blob: 598aaba60dfeff42a3cc789f493e55d654b44395 [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"
59#include "android/net/metrics/INetdEventListener.h"
60#include "binder/IServiceManager.h"
61#include "netdutils/SocketOption.h"
62
Bernie Innocentic165ce82018-10-16 23:35:28 +090063// TODO: make this dynamic and stop depending on implementation details.
Luke Huangc68f1b92018-11-21 20:13:38 +080064constexpr int TEST_NETID = 30;
65constexpr int MAXPACKET = (8 * 1024);
Bernie Innocentic165ce82018-10-16 23:35:28 +090066
67// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
68// Tested here for convenience.
69extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
70 const addrinfo* hints, unsigned netid, unsigned mark,
71 struct addrinfo** result);
72
Bernie Innocenti443489e2018-08-10 14:27:23 +090073using android::base::StringPrintf;
74using android::net::ResolverStats;
75using android::net::metrics::INetdEventListener;
76using android::netdutils::enableSockopt;
77
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090078// TODO: move into libnetdutils?
79namespace {
80ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
81 const struct addrinfo* hints) {
82 addrinfo* result = nullptr;
83 if (getaddrinfo(node, service, hints, &result) != 0) {
84 result = nullptr; // Should already be the case, but...
85 }
86 return ScopedAddrinfo(result);
87}
88} // namespace
89
Bernie Innocenti443489e2018-08-10 14:27:23 +090090// Emulates the behavior of UnorderedElementsAreArray, which currently cannot be used.
91// TODO: Use UnorderedElementsAreArray, which depends on being able to compile libgmock_host,
92// if that is not possible, improve this hacky algorithm, which is O(n**2)
93template <class A, class B>
94bool UnorderedCompareArray(const A& a, const B& b) {
95 if (a.size() != b.size()) return false;
96 for (const auto& a_elem : a) {
97 size_t a_count = 0;
98 for (const auto& a_elem2 : a) {
99 if (a_elem == a_elem2) {
100 ++a_count;
101 }
102 }
103 size_t b_count = 0;
104 for (const auto& b_elem : b) {
105 if (a_elem == b_elem) ++b_count;
106 }
107 if (a_count != b_count) return false;
108 }
109 return true;
110}
111
Bernie Innocenti443489e2018-08-10 14:27:23 +0900112class ResolverTest : public ::testing::Test, public DnsResponderClient {
Bernie Innocenti0298c682018-10-02 23:18:11 +0900113 protected:
Bernie Innocenticd257642018-12-20 15:56:40 +0900114 void SetUp() { DnsResponderClient::SetUp(); }
115 void TearDown() { DnsResponderClient::TearDown(); }
Bernie Innocenti443489e2018-08-10 14:27:23 +0900116
117 bool GetResolverInfo(std::vector<std::string>* servers, std::vector<std::string>* domains,
Mike Yuda77e8e2018-11-26 13:26:21 +0900118 std::vector<std::string>* tlsServers, __res_params* params,
119 std::vector<ResolverStats>* stats) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900120 using android::net::INetd;
121 std::vector<int32_t> params32;
122 std::vector<int32_t> stats32;
Mike Yuda77e8e2018-11-26 13:26:21 +0900123 auto rv = mNetdSrv->getResolverInfo(TEST_NETID, servers, domains, tlsServers, &params32,
124 &stats32);
Bernie Innocenti45238a12018-12-04 14:57:48 +0900125 if (!rv.isOk() || params32.size() != static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT)) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900126 return false;
127 }
128 *params = __res_params {
129 .sample_validity = static_cast<uint16_t>(
130 params32[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY]),
131 .success_threshold = static_cast<uint8_t>(
132 params32[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD]),
133 .min_samples = static_cast<uint8_t>(
134 params32[INetd::RESOLVER_PARAMS_MIN_SAMPLES]),
135 .max_samples = static_cast<uint8_t>(
136 params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES]),
137 .base_timeout_msec = params32[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
138 };
139 return ResolverStats::decodeAll(stats32, stats);
140 }
141
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900142 static std::string ToString(const hostent* he) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900143 if (he == nullptr) return "<null>";
144 char buffer[INET6_ADDRSTRLEN];
145 if (!inet_ntop(he->h_addrtype, he->h_addr_list[0], buffer, sizeof(buffer))) {
146 return "<invalid>";
147 }
148 return buffer;
149 }
150
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900151 static std::string ToString(const addrinfo* ai) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900152 if (!ai)
153 return "<null>";
154 for (const auto* aip = ai ; aip != nullptr ; aip = aip->ai_next) {
155 char host[NI_MAXHOST];
156 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
157 NI_NUMERICHOST);
158 if (rv != 0)
159 return gai_strerror(rv);
160 return host;
161 }
162 return "<invalid>";
163 }
164
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900165 static std::string ToString(const ScopedAddrinfo& ai) { return ToString(ai.get()); }
166
nuccachenf52f7a52018-07-17 18:07:23 +0800167 static std::vector<std::string> ToStrings(const addrinfo* ai) {
168 std::vector<std::string> hosts;
169 if (!ai) {
170 hosts.push_back("<null>");
171 return hosts;
172 }
173 for (const auto* aip = ai; aip != nullptr; aip = aip->ai_next) {
174 char host[NI_MAXHOST];
175 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
176 NI_NUMERICHOST);
177 if (rv != 0) {
178 hosts.clear();
179 hosts.push_back(gai_strerror(rv));
180 return hosts;
181 } else {
182 hosts.push_back(host);
183 }
184 }
185 if (hosts.empty()) hosts.push_back("<invalid>");
186 return hosts;
187 }
188
189 static std::vector<std::string> ToStrings(const ScopedAddrinfo& ai) {
190 return ToStrings(ai.get());
191 }
192
Bernie Innocenti443489e2018-08-10 14:27:23 +0900193 size_t GetNumQueries(const test::DNSResponder& dns, const char* name) const {
194 auto queries = dns.queries();
195 size_t found = 0;
196 for (const auto& p : queries) {
197 if (p.first == name) {
198 ++found;
199 }
200 }
201 return found;
202 }
203
204 size_t GetNumQueriesForType(const test::DNSResponder& dns, ns_type type,
Bernie Innocenti0298c682018-10-02 23:18:11 +0900205 const char* name) const {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900206 auto queries = dns.queries();
207 size_t found = 0;
208 for (const auto& p : queries) {
209 if (p.second == type && p.first == name) {
210 ++found;
211 }
212 }
213 return found;
214 }
215
nuccachenf52f7a52018-07-17 18:07:23 +0800216 bool WaitForPrefix64Detected(int netId, int timeoutMs) {
217 constexpr int intervalMs = 2;
218 const int limit = timeoutMs / intervalMs;
219 for (int count = 0; count <= limit; ++count) {
220 std::string prefix;
221 auto rv = mNetdSrv->getPrefix64(netId, &prefix);
222 if (rv.isOk()) {
223 return true;
224 }
225 usleep(intervalMs * 1000);
226 }
227 return false;
228 }
229
Bernie Innocenti443489e2018-08-10 14:27:23 +0900230 void RunGetAddrInfoStressTest_Binder(unsigned num_hosts, unsigned num_threads,
231 unsigned num_queries) {
232 std::vector<std::string> domains = { "example.com" };
233 std::vector<std::unique_ptr<test::DNSResponder>> dns;
234 std::vector<std::string> servers;
235 std::vector<DnsResponderClient::Mapping> mappings;
236 ASSERT_NO_FATAL_FAILURE(SetupMappings(num_hosts, domains, &mappings));
237 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS, mappings, &dns, &servers));
238
239 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
240
241 auto t0 = std::chrono::steady_clock::now();
242 std::vector<std::thread> threads(num_threads);
243 for (std::thread& thread : threads) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900244 thread = std::thread([&mappings, num_queries]() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900245 for (unsigned i = 0 ; i < num_queries ; ++i) {
246 uint32_t ofs = arc4random_uniform(mappings.size());
247 auto& mapping = mappings[ofs];
248 addrinfo* result = nullptr;
249 int rv = getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result);
250 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
251 if (rv == 0) {
252 std::string result_str = ToString(result);
253 EXPECT_TRUE(result_str == mapping.ip4 || result_str == mapping.ip6)
254 << "result='" << result_str << "', ip4='" << mapping.ip4
255 << "', ip6='" << mapping.ip6;
256 }
257 if (result) {
258 freeaddrinfo(result);
259 result = nullptr;
260 }
261 }
262 });
263 }
264
265 for (std::thread& thread : threads) {
266 thread.join();
267 }
268 auto t1 = std::chrono::steady_clock::now();
269 ALOGI("%u hosts, %u threads, %u queries, %Es", num_hosts, num_threads, num_queries,
270 std::chrono::duration<double>(t1 - t0).count());
271 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
272 }
273
274 const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
275 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
276 const std::vector<int> mDefaultParams_Binder = {
277 300, // SAMPLE_VALIDITY
278 25, // SUCCESS_THRESHOLD
279 8, 8, // {MIN,MAX}_SAMPLES
280 100, // BASE_TIMEOUT_MSEC
281 };
282};
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 };
293 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
294
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};
330 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
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());
384 ASSERT_TRUE(
385 SetResolversForNetwork({listen_addr}, mDefaultSearchDomains, mDefaultParams_Binder));
386
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;
452 std::vector<Mapping> mappings;
453 ASSERT_NO_FATAL_FAILURE(SetupMappings(1, domains, &mappings));
454 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(4, mappings, &dns, &servers));
455 ASSERT_EQ(1U, mappings.size());
456 const Mapping& mapping = mappings[0];
457
458 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
459
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());
Sehee Park8659b8d2018-11-16 10:53:16 +0900483 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams_Binder.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900484 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY],
485 res_params.sample_validity);
486 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
487 res_params.success_threshold);
488 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
489 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
490 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
491 res_params.base_timeout_msec);
492 EXPECT_EQ(servers.size(), res_stats.size());
493
494 EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
495 EXPECT_TRUE(UnorderedCompareArray(res_domains, domains));
496
497 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
498}
499
500TEST_F(ResolverTest, GetAddrInfo) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900501 const char* listen_addr = "127.0.0.4";
502 const char* listen_addr2 = "127.0.0.5";
503 const char* listen_srv = "53";
504 const char* host_name = "howdy.example.com.";
505 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
506 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
507 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
508 ASSERT_TRUE(dns.startServer());
509
510 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
511 dns2.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
512 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
513 ASSERT_TRUE(dns2.startServer());
514
Bernie Innocenti443489e2018-08-10 14:27:23 +0900515 std::vector<std::string> servers = { listen_addr };
516 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
517 dns.clearQueries();
518 dns2.clearQueries();
519
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900520 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
521 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900522 size_t found = GetNumQueries(dns, host_name);
523 EXPECT_LE(1U, found);
524 // Could be A or AAAA
525 std::string result_str = ToString(result);
526 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
527 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900528
529 // Verify that the name is cached.
530 size_t old_found = found;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900531 result = safe_getaddrinfo("howdy", nullptr, nullptr);
532 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900533 found = GetNumQueries(dns, host_name);
534 EXPECT_LE(1U, found);
535 EXPECT_EQ(old_found, found);
536 result_str = ToString(result);
537 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
538 << result_str;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900539
540 // Change the DNS resolver, ensure that queries are still cached.
541 servers = { listen_addr2 };
542 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
543 dns.clearQueries();
544 dns2.clearQueries();
545
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900546 result = safe_getaddrinfo("howdy", nullptr, nullptr);
547 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900548 found = GetNumQueries(dns, host_name);
549 size_t found2 = GetNumQueries(dns2, host_name);
550 EXPECT_EQ(0U, found);
551 EXPECT_LE(0U, found2);
552
553 // Could be A or AAAA
554 result_str = ToString(result);
555 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
556 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900557
558 dns.stopServer();
559 dns2.stopServer();
560}
561
562TEST_F(ResolverTest, GetAddrInfoV4) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900563 constexpr char listen_addr[] = "127.0.0.5";
564 constexpr char listen_srv[] = "53";
565 constexpr char host_name[] = "hola.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900566 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
567 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.5");
568 ASSERT_TRUE(dns.startServer());
569 std::vector<std::string> servers = { listen_addr };
570 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
571
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900572 addrinfo hints = {.ai_family = AF_INET};
573 ScopedAddrinfo result = safe_getaddrinfo("hola", nullptr, &hints);
574 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900575 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
576 EXPECT_EQ("1.2.3.5", ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900577}
578
579TEST_F(ResolverTest, GetAddrInfo_localhost) {
580 constexpr char name[] = "localhost";
581 constexpr char addr[] = "127.0.0.1";
582 constexpr char name_ip6[] = "ip6-localhost";
583 constexpr char addr_ip6[] = "::1";
584
Bernie Innocenti974233e2018-09-04 20:35:34 +0900585 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900586 constexpr char listen_addr[] = "127.0.0.5";
587 constexpr char listen_srv[] = "53";
588 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
589 ASSERT_TRUE(dns.startServer());
590 std::vector<std::string> servers = {listen_addr};
591 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
592
593 ScopedAddrinfo result = safe_getaddrinfo(name, nullptr, nullptr);
594 EXPECT_TRUE(result != nullptr);
595 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti0298c682018-10-02 23:18:11 +0900596 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900597 EXPECT_EQ(addr, ToString(result));
598
599 result = safe_getaddrinfo(name_ip6, nullptr, nullptr);
600 EXPECT_TRUE(result != nullptr);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900601 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
602 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900603 EXPECT_EQ(addr_ip6, ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900604}
605
Bernie Innocenti443489e2018-08-10 14:27:23 +0900606TEST_F(ResolverTest, MultidomainResolution) {
607 std::vector<std::string> searchDomains = { "example1.com", "example2.com", "example3.com" };
608 const char* listen_addr = "127.0.0.6";
609 const char* listen_srv = "53";
610 const char* host_name = "nihao.example2.com.";
611 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
612 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
613 ASSERT_TRUE(dns.startServer());
614 std::vector<std::string> servers = { listen_addr };
615 ASSERT_TRUE(SetResolversForNetwork(servers, searchDomains, mDefaultParams_Binder));
616
617 dns.clearQueries();
618 const hostent* result = gethostbyname("nihao");
619 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
620 ASSERT_FALSE(result == nullptr);
621 ASSERT_EQ(4, result->h_length);
622 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
623 EXPECT_EQ("1.2.3.3", ToString(result));
624 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
625 dns.stopServer();
626}
627
Bernie Innocenti974233e2018-09-04 20:35:34 +0900628TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
629 constexpr char listen_addr0[] = "127.0.0.7";
630 constexpr char listen_srv[] = "53";
631 constexpr char host_name[] = "ohayou.example.com.";
632 constexpr char numeric_addr[] = "fe80::1%lo";
633
634 test::DNSResponder dns(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
635 dns.setResponseProbability(0.0);
636 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
637 ASSERT_TRUE(dns.startServer());
638 std::vector<std::string> servers = {listen_addr0};
639 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
640
641 addrinfo hints = {.ai_family = AF_INET6};
642 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
643 EXPECT_TRUE(result != nullptr);
644 EXPECT_EQ(numeric_addr, ToString(result));
645 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
646
647 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
648 // We should fail without sending out a DNS query.
649 hints.ai_flags |= AI_NUMERICHOST;
650 result = safe_getaddrinfo(host_name, nullptr, &hints);
651 EXPECT_TRUE(result == nullptr);
652 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
653}
654
Bernie Innocenti443489e2018-08-10 14:27:23 +0900655TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900656 const char* listen_addr0 = "127.0.0.7";
657 const char* listen_addr1 = "127.0.0.8";
658 const char* listen_srv = "53";
659 const char* host_name = "ohayou.example.com.";
660 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
661 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
662 dns0.setResponseProbability(0.0);
663 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
664 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
665 ASSERT_TRUE(dns0.startServer());
666 ASSERT_TRUE(dns1.startServer());
667 std::vector<std::string> servers = { listen_addr0, listen_addr1 };
668 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
669 int sample_count = 8;
670 const std::vector<int> params = { 300, 25, sample_count, sample_count };
671 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, params));
672
673 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
674 // reached the dns0, which is set to fail. No more requests should then arrive at that server
675 // for the next sample_lifetime seconds.
676 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900677 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti45238a12018-12-04 14:57:48 +0900678 for (int i = 0; i < sample_count; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900679 std::string domain = StringPrintf("nonexistent%d", i);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900680 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900681 }
682 // Due to 100% errors for all possible samples, the server should be ignored from now on and
683 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
684 dns0.clearQueries();
685 dns1.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900686 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
687 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900688 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
689 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900690}
691
692TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900693 const char* listen_addr0 = "127.0.0.7";
694 const char* listen_addr1 = "127.0.0.8";
695 const char* listen_srv = "53";
696 const char* host_name1 = "ohayou.example.com.";
697 const char* host_name2 = "ciao.example.com.";
698
699 // dns0 does not respond with 100% probability, while
700 // dns1 responds normally, at least initially.
701 test::DNSResponder dns0(listen_addr0, listen_srv, 250, static_cast<ns_rcode>(-1));
702 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
703 dns0.setResponseProbability(0.0);
704 dns0.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::5");
705 dns1.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::6");
706 dns0.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::5");
707 dns1.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::6");
708 ASSERT_TRUE(dns0.startServer());
709 ASSERT_TRUE(dns1.startServer());
710 std::vector<std::string> servers = {listen_addr0, listen_addr1};
711 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
712
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900713 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900714
715 // dns0 will ignore the request, and we'll fallback to dns1 after the first
716 // retry.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900717 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
718 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900719 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
720 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
721
722 // Now make dns1 also ignore 100% requests... The resolve should alternate
723 // retries between the nameservers and fail after 4 attempts.
724 dns1.setResponseProbability(0.0);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900725 addrinfo* result2 = nullptr;
726 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
727 EXPECT_EQ(nullptr, result2);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900728 EXPECT_EQ(4U, GetNumQueries(dns0, host_name2));
729 EXPECT_EQ(4U, GetNumQueries(dns1, host_name2));
730}
731
732TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
733 const char* listen_addr0 = "127.0.0.9";
734 const char* listen_addr1 = "127.0.0.10";
735 const char* listen_addr2 = "127.0.0.11";
736 const char* listen_srv = "53";
737 const char* host_name = "konbanha.example.com.";
738 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
739 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
740 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
741 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
742 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
743 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::7");
744 ASSERT_TRUE(dns0.startServer());
745 ASSERT_TRUE(dns1.startServer());
746 ASSERT_TRUE(dns2.startServer());
747 const std::vector<std::string> servers = { listen_addr0, listen_addr1, listen_addr2 };
748 std::vector<std::thread> threads(10);
749 for (std::thread& thread : threads) {
750 thread = std::thread([this, &servers]() {
751 unsigned delay = arc4random_uniform(1*1000*1000); // <= 1s
752 usleep(delay);
753 std::vector<std::string> serverSubset;
754 for (const auto& server : servers) {
755 if (arc4random_uniform(2)) {
756 serverSubset.push_back(server);
757 }
758 }
759 if (serverSubset.empty()) serverSubset = servers;
760 ASSERT_TRUE(SetResolversForNetwork(serverSubset, mDefaultSearchDomains,
761 mDefaultParams_Binder));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900762 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900763 addrinfo* result = nullptr;
764 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
765 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
766 if (result) {
767 freeaddrinfo(result);
768 result = nullptr;
769 }
770 });
771 }
772 for (std::thread& thread : threads) {
773 thread.join();
774 }
775}
776
777TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100) {
778 const unsigned num_hosts = 100;
779 const unsigned num_threads = 100;
780 const unsigned num_queries = 100;
781 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
782}
783
784TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100000) {
785 const unsigned num_hosts = 100000;
786 const unsigned num_threads = 100;
787 const unsigned num_queries = 100;
788 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
789}
790
791TEST_F(ResolverTest, EmptySetup) {
792 using android::net::INetd;
793 std::vector<std::string> servers;
794 std::vector<std::string> domains;
795 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
796 std::vector<std::string> res_servers;
797 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900798 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900799 __res_params res_params;
800 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900801 ASSERT_TRUE(
802 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900803 EXPECT_EQ(0U, res_servers.size());
804 EXPECT_EQ(0U, res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900805 EXPECT_EQ(0U, res_tls_servers.size());
Sehee Park8659b8d2018-11-16 10:53:16 +0900806 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams_Binder.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900807 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY],
808 res_params.sample_validity);
809 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
810 res_params.success_threshold);
811 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
812 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
813 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
814 res_params.base_timeout_msec);
815}
816
817TEST_F(ResolverTest, SearchPathChange) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900818 const char* listen_addr = "127.0.0.13";
819 const char* listen_srv = "53";
820 const char* host_name1 = "test13.domain1.org.";
821 const char* host_name2 = "test13.domain2.org.";
822 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
823 dns.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::13");
824 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13");
825 ASSERT_TRUE(dns.startServer());
826 std::vector<std::string> servers = { listen_addr };
827 std::vector<std::string> domains = { "domain1.org" };
828 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
829
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900830 const addrinfo hints = {.ai_family = AF_INET6};
831 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
832 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900833 EXPECT_EQ(1U, dns.queries().size());
834 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
835 EXPECT_EQ("2001:db8::13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900836
837 // Test that changing the domain search path on its own works.
838 domains = { "domain2.org" };
839 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
840 dns.clearQueries();
841
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900842 result = safe_getaddrinfo("test13", nullptr, &hints);
843 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900844 EXPECT_EQ(1U, dns.queries().size());
845 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
846 EXPECT_EQ("2001:db8::1:13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900847}
848
Bernie Innocenti443489e2018-08-10 14:27:23 +0900849static std::string base64Encode(const std::vector<uint8_t>& input) {
850 size_t out_len;
851 EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));
852 // out_len includes the trailing NULL.
853 uint8_t output_bytes[out_len];
854 EXPECT_EQ(out_len - 1, EVP_EncodeBlock(output_bytes, input.data(), input.size()));
855 return std::string(reinterpret_cast<char*>(output_bytes));
856}
857
Mike Yuda77e8e2018-11-26 13:26:21 +0900858// If we move this function to dns_responder_client, it will complicate the dependency need of
859// dns_tls_frontend.h.
860static void setupTlsServers(const std::vector<std::string>& servers,
861 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls,
862 std::vector<std::string>* fingerprints) {
863 const char* listen_udp = "53";
864 const char* listen_tls = "853";
865
866 for (const auto& server : servers) {
867 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
868 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
869 t->startServer();
870 fingerprints->push_back(base64Encode(t->fingerprint()));
871 tls->push_back(std::move(t));
872 }
873}
874
875static void shutdownTlsServers(std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
876 for (const auto& t : *tls) {
877 t->stopServer();
878 }
879 tls->clear();
880}
881
882TEST_F(ResolverTest, MaxServerPrune_Binder) {
883 using android::net::INetd;
884
885 std::vector<std::string> domains;
886 std::vector<std::unique_ptr<test::DNSResponder>> dns;
887 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
888 std::vector<std::string> servers;
889 std::vector<std::string> fingerprints;
890 std::vector<Mapping> mappings;
891
892 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
893 domains.push_back(StringPrintf("example%u.com", i));
894 }
895 ASSERT_NO_FATAL_FAILURE(SetupMappings(1, domains, &mappings));
896 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
897 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls, &fingerprints));
898
899 ASSERT_TRUE(SetResolversWithTls(servers, domains, mDefaultParams_Binder, "", fingerprints));
900
901 std::vector<std::string> res_servers;
902 std::vector<std::string> res_domains;
903 std::vector<std::string> res_tls_servers;
904 __res_params res_params;
905 std::vector<ResolverStats> res_stats;
906 ASSERT_TRUE(
907 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
908
909 // Check the size of the stats and its contents.
910 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
911 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
912 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
913 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
914 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
915 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
916
917 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
918 ASSERT_NO_FATAL_FAILURE(shutdownTlsServers(&tls));
919}
920
921TEST_F(ResolverTest, ResolverStats) {
922 const char* listen_addr1 = "127.0.0.4";
923 const char* listen_addr2 = "127.0.0.5";
924 const char* listen_addr3 = "127.0.0.6";
925 const char* listen_srv = "53";
926 const char* host_name = "hello.example.com.";
927
928 // Set server 1 timeout.
929 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
930 dns1.setResponseProbability(0.0);
931 ASSERT_TRUE(dns1.startServer());
932
933 // Set server 2 responding server failure.
934 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
935 dns2.setResponseProbability(0.0);
936 ASSERT_TRUE(dns2.startServer());
937
938 // Set server 3 workable.
939 test::DNSResponder dns3(listen_addr3, listen_srv, 250, ns_rcode::ns_r_servfail);
940 dns3.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
941 ASSERT_TRUE(dns3.startServer());
942
943 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
944 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
945
946 dns3.clearQueries();
947 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
948 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
949 size_t found = GetNumQueries(dns3, host_name);
950 EXPECT_LE(1U, found);
951 std::string result_str = ToString(result);
952 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
953
954 std::vector<std::string> res_servers;
955 std::vector<std::string> res_domains;
956 std::vector<std::string> res_tls_servers;
957 __res_params res_params;
958 std::vector<ResolverStats> res_stats;
959 ASSERT_TRUE(
960 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
961
962 EXPECT_EQ(1, res_stats[0].timeouts);
963 EXPECT_EQ(1, res_stats[1].errors);
964 EXPECT_EQ(1, res_stats[2].successes);
965
966 dns1.stopServer();
967 dns2.stopServer();
968 dns3.stopServer();
969}
970
Bernie Innocenti443489e2018-08-10 14:27:23 +0900971// Test what happens if the specified TLS server is nonexistent.
972TEST_F(ResolverTest, GetHostByName_TlsMissing) {
973 const char* listen_addr = "127.0.0.3";
974 const char* listen_srv = "53";
975 const char* host_name = "tlsmissing.example.com.";
976 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
977 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
978 ASSERT_TRUE(dns.startServer());
979 std::vector<std::string> servers = { listen_addr };
980
981 // There's nothing listening on this address, so validation will either fail or
982 /// hang. Either way, queries will continue to flow to the DNSResponder.
983 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
984
985 const hostent* result;
986
987 result = gethostbyname("tlsmissing");
988 ASSERT_FALSE(result == nullptr);
989 EXPECT_EQ("1.2.3.3", ToString(result));
990
991 // Clear TLS bit.
992 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
993 dns.stopServer();
994}
995
996// Test what happens if the specified TLS server replies with garbage.
997TEST_F(ResolverTest, GetHostByName_TlsBroken) {
998 const char* listen_addr = "127.0.0.3";
999 const char* listen_srv = "53";
1000 const char* host_name1 = "tlsbroken1.example.com.";
1001 const char* host_name2 = "tlsbroken2.example.com.";
1002 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1003 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1004 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1005 ASSERT_TRUE(dns.startServer());
1006 std::vector<std::string> servers = { listen_addr };
1007
1008 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1009 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1010 ASSERT_TRUE(s >= 0);
1011 struct sockaddr_in tlsServer = {
1012 .sin_family = AF_INET,
1013 .sin_port = htons(853),
1014 };
1015 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
Bernie Innocenti6f9fd902018-10-11 20:50:23 +09001016 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1017 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001018 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1019 ASSERT_FALSE(listen(s, 1));
1020
1021 // Trigger TLS validation.
1022 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1023
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.
1049 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1050 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());
1070 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1071
1072 const hostent* result;
1073
1074 // Wait for validation to complete.
1075 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1076
1077 result = gethostbyname("tls1");
1078 ASSERT_FALSE(result == nullptr);
1079 EXPECT_EQ("1.2.3.1", ToString(result));
1080
1081 // Wait for query to get counted.
1082 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1083
1084 // Stop the TLS server. Since we're in opportunistic mode, queries will
1085 // fall back to the locally-assigned (clear text) nameservers.
1086 tls.stopServer();
1087
1088 dns.clearQueries();
1089 result = gethostbyname("tls2");
1090 EXPECT_FALSE(result == nullptr);
1091 EXPECT_EQ("1.2.3.2", ToString(result));
1092 const auto queries = dns.queries();
1093 EXPECT_EQ(1U, queries.size());
1094 EXPECT_EQ("tls2.example.com.", queries[0].first);
1095 EXPECT_EQ(ns_t_a, queries[0].second);
1096
1097 // Reset the resolvers without enabling TLS. Queries should still be routed
1098 // to the UDP endpoint.
1099 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1100
1101 result = gethostbyname("tls3");
1102 ASSERT_FALSE(result == nullptr);
1103 EXPECT_EQ("1.2.3.3", ToString(result));
1104
1105 dns.stopServer();
1106}
1107
1108TEST_F(ResolverTest, GetHostByName_TlsFingerprint) {
1109 const char* listen_addr = "127.0.0.3";
1110 const char* listen_udp = "53";
1111 const char* listen_tls = "853";
1112 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1113 ASSERT_TRUE(dns.startServer());
1114 for (int chain_length = 1; chain_length <= 3; ++chain_length) {
Bernie Innocentif2572392018-10-02 19:04:56 +09001115 std::string host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001116 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1117 std::vector<std::string> servers = { listen_addr };
1118
1119 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1120 tls.set_chain_length(chain_length);
1121 ASSERT_TRUE(tls.startServer());
1122 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1123 { base64Encode(tls.fingerprint()) }));
1124
1125 const hostent* result;
1126
1127 // Wait for validation to complete.
1128 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1129
1130 result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
1131 EXPECT_FALSE(result == nullptr);
1132 if (result) {
1133 EXPECT_EQ("1.2.3.1", ToString(result));
1134
1135 // Wait for query to get counted.
1136 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1137 }
1138
1139 // Clear TLS bit to ensure revalidation.
1140 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1141 tls.stopServer();
1142 }
1143 dns.stopServer();
1144}
1145
1146TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {
1147 const char* listen_addr = "127.0.0.3";
1148 const char* listen_udp = "53";
1149 const char* listen_tls = "853";
1150 const char* host_name = "badtlsfingerprint.example.com.";
1151 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1152 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1153 ASSERT_TRUE(dns.startServer());
1154 std::vector<std::string> servers = { listen_addr };
1155
1156 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1157 ASSERT_TRUE(tls.startServer());
1158 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1159 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
1160 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1161 { base64Encode(bad_fingerprint) }));
1162
1163 // The initial validation should fail at the fingerprint check before
1164 // issuing a query.
1165 EXPECT_FALSE(tls.waitForQueries(1, 500));
1166
1167 // A fingerprint was provided and failed to match, so the query should fail.
1168 EXPECT_EQ(nullptr, gethostbyname("badtlsfingerprint"));
1169
1170 // Clear TLS bit.
1171 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1172 tls.stopServer();
1173 dns.stopServer();
1174}
1175
1176// Test that we can pass two different fingerprints, and connection succeeds as long as
1177// at least one of them matches the server.
1178TEST_F(ResolverTest, GetHostByName_TwoTlsFingerprints) {
1179 const char* listen_addr = "127.0.0.3";
1180 const char* listen_udp = "53";
1181 const char* listen_tls = "853";
1182 const char* host_name = "twotlsfingerprints.example.com.";
1183 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1184 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1185 ASSERT_TRUE(dns.startServer());
1186 std::vector<std::string> servers = { listen_addr };
1187
1188 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1189 ASSERT_TRUE(tls.startServer());
1190 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1191 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
1192 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1193 { base64Encode(bad_fingerprint), base64Encode(tls.fingerprint()) }));
1194
1195 const hostent* result;
1196
1197 // Wait for validation to complete.
1198 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1199
1200 result = gethostbyname("twotlsfingerprints");
1201 ASSERT_FALSE(result == nullptr);
1202 EXPECT_EQ("1.2.3.1", ToString(result));
1203
1204 // Wait for query to get counted.
1205 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1206
1207 // Clear TLS bit.
1208 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1209 tls.stopServer();
1210 dns.stopServer();
1211}
1212
1213TEST_F(ResolverTest, GetHostByName_TlsFingerprintGoesBad) {
1214 const char* listen_addr = "127.0.0.3";
1215 const char* listen_udp = "53";
1216 const char* listen_tls = "853";
1217 const char* host_name1 = "tlsfingerprintgoesbad1.example.com.";
1218 const char* host_name2 = "tlsfingerprintgoesbad2.example.com.";
1219 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1220 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1221 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1222 ASSERT_TRUE(dns.startServer());
1223 std::vector<std::string> servers = { listen_addr };
1224
1225 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1226 ASSERT_TRUE(tls.startServer());
1227 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1228 { base64Encode(tls.fingerprint()) }));
1229
1230 const hostent* result;
1231
1232 // Wait for validation to complete.
1233 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1234
1235 result = gethostbyname("tlsfingerprintgoesbad1");
1236 ASSERT_FALSE(result == nullptr);
1237 EXPECT_EQ("1.2.3.1", ToString(result));
1238
1239 // Wait for query to get counted.
1240 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1241
1242 // Restart the TLS server. This will generate a new certificate whose fingerprint
1243 // no longer matches the stored fingerprint.
1244 tls.stopServer();
1245 tls.startServer();
1246
1247 result = gethostbyname("tlsfingerprintgoesbad2");
1248 ASSERT_TRUE(result == nullptr);
1249 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
1250
1251 // Clear TLS bit.
1252 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1253 tls.stopServer();
1254 dns.stopServer();
1255}
1256
1257TEST_F(ResolverTest, GetHostByName_TlsFailover) {
1258 const char* listen_addr1 = "127.0.0.3";
1259 const char* listen_addr2 = "127.0.0.4";
1260 const char* listen_udp = "53";
1261 const char* listen_tls = "853";
1262 const char* host_name1 = "tlsfailover1.example.com.";
1263 const char* host_name2 = "tlsfailover2.example.com.";
1264 test::DNSResponder dns1(listen_addr1, listen_udp, 250, ns_rcode::ns_r_servfail);
1265 test::DNSResponder dns2(listen_addr2, listen_udp, 250, ns_rcode::ns_r_servfail);
1266 dns1.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1267 dns1.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1268 dns2.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.3");
1269 dns2.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
1270 ASSERT_TRUE(dns1.startServer());
1271 ASSERT_TRUE(dns2.startServer());
1272 std::vector<std::string> servers = { listen_addr1, listen_addr2 };
1273
1274 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1275 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1276 ASSERT_TRUE(tls1.startServer());
1277 ASSERT_TRUE(tls2.startServer());
1278 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1279 { base64Encode(tls1.fingerprint()), base64Encode(tls2.fingerprint()) }));
1280
1281 const hostent* result;
1282
1283 // Wait for validation to complete.
1284 EXPECT_TRUE(tls1.waitForQueries(1, 5000));
1285 EXPECT_TRUE(tls2.waitForQueries(1, 5000));
1286
1287 result = gethostbyname("tlsfailover1");
1288 ASSERT_FALSE(result == nullptr);
1289 EXPECT_EQ("1.2.3.1", ToString(result));
1290
1291 // Wait for query to get counted.
1292 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1293 // No new queries should have reached tls2.
1294 EXPECT_EQ(1, tls2.queries());
1295
1296 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1297 tls1.stopServer();
1298
1299 result = gethostbyname("tlsfailover2");
1300 EXPECT_EQ("1.2.3.4", ToString(result));
1301
1302 // Wait for query to get counted.
1303 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1304
1305 // No additional queries should have reached the insecure servers.
1306 EXPECT_EQ(2U, dns1.queries().size());
1307 EXPECT_EQ(2U, dns2.queries().size());
1308
1309 // Clear TLS bit.
1310 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1311 tls2.stopServer();
1312 dns1.stopServer();
1313 dns2.stopServer();
1314}
1315
1316TEST_F(ResolverTest, GetHostByName_BadTlsName) {
1317 const char* listen_addr = "127.0.0.3";
1318 const char* listen_udp = "53";
1319 const char* listen_tls = "853";
1320 const char* host_name = "badtlsname.example.com.";
1321 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1322 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1323 ASSERT_TRUE(dns.startServer());
1324 std::vector<std::string> servers = { listen_addr };
1325
1326 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1327 ASSERT_TRUE(tls.startServer());
1328 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
1329 "www.example.com", {}));
1330
1331 // The TLS server's certificate doesn't chain to a known CA, and a nonempty name was specified,
1332 // so the client should fail the TLS handshake before ever issuing a query.
1333 EXPECT_FALSE(tls.waitForQueries(1, 500));
1334
1335 // The query should fail hard, because a name was specified.
1336 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1337
1338 // Clear TLS bit.
1339 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1340 tls.stopServer();
1341 dns.stopServer();
1342}
1343
1344TEST_F(ResolverTest, GetAddrInfo_Tls) {
1345 const char* listen_addr = "127.0.0.3";
1346 const char* listen_udp = "53";
1347 const char* listen_tls = "853";
1348 const char* host_name = "addrinfotls.example.com.";
1349 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1350 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1351 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1352 ASSERT_TRUE(dns.startServer());
1353 std::vector<std::string> servers = { listen_addr };
1354
1355 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1356 ASSERT_TRUE(tls.startServer());
1357 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1358 { base64Encode(tls.fingerprint()) }));
1359
1360 // Wait for validation to complete.
1361 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1362
1363 dns.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001364 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1365 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001366 size_t found = GetNumQueries(dns, host_name);
1367 EXPECT_LE(1U, found);
1368 // Could be A or AAAA
1369 std::string result_str = ToString(result);
1370 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
1371 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001372 // Wait for both A and AAAA queries to get counted.
1373 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1374
1375 // Clear TLS bit.
1376 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1377 tls.stopServer();
1378 dns.stopServer();
1379}
1380
1381TEST_F(ResolverTest, TlsBypass) {
1382 const char OFF[] = "off";
1383 const char OPPORTUNISTIC[] = "opportunistic";
1384 const char STRICT[] = "strict";
1385
1386 const char GETHOSTBYNAME[] = "gethostbyname";
1387 const char GETADDRINFO[] = "getaddrinfo";
1388 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1389
1390 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1391
Mike Yu5ae61542018-10-19 22:11:43 +08001392 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001393
1394 const char ADDR4[] = "192.0.2.1";
1395 const char ADDR6[] = "2001:db8::1";
1396
1397 const char cleartext_addr[] = "127.0.0.53";
1398 const char cleartext_port[] = "53";
1399 const char tls_port[] = "853";
1400 const std::vector<std::string> servers = { cleartext_addr };
1401
1402 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1403 ASSERT_TRUE(dns.startServer());
1404
1405 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
1406
1407 struct TestConfig {
1408 const std::string mode;
1409 const bool withWorkingTLS;
1410 const std::string method;
1411
1412 std::string asHostName() const {
1413 return StringPrintf("%s.%s.%s.",
1414 mode.c_str(),
1415 withWorkingTLS ? "tlsOn" : "tlsOff",
1416 method.c_str());
1417 }
1418 } testConfigs[]{
1419 {OFF, false, GETHOSTBYNAME},
1420 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1421 {STRICT, false, GETHOSTBYNAME},
1422 {OFF, true, GETHOSTBYNAME},
1423 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1424 {STRICT, true, GETHOSTBYNAME},
1425 {OFF, false, GETADDRINFO},
1426 {OPPORTUNISTIC, false, GETADDRINFO},
1427 {STRICT, false, GETADDRINFO},
1428 {OFF, true, GETADDRINFO},
1429 {OPPORTUNISTIC, true, GETADDRINFO},
1430 {STRICT, true, GETADDRINFO},
1431 {OFF, false, GETADDRINFOFORNET},
1432 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1433 {STRICT, false, GETADDRINFOFORNET},
1434 {OFF, true, GETADDRINFOFORNET},
1435 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1436 {STRICT, true, GETADDRINFOFORNET},
1437 };
1438
1439 for (const auto& config : testConfigs) {
1440 const std::string testHostName = config.asHostName();
1441 SCOPED_TRACE(testHostName);
1442
1443 // Don't tempt test bugs due to caching.
1444 const char* host_name = testHostName.c_str();
1445 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1446 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1447
1448 if (config.withWorkingTLS) ASSERT_TRUE(tls.startServer());
1449
1450 if (config.mode == OFF) {
1451 ASSERT_TRUE(SetResolversForNetwork(
1452 servers, mDefaultSearchDomains, mDefaultParams_Binder));
1453 } else if (config.mode == OPPORTUNISTIC) {
1454 ASSERT_TRUE(SetResolversWithTls(
1455 servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1456 // Wait for validation to complete.
1457 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1458 } else if (config.mode == STRICT) {
1459 // We use the existence of fingerprints to trigger strict mode,
1460 // rather than hostname validation.
1461 const auto& fingerprint =
1462 (config.withWorkingTLS) ? tls.fingerprint() : NOOP_FINGERPRINT;
1463 ASSERT_TRUE(SetResolversWithTls(
1464 servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1465 { base64Encode(fingerprint) }));
1466 // Wait for validation to complete.
1467 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1468 } else {
1469 FAIL() << "Unsupported Private DNS mode: " << config.mode;
1470 }
1471
1472 const int tlsQueriesBefore = tls.queries();
1473
1474 const hostent* h_result = nullptr;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001475 ScopedAddrinfo ai_result;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001476
1477 if (config.method == GETHOSTBYNAME) {
1478 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1479 h_result = gethostbyname(host_name);
1480
1481 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1482 ASSERT_FALSE(h_result == nullptr);
1483 ASSERT_EQ(4, h_result->h_length);
1484 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1485 EXPECT_EQ(ADDR4, ToString(h_result));
1486 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1487 } else if (config.method == GETADDRINFO) {
1488 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001489 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1490 EXPECT_TRUE(ai_result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001491
1492 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1493 // Could be A or AAAA
1494 const std::string result_str = ToString(ai_result);
1495 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1496 << ", result_str='" << result_str << "'";
1497 } else if (config.method == GETADDRINFOFORNET) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001498 addrinfo* raw_ai_result = nullptr;
Bernie Innocentic165ce82018-10-16 23:35:28 +09001499 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1500 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1501 &raw_ai_result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001502 ai_result.reset(raw_ai_result);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001503
1504 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1505 // Could be A or AAAA
1506 const std::string result_str = ToString(ai_result);
1507 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1508 << ", result_str='" << result_str << "'";
1509 } else {
1510 FAIL() << "Unsupported query method: " << config.method;
1511 }
1512
1513 const int tlsQueriesAfter = tls.queries();
1514 EXPECT_EQ(0, tlsQueriesAfter - tlsQueriesBefore);
1515
Bernie Innocenti443489e2018-08-10 14:27:23 +09001516 // Clear per-process resolv netid.
1517 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
1518 tls.stopServer();
1519 dns.clearQueries();
1520 }
1521
1522 dns.stopServer();
1523}
1524
1525TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Mike Yu5ae61542018-10-19 22:11:43 +08001526 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001527 const char cleartext_addr[] = "127.0.0.53";
1528 const char cleartext_port[] = "53";
1529 const std::vector<std::string> servers = { cleartext_addr };
1530
1531 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1532 const char* host_name = "strictmode.notlsips.example.com.";
1533 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1534 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1535 ASSERT_TRUE(dns.startServer());
1536
1537 ASSERT_TRUE(SetResolversWithTls(
1538 servers, mDefaultSearchDomains, mDefaultParams_Binder,
1539 {}, "", { base64Encode(NOOP_FINGERPRINT) }));
1540
1541 addrinfo* ai_result = nullptr;
1542 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1543 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1544}
Luke Huangc68f1b92018-11-21 20:13:38 +08001545
1546namespace {
1547
1548int getAsyncResponse(int fd, int* rcode, u_char* buf, int bufLen) {
1549 struct pollfd wait_fd[1];
1550 wait_fd[0].fd = fd;
1551 wait_fd[0].events = POLLIN;
1552 short revents;
1553 int ret;
1554
1555 ret = poll(wait_fd, 1, -1);
1556 revents = wait_fd[0].revents;
1557 if (revents & POLLIN) {
1558 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang952d0942018-12-26 16:53:03 +08001559 // Verify that resNetworkResult() closed the fd
1560 char dummy;
1561 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1562 EXPECT_EQ(EBADF, errno);
Luke Huangc68f1b92018-11-21 20:13:38 +08001563 return n;
1564 }
1565 return -1;
1566}
1567
1568std::string toString(u_char* buf, int bufLen, int ipType) {
1569 ns_msg handle;
1570 int ancount, n = 0;
1571 ns_rr rr;
1572
1573 if (ns_initparse((const uint8_t*) buf, bufLen, &handle) >= 0) {
1574 ancount = ns_msg_count(handle, ns_s_an);
1575 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
1576 const u_char* rdata = ns_rr_rdata(rr);
1577 char buffer[INET6_ADDRSTRLEN];
1578 if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
1579 return buffer;
1580 }
1581 }
1582 }
1583 return "";
1584}
1585
1586int dns_open_proxy() {
1587 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1588 if (s == -1) {
1589 return -1;
1590 }
1591 const int one = 1;
1592 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1593
1594 static const struct sockaddr_un proxy_addr = {
1595 .sun_family = AF_UNIX,
1596 .sun_path = "/dev/socket/dnsproxyd",
1597 };
1598
1599 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) !=
1600 0) {
1601 close(s);
1602 return -1;
1603 }
1604
1605 return s;
1606}
1607
Luke Huang952d0942018-12-26 16:53:03 +08001608void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1609 int rcode = -1;
1610 uint8_t buf[MAXPACKET] = {};
1611
1612 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1613 EXPECT_GT(res, 0);
1614 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1615}
1616
1617void expectAnswersNotValid(int fd, int expectedErrno) {
1618 int rcode = -1;
1619 uint8_t buf[MAXPACKET] = {};
1620
1621 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1622 EXPECT_EQ(expectedErrno, res);
1623}
1624
Luke Huangc68f1b92018-11-21 20:13:38 +08001625} // namespace
1626
1627TEST_F(ResolverTest, Async_NormalQueryV4V6) {
1628 const char listen_addr[] = "127.0.0.4";
1629 const char listen_srv[] = "53";
1630 const char host_name[] = "howdy.example.com.";
1631 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1632 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1633 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1634 ASSERT_TRUE(dns.startServer());
1635 std::vector<std::string> servers = {listen_addr};
1636 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1637 dns.clearQueries();
1638
Luke Huang952d0942018-12-26 16:53:03 +08001639 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1640 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001641 EXPECT_TRUE(fd1 != -1);
1642 EXPECT_TRUE(fd2 != -1);
1643
1644 u_char buf[MAXPACKET] = {};
1645 int rcode;
1646 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1647 EXPECT_GT(res, 0);
1648 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1649
1650 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1651 EXPECT_GT(res, 0);
1652 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1653
1654 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1655
1656 // Re-query verify cache works
Luke Huang952d0942018-12-26 16:53:03 +08001657 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1658 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001659
1660 EXPECT_TRUE(fd1 != -1);
1661 EXPECT_TRUE(fd2 != -1);
1662
1663 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1664 EXPECT_GT(res, 0);
1665 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1666
1667 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1668 EXPECT_GT(res, 0);
1669 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1670
1671 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1672}
1673
1674TEST_F(ResolverTest, Async_BadQuery) {
1675 const char listen_addr[] = "127.0.0.4";
1676 const char listen_srv[] = "53";
1677 const char host_name[] = "howdy.example.com.";
1678 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1679 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1680 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1681 ASSERT_TRUE(dns.startServer());
1682 std::vector<std::string> servers = {listen_addr};
1683 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1684 dns.clearQueries();
1685
1686 static struct {
1687 int fd;
1688 const char* dname;
1689 const int queryType;
1690 const int expectRcode;
1691 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001692 {-1, "", ns_t_aaaa, 0},
1693 {-1, "as65ass46", ns_t_aaaa, 0},
1694 {-1, "454564564564", ns_t_aaaa, 0},
1695 {-1, "h645235", ns_t_a, 0},
1696 {-1, "www.google.com", ns_t_a, 0},
Luke Huangc68f1b92018-11-21 20:13:38 +08001697 };
1698
1699 for (auto& td : kTestData) {
1700 SCOPED_TRACE(td.dname);
Luke Huang952d0942018-12-26 16:53:03 +08001701 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001702 EXPECT_TRUE(td.fd != -1);
1703 }
1704
1705 // dns_responder return empty resp(packet only contains query part) with no error currently
1706 for (const auto& td : kTestData) {
1707 u_char buf[MAXPACKET] = {};
1708 int rcode;
1709 SCOPED_TRACE(td.dname);
1710 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1711 EXPECT_GT(res, 0);
1712 EXPECT_EQ(rcode, td.expectRcode);
1713 }
1714}
1715
1716TEST_F(ResolverTest, Async_EmptyAnswer) {
1717 const char listen_addr[] = "127.0.0.4";
1718 const char listen_srv[] = "53";
1719 const char host_name[] = "howdy.example.com.";
1720 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1721 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1722 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1723 ASSERT_TRUE(dns.startServer());
1724 std::vector<std::string> servers = {listen_addr};
1725 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1726 dns.clearQueries();
1727
Luke Huang26a0e2a2018-12-18 16:44:41 +08001728 // TODO: Disable retry to make this test explicit.
1729 auto& cv = dns.getCv();
1730 auto& cvMutex = dns.getCvMutex();
1731 int fd1;
1732 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1733 {
1734 std::unique_lock lk(cvMutex);
Luke Huang952d0942018-12-26 16:53:03 +08001735 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001736 EXPECT_TRUE(fd1 != -1);
1737 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
1738 }
Luke Huangc68f1b92018-11-21 20:13:38 +08001739
Luke Huangc68f1b92018-11-21 20:13:38 +08001740 dns.setResponseProbability(0.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001741
Luke Huang952d0942018-12-26 16:53:03 +08001742 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001743 EXPECT_TRUE(fd2 != -1);
1744
Luke Huang952d0942018-12-26 16:53:03 +08001745 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001746 EXPECT_TRUE(fd3 != -1);
1747
Luke Huang26a0e2a2018-12-18 16:44:41 +08001748 uint8_t buf[MAXPACKET] = {};
Luke Huangc68f1b92018-11-21 20:13:38 +08001749 int rcode;
1750
Luke Huang26a0e2a2018-12-18 16:44:41 +08001751 // expect no response
1752 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
1753 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001754
Luke Huang26a0e2a2018-12-18 16:44:41 +08001755 // expect no response
Luke Huangc68f1b92018-11-21 20:13:38 +08001756 memset(buf, 0, MAXPACKET);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001757 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1758 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001759
Luke Huangc68f1b92018-11-21 20:13:38 +08001760 dns.setResponseProbability(1.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001761
Luke Huang952d0942018-12-26 16:53:03 +08001762 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001763 EXPECT_TRUE(fd4 != -1);
1764
1765 memset(buf, 0, MAXPACKET);
1766 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
1767 EXPECT_GT(res, 0);
1768 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1769
1770 memset(buf, 0, MAXPACKET);
1771 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1772 EXPECT_GT(res, 0);
1773 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1774}
1775
1776TEST_F(ResolverTest, Async_MalformedQuery) {
1777 const char listen_addr[] = "127.0.0.4";
1778 const char listen_srv[] = "53";
1779 const char host_name[] = "howdy.example.com.";
1780 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1781 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1782 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1783 ASSERT_TRUE(dns.startServer());
1784 std::vector<std::string> servers = {listen_addr};
1785 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1786 dns.clearQueries();
1787
1788 int fd = dns_open_proxy();
1789 EXPECT_TRUE(fd > 0);
1790
1791 const std::string badMsg = "16-52512#";
1792 static struct {
1793 const std::string cmd;
1794 const int expectErr;
1795 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001796 // Too few arguments
Luke Huangc68f1b92018-11-21 20:13:38 +08001797 {"resnsend " + badMsg + '\0', -EINVAL},
1798 // Bad netId
Luke Huang952d0942018-12-26 16:53:03 +08001799 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huangc68f1b92018-11-21 20:13:38 +08001800 // Bad raw data
Luke Huang952d0942018-12-26 16:53:03 +08001801 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huangc68f1b92018-11-21 20:13:38 +08001802 };
1803
1804 for (unsigned int i = 0; i < std::size(kTestData); i++) {
1805 auto& td = kTestData[i];
1806 SCOPED_TRACE(td.cmd);
1807 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
1808 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
1809
1810 int32_t tmp;
1811 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
1812 EXPECT_TRUE(rc > 0);
1813 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
1814 }
1815 // Normal query with answer buffer
1816 // This is raw data of query "howdy.example.com" type 1 class 1
1817 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huang952d0942018-12-26 16:53:03 +08001818 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huangc68f1b92018-11-21 20:13:38 +08001819 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1820 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1821
1822 u_char smallBuf[1] = {};
1823 int rcode;
1824 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huang952d0942018-12-26 16:53:03 +08001825 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huangc68f1b92018-11-21 20:13:38 +08001826
1827 // Do the normal test with large buffer again
1828 fd = dns_open_proxy();
1829 EXPECT_TRUE(fd > 0);
1830 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1831 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1832 u_char buf[MAXPACKET] = {};
1833 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1834 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu5b9ffb22018-12-02 17:54:29 +09001835}
1836
Luke Huang952d0942018-12-26 16:53:03 +08001837TEST_F(ResolverTest, Async_CacheFlags) {
1838 const char listen_addr[] = "127.0.0.4";
1839 const char listen_srv[] = "53";
1840 const char host_name[] = "howdy.example.com.";
1841 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1842 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1843 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1844 ASSERT_TRUE(dns.startServer());
1845 std::vector<std::string> servers = {listen_addr};
1846 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1847 dns.clearQueries();
1848
1849 // ANDROID_RESOLV_NO_CACHE_STORE
1850 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1851 ANDROID_RESOLV_NO_CACHE_STORE);
1852 EXPECT_TRUE(fd1 != -1);
1853 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1854 ANDROID_RESOLV_NO_CACHE_STORE);
1855 EXPECT_TRUE(fd2 != -1);
1856 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1857 ANDROID_RESOLV_NO_CACHE_STORE);
1858 EXPECT_TRUE(fd3 != -1);
1859
1860 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
1861 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1862 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1863
1864 // No cache exists, expect 3 queries
1865 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
1866
1867 // Re-query and cache
1868 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1869
1870 EXPECT_TRUE(fd1 != -1);
1871
1872 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1873
1874 // Now we have cache, expect 4 queries
1875 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1876
1877 // ANDROID_RESOLV_NO_CACHE_LOOKUP
1878 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1879 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1880 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1881 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1882
1883 EXPECT_TRUE(fd1 != -1);
1884 EXPECT_TRUE(fd2 != -1);
1885
1886 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1887 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1888
1889 // Skip cache, expect 6 queries
1890 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1891
1892 // Re-query verify cache works
1893 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1894 ANDROID_RESOLV_NO_CACHE_STORE);
1895 EXPECT_TRUE(fd1 != -1);
1896 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1897
1898 // Cache hits, expect still 6 queries
1899 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1900}
1901
1902TEST_F(ResolverTest, Async_NoRetryFlag) {
1903 const char listen_addr[] = "127.0.0.4";
1904 const char listen_srv[] = "53";
1905 const char host_name[] = "howdy.example.com.";
1906 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1907 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1908 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1909 ASSERT_TRUE(dns.startServer());
1910 std::vector<std::string> servers = {listen_addr};
1911 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1912 dns.clearQueries();
1913
1914 dns.setResponseProbability(0.0);
1915
1916 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1917 ANDROID_RESOLV_NO_RETRY);
1918 EXPECT_TRUE(fd1 != -1);
1919
1920 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
1921 ANDROID_RESOLV_NO_RETRY);
1922 EXPECT_TRUE(fd2 != -1);
1923
1924 // expect no response
1925 expectAnswersNotValid(fd1, -ETIMEDOUT);
1926 expectAnswersNotValid(fd2, -ETIMEDOUT);
1927
1928 // No retry case, expect 2 queries
1929 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1930
1931 dns.clearQueries();
1932
1933 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1934 EXPECT_TRUE(fd1 != -1);
1935
1936 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
1937 EXPECT_TRUE(fd2 != -1);
1938
1939 // expect no response
1940 expectAnswersNotValid(fd1, -ETIMEDOUT);
1941 expectAnswersNotValid(fd2, -ETIMEDOUT);
1942
1943 // Retry case, expect 4 queries
1944 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1945}
1946
Mike Yu5b9ffb22018-12-02 17:54:29 +09001947// This test checks that the resolver should not generate the request containing OPT RR when using
1948// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with FORMERR, we
1949// will fallback to no EDNS0 and try again. If the server does no response, we won't retry so that
1950// we get no answer.
1951TEST_F(ResolverTest, BrokenEdns) {
1952 typedef test::DNSResponder::Edns Edns;
1953 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
1954
1955 const char OFF[] = "off";
1956 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
1957 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
1958 const char STRICT[] = "strict";
1959 const char GETHOSTBYNAME[] = "gethostbyname";
1960 const char GETADDRINFO[] = "getaddrinfo";
1961 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
1962 const char ADDR4[] = "192.0.2.1";
1963 const char CLEARTEXT_ADDR[] = "127.0.0.53";
1964 const char CLEARTEXT_PORT[] = "53";
1965 const char TLS_PORT[] = "853";
1966 const std::vector<std::string> servers = { CLEARTEXT_ADDR };
1967
1968 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
1969 ASSERT_TRUE(dns.startServer());
1970
1971 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
1972
1973 static const struct TestConfig {
1974 std::string mode;
1975 std::string method;
1976 Edns edns;
1977 ExpectResult expectResult;
1978
1979 std::string asHostName() const {
1980 const char* ednsString;
1981 switch (edns) {
1982 case Edns::ON:
1983 ednsString = "ednsOn";
1984 break;
1985 case Edns::FORMERR:
1986 ednsString = "ednsFormerr";
1987 break;
1988 case Edns::DROP:
1989 ednsString = "ednsDrop";
1990 break;
1991 default:
1992 ednsString = "";
1993 break;
1994 }
1995 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
1996 }
1997 } testConfigs[] = {
1998 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
1999 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2000 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2001 // commented out since TLS timeout is not configurable.
2002 // TODO: Uncomment them after TLS timeout is configurable.
2003 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2004 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2005 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2006 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2007 {OFF, GETHOSTBYNAME, Edns::FORMERR, EXPECT_SUCCESS},
2008 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR, EXPECT_SUCCESS},
2009 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR, EXPECT_FAILURE},
2010 {STRICT, GETHOSTBYNAME, Edns::FORMERR, EXPECT_FAILURE},
2011 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2012 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2013 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2014 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2015 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2016 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2017 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2018 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2019 {OFF, GETADDRINFO, Edns::FORMERR, EXPECT_SUCCESS},
2020 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR, EXPECT_SUCCESS},
2021 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR, EXPECT_FAILURE},
2022 {STRICT, GETADDRINFO, Edns::FORMERR, EXPECT_FAILURE},
2023 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2024 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2025 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2026 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2027 };
2028
2029 for (const auto& config : testConfigs) {
2030 const std::string testHostName = config.asHostName();
2031 SCOPED_TRACE(testHostName);
2032
2033 const char* host_name = testHostName.c_str();
2034 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2035 dns.setEdns(config.edns);
2036
2037 if (config.mode == OFF) {
2038 ASSERT_TRUE(
2039 SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2040 } else if (config.mode == OPPORTUNISTIC_UDP) {
2041 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
2042 "", {}));
2043 } else if (config.mode == OPPORTUNISTIC_TLS) {
2044 ASSERT_TRUE(tls.startServer());
2045 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
2046 "", {}));
2047 // Wait for validation to complete.
2048 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2049 } else if (config.mode == STRICT) {
2050 ASSERT_TRUE(tls.startServer());
2051 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
2052 "", {base64Encode(tls.fingerprint())}));
2053 // Wait for validation to complete.
2054 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2055 }
2056
2057 if (config.method == GETHOSTBYNAME) {
2058 const hostent* h_result = gethostbyname(host_name);
2059 if (config.expectResult == EXPECT_SUCCESS) {
2060 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2061 ASSERT_TRUE(h_result != nullptr);
2062 ASSERT_EQ(4, h_result->h_length);
2063 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2064 EXPECT_EQ(ADDR4, ToString(h_result));
2065 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2066 } else {
2067 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2068 ASSERT_TRUE(h_result == nullptr);
2069 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2070 }
2071 } else if (config.method == GETADDRINFO) {
2072 ScopedAddrinfo ai_result;
2073 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2074 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2075 if (config.expectResult == EXPECT_SUCCESS) {
2076 EXPECT_TRUE(ai_result != nullptr);
2077 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2078 const std::string result_str = ToString(ai_result);
2079 EXPECT_EQ(ADDR4, result_str);
2080 } else {
2081 EXPECT_TRUE(ai_result == nullptr);
2082 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2083 }
2084 } else {
2085 FAIL() << "Unsupported query method: " << config.method;
2086 }
2087
2088 tls.stopServer();
2089 dns.clearQueries();
2090 }
2091
2092 dns.stopServer();
2093}
nuccachenf52f7a52018-07-17 18:07:23 +08002094
2095TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2096 constexpr char listen_addr[] = "::1";
2097 constexpr char listen_addr2[] = "127.0.0.5";
2098 constexpr char listen_srv[] = "53";
2099 constexpr char dns64_name[] = "ipv4only.arpa.";
2100 constexpr char host_name[] = "v4only.example.com.";
2101
2102 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2103 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2104 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2105 ASSERT_TRUE(dns.startServer());
2106
2107 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
2108 dns2.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2109 ASSERT_TRUE(dns2.startServer());
2110
2111 std::vector<std::string> servers = {listen_addr};
2112 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2113 dns.clearQueries();
2114
2115 // Wait for detecting prefix to complete.
2116 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2117
2118 // hints are necessary in order to let netd know which type of addresses the caller is
2119 // interested in.
2120 addrinfo hints;
2121 memset(&hints, 0, sizeof(hints));
2122 hints.ai_family = AF_UNSPEC;
2123 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2124 EXPECT_TRUE(result != nullptr);
2125 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2126
2127 std::string result_str = ToString(result);
2128 EXPECT_EQ(result_str, "64:ff9b::102:304");
2129
2130 // Let's test the case when there's an IPv4 resolver.
2131 servers = {listen_addr, listen_addr2};
2132 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2133 dns.clearQueries();
2134 dns2.clearQueries();
2135
2136 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2137 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2138
2139 result = safe_getaddrinfo("v4only", nullptr, &hints);
2140 EXPECT_TRUE(result != nullptr);
2141 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2142
2143 result_str = ToString(result);
2144 EXPECT_EQ(result_str, "1.2.3.4");
2145}
2146
nuccachenf52f7a52018-07-17 18:07:23 +08002147TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2148 constexpr char listen_addr[] = "::1";
2149 constexpr char listen_srv[] = "53";
2150 constexpr char dns64_name[] = "ipv4only.arpa.";
2151 constexpr char host_name[] = "v4only.example.com.";
2152
2153 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2154 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2155 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2156 ASSERT_TRUE(dns.startServer());
2157
2158 const std::vector<std::string> servers = {listen_addr};
2159 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2160 dns.clearQueries();
2161
2162 // Wait for detecting prefix to complete.
2163 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2164
2165 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2166 // in AF_INET case.
2167 addrinfo hints;
2168 memset(&hints, 0, sizeof(hints));
2169 hints.ai_family = AF_INET6;
2170 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2171 EXPECT_TRUE(result != nullptr);
2172 std::string result_str = ToString(result);
2173 EXPECT_EQ(result_str, "64:ff9b::102:304");
2174
2175 hints.ai_family = AF_INET;
2176 result = safe_getaddrinfo("v4only", nullptr, &hints);
2177 EXPECT_TRUE(result != nullptr);
2178 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2179 result_str = ToString(result);
2180 EXPECT_EQ(result_str, "1.2.3.4");
2181}
nuccachenf52f7a52018-07-17 18:07:23 +08002182
2183TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2184 constexpr char listen_addr[] = "::1";
2185 constexpr char listen_srv[] = "53";
2186 constexpr char dns64_name[] = "ipv4only.arpa.";
2187 constexpr char host_name[] = "v4v6.example.com.";
2188
2189 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2190 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2191 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2192 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2193 ASSERT_TRUE(dns.startServer());
2194
2195 const std::vector<std::string> servers = {listen_addr};
2196 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2197 dns.clearQueries();
2198
2199 // Wait for detecting prefix to complete.
2200 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2201
2202 addrinfo hints;
2203 memset(&hints, 0, sizeof(hints));
2204 hints.ai_family = AF_UNSPEC;
2205 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2206 EXPECT_TRUE(result != nullptr);
2207 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2208
2209 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2210 std::vector<std::string> result_strs = ToStrings(result);
2211 for (const auto& str : result_strs) {
2212 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2213 << ", result_str='" << str << "'";
2214 }
2215}
2216
2217TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2218 constexpr char listen_addr[] = "::1";
2219 constexpr char listen_srv[] = "53";
2220 constexpr char dns64_name[] = "ipv4only.arpa.";
2221 constexpr char host_name[] = "v4v6.example.com.";
2222
2223 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2224 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2225 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2226 ASSERT_TRUE(dns.startServer());
2227
2228 const std::vector<std::string> servers = {listen_addr};
2229 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2230 dns.clearQueries();
2231
2232 // Wait for detecting prefix to complete.
2233 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2234
2235 addrinfo hints;
2236 memset(&hints, 0, sizeof(hints));
2237 hints.ai_family = AF_UNSPEC;
2238 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2239 EXPECT_TRUE(result != nullptr);
2240 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2241
2242 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2243 std::string result_str = ToString(result);
2244 EXPECT_EQ(result_str, "64:ff9b::102:304");
2245}
2246
2247TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2248 constexpr char THIS_NETWORK[] = "this_network";
2249 constexpr char LOOPBACK[] = "loopback";
2250 constexpr char LINK_LOCAL[] = "link_local";
2251 constexpr char MULTICAST[] = "multicast";
2252 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2253
2254 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2255 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2256 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2257 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2258 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2259
2260 constexpr char listen_addr[] = "::1";
2261 constexpr char listen_srv[] = "53";
2262 constexpr char dns64_name[] = "ipv4only.arpa.";
2263
2264 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2265 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2266 ASSERT_TRUE(dns.startServer());
2267
2268 const std::vector<std::string> servers = {listen_addr};
2269 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2270 dns.clearQueries();
2271
2272 // Wait for detecting prefix to complete.
2273 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2274
2275 static const struct TestConfig {
2276 std::string name;
2277 std::string addr;
2278
2279 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2280 } testConfigs[]{
2281 {THIS_NETWORK, ADDR_THIS_NETWORK},
2282 {LOOPBACK, ADDR_LOOPBACK},
2283 {LINK_LOCAL, ADDR_LINK_LOCAL},
2284 {MULTICAST, ADDR_MULTICAST},
2285 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2286 };
2287
2288 for (const auto& config : testConfigs) {
2289 const std::string testHostName = config.asHostName();
2290 SCOPED_TRACE(testHostName);
2291
2292 const char* host_name = testHostName.c_str();
2293 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2294
2295 addrinfo hints;
2296 memset(&hints, 0, sizeof(hints));
2297 hints.ai_family = AF_INET6;
2298 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2299 // In AF_INET6 case, don't return IPv4 answers
2300 EXPECT_TRUE(result == nullptr);
2301 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2302 dns.clearQueries();
2303
2304 memset(&hints, 0, sizeof(hints));
2305 hints.ai_family = AF_UNSPEC;
2306 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2307 EXPECT_TRUE(result != nullptr);
2308 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2309 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2310 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2311 std::string result_str = ToString(result);
2312 EXPECT_EQ(result_str, config.addr.c_str());
2313 dns.clearQueries();
2314 }
2315}
2316
2317TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2318 constexpr char listen_addr[] = "::1";
2319 constexpr char listen_srv[] = "53";
2320 constexpr char dns64_name[] = "ipv4only.arpa.";
2321 constexpr char host_name[] = "v4only.example.com.";
2322 constexpr char host_name2[] = "v4v6.example.com.";
2323
2324 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2325 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2326 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2327 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2328 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2329 ASSERT_TRUE(dns.startServer());
2330
2331 const std::vector<std::string> servers = {listen_addr};
2332 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2333 dns.clearQueries();
2334
2335 // Wait for detecting prefix to complete.
2336 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2337
2338 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2339 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2340 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2341 EXPECT_TRUE(result != nullptr);
2342 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2343 std::string result_str = ToString(result);
2344 EXPECT_EQ(result_str, "64:ff9b::102:304");
2345 dns.clearQueries();
2346
2347 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2348 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2349 EXPECT_TRUE(result != nullptr);
2350 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2351 std::vector<std::string> result_strs = ToStrings(result);
2352 for (const auto& str : result_strs) {
2353 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2354 << ", result_str='" << str << "'";
2355 }
2356}
2357
2358TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2359 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2360 constexpr char ADDR_ANYADDR_V6[] = "::";
2361 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2362 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2363
2364 constexpr char PORT_NAME_HTTP[] = "http";
2365 constexpr char PORT_NUMBER_HTTP[] = "80";
2366
2367 constexpr char listen_addr[] = "::1";
2368 constexpr char listen_srv[] = "53";
2369 constexpr char dns64_name[] = "ipv4only.arpa.";
2370
2371 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2372 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2373 ASSERT_TRUE(dns.startServer());
2374
2375 const std::vector<std::string> servers = {listen_addr};
2376 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2377 dns.clearQueries();
2378
2379 // Wait for detecting prefix to complete.
2380 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2381
2382 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2383 // - passive socket -> anyaddr (0.0.0.0 or ::)
2384 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2385 static const struct TestConfig {
2386 int flag;
2387 std::string addr_v4;
2388 std::string addr_v6;
2389
2390 std::string asParameters() const {
2391 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2392 addr_v6.c_str());
2393 }
2394 } testConfigs[]{
2395 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2396 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2397 };
2398
2399 for (const auto& config : testConfigs) {
2400 SCOPED_TRACE(config.asParameters());
2401
2402 addrinfo hints;
2403 memset(&hints, 0, sizeof(hints));
2404 hints.ai_family = AF_UNSPEC; // any address family
2405 hints.ai_socktype = 0; // any type
2406 hints.ai_protocol = 0; // any protocol
2407 hints.ai_flags = config.flag;
2408
2409 // Assign hostname as null and service as port name.
2410 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2411 ASSERT_TRUE(result != nullptr);
2412
2413 // Can't be synthesized because it should not get into Netd.
2414 std::vector<std::string> result_strs = ToStrings(result);
2415 for (const auto& str : result_strs) {
2416 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2417 << ", result_str='" << str << "'";
2418 }
2419
2420 // Assign hostname as null and service as numeric port number.
2421 hints.ai_flags = config.flag | AI_NUMERICSERV;
2422 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2423 ASSERT_TRUE(result != nullptr);
2424
2425 // Can't be synthesized because it should not get into Netd.
2426 result_strs = ToStrings(result);
2427 for (const auto& str : result_strs) {
2428 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2429 << ", result_str='" << str << "'";
2430 }
2431 }
2432}
2433
2434TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2435 struct hostent* result = nullptr;
2436 struct in_addr v4addr;
2437 struct in6_addr v6addr;
2438
2439 constexpr char listen_addr[] = "::1";
2440 constexpr char listen_srv[] = "53";
2441 constexpr char dns64_name[] = "ipv4only.arpa.";
2442 constexpr char ptr_name[] = "v4v6.example.com.";
2443 // PTR record for IPv4 address 1.2.3.4
2444 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2445 // PTR record for IPv6 address 2001:db8::102:304
2446 constexpr char ptr_addr_v6[] =
2447 "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.";
2448
2449 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2450 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2451 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2452 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2453 ASSERT_TRUE(dns.startServer());
2454
2455 const std::vector<std::string> servers = {listen_addr};
2456 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2457 dns.clearQueries();
2458
2459 // Wait for detecting prefix to complete.
2460 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2461
2462 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2463 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2464 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2465 ASSERT_TRUE(result != nullptr);
2466 std::string result_str = result->h_name ? result->h_name : "null";
2467 EXPECT_EQ(result_str, "v4v6.example.com");
2468
2469 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2470 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2471 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2472 ASSERT_TRUE(result != nullptr);
2473 result_str = result->h_name ? result->h_name : "null";
2474 EXPECT_EQ(result_str, "v4v6.example.com");
2475}
2476
2477TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2478 constexpr char listen_addr[] = "::1";
2479 constexpr char listen_srv[] = "53";
2480 constexpr char dns64_name[] = "ipv4only.arpa.";
2481 constexpr char ptr_name[] = "v4only.example.com.";
2482 // PTR record for IPv4 address 1.2.3.4
2483 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2484 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2485 constexpr char ptr_addr_v6_nomapping[] =
2486 "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.";
2487 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2488 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2489 constexpr char ptr_addr_v6_synthesis[] =
2490 "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.";
2491
2492 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2493 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2494 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2495 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2496 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2497 ASSERT_TRUE(dns.startServer());
2498
2499 const std::vector<std::string> servers = {listen_addr};
2500 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2501 dns.clearQueries();
2502
2503 // Wait for detecting prefix to complete.
2504 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2505
2506 // Synthesized PTR record doesn't exist on DNS server
2507 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2508 // After querying synthesized address failed, expect that prefix is removed from IPv6
2509 // synthesized address and do reverse IPv4 query instead.
2510 struct in6_addr v6addr;
2511 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2512 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2513 ASSERT_TRUE(result != nullptr);
2514 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2515 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2516 std::string result_str = result->h_name ? result->h_name : "null";
2517 EXPECT_EQ(result_str, "v4only.example.com");
2518 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2519 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2520 // fakes the return IPv4 address as original queried IPv6 address.
2521 result_str = ToString(result);
2522 EXPECT_EQ(result_str, "64:ff9b::102:304");
2523 dns.clearQueries();
2524
2525 // Synthesized PTR record exists on DNS server
2526 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2527 // Expect to Netd pass through synthesized address for DNS queries.
2528 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2529 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2530 ASSERT_TRUE(result != nullptr);
2531 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2532 result_str = result->h_name ? result->h_name : "null";
2533 EXPECT_EQ(result_str, "v6synthesis.example.com");
2534}
2535
2536TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2537 constexpr char dns64_name[] = "ipv4only.arpa.";
2538 constexpr char host_name[] = "localhost";
2539 // The address is synthesized by prefix64:localhost.
2540 constexpr char host_addr[] = "64:ff9b::7f00:1";
2541
2542 constexpr char listen_addr[] = "::1";
2543 constexpr char listen_srv[] = "53";
2544 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2545 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2546 ASSERT_TRUE(dns.startServer());
2547 const std::vector<std::string> servers = {listen_addr};
2548 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2549 dns.clearQueries();
2550
2551 // Wait for detecting prefix to complete.
2552 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2553
2554 // Using synthesized "localhost" address to be a trick for resolving host name
2555 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2556 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2557 struct in6_addr v6addr;
2558 inet_pton(AF_INET6, host_addr, &v6addr);
2559 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2560 ASSERT_TRUE(result != nullptr);
2561 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2562 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2563
2564 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2565 ASSERT_EQ(AF_INET6, result->h_addrtype);
2566 std::string result_str = ToString(result);
2567 EXPECT_EQ(result_str, host_addr);
2568 result_str = result->h_name ? result->h_name : "null";
2569 EXPECT_EQ(result_str, host_name);
2570}
2571
2572TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2573 constexpr char listen_addr[] = "::1";
2574 constexpr char listen_srv[] = "53";
2575 constexpr char dns64_name[] = "ipv4only.arpa.";
2576 constexpr char ptr_name[] = "v4v6.example.com.";
2577 // PTR record for IPv4 address 1.2.3.4
2578 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2579 // PTR record for IPv6 address 2001:db8::102:304
2580 constexpr char ptr_addr_v6[] =
2581 "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.";
2582
2583 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2584 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2585 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2586 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2587 ASSERT_TRUE(dns.startServer());
2588
2589 const std::vector<std::string> servers = {listen_addr};
2590 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2591 dns.clearQueries();
2592
2593 // Wait for detecting prefix to complete.
2594 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2595
2596 static const struct TestConfig {
2597 int flag;
2598 int family;
2599 std::string addr;
2600 std::string host;
2601
2602 std::string asParameters() const {
2603 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2604 host.c_str());
2605 }
2606 } testConfigs[]{
2607 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2608 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2609 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2610 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2611 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2612 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2613 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2614 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2615 };
2616
2617 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2618 for (const auto& config : testConfigs) {
2619 SCOPED_TRACE(config.asParameters());
2620
2621 int rv;
2622 char host[NI_MAXHOST];
2623 struct sockaddr_in sin;
2624 struct sockaddr_in6 sin6;
2625 if (config.family == AF_INET) {
2626 memset(&sin, 0, sizeof(sin));
2627 sin.sin_family = AF_INET;
2628 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2629 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2630 nullptr, 0, config.flag);
2631 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2632 } else if (config.family == AF_INET6) {
2633 memset(&sin6, 0, sizeof(sin6));
2634 sin6.sin6_family = AF_INET6;
2635 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2636 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2637 nullptr, 0, config.flag);
2638 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2639 }
2640 ASSERT_EQ(0, rv);
2641 std::string result_str = host;
2642 EXPECT_EQ(result_str, config.host);
2643 dns.clearQueries();
2644 }
2645}
2646
2647TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2648 constexpr char listen_addr[] = "::1";
2649 constexpr char listen_srv[] = "53";
2650 constexpr char dns64_name[] = "ipv4only.arpa.";
2651 constexpr char ptr_name[] = "v4only.example.com.";
2652 // PTR record for IPv4 address 1.2.3.4
2653 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2654 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2655 constexpr char ptr_addr_v6_nomapping[] =
2656 "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.";
2657 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2658 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2659 constexpr char ptr_addr_v6_synthesis[] =
2660 "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.";
2661
2662 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2663 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2664 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2665 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2666 ASSERT_TRUE(dns.startServer());
2667
2668 const std::vector<std::string> servers = {listen_addr};
2669 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2670 dns.clearQueries();
2671
2672 // Wait for detecting prefix to complete.
2673 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2674
2675 static const struct TestConfig {
2676 bool hasSynthesizedPtrRecord;
2677 int flag;
2678 std::string addr;
2679 std::string host;
2680
2681 std::string asParameters() const {
2682 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2683 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2684 }
2685 } testConfigs[]{
2686 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2687 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2688 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2689 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2690 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2691 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2692 };
2693
2694 // hasSynthesizedPtrRecord = false
2695 // Synthesized PTR record doesn't exist on DNS server
2696 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2697 // After querying synthesized address failed, expect that prefix is removed from IPv6
2698 // synthesized address and do reverse IPv4 query instead.
2699 //
2700 // hasSynthesizedPtrRecord = true
2701 // Synthesized PTR record exists on DNS server
2702 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2703 // Expect to just pass through synthesized address for DNS queries.
2704 for (const auto& config : testConfigs) {
2705 SCOPED_TRACE(config.asParameters());
2706
2707 char host[NI_MAXHOST];
2708 struct sockaddr_in6 sin6;
2709 memset(&sin6, 0, sizeof(sin6));
2710 sin6.sin6_family = AF_INET6;
2711 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2712 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2713 nullptr, 0, config.flag);
2714 ASSERT_EQ(0, rv);
2715 if (config.flag == NI_NAMEREQD) {
2716 if (config.hasSynthesizedPtrRecord) {
2717 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2718 } else {
2719 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2720 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2721 }
2722 }
2723 std::string result_str = host;
2724 EXPECT_EQ(result_str, config.host);
2725 dns.clearQueries();
2726 }
2727}
2728
2729TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2730 constexpr char dns64_name[] = "ipv4only.arpa.";
2731 constexpr char host_name[] = "localhost";
2732 // The address is synthesized by prefix64:localhost.
2733 constexpr char host_addr[] = "64:ff9b::7f00:1";
2734
2735 constexpr char listen_addr[] = "::1";
2736 constexpr char listen_srv[] = "53";
2737 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2738 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2739 ASSERT_TRUE(dns.startServer());
2740 const std::vector<std::string> servers = {listen_addr};
2741 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2742 dns.clearQueries();
2743
2744 // Wait for detecting prefix to complete.
2745 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2746
2747 // Using synthesized "localhost" address to be a trick for resolving host name
2748 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2749 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2750 char host[NI_MAXHOST];
2751 struct sockaddr_in6 sin6;
2752 memset(&sin6, 0, sizeof(sin6));
2753 sin6.sin6_family = AF_INET6;
2754 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2755 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2756 0, NI_NAMEREQD);
2757 ASSERT_EQ(0, rv);
2758 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2759 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2760
2761 std::string result_str = host;
2762 EXPECT_EQ(result_str, host_name);
2763}
2764
nuccachenf52f7a52018-07-17 18:07:23 +08002765TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2766 constexpr char dns64_name[] = "ipv4only.arpa.";
2767 constexpr char host_name[] = "ipv4only.example.com.";
2768
2769 constexpr char listen_addr[] = "::1";
2770 constexpr char listen_srv[] = "53";
2771 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2772 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2773 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2774 ASSERT_TRUE(dns.startServer());
2775 const std::vector<std::string> servers = {listen_addr};
2776 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2777 dns.clearQueries();
2778
2779 // Wait for detecting prefix to complete.
2780 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2781
2782 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2783 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2784 ASSERT_TRUE(result != nullptr);
2785 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2786 std::string result_str = ToString(result);
2787 EXPECT_EQ(result_str, "64:ff9b::102:304");
2788}
nuccachenf52f7a52018-07-17 18:07:23 +08002789
2790TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2791 constexpr char dns64_name[] = "ipv4only.arpa.";
2792 constexpr char host_name[] = "v4v6.example.com.";
2793
2794 constexpr char listen_addr[] = "::1";
2795 constexpr char listen_srv[] = "53";
2796 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2797 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2798 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2799 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2800 ASSERT_TRUE(dns.startServer());
2801 const std::vector<std::string> servers = {listen_addr};
2802 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2803 dns.clearQueries();
2804
2805 // Wait for detecting prefix to complete.
2806 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2807
2808 // IPv4 DNS query. Prefix should have no effect on it.
2809 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2810 ASSERT_TRUE(result != nullptr);
2811 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2812 std::string result_str = ToString(result);
2813 EXPECT_EQ(result_str, "1.2.3.4");
2814 dns.clearQueries();
2815
2816 // IPv6 DNS query. Prefix should have no effect on it.
2817 result = gethostbyname2("v4v6", AF_INET6);
2818 ASSERT_TRUE(result != nullptr);
2819 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2820 result_str = ToString(result);
2821 EXPECT_EQ(result_str, "2001:db8::102:304");
2822}
2823
2824TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2825 constexpr char THIS_NETWORK[] = "this_network";
2826 constexpr char LOOPBACK[] = "loopback";
2827 constexpr char LINK_LOCAL[] = "link_local";
2828 constexpr char MULTICAST[] = "multicast";
2829 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2830
2831 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2832 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2833 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2834 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2835 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2836
2837 constexpr char listen_addr[] = "::1";
2838 constexpr char listen_srv[] = "53";
2839 constexpr char dns64_name[] = "ipv4only.arpa.";
2840
2841 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2842 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2843 ASSERT_TRUE(dns.startServer());
2844
2845 const std::vector<std::string> servers = {listen_addr};
2846 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2847 dns.clearQueries();
2848
2849 // Wait for detecting prefix to complete.
2850 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2851
2852 static const struct TestConfig {
2853 std::string name;
2854 std::string addr;
2855
2856 std::string asHostName() const {
2857 return StringPrintf("%s.example.com.",
2858 name.c_str());
2859 }
2860 } testConfigs[]{
2861 {THIS_NETWORK, ADDR_THIS_NETWORK},
2862 {LOOPBACK, ADDR_LOOPBACK},
2863 {LINK_LOCAL, ADDR_LINK_LOCAL},
2864 {MULTICAST, ADDR_MULTICAST},
2865 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2866 };
2867
2868 for (const auto& config : testConfigs) {
2869 const std::string testHostName = config.asHostName();
2870 SCOPED_TRACE(testHostName);
2871
2872 const char* host_name = testHostName.c_str();
2873 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2874
2875 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2876 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2877
2878 // In AF_INET6 case, don't synthesize special use IPv4 address.
2879 // Expect to have no answer
2880 EXPECT_EQ(nullptr, result);
2881
2882 dns.clearQueries();
2883 }
Bernie Innocenticd257642018-12-20 15:56:40 +09002884}