blob: 89da17db1ee4109ffef5b549b5022d132e030b7f [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 Innocenti3e411a32019-01-17 21:28:24 +0900112class ResolverTest : public ::testing::Test {
Bernie Innocenti0298c682018-10-02 23:18:11 +0900113 protected:
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900114 void SetUp() { mDnsClient.SetUp(); }
115 void TearDown() { mDnsClient.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;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900123 auto rv = mDnsClient.netdService()->getResolverInfo(TEST_NETID, servers, domains,
124 tlsServers, &params32, &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;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900221 auto rv = mDnsClient.netdService()->getPrefix64(netId, &prefix);
nuccachenf52f7a52018-07-17 18:07:23 +0800222 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;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900235 std::vector<DnsResponderClient::DnsResponderClient::Mapping> mappings;
236 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(num_hosts, domains, &mappings));
237 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS, mappings, &dns, &servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900238
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900239 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900240
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());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900271 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900272 }
273
274 const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
275 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900276 const std::vector<int> mDefaultParams = {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900277 300, // SAMPLE_VALIDITY
278 25, // SUCCESS_THRESHOLD
279 8, 8, // {MIN,MAX}_SAMPLES
280 100, // BASE_TIMEOUT_MSEC
281 };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900282
283 DnsResponderClient mDnsClient;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900284};
285
286TEST_F(ResolverTest, GetHostByName) {
287 const char* listen_addr = "127.0.0.3";
288 const char* listen_srv = "53";
289 const char* host_name = "hello.example.com.";
290 const char *nonexistent_host_name = "nonexistent.example.com.";
291 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
292 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
293 ASSERT_TRUE(dns.startServer());
294 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900295 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900296
297 const hostent* result;
298
299 dns.clearQueries();
300 result = gethostbyname("nonexistent");
301 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
302 ASSERT_TRUE(result == nullptr);
303 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
304
305 dns.clearQueries();
306 result = gethostbyname("hello");
307 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
308 ASSERT_FALSE(result == nullptr);
309 ASSERT_EQ(4, result->h_length);
310 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
311 EXPECT_EQ("1.2.3.3", ToString(result));
312 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
313
314 dns.stopServer();
315}
316
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900317TEST_F(ResolverTest, GetHostByName_localhost) {
318 constexpr char name[] = "localhost";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900319 constexpr char name_camelcase[] = "LocalHost";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900320 constexpr char addr[] = "127.0.0.1";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900321 constexpr char name_ip6[] = "ip6-localhost";
322 constexpr char addr_ip6[] = "::1";
Bernie Innocenti0298c682018-10-02 23:18:11 +0900323 constexpr char name_ip6_dot[] = "ip6-localhost.";
324 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900325
Bernie Innocenti974233e2018-09-04 20:35:34 +0900326 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900327 constexpr char listen_addr[] = "127.0.0.3";
328 constexpr char listen_srv[] = "53";
329 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
330 ASSERT_TRUE(dns.startServer());
331 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900332 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900333 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900334
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900335 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900336 const hostent* result = gethostbyname(name);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900337 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900338 ASSERT_FALSE(result == nullptr);
339 ASSERT_EQ(4, result->h_length);
340 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
341 EXPECT_EQ(addr, ToString(result));
342 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
343
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900344 // Ensure the hosts file resolver ignores case of hostnames
345 result = gethostbyname(name_camelcase);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900346 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900347 ASSERT_FALSE(result == nullptr);
348 ASSERT_EQ(4, result->h_length);
349 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
350 EXPECT_EQ(addr, ToString(result));
351 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
352
353 // The hosts file also contains ip6-localhost, but gethostbyname() won't
Bernie Innocenti0298c682018-10-02 23:18:11 +0900354 // return it unless the RES_USE_INET6 option is set. This would be easy to
355 // change, but there's no point in changing the legacy behavior; new code
356 // should be calling getaddrinfo() anyway.
357 // So we check the legacy behavior, which results in amusing A-record
358 // lookups for ip6-localhost, with and without search domains appended.
359 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900360 result = gethostbyname(name_ip6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900361 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
362 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
363 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900364 ASSERT_TRUE(result == nullptr);
365
Bernie Innocenti0298c682018-10-02 23:18:11 +0900366 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
367 // the hosts file.
368 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900369 result = gethostbyname2(name_ip6, AF_INET6);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900370 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900371 ASSERT_FALSE(result == nullptr);
372 ASSERT_EQ(16, result->h_length);
373 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
374 EXPECT_EQ(addr_ip6, ToString(result));
375 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
376
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900377 dns.stopServer();
378}
379
Bernie Innocentic1545232018-10-04 17:12:24 +0900380TEST_F(ResolverTest, GetHostByName_numeric) {
381 // Add a dummy nameserver which shouldn't receive any queries
382 constexpr char listen_addr[] = "127.0.0.3";
383 constexpr char listen_srv[] = "53";
384 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
385 ASSERT_TRUE(dns.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900386 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, mDefaultSearchDomains,
387 mDefaultParams));
Bernie Innocentic1545232018-10-04 17:12:24 +0900388
389 // Numeric v4 address: expect no DNS queries
390 constexpr char numeric_v4[] = "192.168.0.1";
391 dns.clearQueries();
392 const hostent* result = gethostbyname(numeric_v4);
Sehee Park8659b8d2018-11-16 10:53:16 +0900393 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900394 ASSERT_FALSE(result == nullptr);
395 ASSERT_EQ(4, result->h_length); // v4
396 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
397 EXPECT_EQ(numeric_v4, ToString(result));
398 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
399
400 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
401 constexpr char numeric_v6[] = "2001:db8::42";
402 dns.clearQueries();
403 result = gethostbyname(numeric_v6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900404 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900405 EXPECT_TRUE(result == nullptr);
406
407 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
408 dns.clearQueries();
409 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900410 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900411 ASSERT_FALSE(result == nullptr);
412 ASSERT_EQ(16, result->h_length); // v6
413 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
414 EXPECT_EQ(numeric_v6, ToString(result));
415 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
416
417 // Numeric v6 address with scope work with getaddrinfo(),
418 // but gethostbyname2() does not understand them; it issues two dns
419 // queries, then fails. This hardly ever happens, there's no point
420 // in fixing this. This test simply verifies the current (bogus)
421 // behavior to avoid further regressions (like crashes, or leaks).
422 constexpr char numeric_v6_scope[] = "fe80::1%lo";
423 dns.clearQueries();
424 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900425 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Bernie Innocentic1545232018-10-04 17:12:24 +0900426 ASSERT_TRUE(result == nullptr);
427
428 dns.stopServer();
429}
430
Bernie Innocenti443489e2018-08-10 14:27:23 +0900431TEST_F(ResolverTest, BinderSerialization) {
432 using android::net::INetd;
433 std::vector<int> params_offsets = {
434 INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY,
435 INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
436 INetd::RESOLVER_PARAMS_MIN_SAMPLES,
437 INetd::RESOLVER_PARAMS_MAX_SAMPLES,
438 INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
439 };
Bernie Innocenti45238a12018-12-04 14:57:48 +0900440 const int size = static_cast<int>(params_offsets.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900441 EXPECT_EQ(size, INetd::RESOLVER_PARAMS_COUNT);
442 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900443 for (int i = 0; i < size; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900444 EXPECT_EQ(params_offsets[i], i);
445 }
446}
447
448TEST_F(ResolverTest, GetHostByName_Binder) {
449 using android::net::INetd;
450
451 std::vector<std::string> domains = { "example.com" };
452 std::vector<std::unique_ptr<test::DNSResponder>> dns;
453 std::vector<std::string> servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900454 std::vector<DnsResponderClient::Mapping> mappings;
455 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
456 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900457 ASSERT_EQ(1U, mappings.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900458 const DnsResponderClient::Mapping& mapping = mappings[0];
Bernie Innocenti443489e2018-08-10 14:27:23 +0900459
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900460 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900461
462 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900463 const size_t total_queries =
464 std::accumulate(dns.begin(), dns.end(), 0, [this, &mapping](size_t total, auto& d) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900465 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
466 });
467
468 EXPECT_LE(1U, total_queries);
469 ASSERT_FALSE(result == nullptr);
470 ASSERT_EQ(4, result->h_length);
471 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
472 EXPECT_EQ(mapping.ip4, ToString(result));
473 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
474
475 std::vector<std::string> res_servers;
476 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900477 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900478 __res_params res_params;
479 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900480 ASSERT_TRUE(
481 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900482 EXPECT_EQ(servers.size(), res_servers.size());
483 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900484 EXPECT_EQ(0U, res_tls_servers.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900485 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams.size());
486 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY], res_params.sample_validity);
487 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
488 res_params.success_threshold);
489 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
490 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
491 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Bernie Innocenti443489e2018-08-10 14:27:23 +0900492 res_params.base_timeout_msec);
493 EXPECT_EQ(servers.size(), res_stats.size());
494
495 EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
496 EXPECT_TRUE(UnorderedCompareArray(res_domains, domains));
497
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900498 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900499}
500
501TEST_F(ResolverTest, GetAddrInfo) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900502 const char* listen_addr = "127.0.0.4";
503 const char* listen_addr2 = "127.0.0.5";
504 const char* listen_srv = "53";
505 const char* host_name = "howdy.example.com.";
506 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
507 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
508 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
509 ASSERT_TRUE(dns.startServer());
510
511 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
512 dns2.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
513 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
514 ASSERT_TRUE(dns2.startServer());
515
Bernie Innocenti443489e2018-08-10 14:27:23 +0900516 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900517 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900518 dns.clearQueries();
519 dns2.clearQueries();
520
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900521 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
522 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900523 size_t found = GetNumQueries(dns, host_name);
524 EXPECT_LE(1U, found);
525 // Could be A or AAAA
526 std::string result_str = ToString(result);
527 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
528 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900529
530 // Verify that the name is cached.
531 size_t old_found = found;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900532 result = safe_getaddrinfo("howdy", nullptr, nullptr);
533 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900534 found = GetNumQueries(dns, host_name);
535 EXPECT_LE(1U, found);
536 EXPECT_EQ(old_found, found);
537 result_str = ToString(result);
538 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
539 << result_str;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900540
541 // Change the DNS resolver, ensure that queries are still cached.
542 servers = { listen_addr2 };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900543 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900544 dns.clearQueries();
545 dns2.clearQueries();
546
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900547 result = safe_getaddrinfo("howdy", nullptr, nullptr);
548 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900549 found = GetNumQueries(dns, host_name);
550 size_t found2 = GetNumQueries(dns2, host_name);
551 EXPECT_EQ(0U, found);
552 EXPECT_LE(0U, found2);
553
554 // Could be A or AAAA
555 result_str = ToString(result);
556 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
557 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900558
559 dns.stopServer();
560 dns2.stopServer();
561}
562
563TEST_F(ResolverTest, GetAddrInfoV4) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900564 constexpr char listen_addr[] = "127.0.0.5";
565 constexpr char listen_srv[] = "53";
566 constexpr char host_name[] = "hola.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900567 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
568 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.5");
569 ASSERT_TRUE(dns.startServer());
570 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900571 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900572
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900573 addrinfo hints = {.ai_family = AF_INET};
574 ScopedAddrinfo result = safe_getaddrinfo("hola", nullptr, &hints);
575 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900576 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
577 EXPECT_EQ("1.2.3.5", ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900578}
579
580TEST_F(ResolverTest, GetAddrInfo_localhost) {
581 constexpr char name[] = "localhost";
582 constexpr char addr[] = "127.0.0.1";
583 constexpr char name_ip6[] = "ip6-localhost";
584 constexpr char addr_ip6[] = "::1";
585
Bernie Innocenti974233e2018-09-04 20:35:34 +0900586 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900587 constexpr char listen_addr[] = "127.0.0.5";
588 constexpr char listen_srv[] = "53";
589 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
590 ASSERT_TRUE(dns.startServer());
591 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900592 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900593
594 ScopedAddrinfo result = safe_getaddrinfo(name, nullptr, nullptr);
595 EXPECT_TRUE(result != nullptr);
596 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti0298c682018-10-02 23:18:11 +0900597 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900598 EXPECT_EQ(addr, ToString(result));
599
600 result = safe_getaddrinfo(name_ip6, nullptr, nullptr);
601 EXPECT_TRUE(result != nullptr);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900602 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
603 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900604 EXPECT_EQ(addr_ip6, ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900605}
606
Bernie Innocenti443489e2018-08-10 14:27:23 +0900607TEST_F(ResolverTest, MultidomainResolution) {
608 std::vector<std::string> searchDomains = { "example1.com", "example2.com", "example3.com" };
609 const char* listen_addr = "127.0.0.6";
610 const char* listen_srv = "53";
611 const char* host_name = "nihao.example2.com.";
612 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
613 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
614 ASSERT_TRUE(dns.startServer());
615 std::vector<std::string> servers = { listen_addr };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900616 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, searchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900617
618 dns.clearQueries();
619 const hostent* result = gethostbyname("nihao");
620 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
621 ASSERT_FALSE(result == nullptr);
622 ASSERT_EQ(4, result->h_length);
623 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
624 EXPECT_EQ("1.2.3.3", ToString(result));
625 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
626 dns.stopServer();
627}
628
Bernie Innocenti974233e2018-09-04 20:35:34 +0900629TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
630 constexpr char listen_addr0[] = "127.0.0.7";
631 constexpr char listen_srv[] = "53";
632 constexpr char host_name[] = "ohayou.example.com.";
633 constexpr char numeric_addr[] = "fe80::1%lo";
634
635 test::DNSResponder dns(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
636 dns.setResponseProbability(0.0);
637 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
638 ASSERT_TRUE(dns.startServer());
639 std::vector<std::string> servers = {listen_addr0};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900640 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti974233e2018-09-04 20:35:34 +0900641
642 addrinfo hints = {.ai_family = AF_INET6};
643 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
644 EXPECT_TRUE(result != nullptr);
645 EXPECT_EQ(numeric_addr, ToString(result));
646 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
647
648 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
649 // We should fail without sending out a DNS query.
650 hints.ai_flags |= AI_NUMERICHOST;
651 result = safe_getaddrinfo(host_name, nullptr, &hints);
652 EXPECT_TRUE(result == nullptr);
653 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
654}
655
Bernie Innocenti443489e2018-08-10 14:27:23 +0900656TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900657 const char* listen_addr0 = "127.0.0.7";
658 const char* listen_addr1 = "127.0.0.8";
659 const char* listen_srv = "53";
660 const char* host_name = "ohayou.example.com.";
661 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
662 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
663 dns0.setResponseProbability(0.0);
664 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
665 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
666 ASSERT_TRUE(dns0.startServer());
667 ASSERT_TRUE(dns1.startServer());
668 std::vector<std::string> servers = { listen_addr0, listen_addr1 };
669 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
670 int sample_count = 8;
671 const std::vector<int> params = { 300, 25, sample_count, sample_count };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900672 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, params));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900673
674 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
675 // reached the dns0, which is set to fail. No more requests should then arrive at that server
676 // for the next sample_lifetime seconds.
677 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900678 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti45238a12018-12-04 14:57:48 +0900679 for (int i = 0; i < sample_count; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900680 std::string domain = StringPrintf("nonexistent%d", i);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900681 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900682 }
683 // Due to 100% errors for all possible samples, the server should be ignored from now on and
684 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
685 dns0.clearQueries();
686 dns1.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900687 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
688 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900689 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
690 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900691}
692
693TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900694 const char* listen_addr0 = "127.0.0.7";
695 const char* listen_addr1 = "127.0.0.8";
696 const char* listen_srv = "53";
697 const char* host_name1 = "ohayou.example.com.";
698 const char* host_name2 = "ciao.example.com.";
699
700 // dns0 does not respond with 100% probability, while
701 // dns1 responds normally, at least initially.
702 test::DNSResponder dns0(listen_addr0, listen_srv, 250, static_cast<ns_rcode>(-1));
703 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
704 dns0.setResponseProbability(0.0);
705 dns0.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::5");
706 dns1.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::6");
707 dns0.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::5");
708 dns1.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::6");
709 ASSERT_TRUE(dns0.startServer());
710 ASSERT_TRUE(dns1.startServer());
711 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900712 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900713
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900714 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900715
716 // dns0 will ignore the request, and we'll fallback to dns1 after the first
717 // retry.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900718 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
719 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900720 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
721 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
722
723 // Now make dns1 also ignore 100% requests... The resolve should alternate
724 // retries between the nameservers and fail after 4 attempts.
725 dns1.setResponseProbability(0.0);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900726 addrinfo* result2 = nullptr;
727 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
728 EXPECT_EQ(nullptr, result2);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900729 EXPECT_EQ(4U, GetNumQueries(dns0, host_name2));
730 EXPECT_EQ(4U, GetNumQueries(dns1, host_name2));
731}
732
733TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
734 const char* listen_addr0 = "127.0.0.9";
735 const char* listen_addr1 = "127.0.0.10";
736 const char* listen_addr2 = "127.0.0.11";
737 const char* listen_srv = "53";
738 const char* host_name = "konbanha.example.com.";
739 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
740 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
741 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
742 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
743 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
744 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::7");
745 ASSERT_TRUE(dns0.startServer());
746 ASSERT_TRUE(dns1.startServer());
747 ASSERT_TRUE(dns2.startServer());
748 const std::vector<std::string> servers = { listen_addr0, listen_addr1, listen_addr2 };
749 std::vector<std::thread> threads(10);
750 for (std::thread& thread : threads) {
751 thread = std::thread([this, &servers]() {
752 unsigned delay = arc4random_uniform(1*1000*1000); // <= 1s
753 usleep(delay);
754 std::vector<std::string> serverSubset;
755 for (const auto& server : servers) {
756 if (arc4random_uniform(2)) {
757 serverSubset.push_back(server);
758 }
759 }
760 if (serverSubset.empty()) serverSubset = servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900761 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset, mDefaultSearchDomains,
762 mDefaultParams));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900763 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900764 addrinfo* result = nullptr;
765 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
766 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
767 if (result) {
768 freeaddrinfo(result);
769 result = nullptr;
770 }
771 });
772 }
773 for (std::thread& thread : threads) {
774 thread.join();
775 }
776}
777
778TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100) {
779 const unsigned num_hosts = 100;
780 const unsigned num_threads = 100;
781 const unsigned num_queries = 100;
782 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
783}
784
785TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100000) {
786 const unsigned num_hosts = 100000;
787 const unsigned num_threads = 100;
788 const unsigned num_queries = 100;
789 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
790}
791
792TEST_F(ResolverTest, EmptySetup) {
793 using android::net::INetd;
794 std::vector<std::string> servers;
795 std::vector<std::string> domains;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900796 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900797 std::vector<std::string> res_servers;
798 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900799 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900800 __res_params res_params;
801 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900802 ASSERT_TRUE(
803 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900804 EXPECT_EQ(0U, res_servers.size());
805 EXPECT_EQ(0U, res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900806 EXPECT_EQ(0U, res_tls_servers.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900807 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams.size());
808 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY], res_params.sample_validity);
809 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
810 res_params.success_threshold);
811 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
812 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
813 EXPECT_EQ(mDefaultParams[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Bernie Innocenti443489e2018-08-10 14:27:23 +0900814 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" };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900828 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900829
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" };
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900839 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900840 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;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900890 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yuda77e8e2018-11-26 13:26:21 +0900891
892 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
893 domains.push_back(StringPrintf("example%u.com", i));
894 }
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900895 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
896 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
Mike Yuda77e8e2018-11-26 13:26:21 +0900897 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls, &fingerprints));
898
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900899 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, mDefaultParams, "", fingerprints));
Mike Yuda77e8e2018-11-26 13:26:21 +0900900
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
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900917 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Mike Yuda77e8e2018-11-26 13:26:21 +0900918 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};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900944 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Mike Yuda77e8e2018-11-26 13:26:21 +0900945
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.
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900983 ASSERT_TRUE(
984 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900985
986 const hostent* result;
987
988 result = gethostbyname("tlsmissing");
989 ASSERT_FALSE(result == nullptr);
990 EXPECT_EQ("1.2.3.3", ToString(result));
991
992 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900993 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900994 dns.stopServer();
995}
996
997// Test what happens if the specified TLS server replies with garbage.
998TEST_F(ResolverTest, GetHostByName_TlsBroken) {
999 const char* listen_addr = "127.0.0.3";
1000 const char* listen_srv = "53";
1001 const char* host_name1 = "tlsbroken1.example.com.";
1002 const char* host_name2 = "tlsbroken2.example.com.";
1003 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1004 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1005 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1006 ASSERT_TRUE(dns.startServer());
1007 std::vector<std::string> servers = { listen_addr };
1008
1009 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1010 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1011 ASSERT_TRUE(s >= 0);
1012 struct sockaddr_in tlsServer = {
1013 .sin_family = AF_INET,
1014 .sin_port = htons(853),
1015 };
1016 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
Bernie Innocenti6f9fd902018-10-11 20:50:23 +09001017 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1018 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001019 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1020 ASSERT_FALSE(listen(s, 1));
1021
1022 // Trigger TLS validation.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001023 ASSERT_TRUE(
1024 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001025
1026 struct sockaddr_storage cliaddr;
1027 socklen_t sin_size = sizeof(cliaddr);
1028 int new_fd = accept4(s, reinterpret_cast<struct sockaddr *>(&cliaddr), &sin_size, SOCK_CLOEXEC);
1029 ASSERT_TRUE(new_fd > 0);
1030
1031 // We've received the new file descriptor but not written to it or closed, so the
1032 // validation is still pending. Queries should still flow correctly because the
1033 // server is not used until validation succeeds.
1034 const hostent* result;
1035 result = gethostbyname("tlsbroken1");
1036 ASSERT_FALSE(result == nullptr);
1037 EXPECT_EQ("1.2.3.1", ToString(result));
1038
1039 // Now we cause the validation to fail.
1040 std::string garbage = "definitely not a valid TLS ServerHello";
1041 write(new_fd, garbage.data(), garbage.size());
1042 close(new_fd);
1043
1044 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1045 // to the TLS server unless validation succeeds.
1046 result = gethostbyname("tlsbroken2");
1047 ASSERT_FALSE(result == nullptr);
1048 EXPECT_EQ("1.2.3.2", ToString(result));
1049
1050 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001051 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001052 dns.stopServer();
1053 close(s);
1054}
1055
1056TEST_F(ResolverTest, GetHostByName_Tls) {
1057 const char* listen_addr = "127.0.0.3";
1058 const char* listen_udp = "53";
1059 const char* listen_tls = "853";
1060 const char* host_name1 = "tls1.example.com.";
1061 const char* host_name2 = "tls2.example.com.";
1062 const char* host_name3 = "tls3.example.com.";
1063 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1064 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1065 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1066 dns.addMapping(host_name3, ns_type::ns_t_a, "1.2.3.3");
1067 ASSERT_TRUE(dns.startServer());
1068 std::vector<std::string> servers = { listen_addr };
1069
1070 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1071 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001072 ASSERT_TRUE(
1073 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001074
1075 const hostent* result;
1076
1077 // Wait for validation to complete.
1078 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1079
1080 result = gethostbyname("tls1");
1081 ASSERT_FALSE(result == nullptr);
1082 EXPECT_EQ("1.2.3.1", ToString(result));
1083
1084 // Wait for query to get counted.
1085 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1086
1087 // Stop the TLS server. Since we're in opportunistic mode, queries will
1088 // fall back to the locally-assigned (clear text) nameservers.
1089 tls.stopServer();
1090
1091 dns.clearQueries();
1092 result = gethostbyname("tls2");
1093 EXPECT_FALSE(result == nullptr);
1094 EXPECT_EQ("1.2.3.2", ToString(result));
1095 const auto queries = dns.queries();
1096 EXPECT_EQ(1U, queries.size());
1097 EXPECT_EQ("tls2.example.com.", queries[0].first);
1098 EXPECT_EQ(ns_t_a, queries[0].second);
1099
1100 // Reset the resolvers without enabling TLS. Queries should still be routed
1101 // to the UDP endpoint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001102 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001103
1104 result = gethostbyname("tls3");
1105 ASSERT_FALSE(result == nullptr);
1106 EXPECT_EQ("1.2.3.3", ToString(result));
1107
1108 dns.stopServer();
1109}
1110
1111TEST_F(ResolverTest, GetHostByName_TlsFingerprint) {
1112 const char* listen_addr = "127.0.0.3";
1113 const char* listen_udp = "53";
1114 const char* listen_tls = "853";
1115 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1116 ASSERT_TRUE(dns.startServer());
1117 for (int chain_length = 1; chain_length <= 3; ++chain_length) {
Bernie Innocentif2572392018-10-02 19:04:56 +09001118 std::string host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001119 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1120 std::vector<std::string> servers = { listen_addr };
1121
1122 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1123 tls.set_chain_length(chain_length);
1124 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001125 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams,
1126 "", {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001127
1128 const hostent* result;
1129
1130 // Wait for validation to complete.
1131 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1132
1133 result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
1134 EXPECT_FALSE(result == nullptr);
1135 if (result) {
1136 EXPECT_EQ("1.2.3.1", ToString(result));
1137
1138 // Wait for query to get counted.
1139 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1140 }
1141
1142 // Clear TLS bit to ensure revalidation.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001143 ASSERT_TRUE(
1144 mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001145 tls.stopServer();
1146 }
1147 dns.stopServer();
1148}
1149
1150TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {
1151 const char* listen_addr = "127.0.0.3";
1152 const char* listen_udp = "53";
1153 const char* listen_tls = "853";
1154 const char* host_name = "badtlsfingerprint.example.com.";
1155 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1156 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1157 ASSERT_TRUE(dns.startServer());
1158 std::vector<std::string> servers = { listen_addr };
1159
1160 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1161 ASSERT_TRUE(tls.startServer());
1162 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1163 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001164 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "",
1165 {base64Encode(bad_fingerprint)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001166
1167 // The initial validation should fail at the fingerprint check before
1168 // issuing a query.
1169 EXPECT_FALSE(tls.waitForQueries(1, 500));
1170
1171 // A fingerprint was provided and failed to match, so the query should fail.
1172 EXPECT_EQ(nullptr, gethostbyname("badtlsfingerprint"));
1173
1174 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001175 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001176 tls.stopServer();
1177 dns.stopServer();
1178}
1179
1180// Test that we can pass two different fingerprints, and connection succeeds as long as
1181// at least one of them matches the server.
1182TEST_F(ResolverTest, GetHostByName_TwoTlsFingerprints) {
1183 const char* listen_addr = "127.0.0.3";
1184 const char* listen_udp = "53";
1185 const char* listen_tls = "853";
1186 const char* host_name = "twotlsfingerprints.example.com.";
1187 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1188 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1189 ASSERT_TRUE(dns.startServer());
1190 std::vector<std::string> servers = { listen_addr };
1191
1192 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1193 ASSERT_TRUE(tls.startServer());
1194 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1195 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001196 ASSERT_TRUE(mDnsClient.SetResolversWithTls(
1197 servers, mDefaultSearchDomains, mDefaultParams, "",
1198 {base64Encode(bad_fingerprint), base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001199
1200 const hostent* result;
1201
1202 // Wait for validation to complete.
1203 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1204
1205 result = gethostbyname("twotlsfingerprints");
1206 ASSERT_FALSE(result == nullptr);
1207 EXPECT_EQ("1.2.3.1", ToString(result));
1208
1209 // Wait for query to get counted.
1210 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1211
1212 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001213 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001214 tls.stopServer();
1215 dns.stopServer();
1216}
1217
1218TEST_F(ResolverTest, GetHostByName_TlsFingerprintGoesBad) {
1219 const char* listen_addr = "127.0.0.3";
1220 const char* listen_udp = "53";
1221 const char* listen_tls = "853";
1222 const char* host_name1 = "tlsfingerprintgoesbad1.example.com.";
1223 const char* host_name2 = "tlsfingerprintgoesbad2.example.com.";
1224 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1225 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1226 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1227 ASSERT_TRUE(dns.startServer());
1228 std::vector<std::string> servers = { listen_addr };
1229
1230 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1231 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001232 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "",
1233 {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001234
1235 const hostent* result;
1236
1237 // Wait for validation to complete.
1238 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1239
1240 result = gethostbyname("tlsfingerprintgoesbad1");
1241 ASSERT_FALSE(result == nullptr);
1242 EXPECT_EQ("1.2.3.1", ToString(result));
1243
1244 // Wait for query to get counted.
1245 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1246
1247 // Restart the TLS server. This will generate a new certificate whose fingerprint
1248 // no longer matches the stored fingerprint.
1249 tls.stopServer();
1250 tls.startServer();
1251
1252 result = gethostbyname("tlsfingerprintgoesbad2");
1253 ASSERT_TRUE(result == nullptr);
1254 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
1255
1256 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001257 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001258 tls.stopServer();
1259 dns.stopServer();
1260}
1261
1262TEST_F(ResolverTest, GetHostByName_TlsFailover) {
1263 const char* listen_addr1 = "127.0.0.3";
1264 const char* listen_addr2 = "127.0.0.4";
1265 const char* listen_udp = "53";
1266 const char* listen_tls = "853";
1267 const char* host_name1 = "tlsfailover1.example.com.";
1268 const char* host_name2 = "tlsfailover2.example.com.";
1269 test::DNSResponder dns1(listen_addr1, listen_udp, 250, ns_rcode::ns_r_servfail);
1270 test::DNSResponder dns2(listen_addr2, listen_udp, 250, ns_rcode::ns_r_servfail);
1271 dns1.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1272 dns1.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1273 dns2.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.3");
1274 dns2.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
1275 ASSERT_TRUE(dns1.startServer());
1276 ASSERT_TRUE(dns2.startServer());
1277 std::vector<std::string> servers = { listen_addr1, listen_addr2 };
1278
1279 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1280 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1281 ASSERT_TRUE(tls1.startServer());
1282 ASSERT_TRUE(tls2.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001283 ASSERT_TRUE(mDnsClient.SetResolversWithTls(
1284 servers, mDefaultSearchDomains, mDefaultParams, "",
1285 {base64Encode(tls1.fingerprint()), base64Encode(tls2.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001286
1287 const hostent* result;
1288
1289 // Wait for validation to complete.
1290 EXPECT_TRUE(tls1.waitForQueries(1, 5000));
1291 EXPECT_TRUE(tls2.waitForQueries(1, 5000));
1292
1293 result = gethostbyname("tlsfailover1");
1294 ASSERT_FALSE(result == nullptr);
1295 EXPECT_EQ("1.2.3.1", ToString(result));
1296
1297 // Wait for query to get counted.
1298 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1299 // No new queries should have reached tls2.
1300 EXPECT_EQ(1, tls2.queries());
1301
1302 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1303 tls1.stopServer();
1304
1305 result = gethostbyname("tlsfailover2");
1306 EXPECT_EQ("1.2.3.4", ToString(result));
1307
1308 // Wait for query to get counted.
1309 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1310
1311 // No additional queries should have reached the insecure servers.
1312 EXPECT_EQ(2U, dns1.queries().size());
1313 EXPECT_EQ(2U, dns2.queries().size());
1314
1315 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001316 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001317 tls2.stopServer();
1318 dns1.stopServer();
1319 dns2.stopServer();
1320}
1321
1322TEST_F(ResolverTest, GetHostByName_BadTlsName) {
1323 const char* listen_addr = "127.0.0.3";
1324 const char* listen_udp = "53";
1325 const char* listen_tls = "853";
1326 const char* host_name = "badtlsname.example.com.";
1327 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1328 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1329 ASSERT_TRUE(dns.startServer());
1330 std::vector<std::string> servers = { listen_addr };
1331
1332 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1333 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001334 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams,
1335 "www.example.com", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001336
1337 // The TLS server's certificate doesn't chain to a known CA, and a nonempty name was specified,
1338 // so the client should fail the TLS handshake before ever issuing a query.
1339 EXPECT_FALSE(tls.waitForQueries(1, 500));
1340
1341 // The query should fail hard, because a name was specified.
1342 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1343
1344 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001345 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001346 tls.stopServer();
1347 dns.stopServer();
1348}
1349
1350TEST_F(ResolverTest, GetAddrInfo_Tls) {
1351 const char* listen_addr = "127.0.0.3";
1352 const char* listen_udp = "53";
1353 const char* listen_tls = "853";
1354 const char* host_name = "addrinfotls.example.com.";
1355 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1356 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1357 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1358 ASSERT_TRUE(dns.startServer());
1359 std::vector<std::string> servers = { listen_addr };
1360
1361 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1362 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001363 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "",
1364 {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001365
1366 // Wait for validation to complete.
1367 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1368
1369 dns.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001370 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1371 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001372 size_t found = GetNumQueries(dns, host_name);
1373 EXPECT_LE(1U, found);
1374 // Could be A or AAAA
1375 std::string result_str = ToString(result);
1376 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
1377 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001378 // Wait for both A and AAAA queries to get counted.
1379 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1380
1381 // Clear TLS bit.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001382 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001383 tls.stopServer();
1384 dns.stopServer();
1385}
1386
1387TEST_F(ResolverTest, TlsBypass) {
1388 const char OFF[] = "off";
1389 const char OPPORTUNISTIC[] = "opportunistic";
1390 const char STRICT[] = "strict";
1391
1392 const char GETHOSTBYNAME[] = "gethostbyname";
1393 const char GETADDRINFO[] = "getaddrinfo";
1394 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1395
1396 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1397
Mike Yu5ae61542018-10-19 22:11:43 +08001398 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001399
1400 const char ADDR4[] = "192.0.2.1";
1401 const char ADDR6[] = "2001:db8::1";
1402
1403 const char cleartext_addr[] = "127.0.0.53";
1404 const char cleartext_port[] = "53";
1405 const char tls_port[] = "853";
1406 const std::vector<std::string> servers = { cleartext_addr };
1407
1408 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1409 ASSERT_TRUE(dns.startServer());
1410
1411 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
1412
1413 struct TestConfig {
1414 const std::string mode;
1415 const bool withWorkingTLS;
1416 const std::string method;
1417
1418 std::string asHostName() const {
1419 return StringPrintf("%s.%s.%s.",
1420 mode.c_str(),
1421 withWorkingTLS ? "tlsOn" : "tlsOff",
1422 method.c_str());
1423 }
1424 } testConfigs[]{
1425 {OFF, false, GETHOSTBYNAME},
1426 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1427 {STRICT, false, GETHOSTBYNAME},
1428 {OFF, true, GETHOSTBYNAME},
1429 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1430 {STRICT, true, GETHOSTBYNAME},
1431 {OFF, false, GETADDRINFO},
1432 {OPPORTUNISTIC, false, GETADDRINFO},
1433 {STRICT, false, GETADDRINFO},
1434 {OFF, true, GETADDRINFO},
1435 {OPPORTUNISTIC, true, GETADDRINFO},
1436 {STRICT, true, GETADDRINFO},
1437 {OFF, false, GETADDRINFOFORNET},
1438 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1439 {STRICT, false, GETADDRINFOFORNET},
1440 {OFF, true, GETADDRINFOFORNET},
1441 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1442 {STRICT, true, GETADDRINFOFORNET},
1443 };
1444
1445 for (const auto& config : testConfigs) {
1446 const std::string testHostName = config.asHostName();
1447 SCOPED_TRACE(testHostName);
1448
1449 // Don't tempt test bugs due to caching.
1450 const char* host_name = testHostName.c_str();
1451 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1452 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1453
1454 if (config.withWorkingTLS) ASSERT_TRUE(tls.startServer());
1455
1456 if (config.mode == OFF) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001457 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains,
1458 mDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001459 } else if (config.mode == OPPORTUNISTIC) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001460 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
1461 mDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001462 // Wait for validation to complete.
1463 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1464 } else if (config.mode == STRICT) {
1465 // We use the existence of fingerprints to trigger strict mode,
1466 // rather than hostname validation.
1467 const auto& fingerprint =
1468 (config.withWorkingTLS) ? tls.fingerprint() : NOOP_FINGERPRINT;
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001469 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
1470 mDefaultParams, "",
1471 {base64Encode(fingerprint)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001472 // Wait for validation to complete.
1473 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1474 } else {
1475 FAIL() << "Unsupported Private DNS mode: " << config.mode;
1476 }
1477
1478 const int tlsQueriesBefore = tls.queries();
1479
1480 const hostent* h_result = nullptr;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001481 ScopedAddrinfo ai_result;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001482
1483 if (config.method == GETHOSTBYNAME) {
1484 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1485 h_result = gethostbyname(host_name);
1486
1487 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1488 ASSERT_FALSE(h_result == nullptr);
1489 ASSERT_EQ(4, h_result->h_length);
1490 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1491 EXPECT_EQ(ADDR4, ToString(h_result));
1492 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1493 } else if (config.method == GETADDRINFO) {
1494 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001495 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1496 EXPECT_TRUE(ai_result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001497
1498 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1499 // Could be A or AAAA
1500 const std::string result_str = ToString(ai_result);
1501 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1502 << ", result_str='" << result_str << "'";
1503 } else if (config.method == GETADDRINFOFORNET) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001504 addrinfo* raw_ai_result = nullptr;
Bernie Innocentic165ce82018-10-16 23:35:28 +09001505 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1506 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1507 &raw_ai_result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001508 ai_result.reset(raw_ai_result);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001509
1510 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1511 // Could be A or AAAA
1512 const std::string result_str = ToString(ai_result);
1513 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1514 << ", result_str='" << result_str << "'";
1515 } else {
1516 FAIL() << "Unsupported query method: " << config.method;
1517 }
1518
1519 const int tlsQueriesAfter = tls.queries();
1520 EXPECT_EQ(0, tlsQueriesAfter - tlsQueriesBefore);
1521
Bernie Innocenti443489e2018-08-10 14:27:23 +09001522 // Clear per-process resolv netid.
1523 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
1524 tls.stopServer();
1525 dns.clearQueries();
1526 }
1527
1528 dns.stopServer();
1529}
1530
1531TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Mike Yu5ae61542018-10-19 22:11:43 +08001532 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001533 const char cleartext_addr[] = "127.0.0.53";
1534 const char cleartext_port[] = "53";
1535 const std::vector<std::string> servers = { cleartext_addr };
1536
1537 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1538 const char* host_name = "strictmode.notlsips.example.com.";
1539 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1540 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1541 ASSERT_TRUE(dns.startServer());
1542
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001543 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, {},
1544 "", {base64Encode(NOOP_FINGERPRINT)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001545
1546 addrinfo* ai_result = nullptr;
1547 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1548 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1549}
Luke Huangc68f1b92018-11-21 20:13:38 +08001550
1551namespace {
1552
1553int getAsyncResponse(int fd, int* rcode, u_char* buf, int bufLen) {
1554 struct pollfd wait_fd[1];
1555 wait_fd[0].fd = fd;
1556 wait_fd[0].events = POLLIN;
1557 short revents;
1558 int ret;
1559
1560 ret = poll(wait_fd, 1, -1);
1561 revents = wait_fd[0].revents;
1562 if (revents & POLLIN) {
1563 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang952d0942018-12-26 16:53:03 +08001564 // Verify that resNetworkResult() closed the fd
1565 char dummy;
1566 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1567 EXPECT_EQ(EBADF, errno);
Luke Huangc68f1b92018-11-21 20:13:38 +08001568 return n;
1569 }
1570 return -1;
1571}
1572
1573std::string toString(u_char* buf, int bufLen, int ipType) {
1574 ns_msg handle;
1575 int ancount, n = 0;
1576 ns_rr rr;
1577
1578 if (ns_initparse((const uint8_t*) buf, bufLen, &handle) >= 0) {
1579 ancount = ns_msg_count(handle, ns_s_an);
1580 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
1581 const u_char* rdata = ns_rr_rdata(rr);
1582 char buffer[INET6_ADDRSTRLEN];
1583 if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
1584 return buffer;
1585 }
1586 }
1587 }
1588 return "";
1589}
1590
1591int dns_open_proxy() {
1592 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1593 if (s == -1) {
1594 return -1;
1595 }
1596 const int one = 1;
1597 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1598
1599 static const struct sockaddr_un proxy_addr = {
1600 .sun_family = AF_UNIX,
1601 .sun_path = "/dev/socket/dnsproxyd",
1602 };
1603
1604 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) !=
1605 0) {
1606 close(s);
1607 return -1;
1608 }
1609
1610 return s;
1611}
1612
Luke Huang952d0942018-12-26 16:53:03 +08001613void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1614 int rcode = -1;
1615 uint8_t buf[MAXPACKET] = {};
1616
1617 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1618 EXPECT_GT(res, 0);
1619 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1620}
1621
1622void expectAnswersNotValid(int fd, int expectedErrno) {
1623 int rcode = -1;
1624 uint8_t buf[MAXPACKET] = {};
1625
1626 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1627 EXPECT_EQ(expectedErrno, res);
1628}
1629
Luke Huangc68f1b92018-11-21 20:13:38 +08001630} // namespace
1631
1632TEST_F(ResolverTest, Async_NormalQueryV4V6) {
1633 const char listen_addr[] = "127.0.0.4";
1634 const char listen_srv[] = "53";
1635 const char host_name[] = "howdy.example.com.";
1636 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1637 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1638 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1639 ASSERT_TRUE(dns.startServer());
1640 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001641 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001642 dns.clearQueries();
1643
Luke Huang952d0942018-12-26 16:53:03 +08001644 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1645 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001646 EXPECT_TRUE(fd1 != -1);
1647 EXPECT_TRUE(fd2 != -1);
1648
1649 u_char buf[MAXPACKET] = {};
1650 int rcode;
1651 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1652 EXPECT_GT(res, 0);
1653 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1654
1655 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1656 EXPECT_GT(res, 0);
1657 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1658
1659 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1660
1661 // Re-query verify cache works
Luke Huang952d0942018-12-26 16:53:03 +08001662 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1663 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001664
1665 EXPECT_TRUE(fd1 != -1);
1666 EXPECT_TRUE(fd2 != -1);
1667
1668 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1669 EXPECT_GT(res, 0);
1670 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1671
1672 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1673 EXPECT_GT(res, 0);
1674 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1675
1676 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1677}
1678
1679TEST_F(ResolverTest, Async_BadQuery) {
1680 const char listen_addr[] = "127.0.0.4";
1681 const char listen_srv[] = "53";
1682 const char host_name[] = "howdy.example.com.";
1683 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1684 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1685 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1686 ASSERT_TRUE(dns.startServer());
1687 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001688 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001689 dns.clearQueries();
1690
1691 static struct {
1692 int fd;
1693 const char* dname;
1694 const int queryType;
1695 const int expectRcode;
1696 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001697 {-1, "", ns_t_aaaa, 0},
1698 {-1, "as65ass46", ns_t_aaaa, 0},
1699 {-1, "454564564564", ns_t_aaaa, 0},
1700 {-1, "h645235", ns_t_a, 0},
1701 {-1, "www.google.com", ns_t_a, 0},
Luke Huangc68f1b92018-11-21 20:13:38 +08001702 };
1703
1704 for (auto& td : kTestData) {
1705 SCOPED_TRACE(td.dname);
Luke Huang952d0942018-12-26 16:53:03 +08001706 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001707 EXPECT_TRUE(td.fd != -1);
1708 }
1709
1710 // dns_responder return empty resp(packet only contains query part) with no error currently
1711 for (const auto& td : kTestData) {
1712 u_char buf[MAXPACKET] = {};
1713 int rcode;
1714 SCOPED_TRACE(td.dname);
1715 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1716 EXPECT_GT(res, 0);
1717 EXPECT_EQ(rcode, td.expectRcode);
1718 }
1719}
1720
1721TEST_F(ResolverTest, Async_EmptyAnswer) {
1722 const char listen_addr[] = "127.0.0.4";
1723 const char listen_srv[] = "53";
1724 const char host_name[] = "howdy.example.com.";
1725 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1726 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1727 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1728 ASSERT_TRUE(dns.startServer());
1729 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001730 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001731 dns.clearQueries();
1732
Luke Huang26a0e2a2018-12-18 16:44:41 +08001733 // TODO: Disable retry to make this test explicit.
1734 auto& cv = dns.getCv();
1735 auto& cvMutex = dns.getCvMutex();
1736 int fd1;
1737 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1738 {
1739 std::unique_lock lk(cvMutex);
Luke Huang952d0942018-12-26 16:53:03 +08001740 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001741 EXPECT_TRUE(fd1 != -1);
1742 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
1743 }
Luke Huangc68f1b92018-11-21 20:13:38 +08001744
Luke Huangc68f1b92018-11-21 20:13:38 +08001745 dns.setResponseProbability(0.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001746
Luke Huang952d0942018-12-26 16:53:03 +08001747 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001748 EXPECT_TRUE(fd2 != -1);
1749
Luke Huang952d0942018-12-26 16:53:03 +08001750 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001751 EXPECT_TRUE(fd3 != -1);
1752
Luke Huang26a0e2a2018-12-18 16:44:41 +08001753 uint8_t buf[MAXPACKET] = {};
Luke Huangc68f1b92018-11-21 20:13:38 +08001754 int rcode;
1755
Luke Huang26a0e2a2018-12-18 16:44:41 +08001756 // expect no response
1757 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
1758 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001759
Luke Huang26a0e2a2018-12-18 16:44:41 +08001760 // expect no response
Luke Huangc68f1b92018-11-21 20:13:38 +08001761 memset(buf, 0, MAXPACKET);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001762 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1763 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001764
Luke Huangc68f1b92018-11-21 20:13:38 +08001765 dns.setResponseProbability(1.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001766
Luke Huang952d0942018-12-26 16:53:03 +08001767 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001768 EXPECT_TRUE(fd4 != -1);
1769
1770 memset(buf, 0, MAXPACKET);
1771 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
1772 EXPECT_GT(res, 0);
1773 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1774
1775 memset(buf, 0, MAXPACKET);
1776 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1777 EXPECT_GT(res, 0);
1778 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1779}
1780
1781TEST_F(ResolverTest, Async_MalformedQuery) {
1782 const char listen_addr[] = "127.0.0.4";
1783 const char listen_srv[] = "53";
1784 const char host_name[] = "howdy.example.com.";
1785 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1786 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1787 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1788 ASSERT_TRUE(dns.startServer());
1789 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001790 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huangc68f1b92018-11-21 20:13:38 +08001791 dns.clearQueries();
1792
1793 int fd = dns_open_proxy();
1794 EXPECT_TRUE(fd > 0);
1795
1796 const std::string badMsg = "16-52512#";
1797 static struct {
1798 const std::string cmd;
1799 const int expectErr;
1800 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001801 // Too few arguments
Luke Huangc68f1b92018-11-21 20:13:38 +08001802 {"resnsend " + badMsg + '\0', -EINVAL},
1803 // Bad netId
Luke Huang952d0942018-12-26 16:53:03 +08001804 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huangc68f1b92018-11-21 20:13:38 +08001805 // Bad raw data
Luke Huang952d0942018-12-26 16:53:03 +08001806 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huangc68f1b92018-11-21 20:13:38 +08001807 };
1808
1809 for (unsigned int i = 0; i < std::size(kTestData); i++) {
1810 auto& td = kTestData[i];
1811 SCOPED_TRACE(td.cmd);
1812 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
1813 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
1814
1815 int32_t tmp;
1816 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
1817 EXPECT_TRUE(rc > 0);
1818 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
1819 }
1820 // Normal query with answer buffer
1821 // This is raw data of query "howdy.example.com" type 1 class 1
1822 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huang952d0942018-12-26 16:53:03 +08001823 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huangc68f1b92018-11-21 20:13:38 +08001824 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1825 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1826
1827 u_char smallBuf[1] = {};
1828 int rcode;
1829 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huang952d0942018-12-26 16:53:03 +08001830 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huangc68f1b92018-11-21 20:13:38 +08001831
1832 // Do the normal test with large buffer again
1833 fd = dns_open_proxy();
1834 EXPECT_TRUE(fd > 0);
1835 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1836 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1837 u_char buf[MAXPACKET] = {};
1838 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1839 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu5b9ffb22018-12-02 17:54:29 +09001840}
1841
Luke Huang952d0942018-12-26 16:53:03 +08001842TEST_F(ResolverTest, Async_CacheFlags) {
1843 const char listen_addr[] = "127.0.0.4";
1844 const char listen_srv[] = "53";
1845 const char host_name[] = "howdy.example.com.";
1846 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1847 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1848 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1849 ASSERT_TRUE(dns.startServer());
1850 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001851 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huang952d0942018-12-26 16:53:03 +08001852 dns.clearQueries();
1853
1854 // ANDROID_RESOLV_NO_CACHE_STORE
1855 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1856 ANDROID_RESOLV_NO_CACHE_STORE);
1857 EXPECT_TRUE(fd1 != -1);
1858 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1859 ANDROID_RESOLV_NO_CACHE_STORE);
1860 EXPECT_TRUE(fd2 != -1);
1861 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1862 ANDROID_RESOLV_NO_CACHE_STORE);
1863 EXPECT_TRUE(fd3 != -1);
1864
1865 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
1866 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1867 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1868
1869 // No cache exists, expect 3 queries
1870 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
1871
1872 // Re-query and cache
1873 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1874
1875 EXPECT_TRUE(fd1 != -1);
1876
1877 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1878
1879 // Now we have cache, expect 4 queries
1880 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1881
1882 // ANDROID_RESOLV_NO_CACHE_LOOKUP
1883 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1884 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1885 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1886 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1887
1888 EXPECT_TRUE(fd1 != -1);
1889 EXPECT_TRUE(fd2 != -1);
1890
1891 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1892 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1893
1894 // Skip cache, expect 6 queries
1895 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1896
1897 // Re-query verify cache works
1898 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1899 ANDROID_RESOLV_NO_CACHE_STORE);
1900 EXPECT_TRUE(fd1 != -1);
1901 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1902
1903 // Cache hits, expect still 6 queries
1904 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1905}
1906
1907TEST_F(ResolverTest, Async_NoRetryFlag) {
1908 const char listen_addr[] = "127.0.0.4";
1909 const char listen_srv[] = "53";
1910 const char host_name[] = "howdy.example.com.";
1911 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1912 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1913 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1914 ASSERT_TRUE(dns.startServer());
1915 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001916 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
Luke Huang952d0942018-12-26 16:53:03 +08001917 dns.clearQueries();
1918
1919 dns.setResponseProbability(0.0);
1920
1921 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1922 ANDROID_RESOLV_NO_RETRY);
1923 EXPECT_TRUE(fd1 != -1);
1924
1925 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
1926 ANDROID_RESOLV_NO_RETRY);
1927 EXPECT_TRUE(fd2 != -1);
1928
1929 // expect no response
1930 expectAnswersNotValid(fd1, -ETIMEDOUT);
1931 expectAnswersNotValid(fd2, -ETIMEDOUT);
1932
1933 // No retry case, expect 2 queries
1934 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1935
1936 dns.clearQueries();
1937
1938 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1939 EXPECT_TRUE(fd1 != -1);
1940
1941 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
1942 EXPECT_TRUE(fd2 != -1);
1943
1944 // expect no response
1945 expectAnswersNotValid(fd1, -ETIMEDOUT);
1946 expectAnswersNotValid(fd2, -ETIMEDOUT);
1947
1948 // Retry case, expect 4 queries
1949 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1950}
1951
Mike Yu5b9ffb22018-12-02 17:54:29 +09001952// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chenbfd32022019-01-02 14:59:38 +08001953// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
1954// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
1955// won't retry so that we get no answer.
Mike Yu5b9ffb22018-12-02 17:54:29 +09001956TEST_F(ResolverTest, BrokenEdns) {
1957 typedef test::DNSResponder::Edns Edns;
1958 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
1959
1960 const char OFF[] = "off";
1961 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
1962 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
1963 const char STRICT[] = "strict";
1964 const char GETHOSTBYNAME[] = "gethostbyname";
1965 const char GETADDRINFO[] = "getaddrinfo";
1966 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
1967 const char ADDR4[] = "192.0.2.1";
1968 const char CLEARTEXT_ADDR[] = "127.0.0.53";
1969 const char CLEARTEXT_PORT[] = "53";
1970 const char TLS_PORT[] = "853";
1971 const std::vector<std::string> servers = { CLEARTEXT_ADDR };
1972
1973 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
1974 ASSERT_TRUE(dns.startServer());
1975
1976 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
1977
1978 static const struct TestConfig {
1979 std::string mode;
1980 std::string method;
1981 Edns edns;
1982 ExpectResult expectResult;
1983
1984 std::string asHostName() const {
1985 const char* ednsString;
1986 switch (edns) {
1987 case Edns::ON:
1988 ednsString = "ednsOn";
1989 break;
Ken Chenbfd32022019-01-02 14:59:38 +08001990 case Edns::FORMERR_ON_EDNS:
Mike Yu5b9ffb22018-12-02 17:54:29 +09001991 ednsString = "ednsFormerr";
1992 break;
1993 case Edns::DROP:
1994 ednsString = "ednsDrop";
1995 break;
1996 default:
1997 ednsString = "";
1998 break;
1999 }
2000 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2001 }
2002 } testConfigs[] = {
2003 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
2004 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2005 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2006 // commented out since TLS timeout is not configurable.
2007 // TODO: Uncomment them after TLS timeout is configurable.
2008 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2009 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2010 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2011 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
Ken Chenbfd32022019-01-02 14:59:38 +08002012 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2013 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2014 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2015 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002016 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2017 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2018 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2019 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2020 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2021 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2022 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2023 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
Ken Chenbfd32022019-01-02 14:59:38 +08002024 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2025 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2026 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2027 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002028 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2029 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2030 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2031 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2032 };
2033
2034 for (const auto& config : testConfigs) {
2035 const std::string testHostName = config.asHostName();
2036 SCOPED_TRACE(testHostName);
2037
2038 const char* host_name = testHostName.c_str();
2039 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2040 dns.setEdns(config.edns);
2041
2042 if (config.mode == OFF) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002043 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains,
2044 mDefaultParams));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002045 } else if (config.mode == OPPORTUNISTIC_UDP) {
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002046 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
2047 mDefaultParams, "", {}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002048 } else if (config.mode == OPPORTUNISTIC_TLS) {
2049 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002050 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
2051 mDefaultParams, "", {}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002052 // Wait for validation to complete.
2053 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2054 } else if (config.mode == STRICT) {
2055 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002056 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains,
2057 mDefaultParams, "",
2058 {base64Encode(tls.fingerprint())}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002059 // Wait for validation to complete.
2060 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2061 }
2062
2063 if (config.method == GETHOSTBYNAME) {
2064 const hostent* h_result = gethostbyname(host_name);
2065 if (config.expectResult == EXPECT_SUCCESS) {
2066 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2067 ASSERT_TRUE(h_result != nullptr);
2068 ASSERT_EQ(4, h_result->h_length);
2069 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2070 EXPECT_EQ(ADDR4, ToString(h_result));
2071 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2072 } else {
2073 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2074 ASSERT_TRUE(h_result == nullptr);
2075 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2076 }
2077 } else if (config.method == GETADDRINFO) {
2078 ScopedAddrinfo ai_result;
2079 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2080 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2081 if (config.expectResult == EXPECT_SUCCESS) {
2082 EXPECT_TRUE(ai_result != nullptr);
2083 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2084 const std::string result_str = ToString(ai_result);
2085 EXPECT_EQ(ADDR4, result_str);
2086 } else {
2087 EXPECT_TRUE(ai_result == nullptr);
2088 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2089 }
2090 } else {
2091 FAIL() << "Unsupported query method: " << config.method;
2092 }
2093
2094 tls.stopServer();
2095 dns.clearQueries();
2096 }
2097
2098 dns.stopServer();
2099}
nuccachenf52f7a52018-07-17 18:07:23 +08002100
Ken Chenbfd32022019-01-02 14:59:38 +08002101// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2102// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2103// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2104// failed due to timeout.
2105TEST_F(ResolverTest, UnstableTls) {
2106 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2107 const char CLEARTEXT_PORT[] = "53";
2108 const char TLS_PORT[] = "853";
2109 const char* host_name1 = "nonexistent1.example.com.";
2110 const char* host_name2 = "nonexistent2.example.com.";
2111 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2112
2113 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2114 ASSERT_TRUE(dns.startServer());
2115 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2116 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2117 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002118 ASSERT_TRUE(
2119 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Ken Chenbfd32022019-01-02 14:59:38 +08002120 // Wait for validation complete.
2121 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2122 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2123 tls.stopServer();
2124
2125 const hostent* h_result = gethostbyname(host_name1);
2126 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2127 ASSERT_TRUE(h_result == nullptr);
2128 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2129
2130 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2131 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2132 EXPECT_TRUE(ai_result == nullptr);
2133 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2134}
2135
2136// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2137// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2138TEST_F(ResolverTest, BogusDnsServer) {
2139 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2140 const char CLEARTEXT_PORT[] = "53";
2141 const char TLS_PORT[] = "853";
2142 const char* host_name1 = "nonexistent1.example.com.";
2143 const char* host_name2 = "nonexistent2.example.com.";
2144 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2145
2146 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2147 ASSERT_TRUE(dns.startServer());
2148 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2149 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002150 ASSERT_TRUE(
2151 mDnsClient.SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams, "", {}));
Ken Chenbfd32022019-01-02 14:59:38 +08002152 // Wait for validation complete.
2153 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2154 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2155 tls.stopServer();
2156 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2157
2158 const hostent* h_result = gethostbyname(host_name1);
2159 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2160 ASSERT_TRUE(h_result == nullptr);
2161 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2162
2163 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2164 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2165 EXPECT_TRUE(ai_result == nullptr);
2166 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2167}
2168
nuccachenf52f7a52018-07-17 18:07:23 +08002169TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2170 constexpr char listen_addr[] = "::1";
2171 constexpr char listen_addr2[] = "127.0.0.5";
2172 constexpr char listen_srv[] = "53";
2173 constexpr char dns64_name[] = "ipv4only.arpa.";
2174 constexpr char host_name[] = "v4only.example.com.";
2175
2176 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2177 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2178 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2179 ASSERT_TRUE(dns.startServer());
2180
2181 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
2182 dns2.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2183 ASSERT_TRUE(dns2.startServer());
2184
2185 std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002186 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002187 dns.clearQueries();
2188
2189 // Wait for detecting prefix to complete.
2190 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2191
2192 // hints are necessary in order to let netd know which type of addresses the caller is
2193 // interested in.
2194 addrinfo hints;
2195 memset(&hints, 0, sizeof(hints));
2196 hints.ai_family = AF_UNSPEC;
2197 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2198 EXPECT_TRUE(result != nullptr);
2199 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2200
2201 std::string result_str = ToString(result);
2202 EXPECT_EQ(result_str, "64:ff9b::102:304");
2203
2204 // Let's test the case when there's an IPv4 resolver.
2205 servers = {listen_addr, listen_addr2};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002206 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002207 dns.clearQueries();
2208 dns2.clearQueries();
2209
2210 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2211 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2212
2213 result = safe_getaddrinfo("v4only", nullptr, &hints);
2214 EXPECT_TRUE(result != nullptr);
2215 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2216
2217 result_str = ToString(result);
2218 EXPECT_EQ(result_str, "1.2.3.4");
2219}
2220
nuccachenf52f7a52018-07-17 18:07:23 +08002221TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2222 constexpr char listen_addr[] = "::1";
2223 constexpr char listen_srv[] = "53";
2224 constexpr char dns64_name[] = "ipv4only.arpa.";
2225 constexpr char host_name[] = "v4only.example.com.";
2226
2227 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2228 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2229 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2230 ASSERT_TRUE(dns.startServer());
2231
2232 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002233 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002234 dns.clearQueries();
2235
2236 // Wait for detecting prefix to complete.
2237 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2238
2239 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2240 // in AF_INET case.
2241 addrinfo hints;
2242 memset(&hints, 0, sizeof(hints));
2243 hints.ai_family = AF_INET6;
2244 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2245 EXPECT_TRUE(result != nullptr);
2246 std::string result_str = ToString(result);
2247 EXPECT_EQ(result_str, "64:ff9b::102:304");
2248
2249 hints.ai_family = AF_INET;
2250 result = safe_getaddrinfo("v4only", nullptr, &hints);
2251 EXPECT_TRUE(result != nullptr);
2252 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2253 result_str = ToString(result);
2254 EXPECT_EQ(result_str, "1.2.3.4");
2255}
nuccachenf52f7a52018-07-17 18:07:23 +08002256
2257TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2258 constexpr char listen_addr[] = "::1";
2259 constexpr char listen_srv[] = "53";
2260 constexpr char dns64_name[] = "ipv4only.arpa.";
2261 constexpr char host_name[] = "v4v6.example.com.";
2262
2263 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2264 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2265 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2266 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2267 ASSERT_TRUE(dns.startServer());
2268
2269 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002270 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002271 dns.clearQueries();
2272
2273 // Wait for detecting prefix to complete.
2274 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2275
2276 addrinfo hints;
2277 memset(&hints, 0, sizeof(hints));
2278 hints.ai_family = AF_UNSPEC;
2279 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2280 EXPECT_TRUE(result != nullptr);
2281 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2282
2283 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2284 std::vector<std::string> result_strs = ToStrings(result);
2285 for (const auto& str : result_strs) {
2286 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2287 << ", result_str='" << str << "'";
2288 }
2289}
2290
2291TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2292 constexpr char listen_addr[] = "::1";
2293 constexpr char listen_srv[] = "53";
2294 constexpr char dns64_name[] = "ipv4only.arpa.";
2295 constexpr char host_name[] = "v4v6.example.com.";
2296
2297 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2298 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2299 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2300 ASSERT_TRUE(dns.startServer());
2301
2302 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002303 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002304 dns.clearQueries();
2305
2306 // Wait for detecting prefix to complete.
2307 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2308
2309 addrinfo hints;
2310 memset(&hints, 0, sizeof(hints));
2311 hints.ai_family = AF_UNSPEC;
2312 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2313 EXPECT_TRUE(result != nullptr);
2314 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2315
2316 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2317 std::string result_str = ToString(result);
2318 EXPECT_EQ(result_str, "64:ff9b::102:304");
2319}
2320
2321TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2322 constexpr char THIS_NETWORK[] = "this_network";
2323 constexpr char LOOPBACK[] = "loopback";
2324 constexpr char LINK_LOCAL[] = "link_local";
2325 constexpr char MULTICAST[] = "multicast";
2326 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2327
2328 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2329 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2330 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2331 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2332 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2333
2334 constexpr char listen_addr[] = "::1";
2335 constexpr char listen_srv[] = "53";
2336 constexpr char dns64_name[] = "ipv4only.arpa.";
2337
2338 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2339 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2340 ASSERT_TRUE(dns.startServer());
2341
2342 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002343 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002344 dns.clearQueries();
2345
2346 // Wait for detecting prefix to complete.
2347 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2348
2349 static const struct TestConfig {
2350 std::string name;
2351 std::string addr;
2352
2353 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2354 } testConfigs[]{
2355 {THIS_NETWORK, ADDR_THIS_NETWORK},
2356 {LOOPBACK, ADDR_LOOPBACK},
2357 {LINK_LOCAL, ADDR_LINK_LOCAL},
2358 {MULTICAST, ADDR_MULTICAST},
2359 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2360 };
2361
2362 for (const auto& config : testConfigs) {
2363 const std::string testHostName = config.asHostName();
2364 SCOPED_TRACE(testHostName);
2365
2366 const char* host_name = testHostName.c_str();
2367 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2368
2369 addrinfo hints;
2370 memset(&hints, 0, sizeof(hints));
2371 hints.ai_family = AF_INET6;
2372 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2373 // In AF_INET6 case, don't return IPv4 answers
2374 EXPECT_TRUE(result == nullptr);
2375 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2376 dns.clearQueries();
2377
2378 memset(&hints, 0, sizeof(hints));
2379 hints.ai_family = AF_UNSPEC;
2380 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2381 EXPECT_TRUE(result != nullptr);
2382 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2383 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2384 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2385 std::string result_str = ToString(result);
2386 EXPECT_EQ(result_str, config.addr.c_str());
2387 dns.clearQueries();
2388 }
2389}
2390
2391TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2392 constexpr char listen_addr[] = "::1";
2393 constexpr char listen_srv[] = "53";
2394 constexpr char dns64_name[] = "ipv4only.arpa.";
2395 constexpr char host_name[] = "v4only.example.com.";
2396 constexpr char host_name2[] = "v4v6.example.com.";
2397
2398 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2399 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2400 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2401 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2402 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2403 ASSERT_TRUE(dns.startServer());
2404
2405 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002406 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002407 dns.clearQueries();
2408
2409 // Wait for detecting prefix to complete.
2410 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2411
2412 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2413 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2414 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2415 EXPECT_TRUE(result != nullptr);
2416 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2417 std::string result_str = ToString(result);
2418 EXPECT_EQ(result_str, "64:ff9b::102:304");
2419 dns.clearQueries();
2420
2421 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2422 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2423 EXPECT_TRUE(result != nullptr);
2424 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2425 std::vector<std::string> result_strs = ToStrings(result);
2426 for (const auto& str : result_strs) {
2427 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2428 << ", result_str='" << str << "'";
2429 }
2430}
2431
2432TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2433 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2434 constexpr char ADDR_ANYADDR_V6[] = "::";
2435 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2436 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2437
2438 constexpr char PORT_NAME_HTTP[] = "http";
2439 constexpr char PORT_NUMBER_HTTP[] = "80";
2440
2441 constexpr char listen_addr[] = "::1";
2442 constexpr char listen_srv[] = "53";
2443 constexpr char dns64_name[] = "ipv4only.arpa.";
2444
2445 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2446 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2447 ASSERT_TRUE(dns.startServer());
2448
2449 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002450 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002451 dns.clearQueries();
2452
2453 // Wait for detecting prefix to complete.
2454 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2455
2456 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2457 // - passive socket -> anyaddr (0.0.0.0 or ::)
2458 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2459 static const struct TestConfig {
2460 int flag;
2461 std::string addr_v4;
2462 std::string addr_v6;
2463
2464 std::string asParameters() const {
2465 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2466 addr_v6.c_str());
2467 }
2468 } testConfigs[]{
2469 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2470 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2471 };
2472
2473 for (const auto& config : testConfigs) {
2474 SCOPED_TRACE(config.asParameters());
2475
2476 addrinfo hints;
2477 memset(&hints, 0, sizeof(hints));
2478 hints.ai_family = AF_UNSPEC; // any address family
2479 hints.ai_socktype = 0; // any type
2480 hints.ai_protocol = 0; // any protocol
2481 hints.ai_flags = config.flag;
2482
2483 // Assign hostname as null and service as port name.
2484 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2485 ASSERT_TRUE(result != nullptr);
2486
2487 // Can't be synthesized because it should not get into Netd.
2488 std::vector<std::string> result_strs = ToStrings(result);
2489 for (const auto& str : result_strs) {
2490 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2491 << ", result_str='" << str << "'";
2492 }
2493
2494 // Assign hostname as null and service as numeric port number.
2495 hints.ai_flags = config.flag | AI_NUMERICSERV;
2496 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2497 ASSERT_TRUE(result != nullptr);
2498
2499 // Can't be synthesized because it should not get into Netd.
2500 result_strs = ToStrings(result);
2501 for (const auto& str : result_strs) {
2502 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2503 << ", result_str='" << str << "'";
2504 }
2505 }
2506}
2507
2508TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2509 struct hostent* result = nullptr;
2510 struct in_addr v4addr;
2511 struct in6_addr v6addr;
2512
2513 constexpr char listen_addr[] = "::1";
2514 constexpr char listen_srv[] = "53";
2515 constexpr char dns64_name[] = "ipv4only.arpa.";
2516 constexpr char ptr_name[] = "v4v6.example.com.";
2517 // PTR record for IPv4 address 1.2.3.4
2518 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2519 // PTR record for IPv6 address 2001:db8::102:304
2520 constexpr char ptr_addr_v6[] =
2521 "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.";
2522
2523 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2524 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2525 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2526 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2527 ASSERT_TRUE(dns.startServer());
2528
2529 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002530 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002531 dns.clearQueries();
2532
2533 // Wait for detecting prefix to complete.
2534 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2535
2536 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2537 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2538 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2539 ASSERT_TRUE(result != nullptr);
2540 std::string result_str = result->h_name ? result->h_name : "null";
2541 EXPECT_EQ(result_str, "v4v6.example.com");
2542
2543 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2544 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2545 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2546 ASSERT_TRUE(result != nullptr);
2547 result_str = result->h_name ? result->h_name : "null";
2548 EXPECT_EQ(result_str, "v4v6.example.com");
2549}
2550
2551TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2552 constexpr char listen_addr[] = "::1";
2553 constexpr char listen_srv[] = "53";
2554 constexpr char dns64_name[] = "ipv4only.arpa.";
2555 constexpr char ptr_name[] = "v4only.example.com.";
2556 // PTR record for IPv4 address 1.2.3.4
2557 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2558 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2559 constexpr char ptr_addr_v6_nomapping[] =
2560 "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.";
2561 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2562 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2563 constexpr char ptr_addr_v6_synthesis[] =
2564 "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.";
2565
2566 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2567 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2568 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2569 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2570 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2571 ASSERT_TRUE(dns.startServer());
2572
2573 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002574 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002575 dns.clearQueries();
2576
2577 // Wait for detecting prefix to complete.
2578 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2579
2580 // Synthesized PTR record doesn't exist on DNS server
2581 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2582 // After querying synthesized address failed, expect that prefix is removed from IPv6
2583 // synthesized address and do reverse IPv4 query instead.
2584 struct in6_addr v6addr;
2585 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2586 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2587 ASSERT_TRUE(result != nullptr);
2588 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2589 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2590 std::string result_str = result->h_name ? result->h_name : "null";
2591 EXPECT_EQ(result_str, "v4only.example.com");
2592 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2593 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2594 // fakes the return IPv4 address as original queried IPv6 address.
2595 result_str = ToString(result);
2596 EXPECT_EQ(result_str, "64:ff9b::102:304");
2597 dns.clearQueries();
2598
2599 // Synthesized PTR record exists on DNS server
2600 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2601 // Expect to Netd pass through synthesized address for DNS queries.
2602 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2603 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2604 ASSERT_TRUE(result != nullptr);
2605 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2606 result_str = result->h_name ? result->h_name : "null";
2607 EXPECT_EQ(result_str, "v6synthesis.example.com");
2608}
2609
2610TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2611 constexpr char dns64_name[] = "ipv4only.arpa.";
2612 constexpr char host_name[] = "localhost";
2613 // The address is synthesized by prefix64:localhost.
2614 constexpr char host_addr[] = "64:ff9b::7f00:1";
2615
2616 constexpr char listen_addr[] = "::1";
2617 constexpr char listen_srv[] = "53";
2618 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2619 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2620 ASSERT_TRUE(dns.startServer());
2621 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002622 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002623 dns.clearQueries();
2624
2625 // Wait for detecting prefix to complete.
2626 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2627
2628 // Using synthesized "localhost" address to be a trick for resolving host name
2629 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2630 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2631 struct in6_addr v6addr;
2632 inet_pton(AF_INET6, host_addr, &v6addr);
2633 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2634 ASSERT_TRUE(result != nullptr);
2635 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2636 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2637
2638 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2639 ASSERT_EQ(AF_INET6, result->h_addrtype);
2640 std::string result_str = ToString(result);
2641 EXPECT_EQ(result_str, host_addr);
2642 result_str = result->h_name ? result->h_name : "null";
2643 EXPECT_EQ(result_str, host_name);
2644}
2645
2646TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2647 constexpr char listen_addr[] = "::1";
2648 constexpr char listen_srv[] = "53";
2649 constexpr char dns64_name[] = "ipv4only.arpa.";
2650 constexpr char ptr_name[] = "v4v6.example.com.";
2651 // PTR record for IPv4 address 1.2.3.4
2652 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2653 // PTR record for IPv6 address 2001:db8::102:304
2654 constexpr char ptr_addr_v6[] =
2655 "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.";
2656
2657 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2658 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2659 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2660 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2661 ASSERT_TRUE(dns.startServer());
2662
2663 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002664 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002665 dns.clearQueries();
2666
2667 // Wait for detecting prefix to complete.
2668 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2669
2670 static const struct TestConfig {
2671 int flag;
2672 int family;
2673 std::string addr;
2674 std::string host;
2675
2676 std::string asParameters() const {
2677 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2678 host.c_str());
2679 }
2680 } testConfigs[]{
2681 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2682 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2683 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2684 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2685 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2686 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2687 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2688 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2689 };
2690
2691 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2692 for (const auto& config : testConfigs) {
2693 SCOPED_TRACE(config.asParameters());
2694
2695 int rv;
2696 char host[NI_MAXHOST];
2697 struct sockaddr_in sin;
2698 struct sockaddr_in6 sin6;
2699 if (config.family == AF_INET) {
2700 memset(&sin, 0, sizeof(sin));
2701 sin.sin_family = AF_INET;
2702 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2703 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2704 nullptr, 0, config.flag);
2705 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2706 } else if (config.family == AF_INET6) {
2707 memset(&sin6, 0, sizeof(sin6));
2708 sin6.sin6_family = AF_INET6;
2709 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2710 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2711 nullptr, 0, config.flag);
2712 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2713 }
2714 ASSERT_EQ(0, rv);
2715 std::string result_str = host;
2716 EXPECT_EQ(result_str, config.host);
2717 dns.clearQueries();
2718 }
2719}
2720
2721TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2722 constexpr char listen_addr[] = "::1";
2723 constexpr char listen_srv[] = "53";
2724 constexpr char dns64_name[] = "ipv4only.arpa.";
2725 constexpr char ptr_name[] = "v4only.example.com.";
2726 // PTR record for IPv4 address 1.2.3.4
2727 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2728 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2729 constexpr char ptr_addr_v6_nomapping[] =
2730 "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.";
2731 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2732 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2733 constexpr char ptr_addr_v6_synthesis[] =
2734 "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.";
2735
2736 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2737 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2738 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2739 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2740 ASSERT_TRUE(dns.startServer());
2741
2742 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002743 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002744 dns.clearQueries();
2745
2746 // Wait for detecting prefix to complete.
2747 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2748
2749 static const struct TestConfig {
2750 bool hasSynthesizedPtrRecord;
2751 int flag;
2752 std::string addr;
2753 std::string host;
2754
2755 std::string asParameters() const {
2756 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2757 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2758 }
2759 } testConfigs[]{
2760 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2761 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2762 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2763 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2764 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2765 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2766 };
2767
2768 // hasSynthesizedPtrRecord = false
2769 // Synthesized PTR record doesn't exist on DNS server
2770 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2771 // After querying synthesized address failed, expect that prefix is removed from IPv6
2772 // synthesized address and do reverse IPv4 query instead.
2773 //
2774 // hasSynthesizedPtrRecord = true
2775 // Synthesized PTR record exists on DNS server
2776 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2777 // Expect to just pass through synthesized address for DNS queries.
2778 for (const auto& config : testConfigs) {
2779 SCOPED_TRACE(config.asParameters());
2780
2781 char host[NI_MAXHOST];
2782 struct sockaddr_in6 sin6;
2783 memset(&sin6, 0, sizeof(sin6));
2784 sin6.sin6_family = AF_INET6;
2785 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2786 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2787 nullptr, 0, config.flag);
2788 ASSERT_EQ(0, rv);
2789 if (config.flag == NI_NAMEREQD) {
2790 if (config.hasSynthesizedPtrRecord) {
2791 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2792 } else {
2793 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2794 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2795 }
2796 }
2797 std::string result_str = host;
2798 EXPECT_EQ(result_str, config.host);
2799 dns.clearQueries();
2800 }
2801}
2802
2803TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2804 constexpr char dns64_name[] = "ipv4only.arpa.";
2805 constexpr char host_name[] = "localhost";
2806 // The address is synthesized by prefix64:localhost.
2807 constexpr char host_addr[] = "64:ff9b::7f00:1";
2808
2809 constexpr char listen_addr[] = "::1";
2810 constexpr char listen_srv[] = "53";
2811 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2812 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2813 ASSERT_TRUE(dns.startServer());
2814 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002815 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002816 dns.clearQueries();
2817
2818 // Wait for detecting prefix to complete.
2819 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2820
2821 // Using synthesized "localhost" address to be a trick for resolving host name
2822 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2823 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2824 char host[NI_MAXHOST];
2825 struct sockaddr_in6 sin6;
2826 memset(&sin6, 0, sizeof(sin6));
2827 sin6.sin6_family = AF_INET6;
2828 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2829 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2830 0, NI_NAMEREQD);
2831 ASSERT_EQ(0, rv);
2832 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2833 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2834
2835 std::string result_str = host;
2836 EXPECT_EQ(result_str, host_name);
2837}
2838
nuccachenf52f7a52018-07-17 18:07:23 +08002839TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2840 constexpr char dns64_name[] = "ipv4only.arpa.";
2841 constexpr char host_name[] = "ipv4only.example.com.";
2842
2843 constexpr char listen_addr[] = "::1";
2844 constexpr char listen_srv[] = "53";
2845 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2846 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2847 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2848 ASSERT_TRUE(dns.startServer());
2849 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002850 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002851 dns.clearQueries();
2852
2853 // Wait for detecting prefix to complete.
2854 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2855
2856 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2857 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2858 ASSERT_TRUE(result != nullptr);
2859 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2860 std::string result_str = ToString(result);
2861 EXPECT_EQ(result_str, "64:ff9b::102:304");
2862}
nuccachenf52f7a52018-07-17 18:07:23 +08002863
2864TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2865 constexpr char dns64_name[] = "ipv4only.arpa.";
2866 constexpr char host_name[] = "v4v6.example.com.";
2867
2868 constexpr char listen_addr[] = "::1";
2869 constexpr char listen_srv[] = "53";
2870 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2871 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2872 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2873 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2874 ASSERT_TRUE(dns.startServer());
2875 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002876 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002877 dns.clearQueries();
2878
2879 // Wait for detecting prefix to complete.
2880 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2881
2882 // IPv4 DNS query. Prefix should have no effect on it.
2883 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2884 ASSERT_TRUE(result != nullptr);
2885 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2886 std::string result_str = ToString(result);
2887 EXPECT_EQ(result_str, "1.2.3.4");
2888 dns.clearQueries();
2889
2890 // IPv6 DNS query. Prefix should have no effect on it.
2891 result = gethostbyname2("v4v6", AF_INET6);
2892 ASSERT_TRUE(result != nullptr);
2893 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2894 result_str = ToString(result);
2895 EXPECT_EQ(result_str, "2001:db8::102:304");
2896}
2897
2898TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2899 constexpr char THIS_NETWORK[] = "this_network";
2900 constexpr char LOOPBACK[] = "loopback";
2901 constexpr char LINK_LOCAL[] = "link_local";
2902 constexpr char MULTICAST[] = "multicast";
2903 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2904
2905 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2906 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2907 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2908 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2909 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2910
2911 constexpr char listen_addr[] = "::1";
2912 constexpr char listen_srv[] = "53";
2913 constexpr char dns64_name[] = "ipv4only.arpa.";
2914
2915 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2916 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2917 ASSERT_TRUE(dns.startServer());
2918
2919 const std::vector<std::string> servers = {listen_addr};
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002920 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams));
nuccachenf52f7a52018-07-17 18:07:23 +08002921 dns.clearQueries();
2922
2923 // Wait for detecting prefix to complete.
2924 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2925
2926 static const struct TestConfig {
2927 std::string name;
2928 std::string addr;
2929
2930 std::string asHostName() const {
2931 return StringPrintf("%s.example.com.",
2932 name.c_str());
2933 }
2934 } testConfigs[]{
2935 {THIS_NETWORK, ADDR_THIS_NETWORK},
2936 {LOOPBACK, ADDR_LOOPBACK},
2937 {LINK_LOCAL, ADDR_LINK_LOCAL},
2938 {MULTICAST, ADDR_MULTICAST},
2939 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2940 };
2941
2942 for (const auto& config : testConfigs) {
2943 const std::string testHostName = config.asHostName();
2944 SCOPED_TRACE(testHostName);
2945
2946 const char* host_name = testHostName.c_str();
2947 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2948
2949 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2950 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2951
2952 // In AF_INET6 case, don't synthesize special use IPv4 address.
2953 // Expect to have no answer
2954 EXPECT_EQ(nullptr, result);
2955
2956 dns.clearQueries();
2957 }
Bernie Innocenticd257642018-12-20 15:56:40 +09002958}