blob: 0f32fb9404639ef6d0c3f66e054ce58f1c939eb5 [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
Ken Chenbfd32022019-01-02 14:59:38 +08001948// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
1949// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
1950// won't retry so that we get no answer.
Mike Yu5b9ffb22018-12-02 17:54:29 +09001951TEST_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;
Ken Chenbfd32022019-01-02 14:59:38 +08001985 case Edns::FORMERR_ON_EDNS:
Mike Yu5b9ffb22018-12-02 17:54:29 +09001986 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},
Ken Chenbfd32022019-01-02 14:59:38 +08002007 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2008 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2009 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2010 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002011 {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},
Ken Chenbfd32022019-01-02 14:59:38 +08002019 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2020 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2021 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2022 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002023 {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
Ken Chenbfd32022019-01-02 14:59:38 +08002095// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2096// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2097// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2098// failed due to timeout.
2099TEST_F(ResolverTest, UnstableTls) {
2100 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2101 const char CLEARTEXT_PORT[] = "53";
2102 const char TLS_PORT[] = "853";
2103 const char* host_name1 = "nonexistent1.example.com.";
2104 const char* host_name2 = "nonexistent2.example.com.";
2105 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2106
2107 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2108 ASSERT_TRUE(dns.startServer());
2109 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2110 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2111 ASSERT_TRUE(tls.startServer());
2112 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
2113 // Wait for validation complete.
2114 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2115 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2116 tls.stopServer();
2117
2118 const hostent* h_result = gethostbyname(host_name1);
2119 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2120 ASSERT_TRUE(h_result == nullptr);
2121 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2122
2123 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2124 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2125 EXPECT_TRUE(ai_result == nullptr);
2126 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2127}
2128
2129// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2130// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2131TEST_F(ResolverTest, BogusDnsServer) {
2132 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2133 const char CLEARTEXT_PORT[] = "53";
2134 const char TLS_PORT[] = "853";
2135 const char* host_name1 = "nonexistent1.example.com.";
2136 const char* host_name2 = "nonexistent2.example.com.";
2137 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2138
2139 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2140 ASSERT_TRUE(dns.startServer());
2141 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2142 ASSERT_TRUE(tls.startServer());
2143 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
2144 // Wait for validation complete.
2145 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2146 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2147 tls.stopServer();
2148 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2149
2150 const hostent* h_result = gethostbyname(host_name1);
2151 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2152 ASSERT_TRUE(h_result == nullptr);
2153 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2154
2155 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2156 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2157 EXPECT_TRUE(ai_result == nullptr);
2158 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2159}
2160
nuccachenf52f7a52018-07-17 18:07:23 +08002161TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2162 constexpr char listen_addr[] = "::1";
2163 constexpr char listen_addr2[] = "127.0.0.5";
2164 constexpr char listen_srv[] = "53";
2165 constexpr char dns64_name[] = "ipv4only.arpa.";
2166 constexpr char host_name[] = "v4only.example.com.";
2167
2168 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2169 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2170 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2171 ASSERT_TRUE(dns.startServer());
2172
2173 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
2174 dns2.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2175 ASSERT_TRUE(dns2.startServer());
2176
2177 std::vector<std::string> servers = {listen_addr};
2178 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2179 dns.clearQueries();
2180
2181 // Wait for detecting prefix to complete.
2182 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2183
2184 // hints are necessary in order to let netd know which type of addresses the caller is
2185 // interested in.
2186 addrinfo hints;
2187 memset(&hints, 0, sizeof(hints));
2188 hints.ai_family = AF_UNSPEC;
2189 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2190 EXPECT_TRUE(result != nullptr);
2191 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2192
2193 std::string result_str = ToString(result);
2194 EXPECT_EQ(result_str, "64:ff9b::102:304");
2195
2196 // Let's test the case when there's an IPv4 resolver.
2197 servers = {listen_addr, listen_addr2};
2198 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2199 dns.clearQueries();
2200 dns2.clearQueries();
2201
2202 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2203 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2204
2205 result = safe_getaddrinfo("v4only", nullptr, &hints);
2206 EXPECT_TRUE(result != nullptr);
2207 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2208
2209 result_str = ToString(result);
2210 EXPECT_EQ(result_str, "1.2.3.4");
2211}
2212
nuccachenf52f7a52018-07-17 18:07:23 +08002213TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2214 constexpr char listen_addr[] = "::1";
2215 constexpr char listen_srv[] = "53";
2216 constexpr char dns64_name[] = "ipv4only.arpa.";
2217 constexpr char host_name[] = "v4only.example.com.";
2218
2219 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2220 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2221 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2222 ASSERT_TRUE(dns.startServer());
2223
2224 const std::vector<std::string> servers = {listen_addr};
2225 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2226 dns.clearQueries();
2227
2228 // Wait for detecting prefix to complete.
2229 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2230
2231 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2232 // in AF_INET case.
2233 addrinfo hints;
2234 memset(&hints, 0, sizeof(hints));
2235 hints.ai_family = AF_INET6;
2236 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2237 EXPECT_TRUE(result != nullptr);
2238 std::string result_str = ToString(result);
2239 EXPECT_EQ(result_str, "64:ff9b::102:304");
2240
2241 hints.ai_family = AF_INET;
2242 result = safe_getaddrinfo("v4only", nullptr, &hints);
2243 EXPECT_TRUE(result != nullptr);
2244 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2245 result_str = ToString(result);
2246 EXPECT_EQ(result_str, "1.2.3.4");
2247}
nuccachenf52f7a52018-07-17 18:07:23 +08002248
2249TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2250 constexpr char listen_addr[] = "::1";
2251 constexpr char listen_srv[] = "53";
2252 constexpr char dns64_name[] = "ipv4only.arpa.";
2253 constexpr char host_name[] = "v4v6.example.com.";
2254
2255 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2256 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2257 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2258 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2259 ASSERT_TRUE(dns.startServer());
2260
2261 const std::vector<std::string> servers = {listen_addr};
2262 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2263 dns.clearQueries();
2264
2265 // Wait for detecting prefix to complete.
2266 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2267
2268 addrinfo hints;
2269 memset(&hints, 0, sizeof(hints));
2270 hints.ai_family = AF_UNSPEC;
2271 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2272 EXPECT_TRUE(result != nullptr);
2273 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2274
2275 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2276 std::vector<std::string> result_strs = ToStrings(result);
2277 for (const auto& str : result_strs) {
2278 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2279 << ", result_str='" << str << "'";
2280 }
2281}
2282
2283TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2284 constexpr char listen_addr[] = "::1";
2285 constexpr char listen_srv[] = "53";
2286 constexpr char dns64_name[] = "ipv4only.arpa.";
2287 constexpr char host_name[] = "v4v6.example.com.";
2288
2289 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2290 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2291 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2292 ASSERT_TRUE(dns.startServer());
2293
2294 const std::vector<std::string> servers = {listen_addr};
2295 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2296 dns.clearQueries();
2297
2298 // Wait for detecting prefix to complete.
2299 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2300
2301 addrinfo hints;
2302 memset(&hints, 0, sizeof(hints));
2303 hints.ai_family = AF_UNSPEC;
2304 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2305 EXPECT_TRUE(result != nullptr);
2306 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2307
2308 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2309 std::string result_str = ToString(result);
2310 EXPECT_EQ(result_str, "64:ff9b::102:304");
2311}
2312
2313TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2314 constexpr char THIS_NETWORK[] = "this_network";
2315 constexpr char LOOPBACK[] = "loopback";
2316 constexpr char LINK_LOCAL[] = "link_local";
2317 constexpr char MULTICAST[] = "multicast";
2318 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2319
2320 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2321 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2322 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2323 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2324 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2325
2326 constexpr char listen_addr[] = "::1";
2327 constexpr char listen_srv[] = "53";
2328 constexpr char dns64_name[] = "ipv4only.arpa.";
2329
2330 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2331 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2332 ASSERT_TRUE(dns.startServer());
2333
2334 const std::vector<std::string> servers = {listen_addr};
2335 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2336 dns.clearQueries();
2337
2338 // Wait for detecting prefix to complete.
2339 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2340
2341 static const struct TestConfig {
2342 std::string name;
2343 std::string addr;
2344
2345 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2346 } testConfigs[]{
2347 {THIS_NETWORK, ADDR_THIS_NETWORK},
2348 {LOOPBACK, ADDR_LOOPBACK},
2349 {LINK_LOCAL, ADDR_LINK_LOCAL},
2350 {MULTICAST, ADDR_MULTICAST},
2351 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2352 };
2353
2354 for (const auto& config : testConfigs) {
2355 const std::string testHostName = config.asHostName();
2356 SCOPED_TRACE(testHostName);
2357
2358 const char* host_name = testHostName.c_str();
2359 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2360
2361 addrinfo hints;
2362 memset(&hints, 0, sizeof(hints));
2363 hints.ai_family = AF_INET6;
2364 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2365 // In AF_INET6 case, don't return IPv4 answers
2366 EXPECT_TRUE(result == nullptr);
2367 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2368 dns.clearQueries();
2369
2370 memset(&hints, 0, sizeof(hints));
2371 hints.ai_family = AF_UNSPEC;
2372 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2373 EXPECT_TRUE(result != nullptr);
2374 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2375 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2376 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2377 std::string result_str = ToString(result);
2378 EXPECT_EQ(result_str, config.addr.c_str());
2379 dns.clearQueries();
2380 }
2381}
2382
2383TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2384 constexpr char listen_addr[] = "::1";
2385 constexpr char listen_srv[] = "53";
2386 constexpr char dns64_name[] = "ipv4only.arpa.";
2387 constexpr char host_name[] = "v4only.example.com.";
2388 constexpr char host_name2[] = "v4v6.example.com.";
2389
2390 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2391 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2392 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2393 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2394 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2395 ASSERT_TRUE(dns.startServer());
2396
2397 const std::vector<std::string> servers = {listen_addr};
2398 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2399 dns.clearQueries();
2400
2401 // Wait for detecting prefix to complete.
2402 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2403
2404 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2405 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2406 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2407 EXPECT_TRUE(result != nullptr);
2408 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2409 std::string result_str = ToString(result);
2410 EXPECT_EQ(result_str, "64:ff9b::102:304");
2411 dns.clearQueries();
2412
2413 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2414 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2415 EXPECT_TRUE(result != nullptr);
2416 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2417 std::vector<std::string> result_strs = ToStrings(result);
2418 for (const auto& str : result_strs) {
2419 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2420 << ", result_str='" << str << "'";
2421 }
2422}
2423
2424TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2425 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2426 constexpr char ADDR_ANYADDR_V6[] = "::";
2427 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2428 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2429
2430 constexpr char PORT_NAME_HTTP[] = "http";
2431 constexpr char PORT_NUMBER_HTTP[] = "80";
2432
2433 constexpr char listen_addr[] = "::1";
2434 constexpr char listen_srv[] = "53";
2435 constexpr char dns64_name[] = "ipv4only.arpa.";
2436
2437 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2438 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2439 ASSERT_TRUE(dns.startServer());
2440
2441 const std::vector<std::string> servers = {listen_addr};
2442 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2443 dns.clearQueries();
2444
2445 // Wait for detecting prefix to complete.
2446 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2447
2448 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2449 // - passive socket -> anyaddr (0.0.0.0 or ::)
2450 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2451 static const struct TestConfig {
2452 int flag;
2453 std::string addr_v4;
2454 std::string addr_v6;
2455
2456 std::string asParameters() const {
2457 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2458 addr_v6.c_str());
2459 }
2460 } testConfigs[]{
2461 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2462 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2463 };
2464
2465 for (const auto& config : testConfigs) {
2466 SCOPED_TRACE(config.asParameters());
2467
2468 addrinfo hints;
2469 memset(&hints, 0, sizeof(hints));
2470 hints.ai_family = AF_UNSPEC; // any address family
2471 hints.ai_socktype = 0; // any type
2472 hints.ai_protocol = 0; // any protocol
2473 hints.ai_flags = config.flag;
2474
2475 // Assign hostname as null and service as port name.
2476 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2477 ASSERT_TRUE(result != nullptr);
2478
2479 // Can't be synthesized because it should not get into Netd.
2480 std::vector<std::string> result_strs = ToStrings(result);
2481 for (const auto& str : result_strs) {
2482 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2483 << ", result_str='" << str << "'";
2484 }
2485
2486 // Assign hostname as null and service as numeric port number.
2487 hints.ai_flags = config.flag | AI_NUMERICSERV;
2488 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2489 ASSERT_TRUE(result != nullptr);
2490
2491 // Can't be synthesized because it should not get into Netd.
2492 result_strs = ToStrings(result);
2493 for (const auto& str : result_strs) {
2494 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2495 << ", result_str='" << str << "'";
2496 }
2497 }
2498}
2499
2500TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2501 struct hostent* result = nullptr;
2502 struct in_addr v4addr;
2503 struct in6_addr v6addr;
2504
2505 constexpr char listen_addr[] = "::1";
2506 constexpr char listen_srv[] = "53";
2507 constexpr char dns64_name[] = "ipv4only.arpa.";
2508 constexpr char ptr_name[] = "v4v6.example.com.";
2509 // PTR record for IPv4 address 1.2.3.4
2510 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2511 // PTR record for IPv6 address 2001:db8::102:304
2512 constexpr char ptr_addr_v6[] =
2513 "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.";
2514
2515 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2516 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2517 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2518 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2519 ASSERT_TRUE(dns.startServer());
2520
2521 const std::vector<std::string> servers = {listen_addr};
2522 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2523 dns.clearQueries();
2524
2525 // Wait for detecting prefix to complete.
2526 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2527
2528 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2529 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2530 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2531 ASSERT_TRUE(result != nullptr);
2532 std::string result_str = result->h_name ? result->h_name : "null";
2533 EXPECT_EQ(result_str, "v4v6.example.com");
2534
2535 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2536 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2537 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2538 ASSERT_TRUE(result != nullptr);
2539 result_str = result->h_name ? result->h_name : "null";
2540 EXPECT_EQ(result_str, "v4v6.example.com");
2541}
2542
2543TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2544 constexpr char listen_addr[] = "::1";
2545 constexpr char listen_srv[] = "53";
2546 constexpr char dns64_name[] = "ipv4only.arpa.";
2547 constexpr char ptr_name[] = "v4only.example.com.";
2548 // PTR record for IPv4 address 1.2.3.4
2549 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2550 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2551 constexpr char ptr_addr_v6_nomapping[] =
2552 "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.";
2553 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2554 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2555 constexpr char ptr_addr_v6_synthesis[] =
2556 "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.";
2557
2558 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2559 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2560 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2561 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2562 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2563 ASSERT_TRUE(dns.startServer());
2564
2565 const std::vector<std::string> servers = {listen_addr};
2566 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2567 dns.clearQueries();
2568
2569 // Wait for detecting prefix to complete.
2570 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2571
2572 // Synthesized PTR record doesn't exist on DNS server
2573 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2574 // After querying synthesized address failed, expect that prefix is removed from IPv6
2575 // synthesized address and do reverse IPv4 query instead.
2576 struct in6_addr v6addr;
2577 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2578 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2579 ASSERT_TRUE(result != nullptr);
2580 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2581 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2582 std::string result_str = result->h_name ? result->h_name : "null";
2583 EXPECT_EQ(result_str, "v4only.example.com");
2584 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2585 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2586 // fakes the return IPv4 address as original queried IPv6 address.
2587 result_str = ToString(result);
2588 EXPECT_EQ(result_str, "64:ff9b::102:304");
2589 dns.clearQueries();
2590
2591 // Synthesized PTR record exists on DNS server
2592 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2593 // Expect to Netd pass through synthesized address for DNS queries.
2594 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2595 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2596 ASSERT_TRUE(result != nullptr);
2597 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2598 result_str = result->h_name ? result->h_name : "null";
2599 EXPECT_EQ(result_str, "v6synthesis.example.com");
2600}
2601
2602TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2603 constexpr char dns64_name[] = "ipv4only.arpa.";
2604 constexpr char host_name[] = "localhost";
2605 // The address is synthesized by prefix64:localhost.
2606 constexpr char host_addr[] = "64:ff9b::7f00:1";
2607
2608 constexpr char listen_addr[] = "::1";
2609 constexpr char listen_srv[] = "53";
2610 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2611 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2612 ASSERT_TRUE(dns.startServer());
2613 const std::vector<std::string> servers = {listen_addr};
2614 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2615 dns.clearQueries();
2616
2617 // Wait for detecting prefix to complete.
2618 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2619
2620 // Using synthesized "localhost" address to be a trick for resolving host name
2621 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2622 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2623 struct in6_addr v6addr;
2624 inet_pton(AF_INET6, host_addr, &v6addr);
2625 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2626 ASSERT_TRUE(result != nullptr);
2627 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2628 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2629
2630 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2631 ASSERT_EQ(AF_INET6, result->h_addrtype);
2632 std::string result_str = ToString(result);
2633 EXPECT_EQ(result_str, host_addr);
2634 result_str = result->h_name ? result->h_name : "null";
2635 EXPECT_EQ(result_str, host_name);
2636}
2637
2638TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2639 constexpr char listen_addr[] = "::1";
2640 constexpr char listen_srv[] = "53";
2641 constexpr char dns64_name[] = "ipv4only.arpa.";
2642 constexpr char ptr_name[] = "v4v6.example.com.";
2643 // PTR record for IPv4 address 1.2.3.4
2644 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2645 // PTR record for IPv6 address 2001:db8::102:304
2646 constexpr char ptr_addr_v6[] =
2647 "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.";
2648
2649 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2650 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2651 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2652 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2653 ASSERT_TRUE(dns.startServer());
2654
2655 const std::vector<std::string> servers = {listen_addr};
2656 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2657 dns.clearQueries();
2658
2659 // Wait for detecting prefix to complete.
2660 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2661
2662 static const struct TestConfig {
2663 int flag;
2664 int family;
2665 std::string addr;
2666 std::string host;
2667
2668 std::string asParameters() const {
2669 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2670 host.c_str());
2671 }
2672 } testConfigs[]{
2673 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2674 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2675 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2676 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2677 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2678 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2679 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2680 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2681 };
2682
2683 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2684 for (const auto& config : testConfigs) {
2685 SCOPED_TRACE(config.asParameters());
2686
2687 int rv;
2688 char host[NI_MAXHOST];
2689 struct sockaddr_in sin;
2690 struct sockaddr_in6 sin6;
2691 if (config.family == AF_INET) {
2692 memset(&sin, 0, sizeof(sin));
2693 sin.sin_family = AF_INET;
2694 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2695 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2696 nullptr, 0, config.flag);
2697 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2698 } else if (config.family == AF_INET6) {
2699 memset(&sin6, 0, sizeof(sin6));
2700 sin6.sin6_family = AF_INET6;
2701 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2702 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2703 nullptr, 0, config.flag);
2704 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2705 }
2706 ASSERT_EQ(0, rv);
2707 std::string result_str = host;
2708 EXPECT_EQ(result_str, config.host);
2709 dns.clearQueries();
2710 }
2711}
2712
2713TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2714 constexpr char listen_addr[] = "::1";
2715 constexpr char listen_srv[] = "53";
2716 constexpr char dns64_name[] = "ipv4only.arpa.";
2717 constexpr char ptr_name[] = "v4only.example.com.";
2718 // PTR record for IPv4 address 1.2.3.4
2719 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2720 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2721 constexpr char ptr_addr_v6_nomapping[] =
2722 "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.";
2723 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2724 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2725 constexpr char ptr_addr_v6_synthesis[] =
2726 "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.";
2727
2728 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2729 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2730 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2731 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2732 ASSERT_TRUE(dns.startServer());
2733
2734 const std::vector<std::string> servers = {listen_addr};
2735 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2736 dns.clearQueries();
2737
2738 // Wait for detecting prefix to complete.
2739 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2740
2741 static const struct TestConfig {
2742 bool hasSynthesizedPtrRecord;
2743 int flag;
2744 std::string addr;
2745 std::string host;
2746
2747 std::string asParameters() const {
2748 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2749 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2750 }
2751 } testConfigs[]{
2752 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2753 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2754 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2755 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2756 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2757 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2758 };
2759
2760 // hasSynthesizedPtrRecord = false
2761 // Synthesized PTR record doesn't exist on DNS server
2762 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2763 // After querying synthesized address failed, expect that prefix is removed from IPv6
2764 // synthesized address and do reverse IPv4 query instead.
2765 //
2766 // hasSynthesizedPtrRecord = true
2767 // Synthesized PTR record exists on DNS server
2768 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2769 // Expect to just pass through synthesized address for DNS queries.
2770 for (const auto& config : testConfigs) {
2771 SCOPED_TRACE(config.asParameters());
2772
2773 char host[NI_MAXHOST];
2774 struct sockaddr_in6 sin6;
2775 memset(&sin6, 0, sizeof(sin6));
2776 sin6.sin6_family = AF_INET6;
2777 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2778 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2779 nullptr, 0, config.flag);
2780 ASSERT_EQ(0, rv);
2781 if (config.flag == NI_NAMEREQD) {
2782 if (config.hasSynthesizedPtrRecord) {
2783 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2784 } else {
2785 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2786 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2787 }
2788 }
2789 std::string result_str = host;
2790 EXPECT_EQ(result_str, config.host);
2791 dns.clearQueries();
2792 }
2793}
2794
2795TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2796 constexpr char dns64_name[] = "ipv4only.arpa.";
2797 constexpr char host_name[] = "localhost";
2798 // The address is synthesized by prefix64:localhost.
2799 constexpr char host_addr[] = "64:ff9b::7f00:1";
2800
2801 constexpr char listen_addr[] = "::1";
2802 constexpr char listen_srv[] = "53";
2803 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2804 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2805 ASSERT_TRUE(dns.startServer());
2806 const std::vector<std::string> servers = {listen_addr};
2807 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2808 dns.clearQueries();
2809
2810 // Wait for detecting prefix to complete.
2811 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2812
2813 // Using synthesized "localhost" address to be a trick for resolving host name
2814 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2815 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2816 char host[NI_MAXHOST];
2817 struct sockaddr_in6 sin6;
2818 memset(&sin6, 0, sizeof(sin6));
2819 sin6.sin6_family = AF_INET6;
2820 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2821 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2822 0, NI_NAMEREQD);
2823 ASSERT_EQ(0, rv);
2824 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2825 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2826
2827 std::string result_str = host;
2828 EXPECT_EQ(result_str, host_name);
2829}
2830
nuccachenf52f7a52018-07-17 18:07:23 +08002831TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2832 constexpr char dns64_name[] = "ipv4only.arpa.";
2833 constexpr char host_name[] = "ipv4only.example.com.";
2834
2835 constexpr char listen_addr[] = "::1";
2836 constexpr char listen_srv[] = "53";
2837 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2838 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2839 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2840 ASSERT_TRUE(dns.startServer());
2841 const std::vector<std::string> servers = {listen_addr};
2842 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2843 dns.clearQueries();
2844
2845 // Wait for detecting prefix to complete.
2846 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2847
2848 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2849 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2850 ASSERT_TRUE(result != nullptr);
2851 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2852 std::string result_str = ToString(result);
2853 EXPECT_EQ(result_str, "64:ff9b::102:304");
2854}
nuccachenf52f7a52018-07-17 18:07:23 +08002855
2856TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2857 constexpr char dns64_name[] = "ipv4only.arpa.";
2858 constexpr char host_name[] = "v4v6.example.com.";
2859
2860 constexpr char listen_addr[] = "::1";
2861 constexpr char listen_srv[] = "53";
2862 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2863 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2864 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2865 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2866 ASSERT_TRUE(dns.startServer());
2867 const std::vector<std::string> servers = {listen_addr};
2868 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2869 dns.clearQueries();
2870
2871 // Wait for detecting prefix to complete.
2872 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2873
2874 // IPv4 DNS query. Prefix should have no effect on it.
2875 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2876 ASSERT_TRUE(result != nullptr);
2877 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2878 std::string result_str = ToString(result);
2879 EXPECT_EQ(result_str, "1.2.3.4");
2880 dns.clearQueries();
2881
2882 // IPv6 DNS query. Prefix should have no effect on it.
2883 result = gethostbyname2("v4v6", AF_INET6);
2884 ASSERT_TRUE(result != nullptr);
2885 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2886 result_str = ToString(result);
2887 EXPECT_EQ(result_str, "2001:db8::102:304");
2888}
2889
2890TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2891 constexpr char THIS_NETWORK[] = "this_network";
2892 constexpr char LOOPBACK[] = "loopback";
2893 constexpr char LINK_LOCAL[] = "link_local";
2894 constexpr char MULTICAST[] = "multicast";
2895 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2896
2897 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2898 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2899 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2900 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2901 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2902
2903 constexpr char listen_addr[] = "::1";
2904 constexpr char listen_srv[] = "53";
2905 constexpr char dns64_name[] = "ipv4only.arpa.";
2906
2907 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2908 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2909 ASSERT_TRUE(dns.startServer());
2910
2911 const std::vector<std::string> servers = {listen_addr};
2912 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2913 dns.clearQueries();
2914
2915 // Wait for detecting prefix to complete.
2916 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2917
2918 static const struct TestConfig {
2919 std::string name;
2920 std::string addr;
2921
2922 std::string asHostName() const {
2923 return StringPrintf("%s.example.com.",
2924 name.c_str());
2925 }
2926 } testConfigs[]{
2927 {THIS_NETWORK, ADDR_THIS_NETWORK},
2928 {LOOPBACK, ADDR_LOOPBACK},
2929 {LINK_LOCAL, ADDR_LINK_LOCAL},
2930 {MULTICAST, ADDR_MULTICAST},
2931 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2932 };
2933
2934 for (const auto& config : testConfigs) {
2935 const std::string testHostName = config.asHostName();
2936 SCOPED_TRACE(testHostName);
2937
2938 const char* host_name = testHostName.c_str();
2939 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2940
2941 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2942 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2943
2944 // In AF_INET6 case, don't synthesize special use IPv4 address.
2945 // Expect to have no answer
2946 EXPECT_EQ(nullptr, result);
2947
2948 dns.clearQueries();
2949 }
Bernie Innocenticd257642018-12-20 15:56:40 +09002950}