blob: c49ae3e17d1a4786e857e9ebd6f01dfbe9a2dd3a [file] [log] [blame]
Bernie Innocenti443489e2018-08-10 14:27:23 +09001/*
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 *
10 * Unless requied by applicable law or agreed to in writing, software
11 * 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 Innocentic165ce82018-10-16 23:35:28 +090018#define LOG_TAG "netd_test"
19
Bernie Innocenti443489e2018-08-10 14:27:23 +090020#include <arpa/inet.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080021#include <arpa/nameser.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090022#include <netdb.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080023#include <netinet/in.h>
24#include <poll.h> /* poll */
25#include <resolv.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090026#include <stdarg.h>
27#include <stdio.h>
28#include <stdlib.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080029#include <sys/socket.h>
30#include <sys/un.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090031#include <unistd.h>
32
33#include <algorithm>
34#include <chrono>
35#include <iterator>
36#include <numeric>
37#include <thread>
38
Bernie Innocenti443489e2018-08-10 14:27:23 +090039#include <android-base/stringprintf.h>
Luke Huang952d0942018-12-26 16:53:03 +080040#include <android/multinetwork.h> // ResNsendFlags
Bernie Innocenti0298c682018-10-02 23:18:11 +090041#include <cutils/sockets.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090042#include <gtest/gtest.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090043#include <openssl/base64.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090044#include <private/android_filesystem_config.h>
45#include <utils/Log.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090046
Bernie Innocenti443489e2018-08-10 14:27:23 +090047#include "NetdClient.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090048#include "netid_client.h" // NETID_UNSET
Bernie Innocentic165ce82018-10-16 23:35:28 +090049#include "netd_resolv/params.h" // MAX_NS
Bernie Innocenti443489e2018-08-10 14:27:23 +090050
Ken Chenc68c2de2018-11-13 21:51:13 +080051#include "dns_responder/dns_responder.h"
52#include "dns_responder/dns_responder_client.h"
53#include "dns_responder/dns_tls_frontend.h"
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090054
55#include "NetdConstants.h"
Bernie Innocenti443489e2018-08-10 14:27:23 +090056#include "ResolverStats.h"
57
58#include "android/net/INetd.h"
Bernie Innocenti443489e2018-08-10 14:27:23 +090059#include "binder/IServiceManager.h"
60#include "netdutils/SocketOption.h"
61
Bernie Innocentic165ce82018-10-16 23:35:28 +090062// TODO: make this dynamic and stop depending on implementation details.
Luke Huangc68f1b92018-11-21 20:13:38 +080063constexpr int TEST_NETID = 30;
64constexpr int MAXPACKET = (8 * 1024);
Bernie Innocentic165ce82018-10-16 23:35:28 +090065
66// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
67// Tested here for convenience.
68extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
69 const addrinfo* hints, unsigned netid, unsigned mark,
70 struct addrinfo** result);
71
Bernie Innocenti443489e2018-08-10 14:27:23 +090072using android::base::StringPrintf;
73using android::net::ResolverStats;
Bernie Innocenti443489e2018-08-10 14:27:23 +090074using android::netdutils::enableSockopt;
75
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090076// TODO: move into libnetdutils?
77namespace {
78ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
79 const struct addrinfo* hints) {
80 addrinfo* result = nullptr;
81 if (getaddrinfo(node, service, hints, &result) != 0) {
82 result = nullptr; // Should already be the case, but...
83 }
84 return ScopedAddrinfo(result);
85}
86} // namespace
87
Bernie Innocenti443489e2018-08-10 14:27:23 +090088// Emulates the behavior of UnorderedElementsAreArray, which currently cannot be used.
89// TODO: Use UnorderedElementsAreArray, which depends on being able to compile libgmock_host,
90// if that is not possible, improve this hacky algorithm, which is O(n**2)
91template <class A, class B>
92bool UnorderedCompareArray(const A& a, const B& b) {
93 if (a.size() != b.size()) return false;
94 for (const auto& a_elem : a) {
95 size_t a_count = 0;
96 for (const auto& a_elem2 : a) {
97 if (a_elem == a_elem2) {
98 ++a_count;
99 }
100 }
101 size_t b_count = 0;
102 for (const auto& b_elem : b) {
103 if (a_elem == b_elem) ++b_count;
104 }
105 if (a_count != b_count) return false;
106 }
107 return true;
108}
109
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900110class ResolverTest : public ::testing::Test {
Bernie Innocenti0298c682018-10-02 23:18:11 +0900111 protected:
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900112 void SetUp() { mDnsClient.SetUp(); }
113 void TearDown() { mDnsClient.TearDown(); }
Bernie Innocenti443489e2018-08-10 14:27:23 +0900114
115 bool GetResolverInfo(std::vector<std::string>* servers, std::vector<std::string>* domains,
Mike Yuda77e8e2018-11-26 13:26:21 +0900116 std::vector<std::string>* tlsServers, __res_params* params,
117 std::vector<ResolverStats>* stats) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900118 using android::net::INetd;
119 std::vector<int32_t> params32;
120 std::vector<int32_t> stats32;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900121 auto rv = mDnsClient.netdService()->getResolverInfo(TEST_NETID, servers, domains,
122 tlsServers, &params32, &stats32);
Bernie Innocenti45238a12018-12-04 14:57:48 +0900123 if (!rv.isOk() || params32.size() != static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT)) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900124 return false;
125 }
126 *params = __res_params {
127 .sample_validity = static_cast<uint16_t>(
128 params32[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY]),
129 .success_threshold = static_cast<uint8_t>(
130 params32[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD]),
131 .min_samples = static_cast<uint8_t>(
132 params32[INetd::RESOLVER_PARAMS_MIN_SAMPLES]),
133 .max_samples = static_cast<uint8_t>(
134 params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES]),
135 .base_timeout_msec = params32[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
136 };
137 return ResolverStats::decodeAll(stats32, stats);
138 }
139
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900140 static std::string ToString(const hostent* he) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900141 if (he == nullptr) return "<null>";
142 char buffer[INET6_ADDRSTRLEN];
143 if (!inet_ntop(he->h_addrtype, he->h_addr_list[0], buffer, sizeof(buffer))) {
144 return "<invalid>";
145 }
146 return buffer;
147 }
148
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900149 static std::string ToString(const addrinfo* ai) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900150 if (!ai)
151 return "<null>";
152 for (const auto* aip = ai ; aip != nullptr ; aip = aip->ai_next) {
153 char host[NI_MAXHOST];
154 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
155 NI_NUMERICHOST);
156 if (rv != 0)
157 return gai_strerror(rv);
158 return host;
159 }
160 return "<invalid>";
161 }
162
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900163 static std::string ToString(const ScopedAddrinfo& ai) { return ToString(ai.get()); }
164
nuccachenf52f7a52018-07-17 18:07:23 +0800165 static std::vector<std::string> ToStrings(const addrinfo* ai) {
166 std::vector<std::string> hosts;
167 if (!ai) {
168 hosts.push_back("<null>");
169 return hosts;
170 }
171 for (const auto* aip = ai; aip != nullptr; aip = aip->ai_next) {
172 char host[NI_MAXHOST];
173 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
174 NI_NUMERICHOST);
175 if (rv != 0) {
176 hosts.clear();
177 hosts.push_back(gai_strerror(rv));
178 return hosts;
179 } else {
180 hosts.push_back(host);
181 }
182 }
183 if (hosts.empty()) hosts.push_back("<invalid>");
184 return hosts;
185 }
186
187 static std::vector<std::string> ToStrings(const ScopedAddrinfo& ai) {
188 return ToStrings(ai.get());
189 }
190
Bernie Innocenti443489e2018-08-10 14:27:23 +0900191 size_t GetNumQueries(const test::DNSResponder& dns, const char* name) const {
192 auto queries = dns.queries();
193 size_t found = 0;
194 for (const auto& p : queries) {
195 if (p.first == name) {
196 ++found;
197 }
198 }
199 return found;
200 }
201
202 size_t GetNumQueriesForType(const test::DNSResponder& dns, ns_type type,
Bernie Innocenti0298c682018-10-02 23:18:11 +0900203 const char* name) const {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900204 auto queries = dns.queries();
205 size_t found = 0;
206 for (const auto& p : queries) {
207 if (p.second == type && p.first == name) {
208 ++found;
209 }
210 }
211 return found;
212 }
213
nuccachenf52f7a52018-07-17 18:07:23 +0800214 bool WaitForPrefix64Detected(int netId, int timeoutMs) {
215 constexpr int intervalMs = 2;
216 const int limit = timeoutMs / intervalMs;
217 for (int count = 0; count <= limit; ++count) {
218 std::string prefix;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900219 auto rv = mDnsClient.netdService()->getPrefix64(netId, &prefix);
nuccachenf52f7a52018-07-17 18:07:23 +0800220 if (rv.isOk()) {
221 return true;
222 }
223 usleep(intervalMs * 1000);
224 }
225 return false;
226 }
227
Bernie Innocenti443489e2018-08-10 14:27:23 +0900228 void RunGetAddrInfoStressTest_Binder(unsigned num_hosts, unsigned num_threads,
229 unsigned num_queries) {
230 std::vector<std::string> domains = { "example.com" };
231 std::vector<std::unique_ptr<test::DNSResponder>> dns;
232 std::vector<std::string> servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900233 std::vector<DnsResponderClient::DnsResponderClient::Mapping> mappings;
234 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(num_hosts, domains, &mappings));
235 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS, mappings, &dns, &servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900236
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900237 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900238
239 auto t0 = std::chrono::steady_clock::now();
240 std::vector<std::thread> threads(num_threads);
241 for (std::thread& thread : threads) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900242 thread = std::thread([&mappings, num_queries]() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900243 for (unsigned i = 0 ; i < num_queries ; ++i) {
244 uint32_t ofs = arc4random_uniform(mappings.size());
245 auto& mapping = mappings[ofs];
246 addrinfo* result = nullptr;
247 int rv = getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result);
248 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
249 if (rv == 0) {
250 std::string result_str = ToString(result);
251 EXPECT_TRUE(result_str == mapping.ip4 || result_str == mapping.ip6)
252 << "result='" << result_str << "', ip4='" << mapping.ip4
253 << "', ip6='" << mapping.ip6;
254 }
255 if (result) {
256 freeaddrinfo(result);
257 result = nullptr;
258 }
259 }
260 });
261 }
262
263 for (std::thread& thread : threads) {
264 thread.join();
265 }
266 auto t1 = std::chrono::steady_clock::now();
267 ALOGI("%u hosts, %u threads, %u queries, %Es", num_hosts, num_threads, num_queries,
268 std::chrono::duration<double>(t1 - t0).count());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900269 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900270 }
271
272 const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
273 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900274 const std::vector<int> mDefaultParams = {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900275 300, // SAMPLE_VALIDITY
276 25, // SUCCESS_THRESHOLD
277 8, 8, // {MIN,MAX}_SAMPLES
278 100, // BASE_TIMEOUT_MSEC
279 };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900280
281 DnsResponderClient mDnsClient;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900282};
283
284TEST_F(ResolverTest, GetHostByName) {
285 const char* listen_addr = "127.0.0.3";
286 const char* listen_srv = "53";
287 const char* host_name = "hello.example.com.";
288 const char *nonexistent_host_name = "nonexistent.example.com.";
289 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
290 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
291 ASSERT_TRUE(dns.startServer());
292 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900293 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900294
295 const hostent* result;
296
297 dns.clearQueries();
298 result = gethostbyname("nonexistent");
299 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
300 ASSERT_TRUE(result == nullptr);
301 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
302
303 dns.clearQueries();
304 result = gethostbyname("hello");
305 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
306 ASSERT_FALSE(result == nullptr);
307 ASSERT_EQ(4, result->h_length);
308 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
309 EXPECT_EQ("1.2.3.3", ToString(result));
310 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
311
312 dns.stopServer();
313}
314
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900315TEST_F(ResolverTest, GetHostByName_localhost) {
316 constexpr char name[] = "localhost";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900317 constexpr char name_camelcase[] = "LocalHost";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900318 constexpr char addr[] = "127.0.0.1";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900319 constexpr char name_ip6[] = "ip6-localhost";
320 constexpr char addr_ip6[] = "::1";
Bernie Innocenti0298c682018-10-02 23:18:11 +0900321 constexpr char name_ip6_dot[] = "ip6-localhost.";
322 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900323
Bernie Innocenti974233e2018-09-04 20:35:34 +0900324 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900325 constexpr char listen_addr[] = "127.0.0.3";
326 constexpr char listen_srv[] = "53";
327 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
328 ASSERT_TRUE(dns.startServer());
329 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900330 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900331 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900332
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900333 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900334 const hostent* result = gethostbyname(name);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900335 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900336 ASSERT_FALSE(result == nullptr);
337 ASSERT_EQ(4, result->h_length);
338 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
339 EXPECT_EQ(addr, ToString(result));
340 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
341
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900342 // Ensure the hosts file resolver ignores case of hostnames
343 result = gethostbyname(name_camelcase);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900344 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900345 ASSERT_FALSE(result == nullptr);
346 ASSERT_EQ(4, result->h_length);
347 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
348 EXPECT_EQ(addr, ToString(result));
349 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
350
351 // The hosts file also contains ip6-localhost, but gethostbyname() won't
Bernie Innocenti0298c682018-10-02 23:18:11 +0900352 // return it unless the RES_USE_INET6 option is set. This would be easy to
353 // change, but there's no point in changing the legacy behavior; new code
354 // should be calling getaddrinfo() anyway.
355 // So we check the legacy behavior, which results in amusing A-record
356 // lookups for ip6-localhost, with and without search domains appended.
357 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900358 result = gethostbyname(name_ip6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900359 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
360 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
361 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900362 ASSERT_TRUE(result == nullptr);
363
Bernie Innocenti0298c682018-10-02 23:18:11 +0900364 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
365 // the hosts file.
366 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900367 result = gethostbyname2(name_ip6, AF_INET6);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900368 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900369 ASSERT_FALSE(result == nullptr);
370 ASSERT_EQ(16, result->h_length);
371 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
372 EXPECT_EQ(addr_ip6, ToString(result));
373 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
374
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900375 dns.stopServer();
376}
377
Bernie Innocentic1545232018-10-04 17:12:24 +0900378TEST_F(ResolverTest, GetHostByName_numeric) {
379 // Add a dummy nameserver which shouldn't receive any queries
380 constexpr char listen_addr[] = "127.0.0.3";
381 constexpr char listen_srv[] = "53";
382 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
383 ASSERT_TRUE(dns.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900384 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, mDefaultSearchDomains,
385 mDefaultParams));
Bernie Innocentic1545232018-10-04 17:12:24 +0900386
387 // Numeric v4 address: expect no DNS queries
388 constexpr char numeric_v4[] = "192.168.0.1";
389 dns.clearQueries();
390 const hostent* result = gethostbyname(numeric_v4);
Sehee Park8659b8d2018-11-16 10:53:16 +0900391 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900392 ASSERT_FALSE(result == nullptr);
393 ASSERT_EQ(4, result->h_length); // v4
394 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
395 EXPECT_EQ(numeric_v4, ToString(result));
396 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
397
398 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
399 constexpr char numeric_v6[] = "2001:db8::42";
400 dns.clearQueries();
401 result = gethostbyname(numeric_v6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900402 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900403 EXPECT_TRUE(result == nullptr);
404
405 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
406 dns.clearQueries();
407 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900408 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900409 ASSERT_FALSE(result == nullptr);
410 ASSERT_EQ(16, result->h_length); // v6
411 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
412 EXPECT_EQ(numeric_v6, ToString(result));
413 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
414
415 // Numeric v6 address with scope work with getaddrinfo(),
416 // but gethostbyname2() does not understand them; it issues two dns
417 // queries, then fails. This hardly ever happens, there's no point
418 // in fixing this. This test simply verifies the current (bogus)
419 // behavior to avoid further regressions (like crashes, or leaks).
420 constexpr char numeric_v6_scope[] = "fe80::1%lo";
421 dns.clearQueries();
422 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900423 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Bernie Innocentic1545232018-10-04 17:12:24 +0900424 ASSERT_TRUE(result == nullptr);
425
426 dns.stopServer();
427}
428
Bernie Innocenti443489e2018-08-10 14:27:23 +0900429TEST_F(ResolverTest, BinderSerialization) {
430 using android::net::INetd;
431 std::vector<int> params_offsets = {
432 INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY,
433 INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
434 INetd::RESOLVER_PARAMS_MIN_SAMPLES,
435 INetd::RESOLVER_PARAMS_MAX_SAMPLES,
436 INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
437 };
Bernie Innocenti45238a12018-12-04 14:57:48 +0900438 const int size = static_cast<int>(params_offsets.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900439 EXPECT_EQ(size, INetd::RESOLVER_PARAMS_COUNT);
440 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900441 for (int i = 0; i < size; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900442 EXPECT_EQ(params_offsets[i], i);
443 }
444}
445
446TEST_F(ResolverTest, GetHostByName_Binder) {
447 using android::net::INetd;
448
449 std::vector<std::string> domains = { "example.com" };
450 std::vector<std::unique_ptr<test::DNSResponder>> dns;
451 std::vector<std::string> servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900452 std::vector<DnsResponderClient::Mapping> mappings;
453 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
454 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900455 ASSERT_EQ(1U, mappings.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900456 const DnsResponderClient::Mapping& mapping = mappings[0];
Bernie Innocenti443489e2018-08-10 14:27:23 +0900457
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900458 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900459
460 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900461 const size_t total_queries =
462 std::accumulate(dns.begin(), dns.end(), 0, [this, &mapping](size_t total, auto& d) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900463 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
464 });
465
466 EXPECT_LE(1U, total_queries);
467 ASSERT_FALSE(result == nullptr);
468 ASSERT_EQ(4, result->h_length);
469 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
470 EXPECT_EQ(mapping.ip4, ToString(result));
471 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
472
473 std::vector<std::string> res_servers;
474 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900475 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900476 __res_params res_params;
477 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900478 ASSERT_TRUE(
479 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900480 EXPECT_EQ(servers.size(), res_servers.size());
481 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900482 EXPECT_EQ(0U, res_tls_servers.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900483 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams.size());
484 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY], res_params.sample_validity);
485 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
486 res_params.success_threshold);
487 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
488 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
489 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Bernie Innocenti443489e2018-08-10 14:27:23 +0900490 res_params.base_timeout_msec);
491 EXPECT_EQ(servers.size(), res_stats.size());
492
493 EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
494 EXPECT_TRUE(UnorderedCompareArray(res_domains, domains));
495
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900496 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900497}
498
499TEST_F(ResolverTest, GetAddrInfo) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900500 const char* listen_addr = "127.0.0.4";
501 const char* listen_addr2 = "127.0.0.5";
502 const char* listen_srv = "53";
503 const char* host_name = "howdy.example.com.";
504 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
505 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
506 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
507 ASSERT_TRUE(dns.startServer());
508
509 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
510 dns2.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
511 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
512 ASSERT_TRUE(dns2.startServer());
513
Bernie Innocenti443489e2018-08-10 14:27:23 +0900514 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900515 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900516 dns.clearQueries();
517 dns2.clearQueries();
518
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900519 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
520 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900521 size_t found = GetNumQueries(dns, host_name);
522 EXPECT_LE(1U, found);
523 // Could be A or AAAA
524 std::string result_str = ToString(result);
525 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
526 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900527
528 // Verify that the name is cached.
529 size_t old_found = found;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900530 result = safe_getaddrinfo("howdy", nullptr, nullptr);
531 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900532 found = GetNumQueries(dns, host_name);
533 EXPECT_LE(1U, found);
534 EXPECT_EQ(old_found, found);
535 result_str = ToString(result);
536 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
537 << result_str;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900538
539 // Change the DNS resolver, ensure that queries are still cached.
540 servers = { listen_addr2 };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900541 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900542 dns.clearQueries();
543 dns2.clearQueries();
544
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900545 result = safe_getaddrinfo("howdy", nullptr, nullptr);
546 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900547 found = GetNumQueries(dns, host_name);
548 size_t found2 = GetNumQueries(dns2, host_name);
549 EXPECT_EQ(0U, found);
550 EXPECT_LE(0U, found2);
551
552 // Could be A or AAAA
553 result_str = ToString(result);
554 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
555 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900556
557 dns.stopServer();
558 dns2.stopServer();
559}
560
561TEST_F(ResolverTest, GetAddrInfoV4) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900562 constexpr char listen_addr[] = "127.0.0.5";
563 constexpr char listen_srv[] = "53";
564 constexpr char host_name[] = "hola.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900565 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
566 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.5");
567 ASSERT_TRUE(dns.startServer());
568 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900569 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900570
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900571 addrinfo hints = {.ai_family = AF_INET};
572 ScopedAddrinfo result = safe_getaddrinfo("hola", nullptr, &hints);
573 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900574 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
575 EXPECT_EQ("1.2.3.5", ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900576}
577
578TEST_F(ResolverTest, GetAddrInfo_localhost) {
579 constexpr char name[] = "localhost";
580 constexpr char addr[] = "127.0.0.1";
581 constexpr char name_ip6[] = "ip6-localhost";
582 constexpr char addr_ip6[] = "::1";
583
Bernie Innocenti974233e2018-09-04 20:35:34 +0900584 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900585 constexpr char listen_addr[] = "127.0.0.5";
586 constexpr char listen_srv[] = "53";
587 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
588 ASSERT_TRUE(dns.startServer());
589 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900590 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900591
592 ScopedAddrinfo result = safe_getaddrinfo(name, nullptr, nullptr);
593 EXPECT_TRUE(result != nullptr);
594 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti0298c682018-10-02 23:18:11 +0900595 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900596 EXPECT_EQ(addr, ToString(result));
597
598 result = safe_getaddrinfo(name_ip6, nullptr, nullptr);
599 EXPECT_TRUE(result != nullptr);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900600 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
601 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900602 EXPECT_EQ(addr_ip6, ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900603}
604
Bernie Innocenti443489e2018-08-10 14:27:23 +0900605TEST_F(ResolverTest, MultidomainResolution) {
606 std::vector<std::string> searchDomains = { "example1.com", "example2.com", "example3.com" };
607 const char* listen_addr = "127.0.0.6";
608 const char* listen_srv = "53";
609 const char* host_name = "nihao.example2.com.";
610 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
611 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
612 ASSERT_TRUE(dns.startServer());
613 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900614 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, searchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900615
616 dns.clearQueries();
617 const hostent* result = gethostbyname("nihao");
618 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
619 ASSERT_FALSE(result == nullptr);
620 ASSERT_EQ(4, result->h_length);
621 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
622 EXPECT_EQ("1.2.3.3", ToString(result));
623 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
624 dns.stopServer();
625}
626
Bernie Innocenti974233e2018-09-04 20:35:34 +0900627TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
628 constexpr char listen_addr0[] = "127.0.0.7";
629 constexpr char listen_srv[] = "53";
630 constexpr char host_name[] = "ohayou.example.com.";
631 constexpr char numeric_addr[] = "fe80::1%lo";
632
633 test::DNSResponder dns(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
634 dns.setResponseProbability(0.0);
635 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
636 ASSERT_TRUE(dns.startServer());
637 std::vector<std::string> servers = {listen_addr0};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900638 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti974233e2018-09-04 20:35:34 +0900639
640 addrinfo hints = {.ai_family = AF_INET6};
641 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
642 EXPECT_TRUE(result != nullptr);
643 EXPECT_EQ(numeric_addr, ToString(result));
644 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
645
646 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
647 // We should fail without sending out a DNS query.
648 hints.ai_flags |= AI_NUMERICHOST;
649 result = safe_getaddrinfo(host_name, nullptr, &hints);
650 EXPECT_TRUE(result == nullptr);
651 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
652}
653
Bernie Innocenti443489e2018-08-10 14:27:23 +0900654TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900655 const char* listen_addr0 = "127.0.0.7";
656 const char* listen_addr1 = "127.0.0.8";
657 const char* listen_srv = "53";
658 const char* host_name = "ohayou.example.com.";
659 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
660 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
661 dns0.setResponseProbability(0.0);
662 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
663 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
664 ASSERT_TRUE(dns0.startServer());
665 ASSERT_TRUE(dns1.startServer());
666 std::vector<std::string> servers = { listen_addr0, listen_addr1 };
667 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
668 int sample_count = 8;
669 const std::vector<int> params = { 300, 25, sample_count, sample_count };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900670 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, params));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900671
672 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
673 // reached the dns0, which is set to fail. No more requests should then arrive at that server
674 // for the next sample_lifetime seconds.
675 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900676 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti45238a12018-12-04 14:57:48 +0900677 for (int i = 0; i < sample_count; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900678 std::string domain = StringPrintf("nonexistent%d", i);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900679 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900680 }
681 // Due to 100% errors for all possible samples, the server should be ignored from now on and
682 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
683 dns0.clearQueries();
684 dns1.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900685 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
686 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900687 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
688 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900689}
690
691TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900692 const char* listen_addr0 = "127.0.0.7";
693 const char* listen_addr1 = "127.0.0.8";
694 const char* listen_srv = "53";
695 const char* host_name1 = "ohayou.example.com.";
696 const char* host_name2 = "ciao.example.com.";
697
698 // dns0 does not respond with 100% probability, while
699 // dns1 responds normally, at least initially.
700 test::DNSResponder dns0(listen_addr0, listen_srv, 250, static_cast<ns_rcode>(-1));
701 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
702 dns0.setResponseProbability(0.0);
703 dns0.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::5");
704 dns1.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::6");
705 dns0.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::5");
706 dns1.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::6");
707 ASSERT_TRUE(dns0.startServer());
708 ASSERT_TRUE(dns1.startServer());
709 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900710 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900711
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900712 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900713
714 // dns0 will ignore the request, and we'll fallback to dns1 after the first
715 // retry.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900716 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
717 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900718 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
719 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
720
721 // Now make dns1 also ignore 100% requests... The resolve should alternate
722 // retries between the nameservers and fail after 4 attempts.
723 dns1.setResponseProbability(0.0);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900724 addrinfo* result2 = nullptr;
725 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
726 EXPECT_EQ(nullptr, result2);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900727 EXPECT_EQ(4U, GetNumQueries(dns0, host_name2));
728 EXPECT_EQ(4U, GetNumQueries(dns1, host_name2));
729}
730
731TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
732 const char* listen_addr0 = "127.0.0.9";
733 const char* listen_addr1 = "127.0.0.10";
734 const char* listen_addr2 = "127.0.0.11";
735 const char* listen_srv = "53";
736 const char* host_name = "konbanha.example.com.";
737 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
738 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
739 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
740 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
741 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
742 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::7");
743 ASSERT_TRUE(dns0.startServer());
744 ASSERT_TRUE(dns1.startServer());
745 ASSERT_TRUE(dns2.startServer());
746 const std::vector<std::string> servers = { listen_addr0, listen_addr1, listen_addr2 };
747 std::vector<std::thread> threads(10);
748 for (std::thread& thread : threads) {
749 thread = std::thread([this, &servers]() {
750 unsigned delay = arc4random_uniform(1*1000*1000); // <= 1s
751 usleep(delay);
752 std::vector<std::string> serverSubset;
753 for (const auto& server : servers) {
754 if (arc4random_uniform(2)) {
755 serverSubset.push_back(server);
756 }
757 }
758 if (serverSubset.empty()) serverSubset = servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900759 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset, mDefaultSearchDomains,
760 mDefaultParams));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900761 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900762 addrinfo* result = nullptr;
763 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
764 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
765 if (result) {
766 freeaddrinfo(result);
767 result = nullptr;
768 }
769 });
770 }
771 for (std::thread& thread : threads) {
772 thread.join();
773 }
774}
775
776TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100) {
777 const unsigned num_hosts = 100;
778 const unsigned num_threads = 100;
779 const unsigned num_queries = 100;
780 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
781}
782
783TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100000) {
784 const unsigned num_hosts = 100000;
785 const unsigned num_threads = 100;
786 const unsigned num_queries = 100;
787 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
788}
789
790TEST_F(ResolverTest, EmptySetup) {
791 using android::net::INetd;
792 std::vector<std::string> servers;
793 std::vector<std::string> domains;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900794 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900795 std::vector<std::string> res_servers;
796 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900797 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900798 __res_params res_params;
799 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900800 ASSERT_TRUE(
801 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900802 EXPECT_EQ(0U, res_servers.size());
803 EXPECT_EQ(0U, res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900804 EXPECT_EQ(0U, res_tls_servers.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900805 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams.size());
806 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY], res_params.sample_validity);
807 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
808 res_params.success_threshold);
809 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
810 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
811 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Bernie Innocenti443489e2018-08-10 14:27:23 +0900812 res_params.base_timeout_msec);
813}
814
815TEST_F(ResolverTest, SearchPathChange) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900816 const char* listen_addr = "127.0.0.13";
817 const char* listen_srv = "53";
818 const char* host_name1 = "test13.domain1.org.";
819 const char* host_name2 = "test13.domain2.org.";
820 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
821 dns.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::13");
822 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13");
823 ASSERT_TRUE(dns.startServer());
824 std::vector<std::string> servers = { listen_addr };
825 std::vector<std::string> domains = { "domain1.org" };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900826 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900827
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900828 const addrinfo hints = {.ai_family = AF_INET6};
829 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
830 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900831 EXPECT_EQ(1U, dns.queries().size());
832 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
833 EXPECT_EQ("2001:db8::13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900834
835 // Test that changing the domain search path on its own works.
836 domains = { "domain2.org" };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900837 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900838 dns.clearQueries();
839
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900840 result = safe_getaddrinfo("test13", nullptr, &hints);
841 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900842 EXPECT_EQ(1U, dns.queries().size());
843 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
844 EXPECT_EQ("2001:db8::1:13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900845}
846
Bernie Innocenti443489e2018-08-10 14:27:23 +0900847static std::string base64Encode(const std::vector<uint8_t>& input) {
848 size_t out_len;
849 EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));
850 // out_len includes the trailing NULL.
851 uint8_t output_bytes[out_len];
852 EXPECT_EQ(out_len - 1, EVP_EncodeBlock(output_bytes, input.data(), input.size()));
853 return std::string(reinterpret_cast<char*>(output_bytes));
854}
855
Mike Yuda77e8e2018-11-26 13:26:21 +0900856// If we move this function to dns_responder_client, it will complicate the dependency need of
857// dns_tls_frontend.h.
858static void setupTlsServers(const std::vector<std::string>& servers,
859 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls,
860 std::vector<std::string>* fingerprints) {
861 const char* listen_udp = "53";
862 const char* listen_tls = "853";
863
864 for (const auto& server : servers) {
865 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
866 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
867 t->startServer();
868 fingerprints->push_back(base64Encode(t->fingerprint()));
869 tls->push_back(std::move(t));
870 }
871}
872
873static void shutdownTlsServers(std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
874 for (const auto& t : *tls) {
875 t->stopServer();
876 }
877 tls->clear();
878}
879
880TEST_F(ResolverTest, MaxServerPrune_Binder) {
881 using android::net::INetd;
882
883 std::vector<std::string> domains;
884 std::vector<std::unique_ptr<test::DNSResponder>> dns;
885 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
886 std::vector<std::string> servers;
887 std::vector<std::string> fingerprints;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900888 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yuda77e8e2018-11-26 13:26:21 +0900889
890 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
891 domains.push_back(StringPrintf("example%u.com", i));
892 }
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900893 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
894 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
Mike Yuda77e8e2018-11-26 13:26:21 +0900895 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls, &fingerprints));
896
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900897 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, mDefaultParams, "", fingerprints));
Mike Yuda77e8e2018-11-26 13:26:21 +0900898
899 std::vector<std::string> res_servers;
900 std::vector<std::string> res_domains;
901 std::vector<std::string> res_tls_servers;
902 __res_params res_params;
903 std::vector<ResolverStats> res_stats;
904 ASSERT_TRUE(
905 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
906
907 // Check the size of the stats and its contents.
908 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
909 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
910 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
911 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
912 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
913 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
914
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900915 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Mike Yuda77e8e2018-11-26 13:26:21 +0900916 ASSERT_NO_FATAL_FAILURE(shutdownTlsServers(&tls));
917}
918
919TEST_F(ResolverTest, ResolverStats) {
920 const char* listen_addr1 = "127.0.0.4";
921 const char* listen_addr2 = "127.0.0.5";
922 const char* listen_addr3 = "127.0.0.6";
923 const char* listen_srv = "53";
924 const char* host_name = "hello.example.com.";
925
926 // Set server 1 timeout.
927 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
928 dns1.setResponseProbability(0.0);
929 ASSERT_TRUE(dns1.startServer());
930
931 // Set server 2 responding server failure.
932 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
933 dns2.setResponseProbability(0.0);
934 ASSERT_TRUE(dns2.startServer());
935
936 // Set server 3 workable.
937 test::DNSResponder dns3(listen_addr3, listen_srv, 250, ns_rcode::ns_r_servfail);
938 dns3.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
939 ASSERT_TRUE(dns3.startServer());
940
941 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900942 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Mike Yuda77e8e2018-11-26 13:26:21 +0900943
944 dns3.clearQueries();
945 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
946 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
947 size_t found = GetNumQueries(dns3, host_name);
948 EXPECT_LE(1U, found);
949 std::string result_str = ToString(result);
950 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
951
952 std::vector<std::string> res_servers;
953 std::vector<std::string> res_domains;
954 std::vector<std::string> res_tls_servers;
955 __res_params res_params;
956 std::vector<ResolverStats> res_stats;
957 ASSERT_TRUE(
958 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
959
960 EXPECT_EQ(1, res_stats[0].timeouts);
961 EXPECT_EQ(1, res_stats[1].errors);
962 EXPECT_EQ(1, res_stats[2].successes);
963
964 dns1.stopServer();
965 dns2.stopServer();
966 dns3.stopServer();
967}
968
Bernie Innocenti443489e2018-08-10 14:27:23 +0900969// Test what happens if the specified TLS server is nonexistent.
970TEST_F(ResolverTest, GetHostByName_TlsMissing) {
971 const char* listen_addr = "127.0.0.3";
972 const char* listen_srv = "53";
973 const char* host_name = "tlsmissing.example.com.";
974 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
975 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
976 ASSERT_TRUE(dns.startServer());
977 std::vector<std::string> servers = { listen_addr };
978
979 // There's nothing listening on this address, so validation will either fail or
980 /// hang. Either way, queries will continue to flow to the DNSResponder.
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900981 ASSERT_TRUE(
982 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900983
984 const hostent* result;
985
986 result = gethostbyname("tlsmissing");
987 ASSERT_FALSE(result == nullptr);
988 EXPECT_EQ("1.2.3.3", ToString(result));
989
990 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900991 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900992 dns.stopServer();
993}
994
995// Test what happens if the specified TLS server replies with garbage.
996TEST_F(ResolverTest, GetHostByName_TlsBroken) {
997 const char* listen_addr = "127.0.0.3";
998 const char* listen_srv = "53";
999 const char* host_name1 = "tlsbroken1.example.com.";
1000 const char* host_name2 = "tlsbroken2.example.com.";
1001 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1002 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1003 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1004 ASSERT_TRUE(dns.startServer());
1005 std::vector<std::string> servers = { listen_addr };
1006
1007 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1008 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1009 ASSERT_TRUE(s >= 0);
1010 struct sockaddr_in tlsServer = {
1011 .sin_family = AF_INET,
1012 .sin_port = htons(853),
1013 };
1014 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
Bernie Innocenti6f9fd902018-10-11 20:50:23 +09001015 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1016 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001017 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1018 ASSERT_FALSE(listen(s, 1));
1019
1020 // Trigger TLS validation.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001021 ASSERT_TRUE(
1022 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001023
1024 struct sockaddr_storage cliaddr;
1025 socklen_t sin_size = sizeof(cliaddr);
1026 int new_fd = accept4(s, reinterpret_cast<struct sockaddr *>(&cliaddr), &sin_size, SOCK_CLOEXEC);
1027 ASSERT_TRUE(new_fd > 0);
1028
1029 // We've received the new file descriptor but not written to it or closed, so the
1030 // validation is still pending. Queries should still flow correctly because the
1031 // server is not used until validation succeeds.
1032 const hostent* result;
1033 result = gethostbyname("tlsbroken1");
1034 ASSERT_FALSE(result == nullptr);
1035 EXPECT_EQ("1.2.3.1", ToString(result));
1036
1037 // Now we cause the validation to fail.
1038 std::string garbage = "definitely not a valid TLS ServerHello";
1039 write(new_fd, garbage.data(), garbage.size());
1040 close(new_fd);
1041
1042 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1043 // to the TLS server unless validation succeeds.
1044 result = gethostbyname("tlsbroken2");
1045 ASSERT_FALSE(result == nullptr);
1046 EXPECT_EQ("1.2.3.2", ToString(result));
1047
1048 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001049 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001050 dns.stopServer();
1051 close(s);
1052}
1053
1054TEST_F(ResolverTest, GetHostByName_Tls) {
1055 const char* listen_addr = "127.0.0.3";
1056 const char* listen_udp = "53";
1057 const char* listen_tls = "853";
1058 const char* host_name1 = "tls1.example.com.";
1059 const char* host_name2 = "tls2.example.com.";
1060 const char* host_name3 = "tls3.example.com.";
1061 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1062 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1063 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1064 dns.addMapping(host_name3, ns_type::ns_t_a, "1.2.3.3");
1065 ASSERT_TRUE(dns.startServer());
1066 std::vector<std::string> servers = { listen_addr };
1067
1068 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1069 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001070 ASSERT_TRUE(
1071 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001072
1073 const hostent* result;
1074
1075 // Wait for validation to complete.
1076 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1077
1078 result = gethostbyname("tls1");
1079 ASSERT_FALSE(result == nullptr);
1080 EXPECT_EQ("1.2.3.1", ToString(result));
1081
1082 // Wait for query to get counted.
1083 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1084
1085 // Stop the TLS server. Since we're in opportunistic mode, queries will
1086 // fall back to the locally-assigned (clear text) nameservers.
1087 tls.stopServer();
1088
1089 dns.clearQueries();
1090 result = gethostbyname("tls2");
1091 EXPECT_FALSE(result == nullptr);
1092 EXPECT_EQ("1.2.3.2", ToString(result));
1093 const auto queries = dns.queries();
1094 EXPECT_EQ(1U, queries.size());
1095 EXPECT_EQ("tls2.example.com.", queries[0].first);
1096 EXPECT_EQ(ns_t_a, queries[0].second);
1097
1098 // Reset the resolvers without enabling TLS. Queries should still be routed
1099 // to the UDP endpoint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001100 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001101
1102 result = gethostbyname("tls3");
1103 ASSERT_FALSE(result == nullptr);
1104 EXPECT_EQ("1.2.3.3", ToString(result));
1105
1106 dns.stopServer();
1107}
1108
1109TEST_F(ResolverTest, GetHostByName_TlsFingerprint) {
1110 const char* listen_addr = "127.0.0.3";
1111 const char* listen_udp = "53";
1112 const char* listen_tls = "853";
1113 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1114 ASSERT_TRUE(dns.startServer());
1115 for (int chain_length = 1; chain_length <= 3; ++chain_length) {
Bernie Innocentif2572392018-10-02 19:04:56 +09001116 std::string host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001117 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1118 std::vector<std::string> servers = { listen_addr };
1119
1120 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1121 tls.set_chain_length(chain_length);
1122 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001123 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams,
1124 "", {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001125
1126 const hostent* result;
1127
1128 // Wait for validation to complete.
1129 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1130
1131 result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
1132 EXPECT_FALSE(result == nullptr);
1133 if (result) {
1134 EXPECT_EQ("1.2.3.1", ToString(result));
1135
1136 // Wait for query to get counted.
1137 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1138 }
1139
1140 // Clear TLS bit to ensure revalidation.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001141 ASSERT_TRUE(
1142 mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001143 tls.stopServer();
1144 }
1145 dns.stopServer();
1146}
1147
1148TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {
1149 const char* listen_addr = "127.0.0.3";
1150 const char* listen_udp = "53";
1151 const char* listen_tls = "853";
1152 const char* host_name = "badtlsfingerprint.example.com.";
1153 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1154 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1155 ASSERT_TRUE(dns.startServer());
1156 std::vector<std::string> servers = { listen_addr };
1157
1158 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1159 ASSERT_TRUE(tls.startServer());
1160 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1161 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001162 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "",
1163 {base64Encode(bad_fingerprint)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001164
1165 // The initial validation should fail at the fingerprint check before
1166 // issuing a query.
1167 EXPECT_FALSE(tls.waitForQueries(1, 500));
1168
1169 // A fingerprint was provided and failed to match, so the query should fail.
1170 EXPECT_EQ(nullptr, gethostbyname("badtlsfingerprint"));
1171
1172 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001173 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001174 tls.stopServer();
1175 dns.stopServer();
1176}
1177
1178// Test that we can pass two different fingerprints, and connection succeeds as long as
1179// at least one of them matches the server.
1180TEST_F(ResolverTest, GetHostByName_TwoTlsFingerprints) {
1181 const char* listen_addr = "127.0.0.3";
1182 const char* listen_udp = "53";
1183 const char* listen_tls = "853";
1184 const char* host_name = "twotlsfingerprints.example.com.";
1185 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1186 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1187 ASSERT_TRUE(dns.startServer());
1188 std::vector<std::string> servers = { listen_addr };
1189
1190 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1191 ASSERT_TRUE(tls.startServer());
1192 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1193 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001194 ASSERT_TRUE(mDnsClient.SetResolversWithTls(
1195 servers, mDefaultSearchDomains, mDefaultParams, "",
1196 {base64Encode(bad_fingerprint), base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001197
1198 const hostent* result;
1199
1200 // Wait for validation to complete.
1201 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1202
1203 result = gethostbyname("twotlsfingerprints");
1204 ASSERT_FALSE(result == nullptr);
1205 EXPECT_EQ("1.2.3.1", ToString(result));
1206
1207 // Wait for query to get counted.
1208 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1209
1210 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001211 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001212 tls.stopServer();
1213 dns.stopServer();
1214}
1215
1216TEST_F(ResolverTest, GetHostByName_TlsFingerprintGoesBad) {
1217 const char* listen_addr = "127.0.0.3";
1218 const char* listen_udp = "53";
1219 const char* listen_tls = "853";
1220 const char* host_name1 = "tlsfingerprintgoesbad1.example.com.";
1221 const char* host_name2 = "tlsfingerprintgoesbad2.example.com.";
1222 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1223 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1224 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1225 ASSERT_TRUE(dns.startServer());
1226 std::vector<std::string> servers = { listen_addr };
1227
1228 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1229 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001230 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "",
1231 {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001232
1233 const hostent* result;
1234
1235 // Wait for validation to complete.
1236 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1237
1238 result = gethostbyname("tlsfingerprintgoesbad1");
1239 ASSERT_FALSE(result == nullptr);
1240 EXPECT_EQ("1.2.3.1", ToString(result));
1241
1242 // Wait for query to get counted.
1243 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1244
1245 // Restart the TLS server. This will generate a new certificate whose fingerprint
1246 // no longer matches the stored fingerprint.
1247 tls.stopServer();
1248 tls.startServer();
1249
1250 result = gethostbyname("tlsfingerprintgoesbad2");
1251 ASSERT_TRUE(result == nullptr);
1252 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
1253
1254 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001255 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001256 tls.stopServer();
1257 dns.stopServer();
1258}
1259
1260TEST_F(ResolverTest, GetHostByName_TlsFailover) {
1261 const char* listen_addr1 = "127.0.0.3";
1262 const char* listen_addr2 = "127.0.0.4";
1263 const char* listen_udp = "53";
1264 const char* listen_tls = "853";
1265 const char* host_name1 = "tlsfailover1.example.com.";
1266 const char* host_name2 = "tlsfailover2.example.com.";
1267 test::DNSResponder dns1(listen_addr1, listen_udp, 250, ns_rcode::ns_r_servfail);
1268 test::DNSResponder dns2(listen_addr2, listen_udp, 250, ns_rcode::ns_r_servfail);
1269 dns1.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1270 dns1.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1271 dns2.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.3");
1272 dns2.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
1273 ASSERT_TRUE(dns1.startServer());
1274 ASSERT_TRUE(dns2.startServer());
1275 std::vector<std::string> servers = { listen_addr1, listen_addr2 };
1276
1277 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1278 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1279 ASSERT_TRUE(tls1.startServer());
1280 ASSERT_TRUE(tls2.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001281 ASSERT_TRUE(mDnsClient.SetResolversWithTls(
1282 servers, mDefaultSearchDomains, mDefaultParams, "",
1283 {base64Encode(tls1.fingerprint()), base64Encode(tls2.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001284
1285 const hostent* result;
1286
1287 // Wait for validation to complete.
1288 EXPECT_TRUE(tls1.waitForQueries(1, 5000));
1289 EXPECT_TRUE(tls2.waitForQueries(1, 5000));
1290
1291 result = gethostbyname("tlsfailover1");
1292 ASSERT_FALSE(result == nullptr);
1293 EXPECT_EQ("1.2.3.1", ToString(result));
1294
1295 // Wait for query to get counted.
1296 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1297 // No new queries should have reached tls2.
1298 EXPECT_EQ(1, tls2.queries());
1299
1300 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1301 tls1.stopServer();
1302
1303 result = gethostbyname("tlsfailover2");
1304 EXPECT_EQ("1.2.3.4", ToString(result));
1305
1306 // Wait for query to get counted.
1307 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1308
1309 // No additional queries should have reached the insecure servers.
1310 EXPECT_EQ(2U, dns1.queries().size());
1311 EXPECT_EQ(2U, dns2.queries().size());
1312
1313 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001314 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001315 tls2.stopServer();
1316 dns1.stopServer();
1317 dns2.stopServer();
1318}
1319
1320TEST_F(ResolverTest, GetHostByName_BadTlsName) {
1321 const char* listen_addr = "127.0.0.3";
1322 const char* listen_udp = "53";
1323 const char* listen_tls = "853";
1324 const char* host_name = "badtlsname.example.com.";
1325 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1326 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1327 ASSERT_TRUE(dns.startServer());
1328 std::vector<std::string> servers = { listen_addr };
1329
1330 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1331 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001332 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams,
1333 "www.example.com", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001334
1335 // The TLS server's certificate doesn't chain to a known CA, and a nonempty name was specified,
1336 // so the client should fail the TLS handshake before ever issuing a query.
1337 EXPECT_FALSE(tls.waitForQueries(1, 500));
1338
1339 // The query should fail hard, because a name was specified.
1340 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1341
1342 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001343 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001344 tls.stopServer();
1345 dns.stopServer();
1346}
1347
1348TEST_F(ResolverTest, GetAddrInfo_Tls) {
1349 const char* listen_addr = "127.0.0.3";
1350 const char* listen_udp = "53";
1351 const char* listen_tls = "853";
1352 const char* host_name = "addrinfotls.example.com.";
1353 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1354 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1355 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1356 ASSERT_TRUE(dns.startServer());
1357 std::vector<std::string> servers = { listen_addr };
1358
1359 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1360 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001361 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "",
1362 {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001363
1364 // Wait for validation to complete.
1365 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1366
1367 dns.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001368 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1369 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001370 size_t found = GetNumQueries(dns, host_name);
1371 EXPECT_LE(1U, found);
1372 // Could be A or AAAA
1373 std::string result_str = ToString(result);
1374 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
1375 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001376 // Wait for both A and AAAA queries to get counted.
1377 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1378
1379 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001380 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001381 tls.stopServer();
1382 dns.stopServer();
1383}
1384
1385TEST_F(ResolverTest, TlsBypass) {
1386 const char OFF[] = "off";
1387 const char OPPORTUNISTIC[] = "opportunistic";
1388 const char STRICT[] = "strict";
1389
1390 const char GETHOSTBYNAME[] = "gethostbyname";
1391 const char GETADDRINFO[] = "getaddrinfo";
1392 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1393
1394 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1395
Mike Yu5ae61542018-10-19 22:11:43 +08001396 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001397
1398 const char ADDR4[] = "192.0.2.1";
1399 const char ADDR6[] = "2001:db8::1";
1400
1401 const char cleartext_addr[] = "127.0.0.53";
1402 const char cleartext_port[] = "53";
1403 const char tls_port[] = "853";
1404 const std::vector<std::string> servers = { cleartext_addr };
1405
1406 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1407 ASSERT_TRUE(dns.startServer());
1408
1409 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
1410
1411 struct TestConfig {
1412 const std::string mode;
1413 const bool withWorkingTLS;
1414 const std::string method;
1415
1416 std::string asHostName() const {
1417 return StringPrintf("%s.%s.%s.",
1418 mode.c_str(),
1419 withWorkingTLS ? "tlsOn" : "tlsOff",
1420 method.c_str());
1421 }
1422 } testConfigs[]{
1423 {OFF, false, GETHOSTBYNAME},
1424 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1425 {STRICT, false, GETHOSTBYNAME},
1426 {OFF, true, GETHOSTBYNAME},
1427 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1428 {STRICT, true, GETHOSTBYNAME},
1429 {OFF, false, GETADDRINFO},
1430 {OPPORTUNISTIC, false, GETADDRINFO},
1431 {STRICT, false, GETADDRINFO},
1432 {OFF, true, GETADDRINFO},
1433 {OPPORTUNISTIC, true, GETADDRINFO},
1434 {STRICT, true, GETADDRINFO},
1435 {OFF, false, GETADDRINFOFORNET},
1436 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1437 {STRICT, false, GETADDRINFOFORNET},
1438 {OFF, true, GETADDRINFOFORNET},
1439 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1440 {STRICT, true, GETADDRINFOFORNET},
1441 };
1442
1443 for (const auto& config : testConfigs) {
1444 const std::string testHostName = config.asHostName();
1445 SCOPED_TRACE(testHostName);
1446
1447 // Don't tempt test bugs due to caching.
1448 const char* host_name = testHostName.c_str();
1449 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1450 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1451
1452 if (config.withWorkingTLS) ASSERT_TRUE(tls.startServer());
1453
1454 if (config.mode == OFF) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001455 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains,
1456 mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001457 } else if (config.mode == OPPORTUNISTIC) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001458 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
1459 mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001460 // Wait for validation to complete.
1461 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1462 } else if (config.mode == STRICT) {
1463 // We use the existence of fingerprints to trigger strict mode,
1464 // rather than hostname validation.
1465 const auto& fingerprint =
1466 (config.withWorkingTLS) ? tls.fingerprint() : NOOP_FINGERPRINT;
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001467 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
1468 mDefaultParams, "",
1469 {base64Encode(fingerprint)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001470 // Wait for validation to complete.
1471 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1472 } else {
1473 FAIL() << "Unsupported Private DNS mode: " << config.mode;
1474 }
1475
1476 const int tlsQueriesBefore = tls.queries();
1477
1478 const hostent* h_result = nullptr;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001479 ScopedAddrinfo ai_result;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001480
1481 if (config.method == GETHOSTBYNAME) {
1482 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1483 h_result = gethostbyname(host_name);
1484
1485 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1486 ASSERT_FALSE(h_result == nullptr);
1487 ASSERT_EQ(4, h_result->h_length);
1488 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1489 EXPECT_EQ(ADDR4, ToString(h_result));
1490 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1491 } else if (config.method == GETADDRINFO) {
1492 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001493 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1494 EXPECT_TRUE(ai_result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001495
1496 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1497 // Could be A or AAAA
1498 const std::string result_str = ToString(ai_result);
1499 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1500 << ", result_str='" << result_str << "'";
1501 } else if (config.method == GETADDRINFOFORNET) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001502 addrinfo* raw_ai_result = nullptr;
Bernie Innocentic165ce82018-10-16 23:35:28 +09001503 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1504 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1505 &raw_ai_result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001506 ai_result.reset(raw_ai_result);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001507
1508 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1509 // Could be A or AAAA
1510 const std::string result_str = ToString(ai_result);
1511 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1512 << ", result_str='" << result_str << "'";
1513 } else {
1514 FAIL() << "Unsupported query method: " << config.method;
1515 }
1516
1517 const int tlsQueriesAfter = tls.queries();
1518 EXPECT_EQ(0, tlsQueriesAfter - tlsQueriesBefore);
1519
Bernie Innocenti443489e2018-08-10 14:27:23 +09001520 // Clear per-process resolv netid.
1521 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
1522 tls.stopServer();
1523 dns.clearQueries();
1524 }
1525
1526 dns.stopServer();
1527}
1528
1529TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Mike Yu5ae61542018-10-19 22:11:43 +08001530 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001531 const char cleartext_addr[] = "127.0.0.53";
1532 const char cleartext_port[] = "53";
1533 const std::vector<std::string> servers = { cleartext_addr };
1534
1535 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1536 const char* host_name = "strictmode.notlsips.example.com.";
1537 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1538 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1539 ASSERT_TRUE(dns.startServer());
1540
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001541 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, {},
1542 "", {base64Encode(NOOP_FINGERPRINT)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001543
1544 addrinfo* ai_result = nullptr;
1545 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1546 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1547}
Luke Huangc68f1b92018-11-21 20:13:38 +08001548
1549namespace {
1550
1551int getAsyncResponse(int fd, int* rcode, u_char* buf, int bufLen) {
1552 struct pollfd wait_fd[1];
1553 wait_fd[0].fd = fd;
1554 wait_fd[0].events = POLLIN;
1555 short revents;
1556 int ret;
1557
1558 ret = poll(wait_fd, 1, -1);
1559 revents = wait_fd[0].revents;
1560 if (revents & POLLIN) {
1561 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang952d0942018-12-26 16:53:03 +08001562 // Verify that resNetworkResult() closed the fd
1563 char dummy;
1564 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1565 EXPECT_EQ(EBADF, errno);
Luke Huangc68f1b92018-11-21 20:13:38 +08001566 return n;
1567 }
1568 return -1;
1569}
1570
1571std::string toString(u_char* buf, int bufLen, int ipType) {
1572 ns_msg handle;
1573 int ancount, n = 0;
1574 ns_rr rr;
1575
1576 if (ns_initparse((const uint8_t*) buf, bufLen, &handle) >= 0) {
1577 ancount = ns_msg_count(handle, ns_s_an);
1578 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
1579 const u_char* rdata = ns_rr_rdata(rr);
1580 char buffer[INET6_ADDRSTRLEN];
1581 if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
1582 return buffer;
1583 }
1584 }
1585 }
1586 return "";
1587}
1588
1589int dns_open_proxy() {
1590 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1591 if (s == -1) {
1592 return -1;
1593 }
1594 const int one = 1;
1595 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1596
1597 static const struct sockaddr_un proxy_addr = {
1598 .sun_family = AF_UNIX,
1599 .sun_path = "/dev/socket/dnsproxyd",
1600 };
1601
1602 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) !=
1603 0) {
1604 close(s);
1605 return -1;
1606 }
1607
1608 return s;
1609}
1610
Luke Huang952d0942018-12-26 16:53:03 +08001611void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1612 int rcode = -1;
1613 uint8_t buf[MAXPACKET] = {};
1614
1615 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1616 EXPECT_GT(res, 0);
1617 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1618}
1619
1620void expectAnswersNotValid(int fd, int expectedErrno) {
1621 int rcode = -1;
1622 uint8_t buf[MAXPACKET] = {};
1623
1624 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1625 EXPECT_EQ(expectedErrno, res);
1626}
1627
Luke Huangc68f1b92018-11-21 20:13:38 +08001628} // namespace
1629
1630TEST_F(ResolverTest, Async_NormalQueryV4V6) {
1631 const char listen_addr[] = "127.0.0.4";
1632 const char listen_srv[] = "53";
1633 const char host_name[] = "howdy.example.com.";
1634 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1635 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1636 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1637 ASSERT_TRUE(dns.startServer());
1638 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001639 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001640 dns.clearQueries();
1641
Luke Huang952d0942018-12-26 16:53:03 +08001642 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1643 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001644 EXPECT_TRUE(fd1 != -1);
1645 EXPECT_TRUE(fd2 != -1);
1646
1647 u_char buf[MAXPACKET] = {};
1648 int rcode;
1649 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1650 EXPECT_GT(res, 0);
1651 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1652
1653 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1654 EXPECT_GT(res, 0);
1655 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1656
1657 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1658
1659 // Re-query verify cache works
Luke Huang952d0942018-12-26 16:53:03 +08001660 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1661 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001662
1663 EXPECT_TRUE(fd1 != -1);
1664 EXPECT_TRUE(fd2 != -1);
1665
1666 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1667 EXPECT_GT(res, 0);
1668 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1669
1670 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1671 EXPECT_GT(res, 0);
1672 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1673
1674 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1675}
1676
1677TEST_F(ResolverTest, Async_BadQuery) {
1678 const char listen_addr[] = "127.0.0.4";
1679 const char listen_srv[] = "53";
1680 const char host_name[] = "howdy.example.com.";
1681 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1682 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1683 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1684 ASSERT_TRUE(dns.startServer());
1685 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001686 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001687 dns.clearQueries();
1688
1689 static struct {
1690 int fd;
1691 const char* dname;
1692 const int queryType;
1693 const int expectRcode;
1694 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001695 {-1, "", ns_t_aaaa, 0},
1696 {-1, "as65ass46", ns_t_aaaa, 0},
1697 {-1, "454564564564", ns_t_aaaa, 0},
1698 {-1, "h645235", ns_t_a, 0},
1699 {-1, "www.google.com", ns_t_a, 0},
Luke Huangc68f1b92018-11-21 20:13:38 +08001700 };
1701
1702 for (auto& td : kTestData) {
1703 SCOPED_TRACE(td.dname);
Luke Huang952d0942018-12-26 16:53:03 +08001704 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001705 EXPECT_TRUE(td.fd != -1);
1706 }
1707
1708 // dns_responder return empty resp(packet only contains query part) with no error currently
1709 for (const auto& td : kTestData) {
1710 u_char buf[MAXPACKET] = {};
1711 int rcode;
1712 SCOPED_TRACE(td.dname);
1713 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1714 EXPECT_GT(res, 0);
1715 EXPECT_EQ(rcode, td.expectRcode);
1716 }
1717}
1718
1719TEST_F(ResolverTest, Async_EmptyAnswer) {
1720 const char listen_addr[] = "127.0.0.4";
1721 const char listen_srv[] = "53";
1722 const char host_name[] = "howdy.example.com.";
1723 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1724 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1725 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1726 ASSERT_TRUE(dns.startServer());
1727 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001728 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001729 dns.clearQueries();
1730
Luke Huang26a0e2a2018-12-18 16:44:41 +08001731 // TODO: Disable retry to make this test explicit.
1732 auto& cv = dns.getCv();
1733 auto& cvMutex = dns.getCvMutex();
1734 int fd1;
1735 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1736 {
1737 std::unique_lock lk(cvMutex);
Luke Huang952d0942018-12-26 16:53:03 +08001738 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001739 EXPECT_TRUE(fd1 != -1);
1740 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
1741 }
Luke Huangc68f1b92018-11-21 20:13:38 +08001742
Luke Huangc68f1b92018-11-21 20:13:38 +08001743 dns.setResponseProbability(0.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001744
Luke Huang952d0942018-12-26 16:53:03 +08001745 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001746 EXPECT_TRUE(fd2 != -1);
1747
Luke Huang952d0942018-12-26 16:53:03 +08001748 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001749 EXPECT_TRUE(fd3 != -1);
1750
Luke Huang26a0e2a2018-12-18 16:44:41 +08001751 uint8_t buf[MAXPACKET] = {};
Luke Huangc68f1b92018-11-21 20:13:38 +08001752 int rcode;
1753
Luke Huang26a0e2a2018-12-18 16:44:41 +08001754 // expect no response
1755 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
1756 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001757
Luke Huang26a0e2a2018-12-18 16:44:41 +08001758 // expect no response
Luke Huangc68f1b92018-11-21 20:13:38 +08001759 memset(buf, 0, MAXPACKET);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001760 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1761 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001762
Luke Huangc68f1b92018-11-21 20:13:38 +08001763 dns.setResponseProbability(1.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001764
Luke Huang952d0942018-12-26 16:53:03 +08001765 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001766 EXPECT_TRUE(fd4 != -1);
1767
1768 memset(buf, 0, MAXPACKET);
1769 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
1770 EXPECT_GT(res, 0);
1771 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1772
1773 memset(buf, 0, MAXPACKET);
1774 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1775 EXPECT_GT(res, 0);
1776 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1777}
1778
1779TEST_F(ResolverTest, Async_MalformedQuery) {
1780 const char listen_addr[] = "127.0.0.4";
1781 const char listen_srv[] = "53";
1782 const char host_name[] = "howdy.example.com.";
1783 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1784 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1785 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1786 ASSERT_TRUE(dns.startServer());
1787 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001788 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001789 dns.clearQueries();
1790
1791 int fd = dns_open_proxy();
1792 EXPECT_TRUE(fd > 0);
1793
1794 const std::string badMsg = "16-52512#";
1795 static struct {
1796 const std::string cmd;
1797 const int expectErr;
1798 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001799 // Too few arguments
Luke Huangc68f1b92018-11-21 20:13:38 +08001800 {"resnsend " + badMsg + '\0', -EINVAL},
1801 // Bad netId
Luke Huang952d0942018-12-26 16:53:03 +08001802 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huangc68f1b92018-11-21 20:13:38 +08001803 // Bad raw data
Luke Huang952d0942018-12-26 16:53:03 +08001804 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huangc68f1b92018-11-21 20:13:38 +08001805 };
1806
1807 for (unsigned int i = 0; i < std::size(kTestData); i++) {
1808 auto& td = kTestData[i];
1809 SCOPED_TRACE(td.cmd);
1810 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
1811 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
1812
1813 int32_t tmp;
1814 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
1815 EXPECT_TRUE(rc > 0);
1816 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
1817 }
1818 // Normal query with answer buffer
1819 // This is raw data of query "howdy.example.com" type 1 class 1
1820 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huang952d0942018-12-26 16:53:03 +08001821 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huangc68f1b92018-11-21 20:13:38 +08001822 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1823 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1824
1825 u_char smallBuf[1] = {};
1826 int rcode;
1827 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huang952d0942018-12-26 16:53:03 +08001828 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huangc68f1b92018-11-21 20:13:38 +08001829
1830 // Do the normal test with large buffer again
1831 fd = dns_open_proxy();
1832 EXPECT_TRUE(fd > 0);
1833 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1834 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1835 u_char buf[MAXPACKET] = {};
1836 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1837 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu5b9ffb22018-12-02 17:54:29 +09001838}
1839
Luke Huang952d0942018-12-26 16:53:03 +08001840TEST_F(ResolverTest, Async_CacheFlags) {
1841 const char listen_addr[] = "127.0.0.4";
1842 const char listen_srv[] = "53";
1843 const char host_name[] = "howdy.example.com.";
1844 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1845 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1846 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1847 ASSERT_TRUE(dns.startServer());
1848 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001849 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huang952d0942018-12-26 16:53:03 +08001850 dns.clearQueries();
1851
1852 // ANDROID_RESOLV_NO_CACHE_STORE
1853 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1854 ANDROID_RESOLV_NO_CACHE_STORE);
1855 EXPECT_TRUE(fd1 != -1);
1856 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1857 ANDROID_RESOLV_NO_CACHE_STORE);
1858 EXPECT_TRUE(fd2 != -1);
1859 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1860 ANDROID_RESOLV_NO_CACHE_STORE);
1861 EXPECT_TRUE(fd3 != -1);
1862
1863 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
1864 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1865 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1866
1867 // No cache exists, expect 3 queries
1868 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
1869
1870 // Re-query and cache
1871 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1872
1873 EXPECT_TRUE(fd1 != -1);
1874
1875 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1876
1877 // Now we have cache, expect 4 queries
1878 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1879
1880 // ANDROID_RESOLV_NO_CACHE_LOOKUP
1881 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1882 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1883 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1884 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1885
1886 EXPECT_TRUE(fd1 != -1);
1887 EXPECT_TRUE(fd2 != -1);
1888
1889 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1890 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1891
1892 // Skip cache, expect 6 queries
1893 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1894
1895 // Re-query verify cache works
1896 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1897 ANDROID_RESOLV_NO_CACHE_STORE);
1898 EXPECT_TRUE(fd1 != -1);
1899 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1900
1901 // Cache hits, expect still 6 queries
1902 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1903}
1904
1905TEST_F(ResolverTest, Async_NoRetryFlag) {
1906 const char listen_addr[] = "127.0.0.4";
1907 const char listen_srv[] = "53";
1908 const char host_name[] = "howdy.example.com.";
1909 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1910 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1911 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1912 ASSERT_TRUE(dns.startServer());
1913 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001914 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huang952d0942018-12-26 16:53:03 +08001915 dns.clearQueries();
1916
1917 dns.setResponseProbability(0.0);
1918
1919 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1920 ANDROID_RESOLV_NO_RETRY);
1921 EXPECT_TRUE(fd1 != -1);
1922
1923 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
1924 ANDROID_RESOLV_NO_RETRY);
1925 EXPECT_TRUE(fd2 != -1);
1926
1927 // expect no response
1928 expectAnswersNotValid(fd1, -ETIMEDOUT);
1929 expectAnswersNotValid(fd2, -ETIMEDOUT);
1930
1931 // No retry case, expect 2 queries
1932 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1933
1934 dns.clearQueries();
1935
1936 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1937 EXPECT_TRUE(fd1 != -1);
1938
1939 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
1940 EXPECT_TRUE(fd2 != -1);
1941
1942 // expect no response
1943 expectAnswersNotValid(fd1, -ETIMEDOUT);
1944 expectAnswersNotValid(fd2, -ETIMEDOUT);
1945
1946 // Retry case, expect 4 queries
1947 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1948}
1949
Mike Yu5b9ffb22018-12-02 17:54:29 +09001950// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chenbfd32022019-01-02 14:59:38 +08001951// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
1952// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
1953// won't retry so that we get no answer.
Mike Yu5b9ffb22018-12-02 17:54:29 +09001954TEST_F(ResolverTest, BrokenEdns) {
1955 typedef test::DNSResponder::Edns Edns;
1956 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
1957
1958 const char OFF[] = "off";
1959 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
1960 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
1961 const char STRICT[] = "strict";
1962 const char GETHOSTBYNAME[] = "gethostbyname";
1963 const char GETADDRINFO[] = "getaddrinfo";
1964 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
1965 const char ADDR4[] = "192.0.2.1";
1966 const char CLEARTEXT_ADDR[] = "127.0.0.53";
1967 const char CLEARTEXT_PORT[] = "53";
1968 const char TLS_PORT[] = "853";
1969 const std::vector<std::string> servers = { CLEARTEXT_ADDR };
1970
1971 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
1972 ASSERT_TRUE(dns.startServer());
1973
1974 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
1975
1976 static const struct TestConfig {
1977 std::string mode;
1978 std::string method;
1979 Edns edns;
1980 ExpectResult expectResult;
1981
1982 std::string asHostName() const {
1983 const char* ednsString;
1984 switch (edns) {
1985 case Edns::ON:
1986 ednsString = "ednsOn";
1987 break;
Ken Chenbfd32022019-01-02 14:59:38 +08001988 case Edns::FORMERR_ON_EDNS:
Mike Yu5b9ffb22018-12-02 17:54:29 +09001989 ednsString = "ednsFormerr";
1990 break;
1991 case Edns::DROP:
1992 ednsString = "ednsDrop";
1993 break;
1994 default:
1995 ednsString = "";
1996 break;
1997 }
1998 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
1999 }
2000 } testConfigs[] = {
2001 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
2002 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2003 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2004 // commented out since TLS timeout is not configurable.
2005 // TODO: Uncomment them after TLS timeout is configurable.
2006 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2007 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2008 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2009 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
Ken Chenbfd32022019-01-02 14:59:38 +08002010 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2011 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2012 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2013 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002014 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2015 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2016 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2017 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2018 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2019 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2020 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2021 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
Ken Chenbfd32022019-01-02 14:59:38 +08002022 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2023 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2024 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2025 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002026 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2027 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2028 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2029 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2030 };
2031
2032 for (const auto& config : testConfigs) {
2033 const std::string testHostName = config.asHostName();
2034 SCOPED_TRACE(testHostName);
2035
2036 const char* host_name = testHostName.c_str();
2037 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2038 dns.setEdns(config.edns);
2039
2040 if (config.mode == OFF) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002041 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains,
2042 mDefaultParams));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002043 } else if (config.mode == OPPORTUNISTIC_UDP) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002044 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
2045 mDefaultParams, "", {}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002046 } else if (config.mode == OPPORTUNISTIC_TLS) {
2047 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002048 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
2049 mDefaultParams, "", {}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002050 // Wait for validation to complete.
2051 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2052 } else if (config.mode == STRICT) {
2053 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002054 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
2055 mDefaultParams, "",
2056 {base64Encode(tls.fingerprint())}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002057 // Wait for validation to complete.
2058 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2059 }
2060
2061 if (config.method == GETHOSTBYNAME) {
2062 const hostent* h_result = gethostbyname(host_name);
2063 if (config.expectResult == EXPECT_SUCCESS) {
2064 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2065 ASSERT_TRUE(h_result != nullptr);
2066 ASSERT_EQ(4, h_result->h_length);
2067 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2068 EXPECT_EQ(ADDR4, ToString(h_result));
2069 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2070 } else {
2071 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2072 ASSERT_TRUE(h_result == nullptr);
2073 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2074 }
2075 } else if (config.method == GETADDRINFO) {
2076 ScopedAddrinfo ai_result;
2077 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2078 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2079 if (config.expectResult == EXPECT_SUCCESS) {
2080 EXPECT_TRUE(ai_result != nullptr);
2081 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2082 const std::string result_str = ToString(ai_result);
2083 EXPECT_EQ(ADDR4, result_str);
2084 } else {
2085 EXPECT_TRUE(ai_result == nullptr);
2086 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2087 }
2088 } else {
2089 FAIL() << "Unsupported query method: " << config.method;
2090 }
2091
2092 tls.stopServer();
2093 dns.clearQueries();
2094 }
2095
2096 dns.stopServer();
2097}
nuccachenf52f7a52018-07-17 18:07:23 +08002098
Ken Chenbfd32022019-01-02 14:59:38 +08002099// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2100// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2101// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2102// failed due to timeout.
2103TEST_F(ResolverTest, UnstableTls) {
2104 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2105 const char CLEARTEXT_PORT[] = "53";
2106 const char TLS_PORT[] = "853";
2107 const char* host_name1 = "nonexistent1.example.com.";
2108 const char* host_name2 = "nonexistent2.example.com.";
2109 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2110
2111 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2112 ASSERT_TRUE(dns.startServer());
2113 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2114 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2115 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002116 ASSERT_TRUE(
2117 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Ken Chenbfd32022019-01-02 14:59:38 +08002118 // Wait for validation complete.
2119 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2120 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2121 tls.stopServer();
2122
2123 const hostent* h_result = gethostbyname(host_name1);
2124 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2125 ASSERT_TRUE(h_result == nullptr);
2126 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2127
2128 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2129 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2130 EXPECT_TRUE(ai_result == nullptr);
2131 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2132}
2133
2134// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2135// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2136TEST_F(ResolverTest, BogusDnsServer) {
2137 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2138 const char CLEARTEXT_PORT[] = "53";
2139 const char TLS_PORT[] = "853";
2140 const char* host_name1 = "nonexistent1.example.com.";
2141 const char* host_name2 = "nonexistent2.example.com.";
2142 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2143
2144 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2145 ASSERT_TRUE(dns.startServer());
2146 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2147 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002148 ASSERT_TRUE(
2149 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Ken Chenbfd32022019-01-02 14:59:38 +08002150 // Wait for validation complete.
2151 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2152 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2153 tls.stopServer();
2154 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2155
2156 const hostent* h_result = gethostbyname(host_name1);
2157 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2158 ASSERT_TRUE(h_result == nullptr);
2159 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2160
2161 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2162 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2163 EXPECT_TRUE(ai_result == nullptr);
2164 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2165}
2166
nuccachenf52f7a52018-07-17 18:07:23 +08002167TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2168 constexpr char listen_addr[] = "::1";
2169 constexpr char listen_addr2[] = "127.0.0.5";
2170 constexpr char listen_srv[] = "53";
2171 constexpr char dns64_name[] = "ipv4only.arpa.";
2172 constexpr char host_name[] = "v4only.example.com.";
2173
2174 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2175 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2176 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2177 ASSERT_TRUE(dns.startServer());
2178
2179 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
2180 dns2.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2181 ASSERT_TRUE(dns2.startServer());
2182
2183 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002184 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002185 dns.clearQueries();
2186
2187 // Wait for detecting prefix to complete.
2188 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2189
2190 // hints are necessary in order to let netd know which type of addresses the caller is
2191 // interested in.
2192 addrinfo hints;
2193 memset(&hints, 0, sizeof(hints));
2194 hints.ai_family = AF_UNSPEC;
2195 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2196 EXPECT_TRUE(result != nullptr);
2197 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2198
2199 std::string result_str = ToString(result);
2200 EXPECT_EQ(result_str, "64:ff9b::102:304");
2201
2202 // Let's test the case when there's an IPv4 resolver.
2203 servers = {listen_addr, listen_addr2};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002204 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002205 dns.clearQueries();
2206 dns2.clearQueries();
2207
2208 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2209 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2210
2211 result = safe_getaddrinfo("v4only", nullptr, &hints);
2212 EXPECT_TRUE(result != nullptr);
2213 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2214
2215 result_str = ToString(result);
2216 EXPECT_EQ(result_str, "1.2.3.4");
2217}
2218
nuccachenf52f7a52018-07-17 18:07:23 +08002219TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2220 constexpr char listen_addr[] = "::1";
2221 constexpr char listen_srv[] = "53";
2222 constexpr char dns64_name[] = "ipv4only.arpa.";
2223 constexpr char host_name[] = "v4only.example.com.";
2224
2225 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2226 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2227 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2228 ASSERT_TRUE(dns.startServer());
2229
2230 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002231 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002232 dns.clearQueries();
2233
2234 // Wait for detecting prefix to complete.
2235 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2236
2237 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2238 // in AF_INET case.
2239 addrinfo hints;
2240 memset(&hints, 0, sizeof(hints));
2241 hints.ai_family = AF_INET6;
2242 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2243 EXPECT_TRUE(result != nullptr);
2244 std::string result_str = ToString(result);
2245 EXPECT_EQ(result_str, "64:ff9b::102:304");
2246
2247 hints.ai_family = AF_INET;
2248 result = safe_getaddrinfo("v4only", nullptr, &hints);
2249 EXPECT_TRUE(result != nullptr);
2250 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2251 result_str = ToString(result);
2252 EXPECT_EQ(result_str, "1.2.3.4");
2253}
nuccachenf52f7a52018-07-17 18:07:23 +08002254
2255TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2256 constexpr char listen_addr[] = "::1";
2257 constexpr char listen_srv[] = "53";
2258 constexpr char dns64_name[] = "ipv4only.arpa.";
2259 constexpr char host_name[] = "v4v6.example.com.";
2260
2261 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2262 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2263 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2264 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2265 ASSERT_TRUE(dns.startServer());
2266
2267 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002268 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002269 dns.clearQueries();
2270
2271 // Wait for detecting prefix to complete.
2272 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2273
2274 addrinfo hints;
2275 memset(&hints, 0, sizeof(hints));
2276 hints.ai_family = AF_UNSPEC;
2277 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2278 EXPECT_TRUE(result != nullptr);
2279 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2280
2281 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2282 std::vector<std::string> result_strs = ToStrings(result);
2283 for (const auto& str : result_strs) {
2284 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2285 << ", result_str='" << str << "'";
2286 }
2287}
2288
2289TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2290 constexpr char listen_addr[] = "::1";
2291 constexpr char listen_srv[] = "53";
2292 constexpr char dns64_name[] = "ipv4only.arpa.";
2293 constexpr char host_name[] = "v4v6.example.com.";
2294
2295 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2296 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2297 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2298 ASSERT_TRUE(dns.startServer());
2299
2300 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002301 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002302 dns.clearQueries();
2303
2304 // Wait for detecting prefix to complete.
2305 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2306
2307 addrinfo hints;
2308 memset(&hints, 0, sizeof(hints));
2309 hints.ai_family = AF_UNSPEC;
2310 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2311 EXPECT_TRUE(result != nullptr);
2312 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2313
2314 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2315 std::string result_str = ToString(result);
2316 EXPECT_EQ(result_str, "64:ff9b::102:304");
2317}
2318
2319TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2320 constexpr char THIS_NETWORK[] = "this_network";
2321 constexpr char LOOPBACK[] = "loopback";
2322 constexpr char LINK_LOCAL[] = "link_local";
2323 constexpr char MULTICAST[] = "multicast";
2324 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2325
2326 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2327 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2328 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2329 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2330 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2331
2332 constexpr char listen_addr[] = "::1";
2333 constexpr char listen_srv[] = "53";
2334 constexpr char dns64_name[] = "ipv4only.arpa.";
2335
2336 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2337 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2338 ASSERT_TRUE(dns.startServer());
2339
2340 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002341 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002342 dns.clearQueries();
2343
2344 // Wait for detecting prefix to complete.
2345 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2346
2347 static const struct TestConfig {
2348 std::string name;
2349 std::string addr;
2350
2351 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2352 } testConfigs[]{
2353 {THIS_NETWORK, ADDR_THIS_NETWORK},
2354 {LOOPBACK, ADDR_LOOPBACK},
2355 {LINK_LOCAL, ADDR_LINK_LOCAL},
2356 {MULTICAST, ADDR_MULTICAST},
2357 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2358 };
2359
2360 for (const auto& config : testConfigs) {
2361 const std::string testHostName = config.asHostName();
2362 SCOPED_TRACE(testHostName);
2363
2364 const char* host_name = testHostName.c_str();
2365 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2366
2367 addrinfo hints;
2368 memset(&hints, 0, sizeof(hints));
2369 hints.ai_family = AF_INET6;
2370 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2371 // In AF_INET6 case, don't return IPv4 answers
2372 EXPECT_TRUE(result == nullptr);
2373 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2374 dns.clearQueries();
2375
2376 memset(&hints, 0, sizeof(hints));
2377 hints.ai_family = AF_UNSPEC;
2378 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2379 EXPECT_TRUE(result != nullptr);
2380 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2381 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2382 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2383 std::string result_str = ToString(result);
2384 EXPECT_EQ(result_str, config.addr.c_str());
2385 dns.clearQueries();
2386 }
2387}
2388
2389TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2390 constexpr char listen_addr[] = "::1";
2391 constexpr char listen_srv[] = "53";
2392 constexpr char dns64_name[] = "ipv4only.arpa.";
2393 constexpr char host_name[] = "v4only.example.com.";
2394 constexpr char host_name2[] = "v4v6.example.com.";
2395
2396 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2397 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2398 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2399 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2400 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2401 ASSERT_TRUE(dns.startServer());
2402
2403 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002404 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002405 dns.clearQueries();
2406
2407 // Wait for detecting prefix to complete.
2408 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2409
2410 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2411 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2412 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2413 EXPECT_TRUE(result != nullptr);
2414 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2415 std::string result_str = ToString(result);
2416 EXPECT_EQ(result_str, "64:ff9b::102:304");
2417 dns.clearQueries();
2418
2419 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2420 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2421 EXPECT_TRUE(result != nullptr);
2422 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2423 std::vector<std::string> result_strs = ToStrings(result);
2424 for (const auto& str : result_strs) {
2425 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2426 << ", result_str='" << str << "'";
2427 }
2428}
2429
2430TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2431 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2432 constexpr char ADDR_ANYADDR_V6[] = "::";
2433 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2434 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2435
2436 constexpr char PORT_NAME_HTTP[] = "http";
2437 constexpr char PORT_NUMBER_HTTP[] = "80";
2438
2439 constexpr char listen_addr[] = "::1";
2440 constexpr char listen_srv[] = "53";
2441 constexpr char dns64_name[] = "ipv4only.arpa.";
2442
2443 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2444 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2445 ASSERT_TRUE(dns.startServer());
2446
2447 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002448 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002449 dns.clearQueries();
2450
2451 // Wait for detecting prefix to complete.
2452 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2453
2454 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2455 // - passive socket -> anyaddr (0.0.0.0 or ::)
2456 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2457 static const struct TestConfig {
2458 int flag;
2459 std::string addr_v4;
2460 std::string addr_v6;
2461
2462 std::string asParameters() const {
2463 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2464 addr_v6.c_str());
2465 }
2466 } testConfigs[]{
2467 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2468 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2469 };
2470
2471 for (const auto& config : testConfigs) {
2472 SCOPED_TRACE(config.asParameters());
2473
2474 addrinfo hints;
2475 memset(&hints, 0, sizeof(hints));
2476 hints.ai_family = AF_UNSPEC; // any address family
2477 hints.ai_socktype = 0; // any type
2478 hints.ai_protocol = 0; // any protocol
2479 hints.ai_flags = config.flag;
2480
2481 // Assign hostname as null and service as port name.
2482 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2483 ASSERT_TRUE(result != nullptr);
2484
2485 // Can't be synthesized because it should not get into Netd.
2486 std::vector<std::string> result_strs = ToStrings(result);
2487 for (const auto& str : result_strs) {
2488 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2489 << ", result_str='" << str << "'";
2490 }
2491
2492 // Assign hostname as null and service as numeric port number.
2493 hints.ai_flags = config.flag | AI_NUMERICSERV;
2494 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2495 ASSERT_TRUE(result != nullptr);
2496
2497 // Can't be synthesized because it should not get into Netd.
2498 result_strs = ToStrings(result);
2499 for (const auto& str : result_strs) {
2500 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2501 << ", result_str='" << str << "'";
2502 }
2503 }
2504}
2505
2506TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2507 struct hostent* result = nullptr;
2508 struct in_addr v4addr;
2509 struct in6_addr v6addr;
2510
2511 constexpr char listen_addr[] = "::1";
2512 constexpr char listen_srv[] = "53";
2513 constexpr char dns64_name[] = "ipv4only.arpa.";
2514 constexpr char ptr_name[] = "v4v6.example.com.";
2515 // PTR record for IPv4 address 1.2.3.4
2516 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2517 // PTR record for IPv6 address 2001:db8::102:304
2518 constexpr char ptr_addr_v6[] =
2519 "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.";
2520
2521 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2522 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2523 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2524 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2525 ASSERT_TRUE(dns.startServer());
2526
2527 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002528 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002529 dns.clearQueries();
2530
2531 // Wait for detecting prefix to complete.
2532 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2533
2534 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2535 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2536 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2537 ASSERT_TRUE(result != nullptr);
2538 std::string result_str = result->h_name ? result->h_name : "null";
2539 EXPECT_EQ(result_str, "v4v6.example.com");
2540
2541 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2542 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2543 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2544 ASSERT_TRUE(result != nullptr);
2545 result_str = result->h_name ? result->h_name : "null";
2546 EXPECT_EQ(result_str, "v4v6.example.com");
2547}
2548
2549TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2550 constexpr char listen_addr[] = "::1";
2551 constexpr char listen_srv[] = "53";
2552 constexpr char dns64_name[] = "ipv4only.arpa.";
2553 constexpr char ptr_name[] = "v4only.example.com.";
2554 // PTR record for IPv4 address 1.2.3.4
2555 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2556 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2557 constexpr char ptr_addr_v6_nomapping[] =
2558 "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.";
2559 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2560 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2561 constexpr char ptr_addr_v6_synthesis[] =
2562 "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.";
2563
2564 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2565 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2566 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2567 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2568 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2569 ASSERT_TRUE(dns.startServer());
2570
2571 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002572 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002573 dns.clearQueries();
2574
2575 // Wait for detecting prefix to complete.
2576 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2577
2578 // Synthesized PTR record doesn't exist on DNS server
2579 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2580 // After querying synthesized address failed, expect that prefix is removed from IPv6
2581 // synthesized address and do reverse IPv4 query instead.
2582 struct in6_addr v6addr;
2583 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2584 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2585 ASSERT_TRUE(result != nullptr);
2586 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2587 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2588 std::string result_str = result->h_name ? result->h_name : "null";
2589 EXPECT_EQ(result_str, "v4only.example.com");
2590 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2591 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2592 // fakes the return IPv4 address as original queried IPv6 address.
2593 result_str = ToString(result);
2594 EXPECT_EQ(result_str, "64:ff9b::102:304");
2595 dns.clearQueries();
2596
2597 // Synthesized PTR record exists on DNS server
2598 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2599 // Expect to Netd pass through synthesized address for DNS queries.
2600 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2601 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2602 ASSERT_TRUE(result != nullptr);
2603 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2604 result_str = result->h_name ? result->h_name : "null";
2605 EXPECT_EQ(result_str, "v6synthesis.example.com");
2606}
2607
2608TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2609 constexpr char dns64_name[] = "ipv4only.arpa.";
2610 constexpr char host_name[] = "localhost";
2611 // The address is synthesized by prefix64:localhost.
2612 constexpr char host_addr[] = "64:ff9b::7f00:1";
2613
2614 constexpr char listen_addr[] = "::1";
2615 constexpr char listen_srv[] = "53";
2616 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2617 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2618 ASSERT_TRUE(dns.startServer());
2619 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002620 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002621 dns.clearQueries();
2622
2623 // Wait for detecting prefix to complete.
2624 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2625
2626 // Using synthesized "localhost" address to be a trick for resolving host name
2627 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2628 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2629 struct in6_addr v6addr;
2630 inet_pton(AF_INET6, host_addr, &v6addr);
2631 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2632 ASSERT_TRUE(result != nullptr);
2633 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2634 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2635
2636 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2637 ASSERT_EQ(AF_INET6, result->h_addrtype);
2638 std::string result_str = ToString(result);
2639 EXPECT_EQ(result_str, host_addr);
2640 result_str = result->h_name ? result->h_name : "null";
2641 EXPECT_EQ(result_str, host_name);
2642}
2643
2644TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2645 constexpr char listen_addr[] = "::1";
2646 constexpr char listen_srv[] = "53";
2647 constexpr char dns64_name[] = "ipv4only.arpa.";
2648 constexpr char ptr_name[] = "v4v6.example.com.";
2649 // PTR record for IPv4 address 1.2.3.4
2650 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2651 // PTR record for IPv6 address 2001:db8::102:304
2652 constexpr char ptr_addr_v6[] =
2653 "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.";
2654
2655 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2656 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2657 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2658 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2659 ASSERT_TRUE(dns.startServer());
2660
2661 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002662 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002663 dns.clearQueries();
2664
2665 // Wait for detecting prefix to complete.
2666 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2667
2668 static const struct TestConfig {
2669 int flag;
2670 int family;
2671 std::string addr;
2672 std::string host;
2673
2674 std::string asParameters() const {
2675 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2676 host.c_str());
2677 }
2678 } testConfigs[]{
2679 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2680 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2681 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2682 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2683 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2684 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2685 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2686 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2687 };
2688
2689 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2690 for (const auto& config : testConfigs) {
2691 SCOPED_TRACE(config.asParameters());
2692
2693 int rv;
2694 char host[NI_MAXHOST];
2695 struct sockaddr_in sin;
2696 struct sockaddr_in6 sin6;
2697 if (config.family == AF_INET) {
2698 memset(&sin, 0, sizeof(sin));
2699 sin.sin_family = AF_INET;
2700 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2701 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2702 nullptr, 0, config.flag);
2703 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2704 } else if (config.family == AF_INET6) {
2705 memset(&sin6, 0, sizeof(sin6));
2706 sin6.sin6_family = AF_INET6;
2707 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2708 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2709 nullptr, 0, config.flag);
2710 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2711 }
2712 ASSERT_EQ(0, rv);
2713 std::string result_str = host;
2714 EXPECT_EQ(result_str, config.host);
2715 dns.clearQueries();
2716 }
2717}
2718
2719TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2720 constexpr char listen_addr[] = "::1";
2721 constexpr char listen_srv[] = "53";
2722 constexpr char dns64_name[] = "ipv4only.arpa.";
2723 constexpr char ptr_name[] = "v4only.example.com.";
2724 // PTR record for IPv4 address 1.2.3.4
2725 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2726 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2727 constexpr char ptr_addr_v6_nomapping[] =
2728 "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.";
2729 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2730 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2731 constexpr char ptr_addr_v6_synthesis[] =
2732 "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.";
2733
2734 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2735 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2736 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2737 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2738 ASSERT_TRUE(dns.startServer());
2739
2740 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002741 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002742 dns.clearQueries();
2743
2744 // Wait for detecting prefix to complete.
2745 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2746
2747 static const struct TestConfig {
2748 bool hasSynthesizedPtrRecord;
2749 int flag;
2750 std::string addr;
2751 std::string host;
2752
2753 std::string asParameters() const {
2754 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2755 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2756 }
2757 } testConfigs[]{
2758 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2759 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2760 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2761 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2762 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2763 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2764 };
2765
2766 // hasSynthesizedPtrRecord = false
2767 // Synthesized PTR record doesn't exist on DNS server
2768 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2769 // After querying synthesized address failed, expect that prefix is removed from IPv6
2770 // synthesized address and do reverse IPv4 query instead.
2771 //
2772 // hasSynthesizedPtrRecord = true
2773 // Synthesized PTR record exists on DNS server
2774 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2775 // Expect to just pass through synthesized address for DNS queries.
2776 for (const auto& config : testConfigs) {
2777 SCOPED_TRACE(config.asParameters());
2778
2779 char host[NI_MAXHOST];
2780 struct sockaddr_in6 sin6;
2781 memset(&sin6, 0, sizeof(sin6));
2782 sin6.sin6_family = AF_INET6;
2783 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2784 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2785 nullptr, 0, config.flag);
2786 ASSERT_EQ(0, rv);
2787 if (config.flag == NI_NAMEREQD) {
2788 if (config.hasSynthesizedPtrRecord) {
2789 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2790 } else {
2791 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2792 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2793 }
2794 }
2795 std::string result_str = host;
2796 EXPECT_EQ(result_str, config.host);
2797 dns.clearQueries();
2798 }
2799}
2800
2801TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2802 constexpr char dns64_name[] = "ipv4only.arpa.";
2803 constexpr char host_name[] = "localhost";
2804 // The address is synthesized by prefix64:localhost.
2805 constexpr char host_addr[] = "64:ff9b::7f00:1";
2806
2807 constexpr char listen_addr[] = "::1";
2808 constexpr char listen_srv[] = "53";
2809 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2810 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2811 ASSERT_TRUE(dns.startServer());
2812 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002813 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002814 dns.clearQueries();
2815
2816 // Wait for detecting prefix to complete.
2817 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2818
2819 // Using synthesized "localhost" address to be a trick for resolving host name
2820 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2821 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2822 char host[NI_MAXHOST];
2823 struct sockaddr_in6 sin6;
2824 memset(&sin6, 0, sizeof(sin6));
2825 sin6.sin6_family = AF_INET6;
2826 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2827 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2828 0, NI_NAMEREQD);
2829 ASSERT_EQ(0, rv);
2830 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2831 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2832
2833 std::string result_str = host;
2834 EXPECT_EQ(result_str, host_name);
2835}
2836
nuccachenf52f7a52018-07-17 18:07:23 +08002837TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2838 constexpr char dns64_name[] = "ipv4only.arpa.";
2839 constexpr char host_name[] = "ipv4only.example.com.";
2840
2841 constexpr char listen_addr[] = "::1";
2842 constexpr char listen_srv[] = "53";
2843 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2844 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2845 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2846 ASSERT_TRUE(dns.startServer());
2847 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002848 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002849 dns.clearQueries();
2850
2851 // Wait for detecting prefix to complete.
2852 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2853
2854 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2855 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2856 ASSERT_TRUE(result != nullptr);
2857 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2858 std::string result_str = ToString(result);
2859 EXPECT_EQ(result_str, "64:ff9b::102:304");
2860}
nuccachenf52f7a52018-07-17 18:07:23 +08002861
2862TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2863 constexpr char dns64_name[] = "ipv4only.arpa.";
2864 constexpr char host_name[] = "v4v6.example.com.";
2865
2866 constexpr char listen_addr[] = "::1";
2867 constexpr char listen_srv[] = "53";
2868 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2869 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2870 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2871 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2872 ASSERT_TRUE(dns.startServer());
2873 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002874 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002875 dns.clearQueries();
2876
2877 // Wait for detecting prefix to complete.
2878 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2879
2880 // IPv4 DNS query. Prefix should have no effect on it.
2881 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2882 ASSERT_TRUE(result != nullptr);
2883 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2884 std::string result_str = ToString(result);
2885 EXPECT_EQ(result_str, "1.2.3.4");
2886 dns.clearQueries();
2887
2888 // IPv6 DNS query. Prefix should have no effect on it.
2889 result = gethostbyname2("v4v6", AF_INET6);
2890 ASSERT_TRUE(result != nullptr);
2891 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2892 result_str = ToString(result);
2893 EXPECT_EQ(result_str, "2001:db8::102:304");
2894}
2895
2896TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2897 constexpr char THIS_NETWORK[] = "this_network";
2898 constexpr char LOOPBACK[] = "loopback";
2899 constexpr char LINK_LOCAL[] = "link_local";
2900 constexpr char MULTICAST[] = "multicast";
2901 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2902
2903 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2904 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2905 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2906 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2907 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2908
2909 constexpr char listen_addr[] = "::1";
2910 constexpr char listen_srv[] = "53";
2911 constexpr char dns64_name[] = "ipv4only.arpa.";
2912
2913 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2914 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2915 ASSERT_TRUE(dns.startServer());
2916
2917 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002918 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002919 dns.clearQueries();
2920
2921 // Wait for detecting prefix to complete.
2922 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2923
2924 static const struct TestConfig {
2925 std::string name;
2926 std::string addr;
2927
2928 std::string asHostName() const {
2929 return StringPrintf("%s.example.com.",
2930 name.c_str());
2931 }
2932 } testConfigs[]{
2933 {THIS_NETWORK, ADDR_THIS_NETWORK},
2934 {LOOPBACK, ADDR_LOOPBACK},
2935 {LINK_LOCAL, ADDR_LINK_LOCAL},
2936 {MULTICAST, ADDR_MULTICAST},
2937 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2938 };
2939
2940 for (const auto& config : testConfigs) {
2941 const std::string testHostName = config.asHostName();
2942 SCOPED_TRACE(testHostName);
2943
2944 const char* host_name = testHostName.c_str();
2945 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2946
2947 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2948 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2949
2950 // In AF_INET6 case, don't synthesize special use IPv4 address.
2951 // Expect to have no answer
2952 EXPECT_EQ(nullptr, result);
2953
2954 dns.clearQueries();
2955 }
Bernie Innocenticd257642018-12-20 15:56:40 +09002956}