blob: b8b15f94b79ae436fff128d0cac3d141d92851ee [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
Ken Chenb9fa2062018-11-13 21:51:13 +0800898TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900899 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800900 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800901
Xiao Ma09b71022018-12-11 17:56:32 +0900902 test::DNSResponder dns("127.0.0.6");
903 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
904 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
905
Ken Chenb9fa2062018-11-13 21:51:13 +0800906 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900907
Ken Chenb9fa2062018-11-13 21:51:13 +0800908 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
909 ASSERT_FALSE(result == nullptr);
910 ASSERT_EQ(4, result->h_length);
911 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
912 EXPECT_EQ("1.2.3.3", ToString(result));
913 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800914}
915
916TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800917 constexpr char host_name[] = "ohayou.example.com.";
918 constexpr char numeric_addr[] = "fe80::1%lo";
919
Xiao Ma09b71022018-12-11 17:56:32 +0900920 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800921 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900922 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
923 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800924
925 addrinfo hints = {.ai_family = AF_INET6};
926 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
927 EXPECT_TRUE(result != nullptr);
928 EXPECT_EQ(numeric_addr, ToString(result));
929 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
930
931 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
932 // We should fail without sending out a DNS query.
933 hints.ai_flags |= AI_NUMERICHOST;
934 result = safe_getaddrinfo(host_name, nullptr, &hints);
935 EXPECT_TRUE(result == nullptr);
936 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
937}
938
939TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900940 constexpr char listen_addr0[] = "127.0.0.7";
941 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800942 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900943
944 test::DNSResponder dns0(listen_addr0);
945 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800946 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900947 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
948 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
949
Luke Huangf8215372019-11-22 11:53:41 +0800950 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800951 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
952 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800953 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900954 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800955
956 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
957 // reached the dns0, which is set to fail. No more requests should then arrive at that server
958 // for the next sample_lifetime seconds.
959 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900960 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900961 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800962 std::string domain = StringPrintf("nonexistent%d", i);
963 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
964 }
965 // Due to 100% errors for all possible samples, the server should be ignored from now on and
966 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
967 dns0.clearQueries();
968 dns1.clearQueries();
969 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
970 EXPECT_TRUE(result != nullptr);
971 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
972 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
973}
974
975TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900976 constexpr char listen_addr0[] = "127.0.0.7";
977 constexpr char listen_addr1[] = "127.0.0.8";
978 constexpr char listen_srv[] = "53";
979 constexpr char host_name1[] = "ohayou.example.com.";
980 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800981 const std::vector<std::string> defaultSearchDomain = {"example.com"};
982 // The minimal timeout is 1000ms, so we can't decrease timeout
983 // So reduce retry count.
984 const std::vector<int> reduceRetryParams = {
985 300, // sample validity in seconds
986 25, // success threshod in percent
987 8, 8, // {MIN,MAX}_SAMPLES
988 1000, // BASE_TIMEOUT_MSEC
989 1, // retry count
990 };
Xiao Ma09b71022018-12-11 17:56:32 +0900991 const std::vector<DnsRecord> records0 = {
992 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
993 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
994 };
995 const std::vector<DnsRecord> records1 = {
996 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
997 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
998 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800999
1000 // dns0 does not respond with 100% probability, while
1001 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001002 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1003 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001004 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001005 StartDns(dns0, records0);
1006 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001007 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1008 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001009
Luke Huang483cf332019-06-03 17:24:51 +08001010 // Specify ai_socktype to make getaddrinfo will only query 1 time
1011 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001012
1013 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1014 // retry.
1015 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1016 EXPECT_TRUE(result != nullptr);
1017 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1018 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001019 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001020
1021 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001022 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001023 dns1.setResponseProbability(0.0);
1024 addrinfo* result2 = nullptr;
1025 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1026 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001027 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1028 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001029 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001030}
1031
1032TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001033 constexpr char listen_addr0[] = "127.0.0.9";
1034 constexpr char listen_addr1[] = "127.0.0.10";
1035 constexpr char listen_addr2[] = "127.0.0.11";
1036 constexpr char host_name[] = "konbanha.example.com.";
1037
1038 test::DNSResponder dns0(listen_addr0);
1039 test::DNSResponder dns1(listen_addr1);
1040 test::DNSResponder dns2(listen_addr2);
1041 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1042 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1043 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1044
Luke Huangf8215372019-11-22 11:53:41 +08001045 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001046 std::vector<std::thread> threads(10);
1047 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001048 thread = std::thread([this, &servers]() {
1049 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001050 usleep(delay);
1051 std::vector<std::string> serverSubset;
1052 for (const auto& server : servers) {
1053 if (arc4random_uniform(2)) {
1054 serverSubset.push_back(server);
1055 }
1056 }
1057 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001058 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1059 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001060 addrinfo* result = nullptr;
1061 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1062 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1063 if (result) {
1064 freeaddrinfo(result);
1065 result = nullptr;
1066 }
1067 });
1068 }
1069 for (std::thread& thread : threads) {
1070 thread.join();
1071 }
Ken Chen92bed612018-12-22 21:46:55 +08001072
1073 std::vector<std::string> res_servers;
1074 std::vector<std::string> res_domains;
1075 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001076 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001077 std::vector<ResolverStats> res_stats;
1078 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001079 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1080 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1081 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001082 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001083}
1084
Mike Yu8ac63402019-12-02 15:28:38 +08001085TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1086 constexpr char listen_addr1[] = "fe80::1";
1087 constexpr char listen_addr2[] = "255.255.255.255";
1088 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001089 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001090 test::DNSResponder dns(listen_addr3);
1091 ASSERT_TRUE(dns.startServer());
1092
Mike Yu61d17262020-02-15 18:56:22 +08001093 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1094 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1095 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001096
Mike Yu61d17262020-02-15 18:56:22 +08001097 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1098 cleanupParams.servers.clear();
1099 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001100
Mike Yu61d17262020-02-15 18:56:22 +08001101 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1102 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1103 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1104
Mike Yu10832aa2020-08-25 19:13:11 +08001105 // Re-setup test network to make experiment flag take effect.
1106 resetNetwork();
1107
Mike Yu61d17262020-02-15 18:56:22 +08001108 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1109
1110 // Start sending synchronized querying.
1111 for (int i = 0; i < 100; i++) {
1112 std::string hostName = StringPrintf("hello%d.com.", counter++);
1113 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1114 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1115 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1116 }
1117
1118 const std::vector<NameserverStats> targetStats = {
1119 NameserverStats(listen_addr1).setInternalErrors(5),
1120 NameserverStats(listen_addr2).setInternalErrors(5),
1121 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1122 };
1123 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1124
1125 // Also verify the number of queries received in the server because res_stats.successes has
1126 // a maximum.
1127 EXPECT_EQ(dns.queries().size(), 100U);
1128
1129 // Reset the state.
1130 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1131 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001132 }
Mike Yu8ac63402019-12-02 15:28:38 +08001133}
1134
1135TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1136 constexpr char listen_addr1[] = "127.0.0.3";
1137 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001138 int counter = 0; // To generate unique hostnames.
1139
1140 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1141 setupParams.servers = {listen_addr1, listen_addr2};
1142 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1143
1144 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1145 cleanupParams.servers.clear();
1146 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001147
1148 // Set dns1 non-responsive and dns2 workable.
1149 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1150 test::DNSResponder dns2(listen_addr2);
1151 dns1.setResponseProbability(0.0);
1152 ASSERT_TRUE(dns1.startServer());
1153 ASSERT_TRUE(dns2.startServer());
1154
Mike Yu61d17262020-02-15 18:56:22 +08001155 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1156 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1157 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001158
Mike Yu10832aa2020-08-25 19:13:11 +08001159 // Re-setup test network to make experiment flag take effect.
1160 resetNetwork();
1161
Mike Yu61d17262020-02-15 18:56:22 +08001162 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001163
Mike Yu61d17262020-02-15 18:56:22 +08001164 // Start sending synchronized querying.
1165 for (int i = 0; i < 100; i++) {
1166 std::string hostName = StringPrintf("hello%d.com.", counter++);
1167 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1168 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1169 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1170 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1171 }
1172
1173 const std::vector<NameserverStats> targetStats = {
1174 NameserverStats(listen_addr1).setTimeouts(5),
1175 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1176 };
1177 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1178
1179 // Also verify the number of queries received in the server because res_stats.successes has
1180 // an upper bound.
1181 EXPECT_GT(dns1.queries().size(), 0U);
1182 EXPECT_LT(dns1.queries().size(), 5U);
1183 EXPECT_EQ(dns2.queries().size(), 100U);
1184
1185 // Reset the state.
1186 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1187 dns1.clearQueries();
1188 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001189 }
Mike Yu8ac63402019-12-02 15:28:38 +08001190}
1191
chenbrucefd837fa2019-10-29 18:35:36 +08001192TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1193 constexpr char hostnameNoip[] = "noip.example.com.";
1194 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1195 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1196 {"", hostnameNoip},
1197 {"wrong IP", hostnameInvalidip},
1198 };
1199 test::DNSResponder dns;
1200 StartDns(dns, {});
1201 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001202 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001203 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1204 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1205 // The query won't get data from customized table because of invalid customized table
1206 // and DNSResponder also has no records. hostnameNoip has never registered and
1207 // hostnameInvalidip has registered but wrong IP.
1208 const addrinfo hints = {.ai_family = AF_UNSPEC};
1209 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1210 ASSERT_TRUE(result == nullptr);
1211 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1212 }
1213}
1214
1215TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1216 constexpr char hostnameV4[] = "v4only.example.com.";
1217 constexpr char hostnameV6[] = "v6only.example.com.";
1218 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1219 constexpr char custAddrV4[] = "1.2.3.4";
1220 constexpr char custAddrV6[] = "::1.2.3.4";
1221 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1222 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1223 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1224 {custAddrV4, hostnameV4},
1225 };
1226 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1227 {custAddrV6, hostnameV6},
1228 };
1229 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1230 {custAddrV4, hostnameV4V6},
1231 {custAddrV6, hostnameV4V6},
1232 };
1233 const std::vector<DnsRecord> dnsSvHostV4 = {
1234 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1235 };
1236 const std::vector<DnsRecord> dnsSvHostV6 = {
1237 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1238 };
1239 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1240 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1241 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1242 };
1243 struct TestConfig {
1244 const std::string name;
1245 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1246 const std::vector<DnsRecord> dnsserverHosts;
1247 const std::vector<std::string> queryResult;
1248 std::string asParameters() const {
1249 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1250 customizedHosts.empty() ? "No" : "Yes",
1251 dnsserverHosts.empty() ? "No" : "Yes");
1252 }
1253 } testConfigs[]{
1254 // clang-format off
1255 {hostnameV4, {}, {}, {}},
1256 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1257 {hostnameV4, custHostV4, {}, {custAddrV4}},
1258 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1259 {hostnameV6, {}, {}, {}},
1260 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1261 {hostnameV6, custHostV6, {}, {custAddrV6}},
1262 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1263 {hostnameV4V6, {}, {}, {}},
1264 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1265 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1266 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1267 // clang-format on
1268 };
1269
1270 for (const auto& config : testConfigs) {
1271 SCOPED_TRACE(config.asParameters());
1272
1273 test::DNSResponder dns;
1274 StartDns(dns, config.dnsserverHosts);
1275
1276 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001277 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001278 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1279 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1280 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1281 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1282 ASSERT_TRUE(result == nullptr);
1283 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1284 } else {
1285 ASSERT_TRUE(result != nullptr);
1286 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1287 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1288 GetNumQueries(dns, config.name.c_str()));
1289 }
1290
1291 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1292 }
1293}
1294
1295TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1296 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1297 constexpr char custAddrV4[] = "1.2.3.4";
1298 constexpr char custAddrV6[] = "::1.2.3.4";
1299 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1300 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1301 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1302 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1303 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1304 };
1305 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1306 {custAddrV4, hostnameV4V6},
1307 {custAddrV6, hostnameV4V6},
1308 };
1309 test::DNSResponder dns;
1310 StartDns(dns, dnsSvHostV4V6);
1311 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1312
Ken Chena6ac2a62020-04-07 17:25:56 +08001313 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001314 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1315 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1316 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1317 ASSERT_TRUE(result != nullptr);
1318 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1319 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1320
Ken Chena6ac2a62020-04-07 17:25:56 +08001321 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001322 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1323 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1324 ASSERT_TRUE(result != nullptr);
1325 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1326 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1327}
1328
Ken Chenb9fa2062018-11-13 21:51:13 +08001329TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001330 std::vector<std::string> servers;
1331 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001332 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001333 std::vector<std::string> res_servers;
1334 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001335 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001336 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001337 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001338 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001339 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1340 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1341 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001342 EXPECT_EQ(0U, res_servers.size());
1343 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001344 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001345 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1346 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1347 res_params.sample_validity);
1348 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001349 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001350 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1351 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1352 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001353 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001354 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001355}
1356
1357TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001358 constexpr char listen_addr[] = "127.0.0.13";
1359 constexpr char host_name1[] = "test13.domain1.org.";
1360 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001361 std::vector<std::string> servers = {listen_addr};
1362 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001363
1364 const std::vector<DnsRecord> records = {
1365 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1366 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1367 };
1368 test::DNSResponder dns(listen_addr);
1369 StartDns(dns, records);
1370 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001371
1372 const addrinfo hints = {.ai_family = AF_INET6};
1373 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1374 EXPECT_TRUE(result != nullptr);
1375 EXPECT_EQ(1U, dns.queries().size());
1376 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1377 EXPECT_EQ("2001:db8::13", ToString(result));
1378
1379 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001380 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001381 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001382 dns.clearQueries();
1383
1384 result = safe_getaddrinfo("test13", nullptr, &hints);
1385 EXPECT_TRUE(result != nullptr);
1386 EXPECT_EQ(1U, dns.queries().size());
1387 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1388 EXPECT_EQ("2001:db8::1:13", ToString(result));
1389}
1390
Luke Huang2dac4382019-06-24 13:28:44 +08001391namespace {
1392
Luke Huangf8215372019-11-22 11:53:41 +08001393std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001394 unsigned netId) {
1395 std::vector<std::string> res_servers;
1396 std::vector<std::string> res_domains;
1397 std::vector<std::string> res_tls_servers;
1398 res_params res_params;
1399 std::vector<ResolverStats> res_stats;
1400 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001401 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1402 &res_tls_servers, &res_params, &res_stats,
1403 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001404 return res_domains;
1405}
1406
1407} // namespace
1408
1409TEST_F(ResolverTest, SearchPathPrune) {
1410 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1411 constexpr char listen_addr[] = "127.0.0.13";
1412 constexpr char domian_name1[] = "domain13.org.";
1413 constexpr char domian_name2[] = "domain14.org.";
1414 constexpr char host_name1[] = "test13.domain13.org.";
1415 constexpr char host_name2[] = "test14.domain14.org.";
1416 std::vector<std::string> servers = {listen_addr};
1417
1418 std::vector<std::string> testDomains1;
1419 std::vector<std::string> testDomains2;
1420 // Domain length should be <= 255
1421 // Max number of domains in search path is 6
1422 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1423 // Fill up with invalid domain
1424 testDomains1.push_back(std::string(300, i + '0'));
1425 // Fill up with valid but duplicated domain
1426 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1427 }
1428
1429 // Add valid domain used for query.
1430 testDomains1.push_back(domian_name1);
1431
1432 // Add valid domain twice used for query.
1433 testDomains2.push_back(domian_name2);
1434 testDomains2.push_back(domian_name2);
1435
1436 const std::vector<DnsRecord> records = {
1437 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1438 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1439 };
1440 test::DNSResponder dns(listen_addr);
1441 StartDns(dns, records);
1442 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1443
1444 const addrinfo hints = {.ai_family = AF_INET6};
1445 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1446
1447 EXPECT_TRUE(result != nullptr);
1448
1449 EXPECT_EQ(1U, dns.queries().size());
1450 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1451 EXPECT_EQ("2001:db8::13", ToString(result));
1452
1453 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1454 // Expect 1 valid domain, invalid domains are removed.
1455 ASSERT_EQ(1U, res_domains1.size());
1456 EXPECT_EQ(domian_name1, res_domains1[0]);
1457
1458 dns.clearQueries();
1459
1460 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1461
1462 result = safe_getaddrinfo("test14", nullptr, &hints);
1463 EXPECT_TRUE(result != nullptr);
1464
1465 // (3 domains * 2 retries) + 1 success query = 7
1466 EXPECT_EQ(7U, dns.queries().size());
1467 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1468 EXPECT_EQ("2001:db8::1:13", ToString(result));
1469
1470 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1471 // Expect 4 valid domain, duplicate domains are removed.
1472 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1473 EXPECT_THAT(
1474 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1475 testing::ElementsAreArray(res_domains2));
1476}
1477
Mike Yu0a1c53d2018-11-26 13:26:21 +09001478// If we move this function to dns_responder_client, it will complicate the dependency need of
1479// dns_tls_frontend.h.
1480static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001481 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001482 constexpr char listen_udp[] = "53";
1483 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001484
1485 for (const auto& server : servers) {
1486 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1487 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1488 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001489 tls->push_back(std::move(t));
1490 }
1491}
1492
Mike Yu0a1c53d2018-11-26 13:26:21 +09001493TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001494 std::vector<std::string> domains;
1495 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1496 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1497 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001498 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001499
1500 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1501 domains.push_back(StringPrintf("example%u.com", i));
1502 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001503 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1504 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001505 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001506
waynema0e73c2e2019-07-31 15:04:08 +08001507 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1508 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001509
Mike Yu383855b2019-01-15 17:53:27 +08001510 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1511 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1512 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1513 // So, wait for private DNS validation done before stopping backend DNS servers.
1514 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001515 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001516 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001517 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001518 }
1519
Mike Yu0a1c53d2018-11-26 13:26:21 +09001520 std::vector<std::string> res_servers;
1521 std::vector<std::string> res_domains;
1522 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001523 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001524 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001525 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001526 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1527 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1528 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001529
1530 // Check the size of the stats and its contents.
1531 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1532 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1533 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1534 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1535 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1536 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001537}
1538
1539TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001540 constexpr char listen_addr1[] = "127.0.0.4";
1541 constexpr char listen_addr2[] = "127.0.0.5";
1542 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001543
1544 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001545 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001546 dns1.setResponseProbability(0.0);
1547 ASSERT_TRUE(dns1.startServer());
1548
1549 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001550 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001551 dns2.setResponseProbability(0.0);
1552 ASSERT_TRUE(dns2.startServer());
1553
1554 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001555 test::DNSResponder dns3(listen_addr3);
1556 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001557 ASSERT_TRUE(dns3.startServer());
1558
1559 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001560 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001561
1562 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001563 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001564 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001565 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001566 EXPECT_LE(1U, found);
1567 std::string result_str = ToString(result);
1568 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1569
Mike Yue2162e52020-03-04 18:43:46 +08001570 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1571 NameserverStats(listen_addr1).setTimeouts(1),
1572 NameserverStats(listen_addr2).setErrors(1),
1573 NameserverStats(listen_addr3).setSuccesses(1),
1574 };
Mike Yu61d17262020-02-15 18:56:22 +08001575 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001576}
1577
Mike Yu15791832020-02-11 13:38:48 +08001578TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1579 constexpr char listen_addr1[] = "127.0.0.3";
1580 constexpr char listen_addr2[] = "255.255.255.255";
1581 constexpr char listen_addr3[] = "127.0.0.4";
1582 constexpr char hostname[] = "hello";
1583 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1584
1585 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1586 dns1.setResponseProbability(0.0);
1587 ASSERT_TRUE(dns1.startServer());
1588
1589 test::DNSResponder dns3(listen_addr3);
1590 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1591
1592 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1593 parcel.tlsServers.clear();
1594 parcel.servers = {listen_addr1, listen_addr2};
1595 parcel.domains = {"domain1.com", "domain2.com"};
1596 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1597
1598 // Expect the things happening in t1:
1599 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1600 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1601 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1602 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1603 // the stats because of the unmatched revision ID.
1604 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1605 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1606 // "hello.domain2.com".
1607 // 5. The lookup gets the answer and updates a success record to the stats.
1608 std::thread t1([&hostname]() {
1609 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1610 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1611 EXPECT_NE(result.get(), nullptr);
1612 EXPECT_EQ(ToString(result), "1.2.3.4");
1613 });
1614
1615 // Wait for t1 to start the step 1.
1616 while (dns1.queries().size() == 0) {
1617 usleep(1000);
1618 }
1619
1620 // Update the resolver with three nameservers. This will increment the revision ID.
1621 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1622 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1623
1624 t1.join();
1625 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1626 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1627
Mike Yue2162e52020-03-04 18:43:46 +08001628 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1629 NameserverStats(listen_addr1),
1630 NameserverStats(listen_addr2),
1631 NameserverStats(listen_addr3).setSuccesses(1),
1632 };
Mike Yu61d17262020-02-15 18:56:22 +08001633 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001634}
1635
Ken Chenb9fa2062018-11-13 21:51:13 +08001636// Test what happens if the specified TLS server is nonexistent.
1637TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001638 constexpr char listen_addr[] = "127.0.0.3";
1639 constexpr char host_name[] = "tlsmissing.example.com.";
1640
1641 test::DNSResponder dns;
1642 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001643 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001644
1645 // There's nothing listening on this address, so validation will either fail or
1646 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001647 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001648
1649 const hostent* result;
1650
1651 result = gethostbyname("tlsmissing");
1652 ASSERT_FALSE(result == nullptr);
1653 EXPECT_EQ("1.2.3.3", ToString(result));
1654
1655 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001656 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001657}
1658
1659// Test what happens if the specified TLS server replies with garbage.
1660TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001661 constexpr char listen_addr[] = "127.0.0.3";
1662 constexpr char host_name1[] = "tlsbroken1.example.com.";
1663 constexpr char host_name2[] = "tlsbroken2.example.com.";
1664 const std::vector<DnsRecord> records = {
1665 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1666 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1667 };
1668
1669 test::DNSResponder dns;
1670 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001671 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001672
1673 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1674 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1675 ASSERT_TRUE(s >= 0);
1676 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001677 .sin_family = AF_INET,
1678 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001679 };
1680 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1681 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1682 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1683 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1684 ASSERT_FALSE(listen(s, 1));
1685
1686 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001687 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001688
1689 struct sockaddr_storage cliaddr;
1690 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001691 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001692 ASSERT_TRUE(new_fd > 0);
1693
1694 // We've received the new file descriptor but not written to it or closed, so the
1695 // validation is still pending. Queries should still flow correctly because the
1696 // server is not used until validation succeeds.
1697 const hostent* result;
1698 result = gethostbyname("tlsbroken1");
1699 ASSERT_FALSE(result == nullptr);
1700 EXPECT_EQ("1.2.3.1", ToString(result));
1701
1702 // Now we cause the validation to fail.
1703 std::string garbage = "definitely not a valid TLS ServerHello";
1704 write(new_fd, garbage.data(), garbage.size());
1705 close(new_fd);
1706
1707 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1708 // to the TLS server unless validation succeeds.
1709 result = gethostbyname("tlsbroken2");
1710 ASSERT_FALSE(result == nullptr);
1711 EXPECT_EQ("1.2.3.2", ToString(result));
1712
1713 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001714 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001715 close(s);
1716}
1717
1718TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001719 constexpr char listen_addr[] = "127.0.0.3";
1720 constexpr char listen_udp[] = "53";
1721 constexpr char listen_tls[] = "853";
1722 constexpr char host_name1[] = "tls1.example.com.";
1723 constexpr char host_name2[] = "tls2.example.com.";
1724 constexpr char host_name3[] = "tls3.example.com.";
1725 const std::vector<DnsRecord> records = {
1726 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1727 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1728 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1729 };
1730
1731 test::DNSResponder dns;
1732 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001733 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001734
1735 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1736 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001737 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001738 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001739
Mike Yu724f77d2019-08-16 11:14:50 +08001740 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001741 ASSERT_FALSE(result == nullptr);
1742 EXPECT_EQ("1.2.3.1", ToString(result));
1743
1744 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001745 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001746
1747 // Stop the TLS server. Since we're in opportunistic mode, queries will
1748 // fall back to the locally-assigned (clear text) nameservers.
1749 tls.stopServer();
1750
1751 dns.clearQueries();
1752 result = gethostbyname("tls2");
1753 EXPECT_FALSE(result == nullptr);
1754 EXPECT_EQ("1.2.3.2", ToString(result));
1755 const auto queries = dns.queries();
1756 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001757 EXPECT_EQ("tls2.example.com.", queries[0].name);
1758 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001759
1760 // Reset the resolvers without enabling TLS. Queries should still be routed
1761 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001762 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001763
1764 result = gethostbyname("tls3");
1765 ASSERT_FALSE(result == nullptr);
1766 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001767}
1768
Ken Chenb9fa2062018-11-13 21:51:13 +08001769TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001770 constexpr char listen_addr1[] = "127.0.0.3";
1771 constexpr char listen_addr2[] = "127.0.0.4";
1772 constexpr char listen_udp[] = "53";
1773 constexpr char listen_tls[] = "853";
1774 constexpr char host_name1[] = "tlsfailover1.example.com.";
1775 constexpr char host_name2[] = "tlsfailover2.example.com.";
1776 const std::vector<DnsRecord> records1 = {
1777 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1778 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1779 };
1780 const std::vector<DnsRecord> records2 = {
1781 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1782 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1783 };
1784
1785 test::DNSResponder dns1(listen_addr1);
1786 test::DNSResponder dns2(listen_addr2);
1787 StartDns(dns1, records1);
1788 StartDns(dns2, records2);
1789
Luke Huangf8215372019-11-22 11:53:41 +08001790 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001791
1792 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1793 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1794 ASSERT_TRUE(tls1.startServer());
1795 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001796 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1797 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001798 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1799 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001800
Mike Yu724f77d2019-08-16 11:14:50 +08001801 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001802 ASSERT_FALSE(result == nullptr);
1803 EXPECT_EQ("1.2.3.1", ToString(result));
1804
1805 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001806 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001807 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001808 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001809
1810 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1811 tls1.stopServer();
1812
1813 result = gethostbyname("tlsfailover2");
1814 EXPECT_EQ("1.2.3.4", ToString(result));
1815
1816 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001817 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001818
1819 // No additional queries should have reached the insecure servers.
1820 EXPECT_EQ(2U, dns1.queries().size());
1821 EXPECT_EQ(2U, dns2.queries().size());
1822
1823 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001824 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001825}
1826
1827TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001828 constexpr char listen_addr[] = "127.0.0.3";
1829 constexpr char listen_udp[] = "53";
1830 constexpr char listen_tls[] = "853";
1831 constexpr char host_name[] = "badtlsname.example.com.";
1832
1833 test::DNSResponder dns;
1834 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001835 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001836
1837 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1838 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001839 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001840 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001841
waynema0e73c2e2019-07-31 15:04:08 +08001842 // The TLS handshake would fail because the name of TLS server doesn't
1843 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001844 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001845
1846 // The query should fail hard, because a name was specified.
1847 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1848
1849 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001850 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001851}
1852
1853TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001854 constexpr char listen_addr[] = "127.0.0.3";
1855 constexpr char listen_udp[] = "53";
1856 constexpr char listen_tls[] = "853";
1857 constexpr char host_name[] = "addrinfotls.example.com.";
1858 const std::vector<DnsRecord> records = {
1859 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1860 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1861 };
1862
1863 test::DNSResponder dns;
1864 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001865 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001866
1867 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1868 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001869 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1870 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001871 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001872
1873 dns.clearQueries();
1874 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1875 EXPECT_TRUE(result != nullptr);
1876 size_t found = GetNumQueries(dns, host_name);
1877 EXPECT_LE(1U, found);
1878 // Could be A or AAAA
1879 std::string result_str = ToString(result);
1880 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001881 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001882 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001883 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001884
1885 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001886 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001887}
1888
1889TEST_F(ResolverTest, TlsBypass) {
1890 const char OFF[] = "off";
1891 const char OPPORTUNISTIC[] = "opportunistic";
1892 const char STRICT[] = "strict";
1893
1894 const char GETHOSTBYNAME[] = "gethostbyname";
1895 const char GETADDRINFO[] = "getaddrinfo";
1896 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1897
1898 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1899
Ken Chenb9fa2062018-11-13 21:51:13 +08001900 const char ADDR4[] = "192.0.2.1";
1901 const char ADDR6[] = "2001:db8::1";
1902
1903 const char cleartext_addr[] = "127.0.0.53";
1904 const char cleartext_port[] = "53";
1905 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001906 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001907
Xiao Ma09b71022018-12-11 17:56:32 +09001908 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001909 ASSERT_TRUE(dns.startServer());
1910
1911 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001912 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001913
Luke Huangf8215372019-11-22 11:53:41 +08001914 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001915 struct TestConfig {
1916 const std::string mode;
1917 const bool withWorkingTLS;
1918 const std::string method;
1919
1920 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001921 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001922 method.c_str());
1923 }
1924 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001925 {OFF, true, GETHOSTBYNAME},
1926 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1927 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001928 {OFF, true, GETADDRINFO},
1929 {OPPORTUNISTIC, true, GETADDRINFO},
1930 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001931 {OFF, true, GETADDRINFOFORNET},
1932 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1933 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001934 {OFF, false, GETHOSTBYNAME},
1935 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1936 {STRICT, false, GETHOSTBYNAME},
1937 {OFF, false, GETADDRINFO},
1938 {OPPORTUNISTIC, false, GETADDRINFO},
1939 {STRICT, false, GETADDRINFO},
1940 {OFF, false, GETADDRINFOFORNET},
1941 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1942 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001943 };
Luke Huangf8215372019-11-22 11:53:41 +08001944 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001945
1946 for (const auto& config : testConfigs) {
1947 const std::string testHostName = config.asHostName();
1948 SCOPED_TRACE(testHostName);
1949
1950 // Don't tempt test bugs due to caching.
1951 const char* host_name = testHostName.c_str();
1952 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1953 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1954
Mike Yudd4ac2d2019-05-31 16:52:11 +08001955 if (config.withWorkingTLS) {
1956 if (!tls.running()) {
1957 ASSERT_TRUE(tls.startServer());
1958 }
1959 } else {
1960 if (tls.running()) {
1961 ASSERT_TRUE(tls.stopServer());
1962 }
1963 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001964
1965 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001966 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1967 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001968 } else /* OPPORTUNISTIC or STRICT */ {
1969 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001970 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001971 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001972
1973 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001974 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001975 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001976 if (config.withWorkingTLS) {
1977 EXPECT_TRUE(tls.waitForQueries(1));
1978 tls.clearQueries();
1979 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001980 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001981
1982 const hostent* h_result = nullptr;
1983 ScopedAddrinfo ai_result;
1984
1985 if (config.method == GETHOSTBYNAME) {
1986 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1987 h_result = gethostbyname(host_name);
1988
1989 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1990 ASSERT_FALSE(h_result == nullptr);
1991 ASSERT_EQ(4, h_result->h_length);
1992 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1993 EXPECT_EQ(ADDR4, ToString(h_result));
1994 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1995 } else if (config.method == GETADDRINFO) {
1996 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1997 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1998 EXPECT_TRUE(ai_result != nullptr);
1999
2000 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2001 // Could be A or AAAA
2002 const std::string result_str = ToString(ai_result);
2003 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002004 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002005 } else if (config.method == GETADDRINFOFORNET) {
2006 addrinfo* raw_ai_result = nullptr;
2007 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2008 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2009 &raw_ai_result));
2010 ai_result.reset(raw_ai_result);
2011
2012 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2013 // Could be A or AAAA
2014 const std::string result_str = ToString(ai_result);
2015 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002016 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002017 }
2018
Mike Yudd4ac2d2019-05-31 16:52:11 +08002019 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002020
2021 // Clear per-process resolv netid.
2022 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002023 dns.clearQueries();
2024 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002025}
2026
2027TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002028 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002029 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002030 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2031 const std::vector<DnsRecord> records = {
2032 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2033 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2034 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002035
Xiao Ma09b71022018-12-11 17:56:32 +09002036 test::DNSResponder dns(cleartext_addr);
2037 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002038
waynema0e73c2e2019-07-31 15:04:08 +08002039 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2040 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002041
2042 addrinfo* ai_result = nullptr;
2043 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2044 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2045}
Luke Huang94b10b92018-11-21 20:13:38 +08002046
2047namespace {
2048
Luke Huang70931aa2019-01-31 11:57:41 +08002049int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002050 struct pollfd wait_fd[1];
2051 wait_fd[0].fd = fd;
2052 wait_fd[0].events = POLLIN;
2053 short revents;
2054 int ret;
2055
2056 ret = poll(wait_fd, 1, -1);
2057 revents = wait_fd[0].revents;
2058 if (revents & POLLIN) {
2059 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002060 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002061 char unused;
2062 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002063 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002064 return n;
2065 }
2066 return -1;
2067}
2068
Luke Huang70931aa2019-01-31 11:57:41 +08002069std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002070 ns_msg handle;
2071 int ancount, n = 0;
2072 ns_rr rr;
2073
Luke Huangf8215372019-11-22 11:53:41 +08002074 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002075 ancount = ns_msg_count(handle, ns_s_an);
2076 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002077 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002078 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002079 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002080 return buffer;
2081 }
2082 }
2083 }
2084 return "";
2085}
2086
2087int dns_open_proxy() {
2088 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2089 if (s == -1) {
2090 return -1;
2091 }
2092 const int one = 1;
2093 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2094
2095 static const struct sockaddr_un proxy_addr = {
2096 .sun_family = AF_UNIX,
2097 .sun_path = "/dev/socket/dnsproxyd",
2098 };
2099
Luke Huangf8215372019-11-22 11:53:41 +08002100 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002101 0) {
2102 close(s);
2103 return -1;
2104 }
2105
2106 return s;
2107}
2108
Luke Huangba7bef92018-12-26 16:53:03 +08002109void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2110 int rcode = -1;
2111 uint8_t buf[MAXPACKET] = {};
2112
2113 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2114 EXPECT_GT(res, 0);
2115 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2116}
2117
2118void expectAnswersNotValid(int fd, int expectedErrno) {
2119 int rcode = -1;
2120 uint8_t buf[MAXPACKET] = {};
2121
2122 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2123 EXPECT_EQ(expectedErrno, res);
2124}
2125
Luke Huang94b10b92018-11-21 20:13:38 +08002126} // namespace
2127
2128TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002129 constexpr char listen_addr[] = "127.0.0.4";
2130 constexpr char host_name[] = "howdy.example.com.";
2131 const std::vector<DnsRecord> records = {
2132 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2133 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2134 };
2135
2136 test::DNSResponder dns(listen_addr);
2137 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002138 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002139 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002140
Luke Huangba7bef92018-12-26 16:53:03 +08002141 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2142 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002143 EXPECT_TRUE(fd1 != -1);
2144 EXPECT_TRUE(fd2 != -1);
2145
Luke Huang70931aa2019-01-31 11:57:41 +08002146 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002147 int rcode;
2148 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2149 EXPECT_GT(res, 0);
2150 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2151
2152 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2153 EXPECT_GT(res, 0);
2154 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2155
2156 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2157
2158 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002159 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2160 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002161
2162 EXPECT_TRUE(fd1 != -1);
2163 EXPECT_TRUE(fd2 != -1);
2164
2165 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2166 EXPECT_GT(res, 0);
2167 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2168
2169 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2170 EXPECT_GT(res, 0);
2171 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2172
2173 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2174}
2175
2176TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002177 constexpr char listen_addr[] = "127.0.0.4";
2178 constexpr char host_name[] = "howdy.example.com.";
2179 const std::vector<DnsRecord> records = {
2180 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2181 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2182 };
2183
2184 test::DNSResponder dns(listen_addr);
2185 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002186 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002187 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002188
2189 static struct {
2190 int fd;
2191 const char* dname;
2192 const int queryType;
2193 const int expectRcode;
2194 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002195 {-1, "", ns_t_aaaa, 0},
2196 {-1, "as65ass46", ns_t_aaaa, 0},
2197 {-1, "454564564564", ns_t_aaaa, 0},
2198 {-1, "h645235", ns_t_a, 0},
2199 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002200 };
2201
2202 for (auto& td : kTestData) {
2203 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002204 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002205 EXPECT_TRUE(td.fd != -1);
2206 }
2207
2208 // dns_responder return empty resp(packet only contains query part) with no error currently
2209 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002210 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002211 int rcode;
2212 SCOPED_TRACE(td.dname);
2213 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2214 EXPECT_GT(res, 0);
2215 EXPECT_EQ(rcode, td.expectRcode);
2216 }
2217}
2218
2219TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002220 constexpr char listen_addr[] = "127.0.0.4";
2221 constexpr char host_name[] = "howdy.example.com.";
2222 const std::vector<DnsRecord> records = {
2223 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2224 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2225 };
2226
2227 test::DNSResponder dns(listen_addr);
2228 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002229 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002230 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002231
Luke Huang9c264bb2018-12-18 16:44:41 +08002232 // TODO: Disable retry to make this test explicit.
2233 auto& cv = dns.getCv();
2234 auto& cvMutex = dns.getCvMutex();
2235 int fd1;
2236 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2237 {
2238 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002239 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002240 EXPECT_TRUE(fd1 != -1);
2241 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2242 }
Luke Huang94b10b92018-11-21 20:13:38 +08002243
Luke Huang94b10b92018-11-21 20:13:38 +08002244 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002245
Luke Huangba7bef92018-12-26 16:53:03 +08002246 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002247 EXPECT_TRUE(fd2 != -1);
2248
Luke Huangba7bef92018-12-26 16:53:03 +08002249 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002250 EXPECT_TRUE(fd3 != -1);
2251
Luke Huang9c264bb2018-12-18 16:44:41 +08002252 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002253 int rcode;
2254
Luke Huang9c264bb2018-12-18 16:44:41 +08002255 // expect no response
2256 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2257 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002258
Luke Huang9c264bb2018-12-18 16:44:41 +08002259 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002260 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002261 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2262 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002263
Luke Huang94b10b92018-11-21 20:13:38 +08002264 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002265
Luke Huangba7bef92018-12-26 16:53:03 +08002266 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002267 EXPECT_TRUE(fd4 != -1);
2268
2269 memset(buf, 0, MAXPACKET);
2270 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2271 EXPECT_GT(res, 0);
2272 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2273
2274 memset(buf, 0, MAXPACKET);
2275 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2276 EXPECT_GT(res, 0);
2277 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002278
2279 // Trailing dot is removed. Is it intended?
2280 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2281 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2282 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2283 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002284}
2285
2286TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002287 constexpr char listen_addr[] = "127.0.0.4";
2288 constexpr char host_name[] = "howdy.example.com.";
2289 const std::vector<DnsRecord> records = {
2290 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2291 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2292 };
2293
2294 test::DNSResponder dns(listen_addr);
2295 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002296 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002297 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002298
2299 int fd = dns_open_proxy();
2300 EXPECT_TRUE(fd > 0);
2301
2302 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002303 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002304 const std::string cmd;
2305 const int expectErr;
2306 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002307 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002308 {"resnsend " + badMsg + '\0', -EINVAL},
2309 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002310 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002311 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002312 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002313 };
2314
2315 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2316 auto& td = kTestData[i];
2317 SCOPED_TRACE(td.cmd);
2318 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2319 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2320
2321 int32_t tmp;
2322 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2323 EXPECT_TRUE(rc > 0);
2324 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2325 }
2326 // Normal query with answer buffer
2327 // This is raw data of query "howdy.example.com" type 1 class 1
2328 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002329 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002330 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2331 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2332
Luke Huang70931aa2019-01-31 11:57:41 +08002333 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002334 int rcode;
2335 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002336 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002337
2338 // Do the normal test with large buffer again
2339 fd = dns_open_proxy();
2340 EXPECT_TRUE(fd > 0);
2341 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2342 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002343 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002344 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2345 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002346}
2347
Luke Huangba7bef92018-12-26 16:53:03 +08002348TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002349 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002350 constexpr char host_name1[] = "howdy.example.com.";
2351 constexpr char host_name2[] = "howdy.example2.com.";
2352 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002353 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002354 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2355 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2356 {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 +09002357 };
2358
2359 test::DNSResponder dns(listen_addr);
2360 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002361 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002362 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002363
2364 // ANDROID_RESOLV_NO_CACHE_STORE
2365 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2366 ANDROID_RESOLV_NO_CACHE_STORE);
2367 EXPECT_TRUE(fd1 != -1);
2368 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2369 ANDROID_RESOLV_NO_CACHE_STORE);
2370 EXPECT_TRUE(fd2 != -1);
2371 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2372 ANDROID_RESOLV_NO_CACHE_STORE);
2373 EXPECT_TRUE(fd3 != -1);
2374
2375 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2376 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2377 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2378
2379 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002380 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002381
Luke Huang4eabbe32020-05-28 03:17:32 +08002382 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2383 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002384 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2385
2386 EXPECT_TRUE(fd1 != -1);
2387
2388 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2389
Luke Huang4eabbe32020-05-28 03:17:32 +08002390 // Expect 4 queries because there should be no cache before this query.
2391 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2392
2393 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2394 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2395 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2396 ANDROID_RESOLV_NO_CACHE_STORE);
2397 EXPECT_TRUE(fd1 != -1);
2398 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2399 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2400 // ANDROID_RESOLV_NO_CACHE_STORE.
2401 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002402
2403 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2404 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2405 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2406 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2407 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2408
2409 EXPECT_TRUE(fd1 != -1);
2410 EXPECT_TRUE(fd2 != -1);
2411
2412 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2413 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2414
Luke Huang4eabbe32020-05-28 03:17:32 +08002415 // Cache was skipped, expect 2 more queries.
2416 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002417
2418 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002419 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002420 EXPECT_TRUE(fd1 != -1);
2421 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2422
Luke Huang4eabbe32020-05-28 03:17:32 +08002423 // Cache hits, expect still 7 queries
2424 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002425
2426 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2427 dns.clearQueries();
2428
Luke Huang4eabbe32020-05-28 03:17:32 +08002429 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002430 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002431 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002432 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2433
2434 EXPECT_TRUE(fd1 != -1);
2435 EXPECT_TRUE(fd2 != -1);
2436
Luke Huang4eabbe32020-05-28 03:17:32 +08002437 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2438 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002439
2440 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002441 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002442
2443 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002444 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2445 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002446
2447 EXPECT_TRUE(fd1 != -1);
2448 EXPECT_TRUE(fd2 != -1);
2449
Luke Huang4eabbe32020-05-28 03:17:32 +08002450 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2451 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002452
2453 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002454 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002455
2456 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2457 dns.clearQueries();
2458
Luke Huang4eabbe32020-05-28 03:17:32 +08002459 // Make sure that the cache of "howdy.example3.com" exists.
2460 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002461 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002462 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2463 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002464
2465 // Re-query with testFlags
2466 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002467 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002468 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002469 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002470 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002471 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002472
2473 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002474 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002475 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002476 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002477 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002478 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002479
2480 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002481 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002482 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002483 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002484 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002485 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002486}
2487
Luke Huang08b13d22020-02-05 14:46:21 +08002488TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2489 constexpr char listen_addr[] = "127.0.0.4";
2490 constexpr char host_name[] = "howdy.example.com.";
2491 const std::vector<DnsRecord> records = {
2492 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2493 };
2494
2495 test::DNSResponder dns(listen_addr);
2496 StartDns(dns, records);
2497 std::vector<std::string> servers = {listen_addr};
2498 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2499
2500 const unsigned SHORT_TTL_SEC = 1;
2501 dns.setTtl(SHORT_TTL_SEC);
2502
2503 // Refer to b/148842821 for the purpose of below test steps.
2504 // Basically, this test is used to ensure stale cache case is handled
2505 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2506 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2507 EXPECT_TRUE(fd != -1);
2508 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2509
2510 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2511 dns.clearQueries();
2512
2513 // Wait until cache expired
2514 sleep(SHORT_TTL_SEC + 0.5);
2515
2516 // Now request the same hostname again.
2517 // We should see a new DNS query because the entry in cache has become stale.
2518 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2519 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2520 ANDROID_RESOLV_NO_CACHE_STORE);
2521 EXPECT_TRUE(fd != -1);
2522 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2523 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2524 dns.clearQueries();
2525
2526 // If the cache is still stale, we expect to see one more DNS query
2527 // (this time the cache will be refreshed, but we're not checking for it).
2528 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2529 EXPECT_TRUE(fd != -1);
2530 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2531 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2532}
2533
Luke Huangba7bef92018-12-26 16:53:03 +08002534TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002535 constexpr char listen_addr0[] = "127.0.0.4";
2536 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002537 constexpr char host_name[] = "howdy.example.com.";
2538 const std::vector<DnsRecord> records = {
2539 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2540 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2541 };
2542
Luke Huang70931aa2019-01-31 11:57:41 +08002543 test::DNSResponder dns0(listen_addr0);
2544 test::DNSResponder dns1(listen_addr1);
2545 StartDns(dns0, records);
2546 StartDns(dns1, records);
2547 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002548
Luke Huang70931aa2019-01-31 11:57:41 +08002549 dns0.clearQueries();
2550 dns1.clearQueries();
2551
2552 dns0.setResponseProbability(0.0);
2553 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002554
2555 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2556 ANDROID_RESOLV_NO_RETRY);
2557 EXPECT_TRUE(fd1 != -1);
2558
2559 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2560 ANDROID_RESOLV_NO_RETRY);
2561 EXPECT_TRUE(fd2 != -1);
2562
2563 // expect no response
2564 expectAnswersNotValid(fd1, -ETIMEDOUT);
2565 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002566 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2567 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002568
Luke Huang70931aa2019-01-31 11:57:41 +08002569 // No retry case, expect total 2 queries. The server is selected randomly.
2570 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002571
Luke Huang70931aa2019-01-31 11:57:41 +08002572 dns0.clearQueries();
2573 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002574
2575 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2576 EXPECT_TRUE(fd1 != -1);
2577
2578 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2579 EXPECT_TRUE(fd2 != -1);
2580
2581 // expect no response
2582 expectAnswersNotValid(fd1, -ETIMEDOUT);
2583 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002584 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2585 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002586
2587 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002588 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2589 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2590}
2591
2592TEST_F(ResolverTest, Async_VerifyQueryID) {
2593 constexpr char listen_addr[] = "127.0.0.4";
2594 constexpr char host_name[] = "howdy.example.com.";
2595 const std::vector<DnsRecord> records = {
2596 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2597 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2598 };
2599
2600 test::DNSResponder dns(listen_addr);
2601 StartDns(dns, records);
2602 std::vector<std::string> servers = {listen_addr};
2603 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2604
2605 const uint8_t queryBuf1[] = {
2606 /* Header */
2607 0x55, 0x66, /* Transaction ID */
2608 0x01, 0x00, /* Flags */
2609 0x00, 0x01, /* Questions */
2610 0x00, 0x00, /* Answer RRs */
2611 0x00, 0x00, /* Authority RRs */
2612 0x00, 0x00, /* Additional RRs */
2613 /* Queries */
2614 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2615 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2616 0x00, 0x01, /* Type */
2617 0x00, 0x01 /* Class */
2618 };
2619
2620 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2621 EXPECT_TRUE(fd != -1);
2622
2623 uint8_t buf[MAXPACKET] = {};
2624 int rcode;
2625
2626 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2627 EXPECT_GT(res, 0);
2628 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2629
2630 auto hp = reinterpret_cast<HEADER*>(buf);
2631 EXPECT_EQ(21862U, htons(hp->id));
2632
2633 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2634
2635 const uint8_t queryBuf2[] = {
2636 /* Header */
2637 0x00, 0x53, /* Transaction ID */
2638 0x01, 0x00, /* Flags */
2639 0x00, 0x01, /* Questions */
2640 0x00, 0x00, /* Answer RRs */
2641 0x00, 0x00, /* Authority RRs */
2642 0x00, 0x00, /* Additional RRs */
2643 /* Queries */
2644 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2645 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2646 0x00, 0x01, /* Type */
2647 0x00, 0x01 /* Class */
2648 };
2649
2650 // Re-query verify cache works and query id is correct
2651 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2652
2653 EXPECT_TRUE(fd != -1);
2654
2655 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2656 EXPECT_GT(res, 0);
2657 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2658
2659 EXPECT_EQ(0x0053U, htons(hp->id));
2660
2661 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002662}
2663
Mike Yu4f3747b2018-12-02 17:54:29 +09002664// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002665// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2666// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2667// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002668TEST_F(ResolverTest, BrokenEdns) {
2669 typedef test::DNSResponder::Edns Edns;
2670 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2671
Mike Yu3977d482020-02-26 17:18:57 +08002672 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002673 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002674
2675 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002676 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002677
2678 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2679 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2680
2681 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002682 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002683
2684 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002685 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002686
Mike Yu4f3747b2018-12-02 17:54:29 +09002687 const char GETHOSTBYNAME[] = "gethostbyname";
2688 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002689 const char ADDR4[] = "192.0.2.1";
2690 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2691 const char CLEARTEXT_PORT[] = "53";
2692 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002693 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002694 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2695 paramsForCleanup.servers.clear();
2696 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002697
Mike Yufc125e42019-05-15 20:41:28 +08002698 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002699 ASSERT_TRUE(dns.startServer());
2700
2701 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2702
Luke Huangf8215372019-11-22 11:53:41 +08002703 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002704 static const struct TestConfig {
2705 std::string mode;
2706 std::string method;
2707 Edns edns;
2708 ExpectResult expectResult;
2709
2710 std::string asHostName() const {
2711 const char* ednsString;
2712 switch (edns) {
2713 case Edns::ON:
2714 ednsString = "ednsOn";
2715 break;
Ken Chen0a015532019-01-02 14:59:38 +08002716 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002717 ednsString = "ednsFormerr";
2718 break;
2719 case Edns::DROP:
2720 ednsString = "ednsDrop";
2721 break;
2722 default:
2723 ednsString = "";
2724 break;
2725 }
2726 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2727 }
2728 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002729 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2730 // fails. Could such server exist? if so, we might need to fix it to fallback to
2731 // cleartext query. If the server still make no response for the queries with EDNS0, we
2732 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002733 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2734 // commented out since TLS timeout is not configurable.
2735 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002736 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2737 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2738 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2739 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2740 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2741 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2742 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2743 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2744 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2745 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2746 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2747 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2748
2749 // The failure is due to no retry on timeout. Maybe fix it?
2750 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2751
2752 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2753 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2754 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2755 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2756 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2757 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2758 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2759 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2760 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2761 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2762 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2763 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2764 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2765 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2766
2767 // The failure is due to no retry on timeout. Maybe fix it?
2768 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2769
Mike Yu4f3747b2018-12-02 17:54:29 +09002770 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2771 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2772 };
Luke Huangf8215372019-11-22 11:53:41 +08002773 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002774
2775 for (const auto& config : testConfigs) {
2776 const std::string testHostName = config.asHostName();
2777 SCOPED_TRACE(testHostName);
2778
2779 const char* host_name = testHostName.c_str();
2780 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2781 dns.setEdns(config.edns);
2782
2783 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002784 if (tls.running()) {
2785 ASSERT_TRUE(tls.stopServer());
2786 }
Xiao Ma09b71022018-12-11 17:56:32 +09002787 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002788 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002789 if (tls.running()) {
2790 ASSERT_TRUE(tls.stopServer());
2791 }
Xiao Ma09b71022018-12-11 17:56:32 +09002792 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002793 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002794 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002795 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002796 if (!tls.running()) {
2797 ASSERT_TRUE(tls.startServer());
2798 }
Xiao Ma09b71022018-12-11 17:56:32 +09002799 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002800 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002801 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002802
2803 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2804 // Force the resolver to fallback to cleartext queries.
2805 ASSERT_TRUE(tls.stopServer());
2806 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002807 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002808 if (!tls.running()) {
2809 ASSERT_TRUE(tls.startServer());
2810 }
Xiao Ma09b71022018-12-11 17:56:32 +09002811 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002812 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002813 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002814 }
2815
2816 if (config.method == GETHOSTBYNAME) {
2817 const hostent* h_result = gethostbyname(host_name);
2818 if (config.expectResult == EXPECT_SUCCESS) {
2819 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2820 ASSERT_TRUE(h_result != nullptr);
2821 ASSERT_EQ(4, h_result->h_length);
2822 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2823 EXPECT_EQ(ADDR4, ToString(h_result));
2824 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002825 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002826 } else {
2827 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2828 ASSERT_TRUE(h_result == nullptr);
2829 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002830 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2831 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002832 }
2833 } else if (config.method == GETADDRINFO) {
2834 ScopedAddrinfo ai_result;
2835 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2836 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2837 if (config.expectResult == EXPECT_SUCCESS) {
2838 EXPECT_TRUE(ai_result != nullptr);
2839 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2840 const std::string result_str = ToString(ai_result);
2841 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002842 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002843 } else {
2844 EXPECT_TRUE(ai_result == nullptr);
2845 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002846 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2847 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002848 }
2849 } else {
2850 FAIL() << "Unsupported query method: " << config.method;
2851 }
2852
Mike Yudd4ac2d2019-05-31 16:52:11 +08002853 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002854 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002855
2856 // Clear the setup to force the resolver to validate private DNS servers in every test.
2857 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002858 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002859}
nuccachena26cc2a2018-07-17 18:07:23 +08002860
Ken Chen0a015532019-01-02 14:59:38 +08002861// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2862// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2863// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2864// failed due to timeout.
2865TEST_F(ResolverTest, UnstableTls) {
2866 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2867 const char CLEARTEXT_PORT[] = "53";
2868 const char TLS_PORT[] = "853";
2869 const char* host_name1 = "nonexistent1.example.com.";
2870 const char* host_name2 = "nonexistent2.example.com.";
2871 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2872
Mike Yufc125e42019-05-15 20:41:28 +08002873 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002874 ASSERT_TRUE(dns.startServer());
2875 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2876 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2877 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002878 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002879 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2880
Ken Chen0a015532019-01-02 14:59:38 +08002881 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2882 tls.stopServer();
2883
2884 const hostent* h_result = gethostbyname(host_name1);
2885 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2886 ASSERT_TRUE(h_result == nullptr);
2887 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2888
2889 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2890 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2891 EXPECT_TRUE(ai_result == nullptr);
2892 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2893}
2894
2895// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2896// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2897TEST_F(ResolverTest, BogusDnsServer) {
2898 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2899 const char CLEARTEXT_PORT[] = "53";
2900 const char TLS_PORT[] = "853";
2901 const char* host_name1 = "nonexistent1.example.com.";
2902 const char* host_name2 = "nonexistent2.example.com.";
2903 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2904
Mike Yufc125e42019-05-15 20:41:28 +08002905 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002906 ASSERT_TRUE(dns.startServer());
2907 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2908 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002909 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002910 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2911
Ken Chen0a015532019-01-02 14:59:38 +08002912 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2913 tls.stopServer();
2914 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2915
2916 const hostent* h_result = gethostbyname(host_name1);
2917 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2918 ASSERT_TRUE(h_result == nullptr);
2919 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2920
2921 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2922 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2923 EXPECT_TRUE(ai_result == nullptr);
2924 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2925}
2926
nuccachena26cc2a2018-07-17 18:07:23 +08002927TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2928 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002929 constexpr char dns64_name[] = "ipv4only.arpa.";
2930 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002931 const std::vector<DnsRecord> records = {
2932 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2933 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2934 };
nuccachena26cc2a2018-07-17 18:07:23 +08002935
Xiao Ma09b71022018-12-11 17:56:32 +09002936 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002937 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002938
2939 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002940 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002941
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002942 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002943 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002944 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002945
2946 // hints are necessary in order to let netd know which type of addresses the caller is
2947 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002948 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002949 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2950 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002951 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2952 // (which returns 1.2.3.4). But there is an extra AAAA.
2953 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002954
2955 std::string result_str = ToString(result);
2956 EXPECT_EQ(result_str, "64:ff9b::102:304");
2957
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002958 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002959 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002960 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002961
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002962 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002963
2964 result = safe_getaddrinfo("v4only", nullptr, &hints);
2965 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002966 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2967 // A is already cached. But there is an extra AAAA.
2968 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002969
2970 result_str = ToString(result);
2971 EXPECT_EQ(result_str, "1.2.3.4");
2972}
2973
nuccachena26cc2a2018-07-17 18:07:23 +08002974TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2975 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002976 constexpr char dns64_name[] = "ipv4only.arpa.";
2977 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002978 const std::vector<DnsRecord> records = {
2979 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2980 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2981 };
nuccachena26cc2a2018-07-17 18:07:23 +08002982
Xiao Ma09b71022018-12-11 17:56:32 +09002983 test::DNSResponder dns(listen_addr);
2984 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002985 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002986 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002987
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002988 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002989 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002990 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002991
2992 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2993 // in AF_INET case.
2994 addrinfo hints;
2995 memset(&hints, 0, sizeof(hints));
2996 hints.ai_family = AF_INET6;
2997 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2998 EXPECT_TRUE(result != nullptr);
2999 std::string result_str = ToString(result);
3000 EXPECT_EQ(result_str, "64:ff9b::102:304");
3001
3002 hints.ai_family = AF_INET;
3003 result = safe_getaddrinfo("v4only", nullptr, &hints);
3004 EXPECT_TRUE(result != nullptr);
3005 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3006 result_str = ToString(result);
3007 EXPECT_EQ(result_str, "1.2.3.4");
3008}
nuccachena26cc2a2018-07-17 18:07:23 +08003009
3010TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3011 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003012 constexpr char dns64_name[] = "ipv4only.arpa.";
3013 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003014 const std::vector<DnsRecord> records = {
3015 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3016 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3017 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3018 };
nuccachena26cc2a2018-07-17 18:07:23 +08003019
Xiao Ma09b71022018-12-11 17:56:32 +09003020 test::DNSResponder dns(listen_addr);
3021 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003022 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003023 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003024
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003025 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003026 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003027 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003028
Xiao Ma09b71022018-12-11 17:56:32 +09003029 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003030 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3031 EXPECT_TRUE(result != nullptr);
3032 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3033
3034 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003035 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003036 for (const auto& str : result_strs) {
3037 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3038 << ", result_str='" << str << "'";
3039 }
3040}
3041
3042TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3043 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003044 constexpr char dns64_name[] = "ipv4only.arpa.";
3045 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003046 const std::vector<DnsRecord> records = {
3047 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3048 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3049 };
nuccachena26cc2a2018-07-17 18:07:23 +08003050
Xiao Ma09b71022018-12-11 17:56:32 +09003051 test::DNSResponder dns(listen_addr);
3052 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003053 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003054 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003055
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003056 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003057 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003058 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003059
Xiao Ma09b71022018-12-11 17:56:32 +09003060 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003061 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3062 EXPECT_TRUE(result != nullptr);
3063 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3064
3065 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3066 std::string result_str = ToString(result);
3067 EXPECT_EQ(result_str, "64:ff9b::102:304");
3068}
3069
3070TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3071 constexpr char THIS_NETWORK[] = "this_network";
3072 constexpr char LOOPBACK[] = "loopback";
3073 constexpr char LINK_LOCAL[] = "link_local";
3074 constexpr char MULTICAST[] = "multicast";
3075 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3076
3077 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3078 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3079 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3080 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3081 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3082
3083 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003084 constexpr char dns64_name[] = "ipv4only.arpa.";
3085
Xiao Ma09b71022018-12-11 17:56:32 +09003086 test::DNSResponder dns(listen_addr);
3087 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003088 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003089 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003090
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003091 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003092 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003093 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003094
Luke Huangf8215372019-11-22 11:53:41 +08003095 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003096 static const struct TestConfig {
3097 std::string name;
3098 std::string addr;
3099
3100 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3101 } testConfigs[]{
3102 {THIS_NETWORK, ADDR_THIS_NETWORK},
3103 {LOOPBACK, ADDR_LOOPBACK},
3104 {LINK_LOCAL, ADDR_LINK_LOCAL},
3105 {MULTICAST, ADDR_MULTICAST},
3106 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3107 };
Luke Huangf8215372019-11-22 11:53:41 +08003108 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003109
3110 for (const auto& config : testConfigs) {
3111 const std::string testHostName = config.asHostName();
3112 SCOPED_TRACE(testHostName);
3113
3114 const char* host_name = testHostName.c_str();
3115 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3116
3117 addrinfo hints;
3118 memset(&hints, 0, sizeof(hints));
3119 hints.ai_family = AF_INET6;
3120 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3121 // In AF_INET6 case, don't return IPv4 answers
3122 EXPECT_TRUE(result == nullptr);
3123 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3124 dns.clearQueries();
3125
3126 memset(&hints, 0, sizeof(hints));
3127 hints.ai_family = AF_UNSPEC;
3128 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3129 EXPECT_TRUE(result != nullptr);
3130 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3131 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3132 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3133 std::string result_str = ToString(result);
3134 EXPECT_EQ(result_str, config.addr.c_str());
3135 dns.clearQueries();
3136 }
3137}
3138
3139TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3140 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003141 constexpr char dns64_name[] = "ipv4only.arpa.";
3142 constexpr char host_name[] = "v4only.example.com.";
3143 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003144 const std::vector<DnsRecord> records = {
3145 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3146 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3147 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3148 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3149 };
nuccachena26cc2a2018-07-17 18:07:23 +08003150
Xiao Ma09b71022018-12-11 17:56:32 +09003151 test::DNSResponder dns(listen_addr);
3152 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003153 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003154 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003155
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003156 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003157 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003158 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003159
3160 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3161 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3162 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3163 EXPECT_TRUE(result != nullptr);
3164 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3165 std::string result_str = ToString(result);
3166 EXPECT_EQ(result_str, "64:ff9b::102:304");
3167 dns.clearQueries();
3168
3169 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3170 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3171 EXPECT_TRUE(result != nullptr);
3172 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3173 std::vector<std::string> result_strs = ToStrings(result);
3174 for (const auto& str : result_strs) {
3175 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3176 << ", result_str='" << str << "'";
3177 }
3178}
3179
3180TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3181 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3182 constexpr char ADDR_ANYADDR_V6[] = "::";
3183 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3184 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3185
3186 constexpr char PORT_NAME_HTTP[] = "http";
3187 constexpr char PORT_NUMBER_HTTP[] = "80";
3188
3189 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003190 constexpr char dns64_name[] = "ipv4only.arpa.";
3191
Xiao Ma09b71022018-12-11 17:56:32 +09003192 test::DNSResponder dns(listen_addr);
3193 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003194 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003195 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003196
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003197 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003198 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003199 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003200
Luke Huangf8215372019-11-22 11:53:41 +08003201 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003202 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3203 // - passive socket -> anyaddr (0.0.0.0 or ::)
3204 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3205 static const struct TestConfig {
3206 int flag;
3207 std::string addr_v4;
3208 std::string addr_v6;
3209
3210 std::string asParameters() const {
3211 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3212 addr_v6.c_str());
3213 }
3214 } testConfigs[]{
3215 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3216 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3217 };
Luke Huangf8215372019-11-22 11:53:41 +08003218 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003219
3220 for (const auto& config : testConfigs) {
3221 SCOPED_TRACE(config.asParameters());
3222
Xiao Ma09b71022018-12-11 17:56:32 +09003223 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003224 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003225 .ai_family = AF_UNSPEC, // any address family
3226 .ai_socktype = 0, // any type
3227 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003228 };
nuccachena26cc2a2018-07-17 18:07:23 +08003229
3230 // Assign hostname as null and service as port name.
3231 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3232 ASSERT_TRUE(result != nullptr);
3233
3234 // Can't be synthesized because it should not get into Netd.
3235 std::vector<std::string> result_strs = ToStrings(result);
3236 for (const auto& str : result_strs) {
3237 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3238 << ", result_str='" << str << "'";
3239 }
3240
3241 // Assign hostname as null and service as numeric port number.
3242 hints.ai_flags = config.flag | AI_NUMERICSERV;
3243 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3244 ASSERT_TRUE(result != nullptr);
3245
3246 // Can't be synthesized because it should not get into Netd.
3247 result_strs = ToStrings(result);
3248 for (const auto& str : result_strs) {
3249 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3250 << ", result_str='" << str << "'";
3251 }
3252 }
3253}
3254
3255TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3256 struct hostent* result = nullptr;
3257 struct in_addr v4addr;
3258 struct in6_addr v6addr;
3259
3260 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003261 constexpr char dns64_name[] = "ipv4only.arpa.";
3262 constexpr char ptr_name[] = "v4v6.example.com.";
3263 // PTR record for IPv4 address 1.2.3.4
3264 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3265 // PTR record for IPv6 address 2001:db8::102:304
3266 constexpr char ptr_addr_v6[] =
3267 "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 +09003268 const std::vector<DnsRecord> records = {
3269 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3270 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3271 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3272 };
nuccachena26cc2a2018-07-17 18:07:23 +08003273
Xiao Ma09b71022018-12-11 17:56:32 +09003274 test::DNSResponder dns(listen_addr);
3275 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003276 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003277 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003278
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003279 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003280 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003281 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003282
3283 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3284 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3285 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3286 ASSERT_TRUE(result != nullptr);
3287 std::string result_str = result->h_name ? result->h_name : "null";
3288 EXPECT_EQ(result_str, "v4v6.example.com");
3289
3290 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3291 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3292 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3293 ASSERT_TRUE(result != nullptr);
3294 result_str = result->h_name ? result->h_name : "null";
3295 EXPECT_EQ(result_str, "v4v6.example.com");
3296}
3297
3298TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3299 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003300 constexpr char dns64_name[] = "ipv4only.arpa.";
3301 constexpr char ptr_name[] = "v4only.example.com.";
3302 // PTR record for IPv4 address 1.2.3.4
3303 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3304 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3305 constexpr char ptr_addr_v6_nomapping[] =
3306 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
3307 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3308 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3309 constexpr char ptr_addr_v6_synthesis[] =
3310 "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 +09003311 const std::vector<DnsRecord> records = {
3312 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3313 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3314 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3315 };
nuccachena26cc2a2018-07-17 18:07:23 +08003316
Xiao Ma09b71022018-12-11 17:56:32 +09003317 test::DNSResponder dns(listen_addr);
3318 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003319 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003320 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003321 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003322
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003323 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003324 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003325 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003326
3327 // Synthesized PTR record doesn't exist on DNS server
3328 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3329 // After querying synthesized address failed, expect that prefix is removed from IPv6
3330 // synthesized address and do reverse IPv4 query instead.
3331 struct in6_addr v6addr;
3332 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3333 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3334 ASSERT_TRUE(result != nullptr);
3335 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3336 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3337 std::string result_str = result->h_name ? result->h_name : "null";
3338 EXPECT_EQ(result_str, "v4only.example.com");
3339 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3340 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3341 // fakes the return IPv4 address as original queried IPv6 address.
3342 result_str = ToString(result);
3343 EXPECT_EQ(result_str, "64:ff9b::102:304");
3344 dns.clearQueries();
3345
3346 // Synthesized PTR record exists on DNS server
3347 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3348 // Expect to Netd pass through synthesized address for DNS queries.
3349 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3350 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3351 ASSERT_TRUE(result != nullptr);
3352 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3353 result_str = result->h_name ? result->h_name : "null";
3354 EXPECT_EQ(result_str, "v6synthesis.example.com");
3355}
3356
3357TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3358 constexpr char dns64_name[] = "ipv4only.arpa.";
3359 constexpr char host_name[] = "localhost";
3360 // The address is synthesized by prefix64:localhost.
3361 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003362 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003363
3364 test::DNSResponder dns(listen_addr);
3365 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003366 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003367 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003368
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003369 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003370 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003371 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003372
3373 // Using synthesized "localhost" address to be a trick for resolving host name
3374 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3375 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3376 struct in6_addr v6addr;
3377 inet_pton(AF_INET6, host_addr, &v6addr);
3378 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3379 ASSERT_TRUE(result != nullptr);
3380 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3381 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3382
Luke Huangf8215372019-11-22 11:53:41 +08003383 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003384 ASSERT_EQ(AF_INET6, result->h_addrtype);
3385 std::string result_str = ToString(result);
3386 EXPECT_EQ(result_str, host_addr);
3387 result_str = result->h_name ? result->h_name : "null";
3388 EXPECT_EQ(result_str, host_name);
3389}
3390
Hungming Chen9e6185a2019-06-04 16:09:19 +08003391TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3392 // IPv4 addresses in the subnet with notation '/' or '-'.
3393 constexpr char addr_slash[] = "192.0.2.1";
3394 constexpr char addr_hyphen[] = "192.0.3.1";
3395
3396 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3397 // section 4.
3398 const static std::vector<DnsRecord> records = {
3399 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3400 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3401 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3402
3403 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3404 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3405 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3406 };
3407
3408 test::DNSResponder dns;
3409 StartDns(dns, records);
3410 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3411
3412 for (const auto& address : {addr_slash, addr_hyphen}) {
3413 SCOPED_TRACE(address);
3414
3415 in_addr v4addr;
3416 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3417 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3418 ASSERT_TRUE(result != nullptr);
3419 EXPECT_STREQ("hello.example.com", result->h_name);
3420 }
3421}
3422
nuccachena26cc2a2018-07-17 18:07:23 +08003423TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3424 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003425 constexpr char dns64_name[] = "ipv4only.arpa.";
3426 constexpr char ptr_name[] = "v4v6.example.com.";
3427 // PTR record for IPv4 address 1.2.3.4
3428 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3429 // PTR record for IPv6 address 2001:db8::102:304
3430 constexpr char ptr_addr_v6[] =
3431 "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 +09003432 const std::vector<DnsRecord> records = {
3433 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3434 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3435 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3436 };
nuccachena26cc2a2018-07-17 18:07:23 +08003437
Xiao Ma09b71022018-12-11 17:56:32 +09003438 test::DNSResponder dns(listen_addr);
3439 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003440 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003441 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003442
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003443 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003444 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003445 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003446
Luke Huangf8215372019-11-22 11:53:41 +08003447 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003448 static const struct TestConfig {
3449 int flag;
3450 int family;
3451 std::string addr;
3452 std::string host;
3453
3454 std::string asParameters() const {
3455 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3456 host.c_str());
3457 }
3458 } testConfigs[]{
3459 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3460 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3461 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3462 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3463 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3464 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3465 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3466 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3467 };
Luke Huangf8215372019-11-22 11:53:41 +08003468 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003469
3470 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3471 for (const auto& config : testConfigs) {
3472 SCOPED_TRACE(config.asParameters());
3473
3474 int rv;
3475 char host[NI_MAXHOST];
3476 struct sockaddr_in sin;
3477 struct sockaddr_in6 sin6;
3478 if (config.family == AF_INET) {
3479 memset(&sin, 0, sizeof(sin));
3480 sin.sin_family = AF_INET;
3481 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003482 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3483 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003484 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3485 } else if (config.family == AF_INET6) {
3486 memset(&sin6, 0, sizeof(sin6));
3487 sin6.sin6_family = AF_INET6;
3488 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003489 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003490 nullptr, 0, config.flag);
3491 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3492 }
3493 ASSERT_EQ(0, rv);
3494 std::string result_str = host;
3495 EXPECT_EQ(result_str, config.host);
3496 dns.clearQueries();
3497 }
3498}
3499
3500TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3501 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003502 constexpr char dns64_name[] = "ipv4only.arpa.";
3503 constexpr char ptr_name[] = "v4only.example.com.";
3504 // PTR record for IPv4 address 1.2.3.4
3505 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3506 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3507 constexpr char ptr_addr_v6_nomapping[] =
3508 "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.";
3509 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3510 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3511 constexpr char ptr_addr_v6_synthesis[] =
3512 "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 +09003513 const std::vector<DnsRecord> records = {
3514 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3515 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3516 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3517 };
nuccachena26cc2a2018-07-17 18:07:23 +08003518
Xiao Ma09b71022018-12-11 17:56:32 +09003519 test::DNSResponder dns(listen_addr);
3520 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003521 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003522 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003523
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003524 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003525 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003526 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003527
Luke Huangf8215372019-11-22 11:53:41 +08003528 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003529 static const struct TestConfig {
3530 bool hasSynthesizedPtrRecord;
3531 int flag;
3532 std::string addr;
3533 std::string host;
3534
3535 std::string asParameters() const {
3536 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3537 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3538 }
3539 } testConfigs[]{
3540 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3541 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3542 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3543 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3544 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3545 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3546 };
Luke Huangf8215372019-11-22 11:53:41 +08003547 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003548
3549 // hasSynthesizedPtrRecord = false
3550 // Synthesized PTR record doesn't exist on DNS server
3551 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3552 // After querying synthesized address failed, expect that prefix is removed from IPv6
3553 // synthesized address and do reverse IPv4 query instead.
3554 //
3555 // hasSynthesizedPtrRecord = true
3556 // Synthesized PTR record exists on DNS server
3557 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3558 // Expect to just pass through synthesized address for DNS queries.
3559 for (const auto& config : testConfigs) {
3560 SCOPED_TRACE(config.asParameters());
3561
3562 char host[NI_MAXHOST];
3563 struct sockaddr_in6 sin6;
3564 memset(&sin6, 0, sizeof(sin6));
3565 sin6.sin6_family = AF_INET6;
3566 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003567 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003568 nullptr, 0, config.flag);
3569 ASSERT_EQ(0, rv);
3570 if (config.flag == NI_NAMEREQD) {
3571 if (config.hasSynthesizedPtrRecord) {
3572 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3573 } else {
3574 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3575 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3576 }
3577 }
3578 std::string result_str = host;
3579 EXPECT_EQ(result_str, config.host);
3580 dns.clearQueries();
3581 }
3582}
3583
3584TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3585 constexpr char dns64_name[] = "ipv4only.arpa.";
3586 constexpr char host_name[] = "localhost";
3587 // The address is synthesized by prefix64:localhost.
3588 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003589 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003590
3591 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003592
Xiao Ma09b71022018-12-11 17:56:32 +09003593 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003594 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003595 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003596
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003597 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003598 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003599 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003600
3601 // Using synthesized "localhost" address to be a trick for resolving host name
3602 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3603 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3604 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003605 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003606 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003607 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003608 0, NI_NAMEREQD);
3609 ASSERT_EQ(0, rv);
3610 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3611 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3612
3613 std::string result_str = host;
3614 EXPECT_EQ(result_str, host_name);
3615}
3616
Hungming Chen9e6185a2019-06-04 16:09:19 +08003617TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3618 // IPv4 addresses in the subnet with notation '/' or '-'.
3619 constexpr char addr_slash[] = "192.0.2.1";
3620 constexpr char addr_hyphen[] = "192.0.3.1";
3621
3622 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3623 // section 4.
3624 const static std::vector<DnsRecord> records = {
3625 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3626 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3627 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3628
3629 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3630 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3631 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3632 };
3633
3634 test::DNSResponder dns;
3635 StartDns(dns, records);
3636 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3637
3638 for (const auto& address : {addr_slash, addr_hyphen}) {
3639 SCOPED_TRACE(address);
3640
3641 char host[NI_MAXHOST];
3642 sockaddr_in sin = {.sin_family = AF_INET};
3643 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3644 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3645 NI_NAMEREQD);
3646 ASSERT_EQ(0, rv);
3647 EXPECT_STREQ("hello.example.com", host);
3648 }
3649}
3650
nuccachena26cc2a2018-07-17 18:07:23 +08003651TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003652 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003653 constexpr char dns64_name[] = "ipv4only.arpa.";
3654 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003655 const std::vector<DnsRecord> records = {
3656 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3657 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3658 };
nuccachena26cc2a2018-07-17 18:07:23 +08003659
Xiao Ma09b71022018-12-11 17:56:32 +09003660 test::DNSResponder dns(listen_addr);
3661 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003662 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003663 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003664
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003665 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003666 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003667 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003668
3669 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3670 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3671 ASSERT_TRUE(result != nullptr);
3672 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3673 std::string result_str = ToString(result);
3674 EXPECT_EQ(result_str, "64:ff9b::102:304");
3675}
nuccachena26cc2a2018-07-17 18:07:23 +08003676
3677TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3678 constexpr char dns64_name[] = "ipv4only.arpa.";
3679 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003680 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003681 const std::vector<DnsRecord> records = {
3682 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3683 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3684 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3685 };
3686
3687 test::DNSResponder dns(listen_addr);
3688 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003689 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003690 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003691
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003692 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003693 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003694 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003695
3696 // IPv4 DNS query. Prefix should have no effect on it.
3697 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3698 ASSERT_TRUE(result != nullptr);
3699 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3700 std::string result_str = ToString(result);
3701 EXPECT_EQ(result_str, "1.2.3.4");
3702 dns.clearQueries();
3703
3704 // IPv6 DNS query. Prefix should have no effect on it.
3705 result = gethostbyname2("v4v6", AF_INET6);
3706 ASSERT_TRUE(result != nullptr);
3707 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3708 result_str = ToString(result);
3709 EXPECT_EQ(result_str, "2001:db8::102:304");
3710}
3711
3712TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3713 constexpr char THIS_NETWORK[] = "this_network";
3714 constexpr char LOOPBACK[] = "loopback";
3715 constexpr char LINK_LOCAL[] = "link_local";
3716 constexpr char MULTICAST[] = "multicast";
3717 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3718
3719 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3720 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3721 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3722 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3723 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3724
3725 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003726 constexpr char dns64_name[] = "ipv4only.arpa.";
3727
Xiao Ma09b71022018-12-11 17:56:32 +09003728 test::DNSResponder dns(listen_addr);
3729 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003730 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003731 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003732
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003733 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003734 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003735 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003736
Luke Huangf8215372019-11-22 11:53:41 +08003737 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003738 static const struct TestConfig {
3739 std::string name;
3740 std::string addr;
3741
3742 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003743 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003744 }
3745 } testConfigs[]{
3746 {THIS_NETWORK, ADDR_THIS_NETWORK},
3747 {LOOPBACK, ADDR_LOOPBACK},
3748 {LINK_LOCAL, ADDR_LINK_LOCAL},
3749 {MULTICAST, ADDR_MULTICAST},
3750 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3751 };
Luke Huangf8215372019-11-22 11:53:41 +08003752 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003753
3754 for (const auto& config : testConfigs) {
3755 const std::string testHostName = config.asHostName();
3756 SCOPED_TRACE(testHostName);
3757
3758 const char* host_name = testHostName.c_str();
3759 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3760
3761 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3762 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3763
3764 // In AF_INET6 case, don't synthesize special use IPv4 address.
3765 // Expect to have no answer
3766 EXPECT_EQ(nullptr, result);
3767
3768 dns.clearQueries();
3769 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003770}
Mike Yuf14e1a92019-05-10 13:54:58 +08003771
3772TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3773 constexpr char listen_addr[] = "::1";
3774 constexpr char cleartext_port[] = "53";
3775 constexpr char tls_port[] = "853";
3776 constexpr char dns64_name[] = "ipv4only.arpa.";
3777 const std::vector<std::string> servers = {listen_addr};
3778
3779 test::DNSResponder dns(listen_addr);
3780 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3781 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3782 ASSERT_TRUE(tls.startServer());
3783
3784 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003785 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003786 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003787 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003788 tls.clearQueries();
3789
3790 // Start NAT64 prefix discovery and wait for it complete.
3791 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003792 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003793
3794 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003795 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3796 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003797
3798 // Restart the testing network to reset the cache.
3799 mDnsClient.TearDown();
3800 mDnsClient.SetUp();
3801 dns.clearQueries();
3802
3803 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003804 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3805 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003806 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003807 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003808 tls.clearQueries();
3809
3810 // Start NAT64 prefix discovery and wait for it to complete.
3811 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003812 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003813
3814 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003815 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3816 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003817}
Luke Huang9807e6b2019-05-20 16:17:12 +08003818
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003819TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3820 constexpr char host_name[] = "v4.example.com.";
3821 constexpr char listen_addr[] = "::1";
3822 const std::vector<DnsRecord> records = {
3823 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3824 };
3825 const std::string kNat64Prefix1 = "64:ff9b::/96";
3826 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3827
3828 test::DNSResponder dns(listen_addr);
3829 StartDns(dns, records);
3830 const std::vector<std::string> servers = {listen_addr};
3831 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3832
3833 auto resolvService = mDnsClient.resolvService();
3834 addrinfo hints = {.ai_family = AF_INET6};
3835
3836 // No NAT64 prefix, no AAAA record.
3837 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3838 ASSERT_TRUE(result == nullptr);
3839
3840 // Set the prefix, and expect to get a synthesized AAAA record.
3841 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3842 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3843 ASSERT_FALSE(result == nullptr);
3844 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3845
3846 // Update the prefix, expect to see AAAA records from the new prefix.
3847 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3848 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3849 ASSERT_FALSE(result == nullptr);
3850 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3851
3852 // Non-/96 prefixes are ignored.
3853 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3854 EXPECT_FALSE(status.isOk());
3855 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3856 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3857
3858 // Invalid prefixes are ignored.
3859 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3860 EXPECT_FALSE(status.isOk());
3861 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3862 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3863
3864 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3865 EXPECT_FALSE(status.isOk());
3866 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3867 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3868
3869 status = resolvService->setPrefix64(TEST_NETID, "hello");
3870 EXPECT_FALSE(status.isOk());
3871 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3872 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3873
3874 // DNS64 synthesis is still working.
3875 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3876 ASSERT_FALSE(result == nullptr);
3877 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3878
3879 // Clear the prefix. No AAAA records any more.
3880 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3881 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3882 EXPECT_TRUE(result == nullptr);
3883
3884 // Calling startPrefix64Discovery clears the prefix.
3885 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3886 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3887 ASSERT_FALSE(result == nullptr);
3888 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3889
3890 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3891 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3892 ASSERT_TRUE(result == nullptr);
3893
3894 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3895 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3896 EXPECT_FALSE(status.isOk());
3897 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3898 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3899
3900 // .. and clearing the prefix also has no effect.
3901 status = resolvService->setPrefix64(TEST_NETID, "");
3902 EXPECT_FALSE(status.isOk());
3903 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3904 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3905
3906 // setPrefix64 succeeds again when prefix discovery is stopped.
3907 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3908 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3909 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3910 ASSERT_FALSE(result == nullptr);
3911 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3912
3913 // Calling stopPrefix64Discovery clears the prefix.
3914 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3915 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3916 ASSERT_TRUE(result == nullptr);
3917
3918 // Set up NAT64 prefix discovery.
3919 constexpr char dns64_name[] = "ipv4only.arpa.";
3920 const std::vector<DnsRecord> newRecords = {
3921 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3922 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3923 };
3924 dns.stopServer();
3925 StartDns(dns, newRecords);
3926
3927 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3928 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3929 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3930 ASSERT_FALSE(result == nullptr);
3931 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3932
3933 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3934 // continues to be used.
3935 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3936 EXPECT_FALSE(status.isOk());
3937 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3938 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3939
3940 // Clearing the prefix also has no effect if discovery is started.
3941 status = resolvService->setPrefix64(TEST_NETID, "");
3942 EXPECT_FALSE(status.isOk());
3943 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3944 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3945
3946 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3947 ASSERT_FALSE(result == nullptr);
3948 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3949
3950 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3951 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003952
3953 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003954}
3955
Luke Huang9807e6b2019-05-20 16:17:12 +08003956namespace {
3957
Luke Huang0d592bc2019-05-25 18:24:03 +08003958class ScopedSetNetworkForProcess {
3959 public:
3960 explicit ScopedSetNetworkForProcess(unsigned netId) {
3961 mStoredNetId = getNetworkForProcess();
3962 if (netId == mStoredNetId) return;
3963 EXPECT_EQ(0, setNetworkForProcess(netId));
3964 }
3965 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3966
3967 private:
3968 unsigned mStoredNetId;
3969};
3970
3971class ScopedSetNetworkForResolv {
3972 public:
3973 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3974 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3975};
3976
Luke Huang9807e6b2019-05-20 16:17:12 +08003977void sendCommand(int fd, const std::string& cmd) {
3978 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3979 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3980}
3981
3982int32_t readBE32(int fd) {
3983 int32_t tmp;
3984 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3985 EXPECT_TRUE(n > 0);
3986 return ntohl(tmp);
3987}
3988
Luke Huang0d592bc2019-05-25 18:24:03 +08003989int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003990 char buf[4];
3991 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3992 EXPECT_TRUE(n > 0);
3993 // The format of response code is that 4 bytes for the code & null.
3994 buf[3] = '\0';
3995 int result;
3996 EXPECT_TRUE(ParseInt(buf, &result));
3997 return result;
3998}
3999
Luke Huang0d592bc2019-05-25 18:24:03 +08004000bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4001 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4002 return false;
4003 }
4004 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4005 return true;
4006}
4007
Luke Huangf8215372019-11-22 11:53:41 +08004008aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4009 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004010 res.start = start;
4011 res.stop = stop;
4012
4013 return res;
4014}
4015
4016void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4017 unsigned dnsNetId = 0;
4018 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4019 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4020 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4021}
4022
4023void expectDnsNetIdEquals(unsigned netId) {
4024 unsigned dnsNetId = 0;
4025 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4026 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4027}
4028
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004029void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004030 int currentNetid;
4031 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4032 expectDnsNetIdEquals(currentNetid);
4033}
4034
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004035void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004036 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4037 uid_t uid = getuid();
4038 // Add uid to VPN
4039 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4040 expectDnsNetIdEquals(expectedNetId);
4041 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4042}
4043
Luke Huang9807e6b2019-05-20 16:17:12 +08004044} // namespace
4045
4046TEST_F(ResolverTest, getDnsNetId) {
4047 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4048 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004049
4050 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4051 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004052
4053 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004054 {
4055 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4056 expectDnsNetIdEquals(TEST_NETID);
4057 }
4058
4059 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4060 {
4061 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4062 NETID_USE_LOCAL_NAMESERVERS);
4063 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4064 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004065
4066 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004067 {
4068 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4069 expectDnsNetIdEquals(TEST_NETID);
4070 }
4071
4072 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4073 {
4074 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4075 NETID_USE_LOCAL_NAMESERVERS);
4076 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4077 }
4078
4079 // Test with setNetworkForResolv under bypassable vpn
4080 {
4081 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4082 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4083 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004084
4085 // Create socket connected to DnsProxyListener
4086 int fd = dns_open_proxy();
4087 EXPECT_TRUE(fd > 0);
4088 unique_fd ufd(fd);
4089
4090 // Test command with wrong netId
4091 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004092 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004093 EXPECT_EQ(-EINVAL, readBE32(fd));
4094
4095 // Test unsupported command
4096 sendCommand(fd, "getdnsnetidNotSupported");
4097 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004098 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004099}
Sehee Park2c118782019-05-07 13:02:45 +09004100
4101TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004102 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4103 // See aosp/358413 and b/34444781 for why.
4104 SKIP_IF_BPF_NOT_SUPPORTED;
4105
Sehee Park2c118782019-05-07 13:02:45 +09004106 constexpr char listen_addr1[] = "127.0.0.4";
4107 constexpr char listen_addr2[] = "::1";
4108 constexpr char host_name[] = "howdy.example.com.";
4109 const std::vector<DnsRecord> records = {
4110 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4111 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4112 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004113 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004114
4115 test::DNSResponder dns1(listen_addr1);
4116 test::DNSResponder dns2(listen_addr2);
4117 StartDns(dns1, records);
4118 StartDns(dns2, records);
4119
4120 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4121 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4122 dns1.clearQueries();
4123 dns2.clearQueries();
4124
Luke Huangeb618ef2020-05-26 14:17:02 +08004125 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004126 // Dns Query
4127 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4128 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4129 EXPECT_TRUE(fd1 != -1);
4130 EXPECT_TRUE(fd2 != -1);
4131
Luke Huang5729afc2020-07-30 23:12:17 +08004132 uint8_t buf1[MAXPACKET] = {};
4133 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004134 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004135 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4136 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4137 // If API level >= 30 (R+), these queries should be blocked.
4138 if (isAtLeastR) {
4139 EXPECT_EQ(res2, -ECONNREFUSED);
4140 EXPECT_EQ(res1, -ECONNREFUSED);
4141 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4142 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4143 } else {
4144 EXPECT_GT(res2, 0);
4145 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4146 EXPECT_GT(res1, 0);
4147 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4148 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4149 }
Sehee Park2c118782019-05-07 13:02:45 +09004150}
Mike Yua772c202019-09-23 17:47:21 +08004151
Ken Chenbc481b82020-05-21 23:30:01 +08004152TEST_F(ResolverTest, EnforceDnsUid) {
4153 SKIP_IF_BPF_NOT_SUPPORTED;
4154
4155 constexpr char listen_addr1[] = "127.0.0.4";
4156 constexpr char listen_addr2[] = "::1";
4157 constexpr char host_name[] = "howdy.example.com.";
4158 const std::vector<DnsRecord> records = {
4159 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4160 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4161 };
4162 INetd* netdService = mDnsClient.netdService();
4163
4164 test::DNSResponder dns1(listen_addr1);
4165 test::DNSResponder dns2(listen_addr2);
4166 StartDns(dns1, records);
4167 StartDns(dns2, records);
4168
4169 // switch uid of DNS queries from applications to AID_DNS
4170 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4171 parcel.servers = {listen_addr1, listen_addr2};
4172 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4173
4174 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004175 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004176 int rcode;
4177 {
4178 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4179 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004180 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4181 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004182 EXPECT_TRUE(fd1 != -1);
4183 EXPECT_TRUE(fd2 != -1);
4184
Luke Huang5729afc2020-07-30 23:12:17 +08004185 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4186 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4187 // If API level >= 30 (R+), the query should be blocked.
4188 if (isAtLeastR) {
4189 EXPECT_EQ(res2, -ECONNREFUSED);
4190 EXPECT_EQ(res1, -ECONNREFUSED);
4191 } else {
4192 EXPECT_GT(res2, 0);
4193 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4194 EXPECT_GT(res1, 0);
4195 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4196 }
Ken Chenbc481b82020-05-21 23:30:01 +08004197 }
4198
Luke Huang5729afc2020-07-30 23:12:17 +08004199 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004200 parcel.resolverOptions.enforceDnsUid = true;
4201 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4202 {
4203 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4204 // Dns Queries should NOT be blocked
4205 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4206 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4207 EXPECT_TRUE(fd1 != -1);
4208 EXPECT_TRUE(fd2 != -1);
4209
4210 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4211 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4212
4213 memset(buf, 0, MAXPACKET);
4214 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4215 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4216
4217 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4218 // don't check if they are actually being set to AID_DNS, because system uids are always
4219 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4220 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4221 // we have better idea to deal with this.
4222 }
4223}
4224
Mike Yua772c202019-09-23 17:47:21 +08004225TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08004226 const std::string kDotConnectTimeoutMsFlag(
4227 "persist.device_config.netd_native.dot_connect_timeout_ms");
Mike Yu40e67072019-10-09 21:14:09 +08004228 constexpr int expectedTimeout = 1000;
4229 constexpr char hostname1[] = "query1.example.com.";
4230 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004231 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004232 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4233 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004234 };
4235
4236 test::DNSResponder dns;
4237 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004238 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004239 ASSERT_TRUE(tls.startServer());
4240
Mike Yu40e67072019-10-09 21:14:09 +08004241 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4242 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004243
Mike Yu40e67072019-10-09 21:14:09 +08004244 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004245 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004246 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004247 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004248 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004249 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004250 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004251
4252 // The server becomes unresponsive to the handshake request.
4253 tls.setHangOnHandshakeForTesting(true);
4254
4255 // Expect the things happening in getaddrinfo():
4256 // 1. Connect to the private DNS server.
4257 // 2. SSL handshake times out.
4258 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004259 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4260 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004261
Mike Yu40e67072019-10-09 21:14:09 +08004262 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004263 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004264 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4265 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004266
Mike Yu40e67072019-10-09 21:14:09 +08004267 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4268 // should just take a bit more than expetTimeout milliseconds.
4269 EXPECT_GE(timeTakenMs, expectedTimeout);
4270 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4271
4272 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4273 // to the server and then get the result within the timeout.
4274 tls.setHangOnHandshakeForTesting(false);
4275 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4276
4277 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004278 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004279 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4280 EXPECT_EQ(records.at(1).addr, ToString(result));
4281
4282 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004283}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004284
Ken Chen766feae2019-10-30 15:13:44 +08004285TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004286 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004287 test::DNSResponder dns;
4288 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4289 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4290
4291 const hostent* result = gethostbyname("hello");
4292 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4293
4294 // get result from cache
4295 result = gethostbyname("hello");
4296 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4297
4298 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4299
4300 result = gethostbyname("hello");
4301 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4302}
4303
4304TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004305 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004306 constexpr int num_flush = 10;
4307 constexpr int num_queries = 20;
4308 test::DNSResponder dns;
4309 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4310 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4311 const addrinfo hints = {.ai_family = AF_INET};
4312
4313 std::thread t([this]() {
4314 for (int i = 0; i < num_flush; ++i) {
4315 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4316 usleep(delay);
4317 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4318 }
4319 });
4320
4321 for (int i = 0; i < num_queries; ++i) {
4322 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4323 EXPECT_TRUE(result != nullptr);
4324 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4325 }
4326 t.join();
4327}
4328
4329// flush cache while one query is wait-for-response, another is pending.
4330TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
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 const char* listen_addr1 = "127.0.0.9";
4333 const char* listen_addr2 = "127.0.0.10";
4334 test::DNSResponder dns1(listen_addr1);
4335 test::DNSResponder dns2(listen_addr2);
4336 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4337 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4338 addrinfo hints = {.ai_family = AF_INET};
4339
4340 // step 1: set server#1 into deferred responding mode
4341 dns1.setDeferredResp(true);
4342 std::thread t1([&listen_addr1, &hints, this]() {
4343 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4344 // step 3: query
4345 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4346 // step 9: check result
4347 EXPECT_TRUE(result != nullptr);
4348 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4349 });
4350
4351 // step 2: wait for the query to reach the server
4352 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4353 usleep(1000); // 1ms
4354 }
4355
4356 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4357 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4358 // step 5: query (should be blocked in resolver)
4359 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4360 // step 7: check result
4361 EXPECT_TRUE(result != nullptr);
4362 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4363 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4364 });
4365
4366 // step 4: wait a bit for the 2nd query to enter pending state
4367 usleep(100 * 1000); // 100ms
4368 // step 6: flush cache (will unblock pending queries)
4369 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4370 t2.join();
4371
4372 // step 8: resume server#1
4373 dns1.setDeferredResp(false);
4374 t1.join();
4375
4376 // step 10: verify if result is correctly cached
4377 dns2.clearQueries();
4378 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4379 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4380 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4381}
4382
waynema29253052019-08-20 11:26:08 +08004383// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4384TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4385 test::DNSResponder dns;
4386 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4387 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4388
4389 int fd = dns_open_proxy();
4390 ASSERT_TRUE(fd > 0);
4391
4392 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4393 // The raw data is combined with Question section and Additional section
4394 // Question section : query "hello.example.com", type A, class IN
4395 // Additional section : type OPT (41), Option PADDING, Option Length 546
4396 // Padding option which allows DNS clients and servers to artificially
4397 // increase the size of a DNS message by a variable number of bytes.
4398 // See also RFC7830, section 3
4399 const std::string query =
4400 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4401 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4402 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4403 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4404 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4405 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4406 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4407 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4408 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4409 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4410 const std::string cmd =
4411 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4412 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4413 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4414 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4415 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4416 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4417}
4418
Ken Chen99344882020-01-01 14:59:38 +08004419TEST_F(ResolverTest, TruncatedRspMode) {
4420 constexpr char listen_addr[] = "127.0.0.4";
4421 constexpr char listen_addr2[] = "127.0.0.5";
4422 constexpr char listen_srv[] = "53";
4423
4424 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4425 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4426 // dns supports UDP only, dns2 support UDP and TCP
4427 dns.setResponseProbability(0.0, IPPROTO_TCP);
4428 StartDns(dns, kLargeCnameChainRecords);
4429 StartDns(dns2, kLargeCnameChainRecords);
4430
4431 const struct TestConfig {
4432 const std::optional<int32_t> tcMode;
4433 const bool ret;
4434 const unsigned numQueries;
4435 std::string asParameters() const {
4436 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4437 ret ? "true" : "false", numQueries);
4438 }
4439 } testConfigs[]{
4440 // clang-format off
4441 {std::nullopt, true, 0}, /* mode unset */
4442 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4443 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4444 {-666, false, 1}, /* invalid input */
4445 // clang-format on
4446 };
4447
4448 for (const auto& config : testConfigs) {
4449 SCOPED_TRACE(config.asParameters());
4450
4451 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4452 parcel.servers = {listen_addr, listen_addr2};
4453 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004454 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004455 }
4456 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4457
4458 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4459 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4460 ASSERT_TRUE(result != nullptr);
4461 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4462 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4463 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4464 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4465 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4466 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4467 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4468
4469 dns.clearQueries();
4470 dns2.clearQueries();
4471 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004472
4473 // Clear the stats to make the resolver always choose the same server for the first query.
4474 parcel.servers.clear();
4475 parcel.tlsServers.clear();
4476 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004477 }
4478}
4479
Mike Yu153b5b82020-03-04 19:53:54 +08004480TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4481 constexpr char unusable_listen_addr[] = "127.0.0.3";
4482 constexpr char listen_addr[] = "127.0.0.4";
4483 constexpr char hostname[] = "a.hello.query.";
4484 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4485 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4486 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4487 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4488 };
4489
4490 test::DNSResponder dns(listen_addr);
4491 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4492 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4493 ASSERT_TRUE(tls1.startServer());
4494
4495 // Private DNS off mode.
4496 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4497 parcel.servers = {unusable_listen_addr, listen_addr};
4498 parcel.tlsServers.clear();
4499 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4500
4501 // Send a query.
4502 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4503 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4504
4505 // Check the stats as expected.
4506 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4507 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4508 NameserverStats(listen_addr).setSuccesses(1),
4509 };
Mike Yu61d17262020-02-15 18:56:22 +08004510 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004511 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4512
4513 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4514 static const struct TestConfig {
4515 std::vector<std::string> servers;
4516 std::vector<std::string> tlsServers;
4517 std::string tlsName;
4518 } testConfigs[] = {
4519 // Private DNS opportunistic mode.
4520 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4521 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4522
4523 // Private DNS strict mode.
4524 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4525 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4526
4527 // Private DNS off mode.
4528 {{unusable_listen_addr, listen_addr}, {}, ""},
4529 {{listen_addr, unusable_listen_addr}, {}, ""},
4530 };
4531
4532 for (const auto& config : testConfigs) {
4533 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4534 fmt::join(config.tlsServers, ","), config.tlsName));
4535 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4536 parcel.servers = config.servers;
4537 parcel.tlsServers = config.tlsServers;
4538 parcel.tlsName = config.tlsName;
4539 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004540 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004541
4542 // The stats remains when the list of search domains changes.
4543 parcel.domains.push_back("tmp.domains");
4544 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004545 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004546
4547 // The stats remains when the parameters change (except maxSamples).
4548 parcel.sampleValiditySeconds++;
4549 parcel.successThreshold++;
4550 parcel.minSamples++;
4551 parcel.baseTimeoutMsec++;
4552 parcel.retryCount++;
4553 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004554 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004555 }
4556
4557 // The cache remains.
4558 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4559 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4560}
4561
4562TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4563 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4564 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4565 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004566 const auto waitForPrivateDnsStateUpdated = []() {
4567 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4568 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4569 // Since there is a time gap between when PrivateDnsConfiguration reports
4570 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4571 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4572 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4573 // Reference to b/152009023.
4574 std::this_thread::sleep_for(20ms);
4575 };
Mike Yu153b5b82020-03-04 19:53:54 +08004576
4577 test::DNSResponder dns1(addr1);
4578 test::DNSResponder dns2(addr2);
4579 StartDns(dns1, {});
4580 StartDns(dns2, {});
4581 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4582 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4583 unresponsiveTls.setHangOnHandshakeForTesting(true);
4584 ASSERT_TRUE(workableTls.startServer());
4585 ASSERT_TRUE(unresponsiveTls.startServer());
4586
4587 // First setup.
4588 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4589 parcel.servers = {addr1, addr2, unusable_addr};
4590 parcel.tlsServers = {addr1, addr2, unusable_addr};
4591 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4592
4593 // Check the validation results.
4594 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4595 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4596 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4597
4598 static const struct TestConfig {
4599 std::vector<std::string> tlsServers;
4600 std::string tlsName;
4601 } testConfigs[] = {
4602 {{addr1, addr2, unusable_addr}, ""},
4603 {{unusable_addr, addr1, addr2}, ""},
4604 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4605 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4606 };
4607
4608 std::string TlsNameLastTime;
4609 for (const auto& config : testConfigs) {
4610 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4611 config.tlsName));
4612 parcel.servers = config.tlsServers;
4613 parcel.tlsServers = config.tlsServers;
4614 parcel.tlsName = config.tlsName;
4615 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4616
4617 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004618
4619 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004620 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4621
4622 for (const auto& serverAddr : parcel.tlsServers) {
4623 SCOPED_TRACE(serverAddr);
4624 if (serverAddr == workableTls.listen_address()) {
4625 if (dnsModeChanged) {
4626 // In despite of the identical IP address, the server is regarded as a different
4627 // server when DnsTlsServer.name is different. The resolver treats it as a
4628 // different object and begins the validation process.
4629 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4630 }
4631 } else if (serverAddr == unresponsiveTls.listen_address()) {
4632 // No revalidation needed for the server which have been marked as in_progesss.
4633 } else {
4634 // Must be unusable_addr.
4635 // In opportunistic mode, when a validation for a private DNS server fails, the
4636 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4637 // server can be re-evaluated when setResolverConfiguration() is called.
4638 // However, in strict mode, the resolver automatically re-evaluates the server and
4639 // marks the server as in_progress until the validation succeeds, so repeated setup
4640 // makes no effect.
4641 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4642 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4643 }
4644 }
4645 }
4646
4647 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004648 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004649 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4650 if (config.tlsName.empty()) {
4651 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4652 }
Mike Yubc4b9502020-03-20 13:14:00 +08004653 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004654 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4655 if (config.tlsName.empty()) {
4656 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4657 }
4658
4659 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4660
4661 TlsNameLastTime = config.tlsName;
4662 }
4663
4664 // Check that all the validation results are caught.
4665 // Note: it doesn't mean no validation being in progress.
4666 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4667 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4668 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4669}
4670
4671TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4672 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4673 const std::string addr1 = getUniqueIPv4Address();
4674 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004675 const auto waitForPrivateDnsStateUpdated = []() {
4676 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4677 // being flaky. See b/152009023 for the reason.
4678 std::this_thread::sleep_for(20ms);
4679 };
Mike Yu153b5b82020-03-04 19:53:54 +08004680
4681 test::DNSResponder dns1(addr1);
4682 test::DNSResponder dns2(addr2);
4683 StartDns(dns1, {});
4684 StartDns(dns2, {});
4685 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4686 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4687 ASSERT_TRUE(tls1.startServer());
4688 ASSERT_TRUE(tls2.startServer());
4689
4690 static const struct TestConfig {
4691 std::string tlsServer;
4692 std::string tlsName;
4693 bool expectNothingHappenWhenServerUnsupported;
4694 bool expectNothingHappenWhenServerUnresponsive;
4695 std::string asTestName() const {
4696 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4697 expectNothingHappenWhenServerUnsupported,
4698 expectNothingHappenWhenServerUnresponsive);
4699 }
4700 } testConfigs[] = {
4701 {{addr1}, "", false, false},
4702 {{addr2}, "", false, false},
4703 {{addr1}, "", false, true},
4704 {{addr2}, "", false, true},
4705 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4706 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4707 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4708 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4709
4710 // There's no new validation to start because there are already two validation threads
4711 // running (one is for addr1, the other is for addr2). This is because the comparator
4712 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4713 // harmful.
4714 {{addr1}, "", true, true},
4715 {{addr2}, "", true, true},
4716 {{addr1}, "", true, true},
4717 {{addr2}, "", true, true},
4718 };
4719
4720 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4721 int testIndex = 0;
4722 for (const auto& config : testConfigs) {
4723 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4724 testIndex++, config.asTestName()));
4725 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4726
4727 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4728 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4729
4730 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4731 const int connectCountsBefore = tls.acceptConnectionsCount();
4732
Mike Yu9a185882020-03-25 16:02:36 +08004733 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004734 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4735 parcel.servers = {config.tlsServer};
4736 parcel.tlsServers = {config.tlsServer};
4737 parcel.tlsName = config.tlsName;
4738 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4739 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4740
4741 if (serverState == WORKING) {
4742 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4743 } else if (serverState == UNSUPPORTED) {
4744 if (config.expectNothingHappenWhenServerUnsupported) {
4745 // It's possible that the resolver hasn't yet started to
4746 // connect. Wait a while.
4747 // TODO: See if we can get rid of the hard waiting time, such as comparing
4748 // the CountDiff across two tests.
4749 std::this_thread::sleep_for(100ms);
4750 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4751 } else {
4752 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4753 }
4754 } else {
4755 // Must be UNRESPONSIVE.
4756 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4757 // another validation when the server is unresponsive.
4758 const int expectCountDiff =
4759 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4760 if (expectCountDiff == 0) {
4761 // It's possible that the resolver hasn't yet started to
4762 // connect. Wait a while.
4763 std::this_thread::sleep_for(100ms);
4764 }
4765 const auto condition = [&]() {
4766 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4767 };
4768 EXPECT_TRUE(PollForCondition(condition));
4769 }
4770 }
4771
4772 // Set to off mode to reset the PrivateDnsConfiguration state.
4773 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4774 setupOffmode.tlsServers.clear();
4775 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4776 }
4777
4778 // Check that all the validation results are caught.
4779 // Note: it doesn't mean no validation being in progress.
4780 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4781 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4782}
4783
Ken Chen26dc2b02020-06-16 18:49:39 +08004784TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4785 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4786 parcel.caCertificate = kCaCert;
4787 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4788
4789 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4790 ScopedChangeUID scopedChangeUID(uid);
4791 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4792 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4793 }
4794}
4795
Hungming Chenbb90ab32019-10-28 18:20:31 +08004796// Parameterized tests.
4797// TODO: Merge the existing tests as parameterized test if possible.
4798// TODO: Perhaps move parameterized tests to an independent file.
4799enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4800class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004801 public testing::WithParamInterface<CallType> {
4802 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004803 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4804 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004805 if (calltype == CallType::GETADDRINFO) {
4806 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4807 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4808 ASSERT_TRUE(result != nullptr);
4809 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4810 } else if (calltype == CallType::GETHOSTBYNAME) {
4811 const hostent* result = gethostbyname("hello");
4812 ASSERT_TRUE(result != nullptr);
4813 ASSERT_EQ(4, result->h_length);
4814 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4815 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4816 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4817 } else {
4818 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4819 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004820 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004821 }
4822};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004823
Hungming Chen63779052019-10-30 15:06:13 +08004824INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004825 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4826 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004827 switch (info.param) {
4828 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004829 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004830 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004831 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004832 default:
Hungming Chen63779052019-10-30 15:06:13 +08004833 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004834 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004835 });
4836
4837TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4838 // DNS response may have more information in authority section and additional section.
4839 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4840 // content of authority section and additional section. Test these sections if they crash
4841 // the resolver, just in case. See also RFC 1035 section 4.1.
4842 const auto& calltype = GetParam();
4843 test::DNSHeader header(kDefaultDnsHeader);
4844
4845 // Create a DNS response which has a authoritative nameserver record in authority
4846 // section and its relevant address record in additional section.
4847 //
4848 // Question
4849 // hello.example.com. IN A
4850 // Answer
4851 // hello.example.com. IN A 1.2.3.4
4852 // Authority:
4853 // hello.example.com. IN NS ns1.example.com.
4854 // Additional:
4855 // ns1.example.com. IN A 5.6.7.8
4856 //
4857 // A response may have only question, answer, and authority section. Current testing response
4858 // should be able to cover this condition.
4859
4860 // Question section.
4861 test::DNSQuestion question{
4862 .qname = {.name = kHelloExampleCom},
4863 .qtype = ns_type::ns_t_a,
4864 .qclass = ns_c_in,
4865 };
4866 header.questions.push_back(std::move(question));
4867
4868 // Answer section.
4869 test::DNSRecord recordAnswer{
4870 .name = {.name = kHelloExampleCom},
4871 .rtype = ns_type::ns_t_a,
4872 .rclass = ns_c_in,
4873 .ttl = 0, // no cache
4874 };
Hungming Chen63779052019-10-30 15:06:13 +08004875 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004876 header.answers.push_back(std::move(recordAnswer));
4877
4878 // Authority section.
4879 test::DNSRecord recordAuthority{
4880 .name = {.name = kHelloExampleCom},
4881 .rtype = ns_type::ns_t_ns,
4882 .rclass = ns_c_in,
4883 .ttl = 0, // no cache
4884 };
4885 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4886 header.authorities.push_back(std::move(recordAuthority));
4887
4888 // Additional section.
4889 test::DNSRecord recordAdditional{
4890 .name = {.name = "ns1.example.com."},
4891 .rtype = ns_type::ns_t_a,
4892 .rclass = ns_c_in,
4893 .ttl = 0, // no cache
4894 };
4895 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4896 header.additionals.push_back(std::move(recordAdditional));
4897
4898 // Start DNS server.
4899 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4900 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4901 ASSERT_TRUE(dns.startServer());
4902 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4903 dns.clearQueries();
4904
4905 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004906 VerifyQueryHelloExampleComV4(dns, calltype);
4907}
4908
4909TEST_P(ResolverParameterizedTest, MessageCompression) {
4910 const auto& calltype = GetParam();
4911
4912 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4913 //
4914 // Ignoring the other fields of the message, the domain name of question section and answer
4915 // section are presented as:
4916 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4917 // 12 | 5 | h |
4918 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4919 // 14 | e | l |
4920 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4921 // 16 | l | o |
4922 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4923 // 18 | 7 | e |
4924 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4925 // 20 | x | a |
4926 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4927 // 22 | m | p |
4928 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4929 // 24 | l | e |
4930 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4931 // 26 | 3 | c |
4932 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4933 // 28 | o | m |
4934 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4935 // 30 | 0 | ... |
4936 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4937 //
4938 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4939 // 35 | 1 1| 12 |
4940 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4941 const std::vector<uint8_t> kResponseAPointer = {
4942 /* Header */
4943 0x00, 0x00, /* Transaction ID: 0x0000 */
4944 0x81, 0x80, /* Flags: qr rd ra */
4945 0x00, 0x01, /* Questions: 1 */
4946 0x00, 0x01, /* Answer RRs: 1 */
4947 0x00, 0x00, /* Authority RRs: 0 */
4948 0x00, 0x00, /* Additional RRs: 0 */
4949 /* Queries */
4950 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4951 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4952 0x00, 0x01, /* Type: A */
4953 0x00, 0x01, /* Class: IN */
4954 /* Answers */
4955 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4956 0x00, 0x01, /* Type: A */
4957 0x00, 0x01, /* Class: IN */
4958 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4959 0x00, 0x04, /* Data length: 4 */
4960 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4961 };
4962
4963 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4964 // RFC 1035 section 4.1.4.
4965 //
4966 // Ignoring the other fields of the message, the domain name of question section and answer
4967 // section are presented as:
4968 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4969 // 12 | 5 | h |
4970 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4971 // 14 | e | l |
4972 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4973 // 16 | l | o |
4974 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4975 // 18 | 7 | e |
4976 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4977 // 20 | x | a |
4978 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4979 // 22 | m | p |
4980 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4981 // 24 | l | e |
4982 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4983 // 26 | 3 | c |
4984 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4985 // 28 | o | m |
4986 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4987 // 30 | 0 | ... |
4988 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4989 //
4990 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4991 // 35 | 5 | h |
4992 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4993 // 37 | e | l |
4994 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4995 // 39 | l | o |
4996 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4997 // 41 | 1 1| 18 |
4998 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4999 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5000 /* Header */
5001 0x00, 0x00, /* Transaction ID: 0x0000 */
5002 0x81, 0x80, /* Flags: qr rd ra */
5003 0x00, 0x01, /* Questions: 1 */
5004 0x00, 0x01, /* Answer RRs: 1 */
5005 0x00, 0x00, /* Authority RRs: 0 */
5006 0x00, 0x00, /* Additional RRs: 0 */
5007 /* Queries */
5008 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5009 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5010 0x00, 0x01, /* Type: A */
5011 0x00, 0x01, /* Class: IN */
5012 /* Answers */
5013 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5014 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5015 0x00, 0x01, /* Type: A */
5016 0x00, 0x01, /* Class: IN */
5017 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5018 0x00, 0x04, /* Data length: 4 */
5019 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5020 };
5021
5022 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5023 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5024
5025 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5026 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5027 StartDns(dns, {});
5028 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5029
5030 // Expect no cache because the TTL of testing responses are 0.
5031 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005032 }
Mike Yu40e67072019-10-09 21:14:09 +08005033}
Hungming Chen22617fd2019-12-06 12:15:45 +08005034
5035TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5036 const auto& calltype = GetParam();
5037
Hungming Chen22617fd2019-12-06 12:15:45 +08005038 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005039 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005040 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5041
5042 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5043 VerifyQueryHelloExampleComV4(dns, calltype, false);
5044 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5045 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5046}
Luke Huang420ee622019-11-27 17:52:44 +08005047
5048TEST_F(ResolverTest, KeepListeningUDP) {
5049 constexpr char listen_addr1[] = "127.0.0.4";
5050 constexpr char listen_addr2[] = "127.0.0.5";
5051 constexpr char host_name[] = "howdy.example.com.";
5052 const std::vector<DnsRecord> records = {
5053 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5054 };
5055 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5056 1 /* retry count */};
5057 const int delayTimeMs = 1500;
5058
5059 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5060 neverRespondDns.setResponseProbability(0.0);
5061 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005062 ScopedSystemProperties scopedSystemProperties(
5063 "persist.device_config.netd_native.keep_listening_udp", "1");
5064 // Re-setup test network to make experiment flag take effect.
5065 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005066
5067 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5068 kDefaultSearchDomains, params));
5069 // There are 2 DNS servers for this test.
5070 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5071 // |neverRespondDns| will never respond.
5072 // In the first try, resolver will send query to |delayedDns| but get timeout error
5073 // because |delayTimeMs| > DNS timeout.
5074 // Then it's the second try, resolver will send query to |neverRespondDns| and
5075 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005076
Luke Huang420ee622019-11-27 17:52:44 +08005077 test::DNSResponder delayedDns(listen_addr1);
5078 delayedDns.setResponseDelayMs(delayTimeMs);
5079 StartDns(delayedDns, records);
5080
5081 // Specify hints to ensure resolver doing query only 1 round.
5082 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5083 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5084 EXPECT_TRUE(result != nullptr);
5085
5086 std::string result_str = ToString(result);
5087 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5088}
Luke Huang0a0870d2020-02-12 20:41:10 +08005089
5090TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5091 constexpr char listen_addr[] = "127.0.0.4";
5092 constexpr char host_name[] = "howdy.example.com.";
5093 constexpr int TIMING_TOLERANCE_MS = 200;
5094 constexpr int DNS_TIMEOUT_MS = 1000;
5095 const std::vector<DnsRecord> records = {
5096 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5097 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5098 };
5099 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5100 1 /* retry count */};
5101 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5102 neverRespondDns.setResponseProbability(0.0);
5103 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005104 ScopedSystemProperties scopedSystemProperties(
5105 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005106 // The default value of parallel_lookup_sleep_time should be very small
5107 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005108 // Re-setup test network to make experiment flag take effect.
5109 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005110
5111 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5112 neverRespondDns.clearQueries();
5113
Luke Huang0a0870d2020-02-12 20:41:10 +08005114 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5115 // The resolver parameters are set to timeout 1s and retry 1 times.
5116 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5117 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5118 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5119 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5120
5121 EXPECT_TRUE(result == nullptr);
5122 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5123 << "took time should approximate equal timeout";
5124 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005125 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005126}
Luke Huangd1d734f2020-04-30 12:25:40 +08005127
5128TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5129 constexpr char listen_addr[] = "127.0.0.4";
5130 constexpr int TIMING_TOLERANCE_MS = 200;
5131 const std::vector<DnsRecord> records = {
5132 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5133 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5134 };
5135 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5136 1 /* retry count */};
5137 test::DNSResponder dns(listen_addr);
5138 StartDns(dns, records);
5139 ScopedSystemProperties scopedSystemProperties1(
5140 "persist.device_config.netd_native.parallel_lookup", "1");
5141 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5142 ScopedSystemProperties scopedSystemProperties2(
5143 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5144 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5145 // Re-setup test network to make experiment flag take effect.
5146 resetNetwork();
5147
5148 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5149 dns.clearQueries();
5150
5151 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5152 // parallel_lookup_sleep_time to 500ms.
5153 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5154 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5155
5156 EXPECT_NE(nullptr, result);
5157 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5158 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5159 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5160 << "took time should approximate equal timeout";
5161 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5162
5163 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5164 dns.clearQueries();
5165 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5166 EXPECT_NE(nullptr, result);
5167 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5168 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5169 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5170 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5171}
Luke Huangeb618ef2020-05-26 14:17:02 +08005172
5173TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5174 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5175 // See aosp/358413 and b/34444781 for why.
5176 SKIP_IF_BPF_NOT_SUPPORTED;
5177
5178 constexpr char listen_addr1[] = "127.0.0.4";
5179 constexpr char listen_addr2[] = "::1";
5180 test::DNSResponder dns1(listen_addr1);
5181 test::DNSResponder dns2(listen_addr2);
5182 StartDns(dns1, {});
5183 StartDns(dns2, {});
5184
5185 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5186 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5187 dns1.clearQueries();
5188 dns2.clearQueries();
5189 {
5190 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5191 // Start querying ten times.
5192 for (int i = 0; i < 10; i++) {
5193 std::string hostName = fmt::format("blocked{}.com", i);
5194 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005195 // The query result between R+ and Q would be different, but we don't really care
5196 // about the result here because this test is only used to ensure blocked uid rule
5197 // won't cause bad servers.
5198 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005199 }
5200 }
Luke Huang5729afc2020-07-30 23:12:17 +08005201 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5202 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5203 // of their stats show up. Otherwise, all queries should succeed.
5204 const std::vector<NameserverStats> expectedDnsStats = {
5205 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005206 NameserverStats(listen_addr2),
5207 };
Luke Huang5729afc2020-07-30 23:12:17 +08005208 expectStatsEqualTo(expectedDnsStats);
5209 // If api level >= 30 (R+), expect server won't receive any queries,
5210 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5211 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005212 EXPECT_EQ(dns2.queries().size(), 0U);
5213}
Mike Yu6ce587d2019-12-19 21:30:22 +08005214
Mike Yu10832aa2020-08-25 19:13:11 +08005215TEST_F(ResolverTest, DnsServerSelection) {
5216 test::DNSResponder dns1("127.0.0.3");
5217 test::DNSResponder dns2("127.0.0.4");
5218 test::DNSResponder dns3("127.0.0.5");
5219
5220 dns1.setResponseDelayMs(10);
5221 dns2.setResponseDelayMs(25);
5222 dns3.setResponseDelayMs(50);
5223 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5224 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5225 StartDns(dns3, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5226
5227 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, "1");
5228
5229 const std::vector<std::vector<std::string>> testConfig = {
5230 {dns1.listen_address(), dns2.listen_address(), dns3.listen_address()},
5231 {dns1.listen_address(), dns3.listen_address(), dns2.listen_address()},
5232 {dns2.listen_address(), dns1.listen_address(), dns3.listen_address()},
5233 {dns2.listen_address(), dns3.listen_address(), dns1.listen_address()},
5234 {dns3.listen_address(), dns1.listen_address(), dns2.listen_address()},
5235 {dns3.listen_address(), dns2.listen_address(), dns1.listen_address()},
5236 };
5237 for (const auto& serverList : testConfig) {
5238 SCOPED_TRACE(fmt::format("testConfig: [{}]", fmt::join(serverList, ", ")));
5239 const int queryNum = 50;
5240 int64_t accumulatedTime = 0;
5241
5242 // Restart the testing network to 1) make the flag take effect and 2) reset the statistics.
5243 resetNetwork();
5244
5245 // DnsServerSelection doesn't apply to private DNS.
5246 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5247 setupParams.servers = serverList;
5248 setupParams.tlsServers.clear();
5249 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
5250
5251 // DNSResponder doesn't handle queries concurrently, so don't allow more than
5252 // one in-flight query.
5253 for (int i = 0; i < queryNum; i++) {
5254 Stopwatch s;
5255 int fd = resNetworkQuery(TEST_NETID, kHelloExampleCom, ns_c_in, ns_t_a,
5256 ANDROID_RESOLV_NO_CACHE_LOOKUP);
5257 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
5258 accumulatedTime += s.timeTakenUs();
5259 }
5260
5261 const int dns1Count = dns1.queries().size();
5262 const int dns2Count = dns2.queries().size();
5263 const int dns3Count = dns3.queries().size();
5264
5265 // All of the servers have ever been selected. In addition, the less latency server
5266 // is selected more frequently.
5267 EXPECT_GT(dns1Count, 0);
5268 EXPECT_GT(dns2Count, 0);
5269 EXPECT_GT(dns3Count, 0);
5270 EXPECT_GT(dns1Count, dns2Count);
5271 EXPECT_GT(dns2Count, dns3Count);
5272
5273 const int avergeTime = accumulatedTime / queryNum;
5274 LOG(INFO) << "ResolverTest#DnsServerSelection: avergeTime " << avergeTime << "us";
5275
5276 // Since the avergeTime might differ depending on parameters, set [10ms, 20ms] as
5277 // acceptable range.
5278 EXPECT_GE(avergeTime, 10000);
5279 EXPECT_LE(avergeTime, 20000);
5280
5281 dns1.clearQueries();
5282 dns2.clearQueries();
5283 dns3.clearQueries();
5284 }
5285}
5286
Mike Yu6ce587d2019-12-19 21:30:22 +08005287// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5288// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5289// the packets to address B, which is the address on which the testing server is listening. The
5290// answer packets responded from the testing server go through the reverse path back to the
5291// resolver.
5292//
5293// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5294// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5295// help the setup.
5296//
5297// An example of how to use it:
5298// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005299// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005300// network.init();
5301//
5302// auto dns = network.addIpv4Dns();
5303// StartDns(dns.dnsServer, {});
5304//
Luke Huang81568fb2020-07-13 00:55:12 +08005305// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005306// network.startTunForwarder();
5307//
5308// // Send queries here
5309// }
5310
5311class ResolverMultinetworkTest : public ResolverTest {
5312 protected:
5313 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005314 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005315
5316 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005317 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5318 : dnsServer(server), dnsAddr(addr) {}
5319 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005320 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5321 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5322 };
5323
5324 class ScopedNetwork {
5325 public:
5326 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005327 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005328 : mNetId(netId),
5329 mConnectivityType(type),
5330 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005331 mDnsResolvSrv(dnsResolvSrv),
5332 mNetworkName(networkName) {
5333 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005334 }
Luke Huang81568fb2020-07-13 00:55:12 +08005335 virtual ~ScopedNetwork() {
5336 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5337 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5338 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005339
5340 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005341 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5342 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5343 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005344 bool setDnsConfiguration() const;
5345 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005346 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005347 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005348
Luke Huang81568fb2020-07-13 00:55:12 +08005349 protected:
5350 // Subclasses should implement it to decide which network should be create.
5351 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005352
5353 const unsigned mNetId;
5354 const ConnectivityType mConnectivityType;
5355 INetd* mNetdSrv;
5356 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005357 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005358 std::string mIfname;
5359 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005360 std::vector<DnsServerPair> mDnsServerPairs;
5361
5362 private:
5363 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5364 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5365 // address based on it to avoid conflicts.
5366 std::string makeIpv4AddrString(uint8_t n) const {
5367 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5368 }
5369 std::string makeIpv6AddrString(uint8_t n) const {
5370 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5371 }
5372 };
5373
5374 class ScopedPhysicalNetwork : public ScopedNetwork {
5375 public:
5376 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5377 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5378 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5379 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5380 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5381
5382 protected:
5383 Result<void> createNetwork() const override {
5384 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5385 !r.isOk()) {
5386 return Error() << r.getMessage();
5387 }
5388 return {};
5389 }
5390 };
5391
5392 class ScopedVirtualNetwork : public ScopedNetwork {
5393 public:
5394 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5395 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5396 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5397 ~ScopedVirtualNetwork() {
5398 if (!mVpnIsolationUids.empty()) {
5399 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5400 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5401 }
5402 }
5403 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5404 Result<void> enableVpnIsolation(int uid) {
5405 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5406 return Error() << r.getMessage();
5407 }
5408 mVpnIsolationUids.insert(uid);
5409 return {};
5410 }
5411 Result<void> disableVpnIsolation(int uid) {
5412 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5413 !r.isOk()) {
5414 return Error() << r.getMessage();
5415 }
5416 mVpnIsolationUids.erase(uid);
5417 return {};
5418 }
5419 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5420 Result<void> addUidRange(uid_t from, uid_t to) const {
5421 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5422 !r.isOk()) {
5423 return Error() << r.getMessage();
5424 }
5425 return {};
5426 }
5427
5428 protected:
5429 Result<void> createNetwork() const override {
5430 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5431 return Error() << r.getMessage();
5432 }
5433 return {};
5434 }
5435
5436 bool mIsSecure = false;
5437 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005438 };
5439
5440 void SetUp() override {
5441 ResolverTest::SetUp();
5442 ASSERT_NE(mDnsClient.netdService(), nullptr);
5443 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5444 }
5445
Luke Huang81568fb2020-07-13 00:55:12 +08005446 void TearDown() override {
5447 ResolverTest::TearDown();
5448 // Restore default network
5449 if (mStoredDefaultNetwork >= 0) {
5450 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5451 }
5452 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005453
Luke Huang81568fb2020-07-13 00:55:12 +08005454 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5455 const char* name = "Physical") {
5456 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5457 }
5458 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5459 const char* name = "Virtual") {
5460 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5461 name, isSecure};
5462 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005463 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005464 void setDefaultNetwork(int netId) {
5465 // Save current default network at the first call.
5466 std::call_once(defaultNetworkFlag, [&]() {
5467 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5468 });
5469 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5470 }
5471 unsigned getFreeNetId() {
5472 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5473 return mNextNetId++;
5474 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005475
5476 private:
5477 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005478 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5479 // Virtual}Network() is called.
5480 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5481 // is used to create address.
5482 unsigned mNextNetId = TEST_NETID_BASE;
5483 // Use -1 to represent that default network was not modified because
5484 // real netId must be an unsigned value.
5485 int mStoredDefaultNetwork = -1;
5486 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005487};
5488
Mike Yu6ce587d2019-12-19 21:30:22 +08005489Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005490 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005491 unique_fd ufd = TunForwarder::createTun(mIfname);
5492 if (!ufd.ok()) {
5493 return Errorf("createTun for {} failed", mIfname);
5494 }
5495 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5496
Luke Huang81568fb2020-07-13 00:55:12 +08005497 if (auto r = createNetwork(); !r.ok()) {
5498 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005499 }
5500 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5501 return Error() << r.getMessage();
5502 }
5503 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5504 return Error() << r.getMessage();
5505 }
5506
5507 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5508 const std::string v4Addr = makeIpv4AddrString(1);
5509 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5510 return Error() << r.getMessage();
5511 }
5512 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5513 return Error() << r.getMessage();
5514 }
5515 }
5516 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5517 const std::string v6Addr = makeIpv6AddrString(1);
5518 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5519 return Error() << r.getMessage();
5520 }
5521 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5522 return Error() << r.getMessage();
5523 }
5524 }
5525
5526 return {};
5527}
5528
Mike Yu6ce587d2019-12-19 21:30:22 +08005529void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5530 const std::vector<DnsRecord>& records) {
5531 ResolverTest::StartDns(dns, records);
5532
5533 // Bind the DNSResponder's sockets to the network if specified.
5534 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5535 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5536 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5537 }
5538}
5539
5540Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5541 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005542 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005543 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5544
5545 const std::function<std::string(unsigned)> makeIpString =
5546 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5547 : &ScopedNetwork::makeIpv6AddrString,
5548 this, std::placeholders::_1);
5549
5550 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005551 std::string dst1 = makeIpString(
5552 index + 100 +
5553 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005554 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005555 std::string dst2 = makeIpString(
5556 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005557
5558 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5559 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5560 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5561 }
5562
5563 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5564 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5565 }
5566
Luke Huang81568fb2020-07-13 00:55:12 +08005567 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005568}
5569
Luke Huang81568fb2020-07-13 00:55:12 +08005570bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5571 if (mDnsResolvSrv == nullptr) return false;
5572 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5573 parcel.tlsServers.clear();
5574 parcel.netId = mNetId;
5575 parcel.servers.clear();
5576 for (const auto& pair : mDnsServerPairs) {
5577 parcel.servers.push_back(pair.dnsAddr);
5578 }
5579 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5580}
5581
5582bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5583 if (mDnsResolvSrv == nullptr) return false;
5584 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5585 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5586}
5587
5588namespace {
5589
5590// Convenient wrapper for making getaddrinfo call like framework.
5591Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5592 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5593 static const addrinfo hints = {
5594 .ai_flags = AI_ADDRCONFIG,
5595 .ai_family = AF_UNSPEC,
5596 .ai_socktype = SOCK_STREAM,
5597 };
5598 addrinfo* result = nullptr;
5599 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5600 return Error() << r;
5601 }
5602 return ScopedAddrinfo(result);
5603}
5604
5605void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5606 const std::vector<std::string>& expectedResult) {
5607 ScopedChangeUID scopedChangeUID(uid);
5608 auto result = android_getaddrinfofornet_wrapper(name, netId);
5609 ASSERT_RESULT_OK(result);
5610 ScopedAddrinfo ai_result(std::move(result.value()));
5611 std::vector<std::string> result_strs = ToStrings(ai_result);
5612 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5613}
5614
5615} // namespace
5616
Mike Yu6ce587d2019-12-19 21:30:22 +08005617TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5618 constexpr char host_name[] = "ohayou.example.com.";
5619
5620 const std::array<ConnectivityType, 3> allTypes = {
5621 ConnectivityType::V4,
5622 ConnectivityType::V6,
5623 ConnectivityType::V4V6,
5624 };
5625 for (const auto& type : allTypes) {
5626 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5627
5628 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005629 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005630 ASSERT_RESULT_OK(network.init());
5631
5632 // Add a testing DNS server.
5633 const Result<DnsServerPair> dnsPair =
5634 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5635 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005636 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5637 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005638
5639 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005640 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005641 ASSERT_TRUE(network.startTunForwarder());
5642
Luke Huang81568fb2020-07-13 00:55:12 +08005643 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5644 ASSERT_RESULT_OK(result);
5645 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005646 std::vector<std::string> result_strs = ToStrings(ai_result);
5647 std::vector<std::string> expectedResult;
5648 size_t expectedQueries = 0;
5649
5650 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5651 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5652 expectedQueries++;
5653 }
5654 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005655 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005656 expectedQueries++;
5657 }
5658 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005659 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005660 }
5661}
5662
5663TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5664 constexpr char host_name[] = "ohayou.example.com.";
5665
5666 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005667 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5668 mDnsClient.netdService(),
5669 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005670 ASSERT_RESULT_OK(network->init());
5671 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5672 ASSERT_RESULT_OK(dnsPair);
5673
5674 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005675 dnsPair->dnsServer->setResponseProbability(0.0);
5676 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5677 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005678
5679 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005680 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005681 ASSERT_TRUE(network->startTunForwarder());
5682
5683 // Expect the things happening in order:
5684 // 1. The thread sends the query to the dns server which is unresponsive.
5685 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5686 // 3. After the dns server timeout, the thread retries but fails to connect.
5687 std::thread lookup([&]() {
5688 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5689 EXPECT_TRUE(fd != -1);
5690 expectAnswersNotValid(fd, -ETIMEDOUT);
5691 });
5692
5693 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005694 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005695 EXPECT_TRUE(PollForCondition(condition));
5696 network.reset();
5697
5698 lookup.join();
5699}
5700
5701TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5702 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5703 constexpr char host_name[] = "ohayou.example.com.";
5704
Luke Huang81568fb2020-07-13 00:55:12 +08005705 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5706 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005707 ASSERT_RESULT_OK(network1.init());
5708 ASSERT_RESULT_OK(network2.init());
5709
5710 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5711 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5712 ASSERT_RESULT_OK(dnsPair1);
5713 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005714 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5715 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005716
5717 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005718 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005719 ASSERT_TRUE(network1.startTunForwarder());
5720
5721 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005722 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005723 ASSERT_TRUE(network2.startTunForwarder());
5724
5725 // Send the same queries to both networks.
5726 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5727 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5728
Luke Huang81568fb2020-07-13 00:55:12 +08005729 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5730 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5731 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5732 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005733
5734 // Flush the cache of network 1, and send the queries again.
5735 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5736 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5737 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5738
Luke Huang81568fb2020-07-13 00:55:12 +08005739 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5740 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5741 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5742 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5743}
5744
5745TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5746 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5747 SKIP_IF_BPF_NOT_SUPPORTED;
5748 constexpr char host_name[] = "ohayou.example.com.";
5749 constexpr char ipv4_addr[] = "192.0.2.0";
5750 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5751
5752 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5753 {ConnectivityType::V4, {ipv4_addr}},
5754 {ConnectivityType::V6, {ipv6_addr}},
5755 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5756 };
5757 for (const auto& [type, result] : testPairs) {
5758 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5759
5760 // Create a network.
5761 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5762 ScopedVirtualNetwork bypassableVpnNetwork =
5763 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5764 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5765
5766 ASSERT_RESULT_OK(underlyingNetwork.init());
5767 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5768 ASSERT_RESULT_OK(secureVpnNetwork.init());
5769 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5770 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5771
5772 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5773 ScopedNetwork* nw) -> void {
5774 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5775 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5776 ASSERT_TRUE(nw->setDnsConfiguration());
5777 ASSERT_TRUE(nw->startTunForwarder());
5778 };
5779 // Add a testing DNS server to networks.
5780 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5781 ? underlyingNetwork.addIpv4Dns()
5782 : underlyingNetwork.addIpv6Dns();
5783 ASSERT_RESULT_OK(underlyingPair);
5784 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5785 ? bypassableVpnNetwork.addIpv4Dns()
5786 : bypassableVpnNetwork.addIpv6Dns();
5787 ASSERT_RESULT_OK(bypassableVpnPair);
5788 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
5789 ? secureVpnNetwork.addIpv4Dns()
5790 : secureVpnNetwork.addIpv6Dns();
5791 ASSERT_RESULT_OK(secureVpnPair);
5792 // Set up resolver and start forwarding for networks.
5793 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
5794 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
5795 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
5796
5797 setDefaultNetwork(underlyingNetwork.netId());
5798 const unsigned underlyingNetId = underlyingNetwork.netId();
5799 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
5800 const unsigned secureVpnNetId = secureVpnNetwork.netId();
5801 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
5802 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
5803 auto expectDnsQueryCountsFn = [&](size_t count,
5804 std::shared_ptr<test::DNSResponder> dnsServer,
5805 unsigned expectedDnsNetId) -> void {
5806 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
5807 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
5808 dnsServer->clearQueries();
5809 // Give DnsResolver some time to clear cache to avoid race.
5810 usleep(5 * 1000);
5811 };
5812
5813 // Create a object to represent default network, do not init it.
5814 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
5815
5816 // Test VPN with DNS server under 4 different network selection scenarios.
5817 // See the test config for the expectation.
5818 const struct TestConfig {
5819 ScopedNetwork* selectedNetwork;
5820 unsigned expectedDnsNetId;
5821 std::shared_ptr<test::DNSResponder> expectedDnsServer;
5822 } vpnWithDnsServerConfigs[]{
5823 // clang-format off
5824 // Queries use the bypassable VPN by default.
5825 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5826 // Choosing the underlying network works because the VPN is bypassable.
5827 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
5828 // Selecting the VPN sends the query on the VPN.
5829 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5830 // TEST_UID does not have access to the secure VPN.
5831 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5832 // clang-format on
5833 };
5834 for (const auto& config : vpnWithDnsServerConfigs) {
5835 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
5836 config.selectedNetwork->name()));
5837 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
5838 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
5839 config.expectedDnsNetId);
5840 }
5841
5842 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
5843 &bypassableVpnNetwork, &secureVpnNetwork};
5844 // Test the VPN without DNS server with the same combination as before.
5845 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
5846 // Test bypassable VPN, TEST_UID
5847 for (const auto* selectedNetwork : nwVec) {
5848 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
5849 selectedNetwork->name()));
5850 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
5851 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5852 }
5853
5854 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
5855 for (bool enableVpnIsolation : {false, true}) {
5856 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
5857 if (enableVpnIsolation) {
5858 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
5859 }
5860
5861 // Test secure VPN without DNS server.
5862 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
5863 for (const auto* selectedNetwork : nwVec) {
5864 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
5865 selectedNetwork->name()));
5866 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5867 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5868 }
5869
5870 // Test secure VPN with DNS server.
5871 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
5872 for (const auto* selectedNetwork : nwVec) {
5873 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
5874 selectedNetwork->name()));
5875 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5876 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
5877 }
5878
5879 if (enableVpnIsolation) {
5880 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
5881 }
5882 }
5883 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005884}