blob: 4be5f4826aa09ffeead0eec8c568185b7b5eaf38 [file] [log] [blame]
Bernie Innocenti443489e2018-08-10 14:27:23 +09001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless requied by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocentic165ce82018-10-16 23:35:28 +090018#define LOG_TAG "netd_test"
19
Bernie Innocenti443489e2018-08-10 14:27:23 +090020#include <arpa/inet.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080021#include <arpa/nameser.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090022#include <netdb.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080023#include <netinet/in.h>
24#include <poll.h> /* poll */
25#include <resolv.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090026#include <stdarg.h>
27#include <stdio.h>
28#include <stdlib.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080029#include <sys/socket.h>
30#include <sys/un.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090031#include <unistd.h>
32
33#include <algorithm>
34#include <chrono>
35#include <iterator>
36#include <numeric>
37#include <thread>
38
Bernie Innocenti443489e2018-08-10 14:27:23 +090039#include <android-base/stringprintf.h>
Luke Huang952d0942018-12-26 16:53:03 +080040#include <android/multinetwork.h> // ResNsendFlags
Bernie Innocenti0298c682018-10-02 23:18:11 +090041#include <cutils/sockets.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090042#include <gtest/gtest.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090043#include <openssl/base64.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090044#include <private/android_filesystem_config.h>
45#include <utils/Log.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090046
Bernie Innocenti443489e2018-08-10 14:27:23 +090047#include "NetdClient.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090048#include "netid_client.h" // NETID_UNSET
Bernie Innocentic165ce82018-10-16 23:35:28 +090049#include "netd_resolv/params.h" // MAX_NS
Bernie Innocenti443489e2018-08-10 14:27:23 +090050
Ken Chenc68c2de2018-11-13 21:51:13 +080051#include "dns_responder/dns_responder.h"
52#include "dns_responder/dns_responder_client.h"
53#include "dns_responder/dns_tls_frontend.h"
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090054
55#include "NetdConstants.h"
Bernie Innocenti443489e2018-08-10 14:27:23 +090056#include "ResolverStats.h"
57
58#include "android/net/INetd.h"
Bernie Innocenti443489e2018-08-10 14:27:23 +090059#include "binder/IServiceManager.h"
60#include "netdutils/SocketOption.h"
61
Bernie Innocentic165ce82018-10-16 23:35:28 +090062// TODO: make this dynamic and stop depending on implementation details.
Luke Huangc68f1b92018-11-21 20:13:38 +080063constexpr int TEST_NETID = 30;
64constexpr int MAXPACKET = (8 * 1024);
Bernie Innocentic165ce82018-10-16 23:35:28 +090065
66// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
67// Tested here for convenience.
68extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
69 const addrinfo* hints, unsigned netid, unsigned mark,
70 struct addrinfo** result);
71
Bernie Innocenti443489e2018-08-10 14:27:23 +090072using android::base::StringPrintf;
73using android::net::ResolverStats;
Bernie Innocenti443489e2018-08-10 14:27:23 +090074using android::netdutils::enableSockopt;
75
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090076// TODO: move into libnetdutils?
77namespace {
78ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
79 const struct addrinfo* hints) {
80 addrinfo* result = nullptr;
81 if (getaddrinfo(node, service, hints, &result) != 0) {
82 result = nullptr; // Should already be the case, but...
83 }
84 return ScopedAddrinfo(result);
85}
86} // namespace
87
Bernie Innocenti443489e2018-08-10 14:27:23 +090088// Emulates the behavior of UnorderedElementsAreArray, which currently cannot be used.
89// TODO: Use UnorderedElementsAreArray, which depends on being able to compile libgmock_host,
90// if that is not possible, improve this hacky algorithm, which is O(n**2)
91template <class A, class B>
92bool UnorderedCompareArray(const A& a, const B& b) {
93 if (a.size() != b.size()) return false;
94 for (const auto& a_elem : a) {
95 size_t a_count = 0;
96 for (const auto& a_elem2 : a) {
97 if (a_elem == a_elem2) {
98 ++a_count;
99 }
100 }
101 size_t b_count = 0;
102 for (const auto& b_elem : b) {
103 if (a_elem == b_elem) ++b_count;
104 }
105 if (a_count != b_count) return false;
106 }
107 return true;
108}
109
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900110class ResolverTest : public ::testing::Test {
Bernie Innocenti0298c682018-10-02 23:18:11 +0900111 protected:
Xiao Ma7c75f452018-12-11 17:56:32 +0900112 struct DnsRecord {
113 std::string host_name; // host name
114 ns_type type; // record type
115 std::string addr; // ipv4/v6 address
116 };
117
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900118 void SetUp() { mDnsClient.SetUp(); }
119 void TearDown() { mDnsClient.TearDown(); }
Bernie Innocenti443489e2018-08-10 14:27:23 +0900120
121 bool GetResolverInfo(std::vector<std::string>* servers, std::vector<std::string>* domains,
Mike Yuda77e8e2018-11-26 13:26:21 +0900122 std::vector<std::string>* tlsServers, __res_params* params,
Ken Chen2a429352018-12-22 21:46:55 +0800123 std::vector<ResolverStats>* stats,
124 int* wait_for_pending_req_timeout_count) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900125 using android::net::INetd;
126 std::vector<int32_t> params32;
127 std::vector<int32_t> stats32;
Ken Chen2a429352018-12-22 21:46:55 +0800128 std::vector<int32_t> wait_for_pending_req_timeout_count32{0};
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900129 auto rv = mDnsClient.netdService()->getResolverInfo(TEST_NETID, servers, domains,
Ken Chen2a429352018-12-22 21:46:55 +0800130 tlsServers, &params32, &stats32,
131 &wait_for_pending_req_timeout_count32);
132
Bernie Innocenti45238a12018-12-04 14:57:48 +0900133 if (!rv.isOk() || params32.size() != static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT)) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900134 return false;
135 }
136 *params = __res_params {
137 .sample_validity = static_cast<uint16_t>(
138 params32[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY]),
139 .success_threshold = static_cast<uint8_t>(
140 params32[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD]),
141 .min_samples = static_cast<uint8_t>(
142 params32[INetd::RESOLVER_PARAMS_MIN_SAMPLES]),
143 .max_samples = static_cast<uint8_t>(
144 params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES]),
145 .base_timeout_msec = params32[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
146 };
Ken Chen2a429352018-12-22 21:46:55 +0800147 *wait_for_pending_req_timeout_count = wait_for_pending_req_timeout_count32[0];
Bernie Innocenti443489e2018-08-10 14:27:23 +0900148 return ResolverStats::decodeAll(stats32, stats);
149 }
150
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900151 static std::string ToString(const hostent* he) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900152 if (he == nullptr) return "<null>";
153 char buffer[INET6_ADDRSTRLEN];
154 if (!inet_ntop(he->h_addrtype, he->h_addr_list[0], buffer, sizeof(buffer))) {
155 return "<invalid>";
156 }
157 return buffer;
158 }
159
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900160 static std::string ToString(const addrinfo* ai) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900161 if (!ai)
162 return "<null>";
163 for (const auto* aip = ai ; aip != nullptr ; aip = aip->ai_next) {
164 char host[NI_MAXHOST];
165 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
166 NI_NUMERICHOST);
167 if (rv != 0)
168 return gai_strerror(rv);
169 return host;
170 }
171 return "<invalid>";
172 }
173
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900174 static std::string ToString(const ScopedAddrinfo& ai) { return ToString(ai.get()); }
175
nuccachenf52f7a52018-07-17 18:07:23 +0800176 static std::vector<std::string> ToStrings(const addrinfo* ai) {
177 std::vector<std::string> hosts;
178 if (!ai) {
179 hosts.push_back("<null>");
180 return hosts;
181 }
182 for (const auto* aip = ai; aip != nullptr; aip = aip->ai_next) {
183 char host[NI_MAXHOST];
184 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
185 NI_NUMERICHOST);
186 if (rv != 0) {
187 hosts.clear();
188 hosts.push_back(gai_strerror(rv));
189 return hosts;
190 } else {
191 hosts.push_back(host);
192 }
193 }
194 if (hosts.empty()) hosts.push_back("<invalid>");
195 return hosts;
196 }
197
198 static std::vector<std::string> ToStrings(const ScopedAddrinfo& ai) {
199 return ToStrings(ai.get());
200 }
201
Bernie Innocenti443489e2018-08-10 14:27:23 +0900202 size_t GetNumQueries(const test::DNSResponder& dns, const char* name) const {
203 auto queries = dns.queries();
204 size_t found = 0;
205 for (const auto& p : queries) {
206 if (p.first == name) {
207 ++found;
208 }
209 }
210 return found;
211 }
212
213 size_t GetNumQueriesForType(const test::DNSResponder& dns, ns_type type,
Bernie Innocenti0298c682018-10-02 23:18:11 +0900214 const char* name) const {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900215 auto queries = dns.queries();
216 size_t found = 0;
217 for (const auto& p : queries) {
218 if (p.second == type && p.first == name) {
219 ++found;
220 }
221 }
222 return found;
223 }
224
nuccachenf52f7a52018-07-17 18:07:23 +0800225 bool WaitForPrefix64Detected(int netId, int timeoutMs) {
226 constexpr int intervalMs = 2;
227 const int limit = timeoutMs / intervalMs;
228 for (int count = 0; count <= limit; ++count) {
229 std::string prefix;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900230 auto rv = mDnsClient.netdService()->getPrefix64(netId, &prefix);
nuccachenf52f7a52018-07-17 18:07:23 +0800231 if (rv.isOk()) {
232 return true;
233 }
234 usleep(intervalMs * 1000);
235 }
236 return false;
237 }
238
Bernie Innocenti443489e2018-08-10 14:27:23 +0900239 void RunGetAddrInfoStressTest_Binder(unsigned num_hosts, unsigned num_threads,
240 unsigned num_queries) {
241 std::vector<std::string> domains = { "example.com" };
242 std::vector<std::unique_ptr<test::DNSResponder>> dns;
243 std::vector<std::string> servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900244 std::vector<DnsResponderClient::DnsResponderClient::Mapping> mappings;
245 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(num_hosts, domains, &mappings));
246 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS, mappings, &dns, &servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900247
Xiao Ma7c75f452018-12-11 17:56:32 +0900248 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900249
250 auto t0 = std::chrono::steady_clock::now();
251 std::vector<std::thread> threads(num_threads);
252 for (std::thread& thread : threads) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900253 thread = std::thread([&mappings, num_queries]() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900254 for (unsigned i = 0 ; i < num_queries ; ++i) {
255 uint32_t ofs = arc4random_uniform(mappings.size());
256 auto& mapping = mappings[ofs];
257 addrinfo* result = nullptr;
258 int rv = getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result);
259 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
260 if (rv == 0) {
261 std::string result_str = ToString(result);
262 EXPECT_TRUE(result_str == mapping.ip4 || result_str == mapping.ip6)
263 << "result='" << result_str << "', ip4='" << mapping.ip4
264 << "', ip6='" << mapping.ip6;
265 }
266 if (result) {
267 freeaddrinfo(result);
268 result = nullptr;
269 }
270 }
271 });
272 }
273
274 for (std::thread& thread : threads) {
275 thread.join();
276 }
277 auto t1 = std::chrono::steady_clock::now();
278 ALOGI("%u hosts, %u threads, %u queries, %Es", num_hosts, num_threads, num_queries,
279 std::chrono::duration<double>(t1 - t0).count());
Ken Chen2a429352018-12-22 21:46:55 +0800280
281 std::vector<std::string> res_servers;
282 std::vector<std::string> res_domains;
283 std::vector<std::string> res_tls_servers;
284 __res_params res_params;
285 std::vector<ResolverStats> res_stats;
286 int wait_for_pending_req_timeout_count;
287 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
288 &res_stats, &wait_for_pending_req_timeout_count));
289 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
290
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900291 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900292 }
293
Xiao Ma7c75f452018-12-11 17:56:32 +0900294 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
295 for (const auto& r : records) {
296 dns.addMapping(r.host_name, r.type, r.addr);
297 }
298
299 ASSERT_TRUE(dns.startServer());
300 dns.clearQueries();
301 }
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900302
303 DnsResponderClient mDnsClient;
Xiao Ma7c75f452018-12-11 17:56:32 +0900304
305 static constexpr char kLocalHost[] = "localhost";
306 static constexpr char kLocalHostAddr[] = "127.0.0.1";
307 static constexpr char kIp6LocalHost[] = "ip6-localhost";
308 static constexpr char kIp6LocalHostAddr[] = "::1";
309 static constexpr char kHelloExampleCom[] = "hello.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900310};
311
312TEST_F(ResolverTest, GetHostByName) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900313 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
314
315 test::DNSResponder dns;
316 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
317 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900318
319 const hostent* result;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900320 result = gethostbyname("nonexistent");
321 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
322 ASSERT_TRUE(result == nullptr);
323 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
324
325 dns.clearQueries();
326 result = gethostbyname("hello");
Xiao Ma7c75f452018-12-11 17:56:32 +0900327 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900328 ASSERT_FALSE(result == nullptr);
329 ASSERT_EQ(4, result->h_length);
330 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
331 EXPECT_EQ("1.2.3.3", ToString(result));
332 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900333}
334
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900335TEST_F(ResolverTest, GetHostByName_localhost) {
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900336 constexpr char name_camelcase[] = "LocalHost";
Bernie Innocenti0298c682018-10-02 23:18:11 +0900337 constexpr char name_ip6_dot[] = "ip6-localhost.";
338 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900339
Bernie Innocenti974233e2018-09-04 20:35:34 +0900340 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma7c75f452018-12-11 17:56:32 +0900341 test::DNSResponder dns;
342 StartDns(dns, {});
343 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900344
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900345 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma7c75f452018-12-11 17:56:32 +0900346 const hostent* result = gethostbyname(kLocalHost);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900347 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900348 ASSERT_FALSE(result == nullptr);
349 ASSERT_EQ(4, result->h_length);
350 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma7c75f452018-12-11 17:56:32 +0900351 EXPECT_EQ(kLocalHostAddr, ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900352 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
353
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900354 // Ensure the hosts file resolver ignores case of hostnames
355 result = gethostbyname(name_camelcase);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900356 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900357 ASSERT_FALSE(result == nullptr);
358 ASSERT_EQ(4, result->h_length);
359 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma7c75f452018-12-11 17:56:32 +0900360 EXPECT_EQ(kLocalHostAddr, ToString(result));
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900361 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
362
363 // The hosts file also contains ip6-localhost, but gethostbyname() won't
Bernie Innocenti0298c682018-10-02 23:18:11 +0900364 // return it unless the RES_USE_INET6 option is set. This would be easy to
365 // change, but there's no point in changing the legacy behavior; new code
366 // should be calling getaddrinfo() anyway.
367 // So we check the legacy behavior, which results in amusing A-record
368 // lookups for ip6-localhost, with and without search domains appended.
369 dns.clearQueries();
Xiao Ma7c75f452018-12-11 17:56:32 +0900370 result = gethostbyname(kIp6LocalHost);
Sehee Park8659b8d2018-11-16 10:53:16 +0900371 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
372 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
373 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900374 ASSERT_TRUE(result == nullptr);
375
Bernie Innocenti0298c682018-10-02 23:18:11 +0900376 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
377 // the hosts file.
378 dns.clearQueries();
Xiao Ma7c75f452018-12-11 17:56:32 +0900379 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900380 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900381 ASSERT_FALSE(result == nullptr);
382 ASSERT_EQ(16, result->h_length);
383 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma7c75f452018-12-11 17:56:32 +0900384 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900385 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900386}
387
Bernie Innocentic1545232018-10-04 17:12:24 +0900388TEST_F(ResolverTest, GetHostByName_numeric) {
389 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma7c75f452018-12-11 17:56:32 +0900390 test::DNSResponder dns;
391 StartDns(dns, {});
392 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocentic1545232018-10-04 17:12:24 +0900393
394 // Numeric v4 address: expect no DNS queries
395 constexpr char numeric_v4[] = "192.168.0.1";
Bernie Innocentic1545232018-10-04 17:12:24 +0900396 const hostent* result = gethostbyname(numeric_v4);
Sehee Park8659b8d2018-11-16 10:53:16 +0900397 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900398 ASSERT_FALSE(result == nullptr);
399 ASSERT_EQ(4, result->h_length); // v4
400 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
401 EXPECT_EQ(numeric_v4, ToString(result));
402 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
403
404 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
405 constexpr char numeric_v6[] = "2001:db8::42";
406 dns.clearQueries();
407 result = gethostbyname(numeric_v6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900408 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900409 EXPECT_TRUE(result == nullptr);
410
411 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
412 dns.clearQueries();
413 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900414 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900415 ASSERT_FALSE(result == nullptr);
416 ASSERT_EQ(16, result->h_length); // v6
417 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
418 EXPECT_EQ(numeric_v6, ToString(result));
419 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
420
421 // Numeric v6 address with scope work with getaddrinfo(),
422 // but gethostbyname2() does not understand them; it issues two dns
423 // queries, then fails. This hardly ever happens, there's no point
424 // in fixing this. This test simply verifies the current (bogus)
425 // behavior to avoid further regressions (like crashes, or leaks).
426 constexpr char numeric_v6_scope[] = "fe80::1%lo";
427 dns.clearQueries();
428 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900429 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Bernie Innocentic1545232018-10-04 17:12:24 +0900430 ASSERT_TRUE(result == nullptr);
Bernie Innocentic1545232018-10-04 17:12:24 +0900431}
432
Bernie Innocenti443489e2018-08-10 14:27:23 +0900433TEST_F(ResolverTest, BinderSerialization) {
434 using android::net::INetd;
435 std::vector<int> params_offsets = {
436 INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY,
437 INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
438 INetd::RESOLVER_PARAMS_MIN_SAMPLES,
439 INetd::RESOLVER_PARAMS_MAX_SAMPLES,
440 INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
441 };
Bernie Innocenti45238a12018-12-04 14:57:48 +0900442 const int size = static_cast<int>(params_offsets.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900443 EXPECT_EQ(size, INetd::RESOLVER_PARAMS_COUNT);
444 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900445 for (int i = 0; i < size; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900446 EXPECT_EQ(params_offsets[i], i);
447 }
448}
449
450TEST_F(ResolverTest, GetHostByName_Binder) {
451 using android::net::INetd;
452
453 std::vector<std::string> domains = { "example.com" };
454 std::vector<std::unique_ptr<test::DNSResponder>> dns;
455 std::vector<std::string> servers;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900456 std::vector<DnsResponderClient::Mapping> mappings;
457 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
458 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900459 ASSERT_EQ(1U, mappings.size());
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900460 const DnsResponderClient::Mapping& mapping = mappings[0];
Bernie Innocenti443489e2018-08-10 14:27:23 +0900461
Xiao Ma7c75f452018-12-11 17:56:32 +0900462 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900463
464 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900465 const size_t total_queries =
466 std::accumulate(dns.begin(), dns.end(), 0, [this, &mapping](size_t total, auto& d) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900467 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
468 });
469
470 EXPECT_LE(1U, total_queries);
471 ASSERT_FALSE(result == nullptr);
472 ASSERT_EQ(4, result->h_length);
473 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
474 EXPECT_EQ(mapping.ip4, ToString(result));
475 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
476
477 std::vector<std::string> res_servers;
478 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900479 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900480 __res_params res_params;
481 std::vector<ResolverStats> res_stats;
Ken Chen2a429352018-12-22 21:46:55 +0800482 int wait_for_pending_req_timeout_count;
483 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
484 &res_stats, &wait_for_pending_req_timeout_count));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900485 EXPECT_EQ(servers.size(), res_servers.size());
486 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900487 EXPECT_EQ(0U, res_tls_servers.size());
Xiao Ma7c75f452018-12-11 17:56:32 +0900488 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
489 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY], res_params.sample_validity);
490 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900491 res_params.success_threshold);
Xiao Ma7c75f452018-12-11 17:56:32 +0900492 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
493 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
494 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Bernie Innocenti443489e2018-08-10 14:27:23 +0900495 res_params.base_timeout_msec);
496 EXPECT_EQ(servers.size(), res_stats.size());
497
498 EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
499 EXPECT_TRUE(UnorderedCompareArray(res_domains, domains));
500
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900501 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900502}
503
504TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900505 constexpr char listen_addr[] = "127.0.0.4";
506 constexpr char listen_addr2[] = "127.0.0.5";
507 constexpr char host_name[] = "howdy.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900508
Xiao Ma7c75f452018-12-11 17:56:32 +0900509 const std::vector<DnsRecord> records = {
510 {host_name, ns_type::ns_t_a, "1.2.3.4"},
511 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
512 };
513 test::DNSResponder dns(listen_addr);
514 test::DNSResponder dns2(listen_addr2);
515 StartDns(dns, records);
516 StartDns(dns2, records);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900517
Xiao Ma7c75f452018-12-11 17:56:32 +0900518 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900519 dns.clearQueries();
520 dns2.clearQueries();
521
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900522 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
523 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900524 size_t found = GetNumQueries(dns, host_name);
525 EXPECT_LE(1U, found);
526 // Could be A or AAAA
527 std::string result_str = ToString(result);
528 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
529 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900530
531 // Verify that the name is cached.
532 size_t old_found = found;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900533 result = safe_getaddrinfo("howdy", nullptr, nullptr);
534 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900535 found = GetNumQueries(dns, host_name);
536 EXPECT_LE(1U, found);
537 EXPECT_EQ(old_found, found);
538 result_str = ToString(result);
539 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
540 << result_str;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900541
542 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma7c75f452018-12-11 17:56:32 +0900543 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
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
560TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900561 test::DNSResponder dns;
562 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
563 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900564
Xiao Ma7c75f452018-12-11 17:56:32 +0900565 const addrinfo hints = {.ai_family = AF_INET};
566 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900567 EXPECT_TRUE(result != nullptr);
Xiao Ma7c75f452018-12-11 17:56:32 +0900568 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900569 EXPECT_EQ("1.2.3.5", ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900570}
571
572TEST_F(ResolverTest, GetAddrInfo_localhost) {
Bernie Innocenti974233e2018-09-04 20:35:34 +0900573 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma7c75f452018-12-11 17:56:32 +0900574 test::DNSResponder dns;
575 StartDns(dns, {});
576 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900577
Xiao Ma7c75f452018-12-11 17:56:32 +0900578 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900579 EXPECT_TRUE(result != nullptr);
580 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti0298c682018-10-02 23:18:11 +0900581 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma7c75f452018-12-11 17:56:32 +0900582 EXPECT_EQ(kLocalHostAddr, ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900583
Xiao Ma7c75f452018-12-11 17:56:32 +0900584 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900585 EXPECT_TRUE(result != nullptr);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900586 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
587 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma7c75f452018-12-11 17:56:32 +0900588 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900589}
590
Ken Chen2a429352018-12-22 21:46:55 +0800591// Verify if the resolver correctly handle multiple queries simultaneously
592// step 1: set dns server#1 into deferred responding mode.
593// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
594// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
595// response of previous pending query sent by thread#1.
596// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
597// respond to resolver immediately.
598// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
599// step 6: resume dns server#1 to respond dns query in step#2.
600// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
601// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
602// before signaled by thread#1.
603TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
604 const char* listen_addr1 = "127.0.0.9";
605 const char* listen_addr2 = "127.0.0.10";
606 const char* listen_addr3 = "127.0.0.11";
607 const char* listen_srv = "53";
608 const char* host_name_deferred = "hello.example.com.";
609 const char* host_name_normal = "konbanha.example.com.";
610 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
611 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
612 test::DNSResponder dns3(listen_addr3, listen_srv, 250, ns_rcode::ns_r_servfail);
613 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
614 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
615 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
616 ASSERT_TRUE(dns1.startServer());
617 ASSERT_TRUE(dns2.startServer());
618 ASSERT_TRUE(dns3.startServer());
619 const std::vector<std::string> servers_for_t1 = {listen_addr1};
620 const std::vector<std::string> servers_for_t2 = {listen_addr2};
621 const std::vector<std::string> servers_for_t3 = {listen_addr3};
622 addrinfo hints = {.ai_family = AF_INET};
623 const std::vector<int> params = {300, 25, 8, 8, 5000};
624 bool t3_task_done = false;
625
626 dns1.setDeferredResp(true);
627 std::thread t1([&, this]() {
628 ASSERT_TRUE(
629 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
630 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
631 // t3's dns query should got returned first
632 EXPECT_TRUE(t3_task_done);
633 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
634 EXPECT_TRUE(result != nullptr);
635 EXPECT_EQ("1.2.3.4", ToString(result));
636 });
637
638 // ensuring t1 and t2 handler functions are processed in order
639 usleep(100 * 1000);
640 std::thread t2([&, this]() {
641 ASSERT_TRUE(
642 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
643 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
644 EXPECT_TRUE(t3_task_done);
645 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
646 EXPECT_TRUE(result != nullptr);
647 EXPECT_EQ("1.2.3.4", ToString(result));
648
649 std::vector<std::string> res_servers;
650 std::vector<std::string> res_domains;
651 std::vector<std::string> res_tls_servers;
652 __res_params res_params;
653 std::vector<ResolverStats> res_stats;
654 int wait_for_pending_req_timeout_count;
655 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
656 &res_stats, &wait_for_pending_req_timeout_count));
657 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
658 });
659
660 // ensuring t2 and t3 handler functions are processed in order
661 usleep(100 * 1000);
662 std::thread t3([&, this]() {
663 ASSERT_TRUE(
664 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
665 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
666 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
667 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
668 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
669 EXPECT_TRUE(result != nullptr);
670 EXPECT_EQ("1.2.3.5", ToString(result));
671
672 t3_task_done = true;
673 dns1.setDeferredResp(false);
674 });
675 t3.join();
676 t1.join();
677 t2.join();
678}
679
Bernie Innocenti443489e2018-08-10 14:27:23 +0900680TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900681 constexpr char host_name[] = "nihao.example2.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900682 std::vector<std::string> searchDomains = { "example1.com", "example2.com", "example3.com" };
Bernie Innocenti443489e2018-08-10 14:27:23 +0900683
Xiao Ma7c75f452018-12-11 17:56:32 +0900684 test::DNSResponder dns("127.0.0.6");
685 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
686 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
687
Bernie Innocenti443489e2018-08-10 14:27:23 +0900688 const hostent* result = gethostbyname("nihao");
Xiao Ma7c75f452018-12-11 17:56:32 +0900689
Bernie Innocenti443489e2018-08-10 14:27:23 +0900690 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
691 ASSERT_FALSE(result == nullptr);
692 ASSERT_EQ(4, result->h_length);
693 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
694 EXPECT_EQ("1.2.3.3", ToString(result));
695 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
696 dns.stopServer();
697}
698
Bernie Innocenti974233e2018-09-04 20:35:34 +0900699TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Bernie Innocenti974233e2018-09-04 20:35:34 +0900700 constexpr char host_name[] = "ohayou.example.com.";
701 constexpr char numeric_addr[] = "fe80::1%lo";
702
Xiao Ma7c75f452018-12-11 17:56:32 +0900703 test::DNSResponder dns;
Bernie Innocenti974233e2018-09-04 20:35:34 +0900704 dns.setResponseProbability(0.0);
Xiao Ma7c75f452018-12-11 17:56:32 +0900705 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
706 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti974233e2018-09-04 20:35:34 +0900707
708 addrinfo hints = {.ai_family = AF_INET6};
709 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
710 EXPECT_TRUE(result != nullptr);
711 EXPECT_EQ(numeric_addr, ToString(result));
712 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
713
714 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
715 // We should fail without sending out a DNS query.
716 hints.ai_flags |= AI_NUMERICHOST;
717 result = safe_getaddrinfo(host_name, nullptr, &hints);
718 EXPECT_TRUE(result == nullptr);
719 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
720}
721
Bernie Innocenti443489e2018-08-10 14:27:23 +0900722TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900723 constexpr char listen_addr0[] = "127.0.0.7";
724 constexpr char listen_addr1[] = "127.0.0.8";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900725 const char* host_name = "ohayou.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +0900726
727 test::DNSResponder dns0(listen_addr0);
728 test::DNSResponder dns1(listen_addr1);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900729 dns0.setResponseProbability(0.0);
Xiao Ma7c75f452018-12-11 17:56:32 +0900730 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
731 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
732
Bernie Innocenti443489e2018-08-10 14:27:23 +0900733 std::vector<std::string> servers = { listen_addr0, listen_addr1 };
734 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
735 int sample_count = 8;
736 const std::vector<int> params = { 300, 25, sample_count, sample_count };
Xiao Ma7c75f452018-12-11 17:56:32 +0900737 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900738
739 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
740 // reached the dns0, which is set to fail. No more requests should then arrive at that server
741 // for the next sample_lifetime seconds.
742 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma7c75f452018-12-11 17:56:32 +0900743 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti45238a12018-12-04 14:57:48 +0900744 for (int i = 0; i < sample_count; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900745 std::string domain = StringPrintf("nonexistent%d", i);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900746 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900747 }
748 // Due to 100% errors for all possible samples, the server should be ignored from now on and
749 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
750 dns0.clearQueries();
751 dns1.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900752 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
753 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900754 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
755 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900756}
757
758TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900759 constexpr char listen_addr0[] = "127.0.0.7";
760 constexpr char listen_addr1[] = "127.0.0.8";
761 constexpr char listen_srv[] = "53";
762 constexpr char host_name1[] = "ohayou.example.com.";
763 constexpr char host_name2[] = "ciao.example.com.";
764 const std::vector<DnsRecord> records0 = {
765 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
766 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
767 };
768 const std::vector<DnsRecord> records1 = {
769 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
770 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
771 };
Bernie Innocenti443489e2018-08-10 14:27:23 +0900772
773 // dns0 does not respond with 100% probability, while
774 // dns1 responds normally, at least initially.
775 test::DNSResponder dns0(listen_addr0, listen_srv, 250, static_cast<ns_rcode>(-1));
776 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
777 dns0.setResponseProbability(0.0);
Xiao Ma7c75f452018-12-11 17:56:32 +0900778 StartDns(dns0, records0);
779 StartDns(dns1, records1);
780 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900781
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900782 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900783
784 // dns0 will ignore the request, and we'll fallback to dns1 after the first
785 // retry.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900786 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
787 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900788 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
789 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
790
791 // Now make dns1 also ignore 100% requests... The resolve should alternate
792 // retries between the nameservers and fail after 4 attempts.
793 dns1.setResponseProbability(0.0);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900794 addrinfo* result2 = nullptr;
795 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
796 EXPECT_EQ(nullptr, result2);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900797 EXPECT_EQ(4U, GetNumQueries(dns0, host_name2));
798 EXPECT_EQ(4U, GetNumQueries(dns1, host_name2));
799}
800
801TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900802 constexpr char listen_addr0[] = "127.0.0.9";
803 constexpr char listen_addr1[] = "127.0.0.10";
804 constexpr char listen_addr2[] = "127.0.0.11";
805 constexpr char host_name[] = "konbanha.example.com.";
806
807 test::DNSResponder dns0(listen_addr0);
808 test::DNSResponder dns1(listen_addr1);
809 test::DNSResponder dns2(listen_addr2);
810 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
811 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
812 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
813
Bernie Innocenti443489e2018-08-10 14:27:23 +0900814 const std::vector<std::string> servers = { listen_addr0, listen_addr1, listen_addr2 };
815 std::vector<std::thread> threads(10);
816 for (std::thread& thread : threads) {
817 thread = std::thread([this, &servers]() {
818 unsigned delay = arc4random_uniform(1*1000*1000); // <= 1s
819 usleep(delay);
820 std::vector<std::string> serverSubset;
821 for (const auto& server : servers) {
822 if (arc4random_uniform(2)) {
823 serverSubset.push_back(server);
824 }
825 }
826 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma7c75f452018-12-11 17:56:32 +0900827 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
828 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900829 addrinfo* result = nullptr;
830 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
831 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
832 if (result) {
833 freeaddrinfo(result);
834 result = nullptr;
835 }
836 });
837 }
838 for (std::thread& thread : threads) {
839 thread.join();
840 }
Ken Chen2a429352018-12-22 21:46:55 +0800841
842 std::vector<std::string> res_servers;
843 std::vector<std::string> res_domains;
844 std::vector<std::string> res_tls_servers;
845 __res_params res_params;
846 std::vector<ResolverStats> res_stats;
847 int wait_for_pending_req_timeout_count;
848 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
849 &res_stats, &wait_for_pending_req_timeout_count));
850 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900851}
852
853TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100) {
854 const unsigned num_hosts = 100;
855 const unsigned num_threads = 100;
856 const unsigned num_queries = 100;
857 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
858}
859
860TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100000) {
861 const unsigned num_hosts = 100000;
862 const unsigned num_threads = 100;
863 const unsigned num_queries = 100;
864 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
865}
866
867TEST_F(ResolverTest, EmptySetup) {
868 using android::net::INetd;
869 std::vector<std::string> servers;
870 std::vector<std::string> domains;
Xiao Ma7c75f452018-12-11 17:56:32 +0900871 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900872 std::vector<std::string> res_servers;
873 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900874 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900875 __res_params res_params;
876 std::vector<ResolverStats> res_stats;
Ken Chen2a429352018-12-22 21:46:55 +0800877 int wait_for_pending_req_timeout_count;
878 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
879 &res_stats, &wait_for_pending_req_timeout_count));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900880 EXPECT_EQ(0U, res_servers.size());
881 EXPECT_EQ(0U, res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900882 EXPECT_EQ(0U, res_tls_servers.size());
Xiao Ma7c75f452018-12-11 17:56:32 +0900883 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
884 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY], res_params.sample_validity);
885 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900886 res_params.success_threshold);
Xiao Ma7c75f452018-12-11 17:56:32 +0900887 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
888 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
889 EXPECT_EQ(kDefaultParams[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Bernie Innocenti443489e2018-08-10 14:27:23 +0900890 res_params.base_timeout_msec);
891}
892
893TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900894 constexpr char listen_addr[] = "127.0.0.13";
895 constexpr char host_name1[] = "test13.domain1.org.";
896 constexpr char host_name2[] = "test13.domain2.org.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900897 std::vector<std::string> servers = { listen_addr };
898 std::vector<std::string> domains = { "domain1.org" };
Xiao Ma7c75f452018-12-11 17:56:32 +0900899
900 const std::vector<DnsRecord> records = {
901 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
902 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
903 };
904 test::DNSResponder dns(listen_addr);
905 StartDns(dns, records);
906 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900907
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900908 const addrinfo hints = {.ai_family = AF_INET6};
909 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
910 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900911 EXPECT_EQ(1U, dns.queries().size());
912 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
913 EXPECT_EQ("2001:db8::13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900914
915 // Test that changing the domain search path on its own works.
916 domains = { "domain2.org" };
Xiao Ma7c75f452018-12-11 17:56:32 +0900917 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900918 dns.clearQueries();
919
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900920 result = safe_getaddrinfo("test13", nullptr, &hints);
921 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900922 EXPECT_EQ(1U, dns.queries().size());
923 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
924 EXPECT_EQ("2001:db8::1:13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900925}
926
Bernie Innocenti443489e2018-08-10 14:27:23 +0900927static std::string base64Encode(const std::vector<uint8_t>& input) {
928 size_t out_len;
929 EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));
930 // out_len includes the trailing NULL.
931 uint8_t output_bytes[out_len];
932 EXPECT_EQ(out_len - 1, EVP_EncodeBlock(output_bytes, input.data(), input.size()));
933 return std::string(reinterpret_cast<char*>(output_bytes));
934}
935
Mike Yuda77e8e2018-11-26 13:26:21 +0900936// If we move this function to dns_responder_client, it will complicate the dependency need of
937// dns_tls_frontend.h.
938static void setupTlsServers(const std::vector<std::string>& servers,
939 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls,
940 std::vector<std::string>* fingerprints) {
Xiao Ma7c75f452018-12-11 17:56:32 +0900941 constexpr char listen_udp[] = "53";
942 constexpr char listen_tls[] = "853";
Mike Yuda77e8e2018-11-26 13:26:21 +0900943
944 for (const auto& server : servers) {
945 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
946 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
947 t->startServer();
948 fingerprints->push_back(base64Encode(t->fingerprint()));
949 tls->push_back(std::move(t));
950 }
951}
952
953static void shutdownTlsServers(std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
954 for (const auto& t : *tls) {
955 t->stopServer();
956 }
957 tls->clear();
958}
959
960TEST_F(ResolverTest, MaxServerPrune_Binder) {
961 using android::net::INetd;
962
963 std::vector<std::string> domains;
964 std::vector<std::unique_ptr<test::DNSResponder>> dns;
965 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
966 std::vector<std::string> servers;
967 std::vector<std::string> fingerprints;
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900968 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yuda77e8e2018-11-26 13:26:21 +0900969
970 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
971 domains.push_back(StringPrintf("example%u.com", i));
972 }
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900973 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
974 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
Mike Yuda77e8e2018-11-26 13:26:21 +0900975 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls, &fingerprints));
976
Xiao Ma7c75f452018-12-11 17:56:32 +0900977 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams, "", fingerprints));
Mike Yuda77e8e2018-11-26 13:26:21 +0900978
979 std::vector<std::string> res_servers;
980 std::vector<std::string> res_domains;
981 std::vector<std::string> res_tls_servers;
982 __res_params res_params;
983 std::vector<ResolverStats> res_stats;
Ken Chen2a429352018-12-22 21:46:55 +0800984 int wait_for_pending_req_timeout_count;
985 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
986 &res_stats, &wait_for_pending_req_timeout_count));
Mike Yuda77e8e2018-11-26 13:26:21 +0900987
988 // Check the size of the stats and its contents.
989 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
990 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
991 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
992 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
993 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
994 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
995
Bernie Innocenti3e411a32019-01-17 21:28:24 +0900996 ASSERT_NO_FATAL_FAILURE(mDnsClient.ShutdownDNSServers(&dns));
Mike Yuda77e8e2018-11-26 13:26:21 +0900997 ASSERT_NO_FATAL_FAILURE(shutdownTlsServers(&tls));
998}
999
1000TEST_F(ResolverTest, ResolverStats) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001001 constexpr char listen_addr1[] = "127.0.0.4";
1002 constexpr char listen_addr2[] = "127.0.0.5";
1003 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yuda77e8e2018-11-26 13:26:21 +09001004
1005 // Set server 1 timeout.
Xiao Ma7c75f452018-12-11 17:56:32 +09001006 test::DNSResponder dns1(listen_addr1, "53", 250, static_cast<ns_rcode>(-1));
Mike Yuda77e8e2018-11-26 13:26:21 +09001007 dns1.setResponseProbability(0.0);
1008 ASSERT_TRUE(dns1.startServer());
1009
1010 // Set server 2 responding server failure.
Xiao Ma7c75f452018-12-11 17:56:32 +09001011 test::DNSResponder dns2(listen_addr2);
Mike Yuda77e8e2018-11-26 13:26:21 +09001012 dns2.setResponseProbability(0.0);
1013 ASSERT_TRUE(dns2.startServer());
1014
1015 // Set server 3 workable.
Xiao Ma7c75f452018-12-11 17:56:32 +09001016 test::DNSResponder dns3(listen_addr3);
1017 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yuda77e8e2018-11-26 13:26:21 +09001018 ASSERT_TRUE(dns3.startServer());
1019
1020 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma7c75f452018-12-11 17:56:32 +09001021 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yuda77e8e2018-11-26 13:26:21 +09001022
1023 dns3.clearQueries();
Xiao Ma7c75f452018-12-11 17:56:32 +09001024 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yuda77e8e2018-11-26 13:26:21 +09001025 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma7c75f452018-12-11 17:56:32 +09001026 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yuda77e8e2018-11-26 13:26:21 +09001027 EXPECT_LE(1U, found);
1028 std::string result_str = ToString(result);
1029 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1030
1031 std::vector<std::string> res_servers;
1032 std::vector<std::string> res_domains;
1033 std::vector<std::string> res_tls_servers;
1034 __res_params res_params;
1035 std::vector<ResolverStats> res_stats;
Ken Chen2a429352018-12-22 21:46:55 +08001036 int wait_for_pending_req_timeout_count;
1037 ASSERT_TRUE(GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params,
1038 &res_stats, &wait_for_pending_req_timeout_count));
Mike Yuda77e8e2018-11-26 13:26:21 +09001039
1040 EXPECT_EQ(1, res_stats[0].timeouts);
1041 EXPECT_EQ(1, res_stats[1].errors);
1042 EXPECT_EQ(1, res_stats[2].successes);
Mike Yuda77e8e2018-11-26 13:26:21 +09001043}
1044
Bernie Innocenti443489e2018-08-10 14:27:23 +09001045// Test what happens if the specified TLS server is nonexistent.
1046TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001047 constexpr char listen_addr[] = "127.0.0.3";
1048 constexpr char host_name[] = "tlsmissing.example.com.";
1049
1050 test::DNSResponder dns;
1051 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Bernie Innocenti443489e2018-08-10 14:27:23 +09001052 std::vector<std::string> servers = { listen_addr };
1053
1054 // There's nothing listening on this address, so validation will either fail or
1055 /// hang. Either way, queries will continue to flow to the DNSResponder.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001056 ASSERT_TRUE(
Xiao Ma7c75f452018-12-11 17:56:32 +09001057 mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001058
1059 const hostent* result;
1060
1061 result = gethostbyname("tlsmissing");
1062 ASSERT_FALSE(result == nullptr);
1063 EXPECT_EQ("1.2.3.3", ToString(result));
1064
1065 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001066 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001067}
1068
1069// Test what happens if the specified TLS server replies with garbage.
1070TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001071 constexpr char listen_addr[] = "127.0.0.3";
1072 constexpr char host_name1[] = "tlsbroken1.example.com.";
1073 constexpr char host_name2[] = "tlsbroken2.example.com.";
1074 const std::vector<DnsRecord> records = {
1075 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1076 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1077 };
1078
1079 test::DNSResponder dns;
1080 StartDns(dns, records);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001081 std::vector<std::string> servers = { listen_addr };
1082
1083 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1084 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1085 ASSERT_TRUE(s >= 0);
1086 struct sockaddr_in tlsServer = {
1087 .sin_family = AF_INET,
1088 .sin_port = htons(853),
1089 };
1090 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
Bernie Innocenti6f9fd902018-10-11 20:50:23 +09001091 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1092 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001093 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1094 ASSERT_FALSE(listen(s, 1));
1095
1096 // Trigger TLS validation.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001097 ASSERT_TRUE(
Xiao Ma7c75f452018-12-11 17:56:32 +09001098 mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001099
1100 struct sockaddr_storage cliaddr;
1101 socklen_t sin_size = sizeof(cliaddr);
1102 int new_fd = accept4(s, reinterpret_cast<struct sockaddr *>(&cliaddr), &sin_size, SOCK_CLOEXEC);
1103 ASSERT_TRUE(new_fd > 0);
1104
1105 // We've received the new file descriptor but not written to it or closed, so the
1106 // validation is still pending. Queries should still flow correctly because the
1107 // server is not used until validation succeeds.
1108 const hostent* result;
1109 result = gethostbyname("tlsbroken1");
1110 ASSERT_FALSE(result == nullptr);
1111 EXPECT_EQ("1.2.3.1", ToString(result));
1112
1113 // Now we cause the validation to fail.
1114 std::string garbage = "definitely not a valid TLS ServerHello";
1115 write(new_fd, garbage.data(), garbage.size());
1116 close(new_fd);
1117
1118 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1119 // to the TLS server unless validation succeeds.
1120 result = gethostbyname("tlsbroken2");
1121 ASSERT_FALSE(result == nullptr);
1122 EXPECT_EQ("1.2.3.2", ToString(result));
1123
1124 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001125 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001126 close(s);
1127}
1128
1129TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001130 constexpr char listen_addr[] = "127.0.0.3";
1131 constexpr char listen_udp[] = "53";
1132 constexpr char listen_tls[] = "853";
1133 constexpr char host_name1[] = "tls1.example.com.";
1134 constexpr char host_name2[] = "tls2.example.com.";
1135 constexpr char host_name3[] = "tls3.example.com.";
1136 const std::vector<DnsRecord> records = {
1137 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1138 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1139 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1140 };
1141
1142 test::DNSResponder dns;
1143 StartDns(dns, records);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001144 std::vector<std::string> servers = { listen_addr };
1145
1146 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1147 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001148 ASSERT_TRUE(
Xiao Ma7c75f452018-12-11 17:56:32 +09001149 mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001150
1151 const hostent* result;
1152
1153 // Wait for validation to complete.
1154 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1155
1156 result = gethostbyname("tls1");
1157 ASSERT_FALSE(result == nullptr);
1158 EXPECT_EQ("1.2.3.1", ToString(result));
1159
1160 // Wait for query to get counted.
1161 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1162
1163 // Stop the TLS server. Since we're in opportunistic mode, queries will
1164 // fall back to the locally-assigned (clear text) nameservers.
1165 tls.stopServer();
1166
1167 dns.clearQueries();
1168 result = gethostbyname("tls2");
1169 EXPECT_FALSE(result == nullptr);
1170 EXPECT_EQ("1.2.3.2", ToString(result));
1171 const auto queries = dns.queries();
1172 EXPECT_EQ(1U, queries.size());
1173 EXPECT_EQ("tls2.example.com.", queries[0].first);
1174 EXPECT_EQ(ns_t_a, queries[0].second);
1175
1176 // Reset the resolvers without enabling TLS. Queries should still be routed
1177 // to the UDP endpoint.
Xiao Ma7c75f452018-12-11 17:56:32 +09001178 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001179
1180 result = gethostbyname("tls3");
1181 ASSERT_FALSE(result == nullptr);
1182 EXPECT_EQ("1.2.3.3", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001183}
1184
1185TEST_F(ResolverTest, GetHostByName_TlsFingerprint) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001186 constexpr char listen_addr[] = "127.0.0.3";
1187 constexpr char listen_udp[] = "53";
1188 constexpr char listen_tls[] = "853";
1189 test::DNSResponder dns;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001190 ASSERT_TRUE(dns.startServer());
1191 for (int chain_length = 1; chain_length <= 3; ++chain_length) {
Bernie Innocentif2572392018-10-02 19:04:56 +09001192 std::string host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001193 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1194 std::vector<std::string> servers = { listen_addr };
1195
1196 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1197 tls.set_chain_length(chain_length);
1198 ASSERT_TRUE(tls.startServer());
Xiao Ma7c75f452018-12-11 17:56:32 +09001199 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001200 "", {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001201
1202 const hostent* result;
1203
1204 // Wait for validation to complete.
1205 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1206
1207 result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
1208 EXPECT_FALSE(result == nullptr);
1209 if (result) {
1210 EXPECT_EQ("1.2.3.1", ToString(result));
1211
1212 // Wait for query to get counted.
1213 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1214 }
1215
1216 // Clear TLS bit to ensure revalidation.
Xiao Ma7c75f452018-12-11 17:56:32 +09001217 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001218 tls.stopServer();
1219 }
Bernie Innocenti443489e2018-08-10 14:27:23 +09001220}
1221
1222TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001223 constexpr char listen_addr[] = "127.0.0.3";
1224 constexpr char listen_udp[] = "53";
1225 constexpr char listen_tls[] = "853";
1226 constexpr char host_name[] = "badtlsfingerprint.example.com.";
1227
1228 test::DNSResponder dns;
1229 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Bernie Innocenti443489e2018-08-10 14:27:23 +09001230 std::vector<std::string> servers = { listen_addr };
1231
1232 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1233 ASSERT_TRUE(tls.startServer());
1234 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1235 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
Xiao Ma7c75f452018-12-11 17:56:32 +09001236 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001237 {base64Encode(bad_fingerprint)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001238
1239 // The initial validation should fail at the fingerprint check before
1240 // issuing a query.
1241 EXPECT_FALSE(tls.waitForQueries(1, 500));
1242
1243 // A fingerprint was provided and failed to match, so the query should fail.
1244 EXPECT_EQ(nullptr, gethostbyname("badtlsfingerprint"));
1245
1246 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001247 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001248}
1249
1250// Test that we can pass two different fingerprints, and connection succeeds as long as
1251// at least one of them matches the server.
1252TEST_F(ResolverTest, GetHostByName_TwoTlsFingerprints) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001253 constexpr char listen_addr[] = "127.0.0.3";
1254 constexpr char listen_udp[] = "53";
1255 constexpr char listen_tls[] = "853";
1256 constexpr char host_name[] = "twotlsfingerprints.example.com.";
1257
1258 test::DNSResponder dns;
1259 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Bernie Innocenti443489e2018-08-10 14:27:23 +09001260 std::vector<std::string> servers = { listen_addr };
1261
1262 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1263 ASSERT_TRUE(tls.startServer());
1264 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1265 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001266 ASSERT_TRUE(mDnsClient.SetResolversWithTls(
Xiao Ma7c75f452018-12-11 17:56:32 +09001267 servers, kDefaultSearchDomains, kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001268 {base64Encode(bad_fingerprint), base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001269
1270 const hostent* result;
1271
1272 // Wait for validation to complete.
1273 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1274
1275 result = gethostbyname("twotlsfingerprints");
1276 ASSERT_FALSE(result == nullptr);
1277 EXPECT_EQ("1.2.3.1", ToString(result));
1278
1279 // Wait for query to get counted.
1280 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1281
1282 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001283 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001284}
1285
1286TEST_F(ResolverTest, GetHostByName_TlsFingerprintGoesBad) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001287 constexpr char listen_addr[] = "127.0.0.3";
1288 constexpr char listen_udp[] = "53";
1289 constexpr char listen_tls[] = "853";
1290 constexpr char host_name1[] = "tlsfingerprintgoesbad1.example.com.";
1291 constexpr char host_name2[] = "tlsfingerprintgoesbad2.example.com.";
1292 const std::vector<DnsRecord> records = {
1293 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1294 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1295 };
1296
1297 test::DNSResponder dns;
1298 StartDns(dns, records);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001299 std::vector<std::string> servers = { listen_addr };
1300
1301 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1302 ASSERT_TRUE(tls.startServer());
Xiao Ma7c75f452018-12-11 17:56:32 +09001303 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001304 {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001305
1306 const hostent* result;
1307
1308 // Wait for validation to complete.
1309 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1310
1311 result = gethostbyname("tlsfingerprintgoesbad1");
1312 ASSERT_FALSE(result == nullptr);
1313 EXPECT_EQ("1.2.3.1", ToString(result));
1314
1315 // Wait for query to get counted.
1316 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1317
1318 // Restart the TLS server. This will generate a new certificate whose fingerprint
1319 // no longer matches the stored fingerprint.
1320 tls.stopServer();
1321 tls.startServer();
1322
1323 result = gethostbyname("tlsfingerprintgoesbad2");
1324 ASSERT_TRUE(result == nullptr);
1325 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
1326
1327 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001328 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001329}
1330
1331TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001332 constexpr char listen_addr1[] = "127.0.0.3";
1333 constexpr char listen_addr2[] = "127.0.0.4";
1334 constexpr char listen_udp[] = "53";
1335 constexpr char listen_tls[] = "853";
1336 constexpr char host_name1[] = "tlsfailover1.example.com.";
1337 constexpr char host_name2[] = "tlsfailover2.example.com.";
1338 const std::vector<DnsRecord> records1 = {
1339 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1340 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1341 };
1342 const std::vector<DnsRecord> records2 = {
1343 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1344 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1345 };
1346
1347 test::DNSResponder dns1(listen_addr1);
1348 test::DNSResponder dns2(listen_addr2);
1349 StartDns(dns1, records1);
1350 StartDns(dns2, records2);
1351
Bernie Innocenti443489e2018-08-10 14:27:23 +09001352 std::vector<std::string> servers = { listen_addr1, listen_addr2 };
1353
1354 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1355 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1356 ASSERT_TRUE(tls1.startServer());
1357 ASSERT_TRUE(tls2.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001358 ASSERT_TRUE(mDnsClient.SetResolversWithTls(
Xiao Ma7c75f452018-12-11 17:56:32 +09001359 servers, kDefaultSearchDomains, kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001360 {base64Encode(tls1.fingerprint()), base64Encode(tls2.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001361
1362 const hostent* result;
1363
1364 // Wait for validation to complete.
1365 EXPECT_TRUE(tls1.waitForQueries(1, 5000));
1366 EXPECT_TRUE(tls2.waitForQueries(1, 5000));
1367
1368 result = gethostbyname("tlsfailover1");
1369 ASSERT_FALSE(result == nullptr);
1370 EXPECT_EQ("1.2.3.1", ToString(result));
1371
1372 // Wait for query to get counted.
1373 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1374 // No new queries should have reached tls2.
1375 EXPECT_EQ(1, tls2.queries());
1376
1377 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1378 tls1.stopServer();
1379
1380 result = gethostbyname("tlsfailover2");
1381 EXPECT_EQ("1.2.3.4", ToString(result));
1382
1383 // Wait for query to get counted.
1384 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1385
1386 // No additional queries should have reached the insecure servers.
1387 EXPECT_EQ(2U, dns1.queries().size());
1388 EXPECT_EQ(2U, dns2.queries().size());
1389
1390 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001391 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001392}
1393
1394TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001395 constexpr char listen_addr[] = "127.0.0.3";
1396 constexpr char listen_udp[] = "53";
1397 constexpr char listen_tls[] = "853";
1398 constexpr char host_name[] = "badtlsname.example.com.";
1399
1400 test::DNSResponder dns;
1401 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Bernie Innocenti443489e2018-08-10 14:27:23 +09001402 std::vector<std::string> servers = { listen_addr };
1403
1404 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1405 ASSERT_TRUE(tls.startServer());
Xiao Ma7c75f452018-12-11 17:56:32 +09001406 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001407 "www.example.com", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001408
1409 // The TLS server's certificate doesn't chain to a known CA, and a nonempty name was specified,
1410 // so the client should fail the TLS handshake before ever issuing a query.
1411 EXPECT_FALSE(tls.waitForQueries(1, 500));
1412
1413 // The query should fail hard, because a name was specified.
1414 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1415
1416 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001417 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001418}
1419
1420TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001421 constexpr char listen_addr[] = "127.0.0.3";
1422 constexpr char listen_udp[] = "53";
1423 constexpr char listen_tls[] = "853";
1424 constexpr char host_name[] = "addrinfotls.example.com.";
1425 const std::vector<DnsRecord> records = {
1426 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1427 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1428 };
1429
1430 test::DNSResponder dns;
1431 StartDns(dns, records);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001432 std::vector<std::string> servers = { listen_addr };
1433
1434 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1435 ASSERT_TRUE(tls.startServer());
Xiao Ma7c75f452018-12-11 17:56:32 +09001436 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001437 {base64Encode(tls.fingerprint())}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001438
1439 // Wait for validation to complete.
1440 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1441
1442 dns.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001443 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1444 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001445 size_t found = GetNumQueries(dns, host_name);
1446 EXPECT_LE(1U, found);
1447 // Could be A or AAAA
1448 std::string result_str = ToString(result);
1449 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
1450 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001451 // Wait for both A and AAAA queries to get counted.
1452 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1453
1454 // Clear TLS bit.
Xiao Ma7c75f452018-12-11 17:56:32 +09001455 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001456}
1457
1458TEST_F(ResolverTest, TlsBypass) {
1459 const char OFF[] = "off";
1460 const char OPPORTUNISTIC[] = "opportunistic";
1461 const char STRICT[] = "strict";
1462
1463 const char GETHOSTBYNAME[] = "gethostbyname";
1464 const char GETADDRINFO[] = "getaddrinfo";
1465 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1466
1467 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1468
Mike Yu5ae61542018-10-19 22:11:43 +08001469 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001470
1471 const char ADDR4[] = "192.0.2.1";
1472 const char ADDR6[] = "2001:db8::1";
1473
1474 const char cleartext_addr[] = "127.0.0.53";
1475 const char cleartext_port[] = "53";
1476 const char tls_port[] = "853";
1477 const std::vector<std::string> servers = { cleartext_addr };
1478
Xiao Ma7c75f452018-12-11 17:56:32 +09001479 test::DNSResponder dns(cleartext_addr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001480 ASSERT_TRUE(dns.startServer());
1481
1482 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
1483
1484 struct TestConfig {
1485 const std::string mode;
1486 const bool withWorkingTLS;
1487 const std::string method;
1488
1489 std::string asHostName() const {
1490 return StringPrintf("%s.%s.%s.",
1491 mode.c_str(),
1492 withWorkingTLS ? "tlsOn" : "tlsOff",
1493 method.c_str());
1494 }
1495 } testConfigs[]{
1496 {OFF, false, GETHOSTBYNAME},
1497 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1498 {STRICT, false, GETHOSTBYNAME},
1499 {OFF, true, GETHOSTBYNAME},
1500 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1501 {STRICT, true, GETHOSTBYNAME},
1502 {OFF, false, GETADDRINFO},
1503 {OPPORTUNISTIC, false, GETADDRINFO},
1504 {STRICT, false, GETADDRINFO},
1505 {OFF, true, GETADDRINFO},
1506 {OPPORTUNISTIC, true, GETADDRINFO},
1507 {STRICT, true, GETADDRINFO},
1508 {OFF, false, GETADDRINFOFORNET},
1509 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1510 {STRICT, false, GETADDRINFOFORNET},
1511 {OFF, true, GETADDRINFOFORNET},
1512 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1513 {STRICT, true, GETADDRINFOFORNET},
1514 };
1515
1516 for (const auto& config : testConfigs) {
1517 const std::string testHostName = config.asHostName();
1518 SCOPED_TRACE(testHostName);
1519
1520 // Don't tempt test bugs due to caching.
1521 const char* host_name = testHostName.c_str();
1522 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1523 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1524
1525 if (config.withWorkingTLS) ASSERT_TRUE(tls.startServer());
1526
1527 if (config.mode == OFF) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001528 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1529 kDefaultParams));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001530 } else if (config.mode == OPPORTUNISTIC) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001531 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
1532 kDefaultParams, "", {}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001533 // Wait for validation to complete.
1534 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1535 } else if (config.mode == STRICT) {
1536 // We use the existence of fingerprints to trigger strict mode,
1537 // rather than hostname validation.
1538 const auto& fingerprint =
1539 (config.withWorkingTLS) ? tls.fingerprint() : NOOP_FINGERPRINT;
Xiao Ma7c75f452018-12-11 17:56:32 +09001540 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
1541 kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001542 {base64Encode(fingerprint)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001543 // Wait for validation to complete.
1544 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1545 } else {
1546 FAIL() << "Unsupported Private DNS mode: " << config.mode;
1547 }
1548
1549 const int tlsQueriesBefore = tls.queries();
1550
1551 const hostent* h_result = nullptr;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001552 ScopedAddrinfo ai_result;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001553
1554 if (config.method == GETHOSTBYNAME) {
1555 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1556 h_result = gethostbyname(host_name);
1557
1558 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1559 ASSERT_FALSE(h_result == nullptr);
1560 ASSERT_EQ(4, h_result->h_length);
1561 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1562 EXPECT_EQ(ADDR4, ToString(h_result));
1563 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1564 } else if (config.method == GETADDRINFO) {
1565 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001566 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1567 EXPECT_TRUE(ai_result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001568
1569 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1570 // Could be A or AAAA
1571 const std::string result_str = ToString(ai_result);
1572 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1573 << ", result_str='" << result_str << "'";
1574 } else if (config.method == GETADDRINFOFORNET) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001575 addrinfo* raw_ai_result = nullptr;
Bernie Innocentic165ce82018-10-16 23:35:28 +09001576 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1577 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1578 &raw_ai_result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001579 ai_result.reset(raw_ai_result);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001580
1581 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1582 // Could be A or AAAA
1583 const std::string result_str = ToString(ai_result);
1584 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1585 << ", result_str='" << result_str << "'";
1586 } else {
1587 FAIL() << "Unsupported query method: " << config.method;
1588 }
1589
1590 const int tlsQueriesAfter = tls.queries();
1591 EXPECT_EQ(0, tlsQueriesAfter - tlsQueriesBefore);
1592
Bernie Innocenti443489e2018-08-10 14:27:23 +09001593 // Clear per-process resolv netid.
1594 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
1595 tls.stopServer();
1596 dns.clearQueries();
1597 }
Bernie Innocenti443489e2018-08-10 14:27:23 +09001598}
1599
1600TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Mike Yu5ae61542018-10-19 22:11:43 +08001601 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Xiao Ma7c75f452018-12-11 17:56:32 +09001602 constexpr char cleartext_addr[] = "127.0.0.53";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001603 const std::vector<std::string> servers = { cleartext_addr };
Xiao Ma7c75f452018-12-11 17:56:32 +09001604 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1605 const std::vector<DnsRecord> records = {
1606 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1607 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1608 };
Bernie Innocenti443489e2018-08-10 14:27:23 +09001609
Xiao Ma7c75f452018-12-11 17:56:32 +09001610 test::DNSResponder dns(cleartext_addr);
1611 StartDns(dns, records);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001612
Xiao Ma7c75f452018-12-11 17:56:32 +09001613 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, {},
Bernie Innocenti3e411a32019-01-17 21:28:24 +09001614 "", {base64Encode(NOOP_FINGERPRINT)}));
Bernie Innocenti443489e2018-08-10 14:27:23 +09001615
1616 addrinfo* ai_result = nullptr;
1617 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1618 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1619}
Luke Huangc68f1b92018-11-21 20:13:38 +08001620
1621namespace {
1622
1623int getAsyncResponse(int fd, int* rcode, u_char* buf, int bufLen) {
1624 struct pollfd wait_fd[1];
1625 wait_fd[0].fd = fd;
1626 wait_fd[0].events = POLLIN;
1627 short revents;
1628 int ret;
1629
1630 ret = poll(wait_fd, 1, -1);
1631 revents = wait_fd[0].revents;
1632 if (revents & POLLIN) {
1633 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang952d0942018-12-26 16:53:03 +08001634 // Verify that resNetworkResult() closed the fd
1635 char dummy;
1636 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1637 EXPECT_EQ(EBADF, errno);
Luke Huangc68f1b92018-11-21 20:13:38 +08001638 return n;
1639 }
1640 return -1;
1641}
1642
1643std::string toString(u_char* buf, int bufLen, int ipType) {
1644 ns_msg handle;
1645 int ancount, n = 0;
1646 ns_rr rr;
1647
1648 if (ns_initparse((const uint8_t*) buf, bufLen, &handle) >= 0) {
1649 ancount = ns_msg_count(handle, ns_s_an);
1650 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
1651 const u_char* rdata = ns_rr_rdata(rr);
1652 char buffer[INET6_ADDRSTRLEN];
1653 if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
1654 return buffer;
1655 }
1656 }
1657 }
1658 return "";
1659}
1660
1661int dns_open_proxy() {
1662 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1663 if (s == -1) {
1664 return -1;
1665 }
1666 const int one = 1;
1667 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1668
1669 static const struct sockaddr_un proxy_addr = {
1670 .sun_family = AF_UNIX,
1671 .sun_path = "/dev/socket/dnsproxyd",
1672 };
1673
1674 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) !=
1675 0) {
1676 close(s);
1677 return -1;
1678 }
1679
1680 return s;
1681}
1682
Luke Huang952d0942018-12-26 16:53:03 +08001683void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1684 int rcode = -1;
1685 uint8_t buf[MAXPACKET] = {};
1686
1687 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1688 EXPECT_GT(res, 0);
1689 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1690}
1691
1692void expectAnswersNotValid(int fd, int expectedErrno) {
1693 int rcode = -1;
1694 uint8_t buf[MAXPACKET] = {};
1695
1696 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1697 EXPECT_EQ(expectedErrno, res);
1698}
1699
Luke Huangc68f1b92018-11-21 20:13:38 +08001700} // namespace
1701
1702TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001703 constexpr char listen_addr[] = "127.0.0.4";
1704 constexpr char host_name[] = "howdy.example.com.";
1705 const std::vector<DnsRecord> records = {
1706 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1707 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1708 };
1709
1710 test::DNSResponder dns(listen_addr);
1711 StartDns(dns, records);
Luke Huangc68f1b92018-11-21 20:13:38 +08001712 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09001713 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangc68f1b92018-11-21 20:13:38 +08001714
Luke Huang952d0942018-12-26 16:53:03 +08001715 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1716 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001717 EXPECT_TRUE(fd1 != -1);
1718 EXPECT_TRUE(fd2 != -1);
1719
1720 u_char buf[MAXPACKET] = {};
1721 int rcode;
1722 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1723 EXPECT_GT(res, 0);
1724 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1725
1726 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1727 EXPECT_GT(res, 0);
1728 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1729
1730 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1731
1732 // Re-query verify cache works
Luke Huang952d0942018-12-26 16:53:03 +08001733 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1734 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001735
1736 EXPECT_TRUE(fd1 != -1);
1737 EXPECT_TRUE(fd2 != -1);
1738
1739 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1740 EXPECT_GT(res, 0);
1741 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1742
1743 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1744 EXPECT_GT(res, 0);
1745 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1746
1747 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1748}
1749
1750TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001751 constexpr char listen_addr[] = "127.0.0.4";
1752 constexpr char host_name[] = "howdy.example.com.";
1753 const std::vector<DnsRecord> records = {
1754 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1755 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1756 };
1757
1758 test::DNSResponder dns(listen_addr);
1759 StartDns(dns, records);
Luke Huangc68f1b92018-11-21 20:13:38 +08001760 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09001761 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangc68f1b92018-11-21 20:13:38 +08001762
1763 static struct {
1764 int fd;
1765 const char* dname;
1766 const int queryType;
1767 const int expectRcode;
1768 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001769 {-1, "", ns_t_aaaa, 0},
1770 {-1, "as65ass46", ns_t_aaaa, 0},
1771 {-1, "454564564564", ns_t_aaaa, 0},
1772 {-1, "h645235", ns_t_a, 0},
1773 {-1, "www.google.com", ns_t_a, 0},
Luke Huangc68f1b92018-11-21 20:13:38 +08001774 };
1775
1776 for (auto& td : kTestData) {
1777 SCOPED_TRACE(td.dname);
Luke Huang952d0942018-12-26 16:53:03 +08001778 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001779 EXPECT_TRUE(td.fd != -1);
1780 }
1781
1782 // dns_responder return empty resp(packet only contains query part) with no error currently
1783 for (const auto& td : kTestData) {
1784 u_char buf[MAXPACKET] = {};
1785 int rcode;
1786 SCOPED_TRACE(td.dname);
1787 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1788 EXPECT_GT(res, 0);
1789 EXPECT_EQ(rcode, td.expectRcode);
1790 }
1791}
1792
1793TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001794 constexpr char listen_addr[] = "127.0.0.4";
1795 constexpr char host_name[] = "howdy.example.com.";
1796 const std::vector<DnsRecord> records = {
1797 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1798 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1799 };
1800
1801 test::DNSResponder dns(listen_addr);
1802 StartDns(dns, records);
Luke Huangc68f1b92018-11-21 20:13:38 +08001803 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09001804 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangc68f1b92018-11-21 20:13:38 +08001805
Luke Huang26a0e2a2018-12-18 16:44:41 +08001806 // TODO: Disable retry to make this test explicit.
1807 auto& cv = dns.getCv();
1808 auto& cvMutex = dns.getCvMutex();
1809 int fd1;
1810 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1811 {
1812 std::unique_lock lk(cvMutex);
Luke Huang952d0942018-12-26 16:53:03 +08001813 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001814 EXPECT_TRUE(fd1 != -1);
1815 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
1816 }
Luke Huangc68f1b92018-11-21 20:13:38 +08001817
Luke Huangc68f1b92018-11-21 20:13:38 +08001818 dns.setResponseProbability(0.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001819
Luke Huang952d0942018-12-26 16:53:03 +08001820 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001821 EXPECT_TRUE(fd2 != -1);
1822
Luke Huang952d0942018-12-26 16:53:03 +08001823 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001824 EXPECT_TRUE(fd3 != -1);
1825
Luke Huang26a0e2a2018-12-18 16:44:41 +08001826 uint8_t buf[MAXPACKET] = {};
Luke Huangc68f1b92018-11-21 20:13:38 +08001827 int rcode;
1828
Luke Huang26a0e2a2018-12-18 16:44:41 +08001829 // expect no response
1830 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
1831 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001832
Luke Huang26a0e2a2018-12-18 16:44:41 +08001833 // expect no response
Luke Huangc68f1b92018-11-21 20:13:38 +08001834 memset(buf, 0, MAXPACKET);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001835 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1836 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001837
Luke Huangc68f1b92018-11-21 20:13:38 +08001838 dns.setResponseProbability(1.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001839
Luke Huang952d0942018-12-26 16:53:03 +08001840 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001841 EXPECT_TRUE(fd4 != -1);
1842
1843 memset(buf, 0, MAXPACKET);
1844 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
1845 EXPECT_GT(res, 0);
1846 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1847
1848 memset(buf, 0, MAXPACKET);
1849 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1850 EXPECT_GT(res, 0);
1851 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1852}
1853
1854TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001855 constexpr char listen_addr[] = "127.0.0.4";
1856 constexpr char host_name[] = "howdy.example.com.";
1857 const std::vector<DnsRecord> records = {
1858 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1859 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1860 };
1861
1862 test::DNSResponder dns(listen_addr);
1863 StartDns(dns, records);
Luke Huangc68f1b92018-11-21 20:13:38 +08001864 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09001865 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangc68f1b92018-11-21 20:13:38 +08001866
1867 int fd = dns_open_proxy();
1868 EXPECT_TRUE(fd > 0);
1869
1870 const std::string badMsg = "16-52512#";
Xiao Ma7c75f452018-12-11 17:56:32 +09001871 static const struct {
Luke Huangc68f1b92018-11-21 20:13:38 +08001872 const std::string cmd;
1873 const int expectErr;
1874 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001875 // Too few arguments
Luke Huangc68f1b92018-11-21 20:13:38 +08001876 {"resnsend " + badMsg + '\0', -EINVAL},
1877 // Bad netId
Luke Huang952d0942018-12-26 16:53:03 +08001878 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huangc68f1b92018-11-21 20:13:38 +08001879 // Bad raw data
Luke Huang952d0942018-12-26 16:53:03 +08001880 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huangc68f1b92018-11-21 20:13:38 +08001881 };
1882
1883 for (unsigned int i = 0; i < std::size(kTestData); i++) {
1884 auto& td = kTestData[i];
1885 SCOPED_TRACE(td.cmd);
1886 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
1887 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
1888
1889 int32_t tmp;
1890 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
1891 EXPECT_TRUE(rc > 0);
1892 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
1893 }
1894 // Normal query with answer buffer
1895 // This is raw data of query "howdy.example.com" type 1 class 1
1896 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huang952d0942018-12-26 16:53:03 +08001897 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huangc68f1b92018-11-21 20:13:38 +08001898 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1899 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1900
1901 u_char smallBuf[1] = {};
1902 int rcode;
1903 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huang952d0942018-12-26 16:53:03 +08001904 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huangc68f1b92018-11-21 20:13:38 +08001905
1906 // Do the normal test with large buffer again
1907 fd = dns_open_proxy();
1908 EXPECT_TRUE(fd > 0);
1909 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1910 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1911 u_char buf[MAXPACKET] = {};
1912 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1913 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu5b9ffb22018-12-02 17:54:29 +09001914}
1915
Luke Huang952d0942018-12-26 16:53:03 +08001916TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001917 constexpr char listen_addr[] = "127.0.0.4";
1918 constexpr char host_name[] = "howdy.example.com.";
1919 const std::vector<DnsRecord> records = {
1920 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1921 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1922 };
1923
1924 test::DNSResponder dns(listen_addr);
1925 StartDns(dns, records);
Luke Huang952d0942018-12-26 16:53:03 +08001926 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09001927 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang952d0942018-12-26 16:53:03 +08001928
1929 // ANDROID_RESOLV_NO_CACHE_STORE
1930 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1931 ANDROID_RESOLV_NO_CACHE_STORE);
1932 EXPECT_TRUE(fd1 != -1);
1933 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1934 ANDROID_RESOLV_NO_CACHE_STORE);
1935 EXPECT_TRUE(fd2 != -1);
1936 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1937 ANDROID_RESOLV_NO_CACHE_STORE);
1938 EXPECT_TRUE(fd3 != -1);
1939
1940 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
1941 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1942 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1943
1944 // No cache exists, expect 3 queries
1945 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
1946
1947 // Re-query and cache
1948 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1949
1950 EXPECT_TRUE(fd1 != -1);
1951
1952 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1953
1954 // Now we have cache, expect 4 queries
1955 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1956
1957 // ANDROID_RESOLV_NO_CACHE_LOOKUP
1958 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1959 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1960 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1961 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1962
1963 EXPECT_TRUE(fd1 != -1);
1964 EXPECT_TRUE(fd2 != -1);
1965
1966 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1967 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1968
1969 // Skip cache, expect 6 queries
1970 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1971
1972 // Re-query verify cache works
1973 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1974 ANDROID_RESOLV_NO_CACHE_STORE);
1975 EXPECT_TRUE(fd1 != -1);
1976 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1977
1978 // Cache hits, expect still 6 queries
1979 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1980}
1981
1982TEST_F(ResolverTest, Async_NoRetryFlag) {
Xiao Ma7c75f452018-12-11 17:56:32 +09001983 constexpr char listen_addr[] = "127.0.0.4";
1984 constexpr char host_name[] = "howdy.example.com.";
1985 const std::vector<DnsRecord> records = {
1986 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1987 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1988 };
1989
1990 test::DNSResponder dns(listen_addr);
1991 StartDns(dns, records);
Luke Huang952d0942018-12-26 16:53:03 +08001992 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09001993 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang952d0942018-12-26 16:53:03 +08001994
1995 dns.setResponseProbability(0.0);
1996
1997 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1998 ANDROID_RESOLV_NO_RETRY);
1999 EXPECT_TRUE(fd1 != -1);
2000
2001 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2002 ANDROID_RESOLV_NO_RETRY);
2003 EXPECT_TRUE(fd2 != -1);
2004
2005 // expect no response
2006 expectAnswersNotValid(fd1, -ETIMEDOUT);
2007 expectAnswersNotValid(fd2, -ETIMEDOUT);
2008
2009 // No retry case, expect 2 queries
2010 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2011
2012 dns.clearQueries();
2013
2014 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2015 EXPECT_TRUE(fd1 != -1);
2016
2017 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2018 EXPECT_TRUE(fd2 != -1);
2019
2020 // expect no response
2021 expectAnswersNotValid(fd1, -ETIMEDOUT);
2022 expectAnswersNotValid(fd2, -ETIMEDOUT);
2023
2024 // Retry case, expect 4 queries
2025 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
2026}
2027
Mike Yu5b9ffb22018-12-02 17:54:29 +09002028// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chenbfd32022019-01-02 14:59:38 +08002029// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2030// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2031// won't retry so that we get no answer.
Mike Yu5b9ffb22018-12-02 17:54:29 +09002032TEST_F(ResolverTest, BrokenEdns) {
2033 typedef test::DNSResponder::Edns Edns;
2034 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2035
2036 const char OFF[] = "off";
2037 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
2038 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
2039 const char STRICT[] = "strict";
2040 const char GETHOSTBYNAME[] = "gethostbyname";
2041 const char GETADDRINFO[] = "getaddrinfo";
2042 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
2043 const char ADDR4[] = "192.0.2.1";
2044 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2045 const char CLEARTEXT_PORT[] = "53";
2046 const char TLS_PORT[] = "853";
2047 const std::vector<std::string> servers = { CLEARTEXT_ADDR };
2048
2049 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2050 ASSERT_TRUE(dns.startServer());
2051
2052 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2053
2054 static const struct TestConfig {
2055 std::string mode;
2056 std::string method;
2057 Edns edns;
2058 ExpectResult expectResult;
2059
2060 std::string asHostName() const {
2061 const char* ednsString;
2062 switch (edns) {
2063 case Edns::ON:
2064 ednsString = "ednsOn";
2065 break;
Ken Chenbfd32022019-01-02 14:59:38 +08002066 case Edns::FORMERR_ON_EDNS:
Mike Yu5b9ffb22018-12-02 17:54:29 +09002067 ednsString = "ednsFormerr";
2068 break;
2069 case Edns::DROP:
2070 ednsString = "ednsDrop";
2071 break;
2072 default:
2073 ednsString = "";
2074 break;
2075 }
2076 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2077 }
2078 } testConfigs[] = {
2079 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
2080 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2081 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2082 // commented out since TLS timeout is not configurable.
2083 // TODO: Uncomment them after TLS timeout is configurable.
2084 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2085 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2086 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2087 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
Ken Chenbfd32022019-01-02 14:59:38 +08002088 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2089 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2090 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2091 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002092 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2093 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2094 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2095 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2096 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2097 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2098 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2099 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
Ken Chenbfd32022019-01-02 14:59:38 +08002100 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2101 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2102 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2103 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu5b9ffb22018-12-02 17:54:29 +09002104 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2105 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2106 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2107 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2108 };
2109
2110 for (const auto& config : testConfigs) {
2111 const std::string testHostName = config.asHostName();
2112 SCOPED_TRACE(testHostName);
2113
2114 const char* host_name = testHostName.c_str();
2115 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2116 dns.setEdns(config.edns);
2117
2118 if (config.mode == OFF) {
Xiao Ma7c75f452018-12-11 17:56:32 +09002119 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002120 } else if (config.mode == OPPORTUNISTIC_UDP) {
Xiao Ma7c75f452018-12-11 17:56:32 +09002121 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
2122 kDefaultParams, "", {}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002123 } else if (config.mode == OPPORTUNISTIC_TLS) {
2124 ASSERT_TRUE(tls.startServer());
Xiao Ma7c75f452018-12-11 17:56:32 +09002125 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
2126 kDefaultParams, "", {}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002127 // Wait for validation to complete.
2128 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2129 } else if (config.mode == STRICT) {
2130 ASSERT_TRUE(tls.startServer());
Xiao Ma7c75f452018-12-11 17:56:32 +09002131 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
2132 kDefaultParams, "",
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002133 {base64Encode(tls.fingerprint())}));
Mike Yu5b9ffb22018-12-02 17:54:29 +09002134 // Wait for validation to complete.
2135 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2136 }
2137
2138 if (config.method == GETHOSTBYNAME) {
2139 const hostent* h_result = gethostbyname(host_name);
2140 if (config.expectResult == EXPECT_SUCCESS) {
2141 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2142 ASSERT_TRUE(h_result != nullptr);
2143 ASSERT_EQ(4, h_result->h_length);
2144 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2145 EXPECT_EQ(ADDR4, ToString(h_result));
2146 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2147 } else {
2148 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2149 ASSERT_TRUE(h_result == nullptr);
2150 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2151 }
2152 } else if (config.method == GETADDRINFO) {
2153 ScopedAddrinfo ai_result;
2154 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2155 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2156 if (config.expectResult == EXPECT_SUCCESS) {
2157 EXPECT_TRUE(ai_result != nullptr);
2158 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2159 const std::string result_str = ToString(ai_result);
2160 EXPECT_EQ(ADDR4, result_str);
2161 } else {
2162 EXPECT_TRUE(ai_result == nullptr);
2163 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2164 }
2165 } else {
2166 FAIL() << "Unsupported query method: " << config.method;
2167 }
2168
2169 tls.stopServer();
2170 dns.clearQueries();
2171 }
2172
2173 dns.stopServer();
2174}
nuccachenf52f7a52018-07-17 18:07:23 +08002175
Ken Chenbfd32022019-01-02 14:59:38 +08002176// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2177// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2178// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2179// failed due to timeout.
2180TEST_F(ResolverTest, UnstableTls) {
2181 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2182 const char CLEARTEXT_PORT[] = "53";
2183 const char TLS_PORT[] = "853";
2184 const char* host_name1 = "nonexistent1.example.com.";
2185 const char* host_name2 = "nonexistent2.example.com.";
2186 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2187
2188 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2189 ASSERT_TRUE(dns.startServer());
2190 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2191 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2192 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002193 ASSERT_TRUE(
Xiao Ma7c75f452018-12-11 17:56:32 +09002194 mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "", {}));
Ken Chenbfd32022019-01-02 14:59:38 +08002195 // Wait for validation complete.
2196 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2197 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2198 tls.stopServer();
2199
2200 const hostent* h_result = gethostbyname(host_name1);
2201 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2202 ASSERT_TRUE(h_result == nullptr);
2203 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2204
2205 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2206 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2207 EXPECT_TRUE(ai_result == nullptr);
2208 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2209}
2210
2211// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2212// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2213TEST_F(ResolverTest, BogusDnsServer) {
2214 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2215 const char CLEARTEXT_PORT[] = "53";
2216 const char TLS_PORT[] = "853";
2217 const char* host_name1 = "nonexistent1.example.com.";
2218 const char* host_name2 = "nonexistent2.example.com.";
2219 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2220
2221 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
2222 ASSERT_TRUE(dns.startServer());
2223 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2224 ASSERT_TRUE(tls.startServer());
Bernie Innocenti3e411a32019-01-17 21:28:24 +09002225 ASSERT_TRUE(
Xiao Ma7c75f452018-12-11 17:56:32 +09002226 mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, "", {}));
Ken Chenbfd32022019-01-02 14:59:38 +08002227 // Wait for validation complete.
2228 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2229 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2230 tls.stopServer();
2231 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2232
2233 const hostent* h_result = gethostbyname(host_name1);
2234 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2235 ASSERT_TRUE(h_result == nullptr);
2236 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2237
2238 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2239 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2240 EXPECT_TRUE(ai_result == nullptr);
2241 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2242}
2243
nuccachenf52f7a52018-07-17 18:07:23 +08002244TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2245 constexpr char listen_addr[] = "::1";
2246 constexpr char listen_addr2[] = "127.0.0.5";
nuccachenf52f7a52018-07-17 18:07:23 +08002247 constexpr char dns64_name[] = "ipv4only.arpa.";
2248 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002249 const std::vector<DnsRecord> records = {
2250 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2251 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2252 };
nuccachenf52f7a52018-07-17 18:07:23 +08002253
Xiao Ma7c75f452018-12-11 17:56:32 +09002254 test::DNSResponder dns(listen_addr);
2255 test::DNSResponder dns2(listen_addr2);
2256 StartDns(dns, records);
2257 StartDns(dns2, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachenf52f7a52018-07-17 18:07:23 +08002258
2259 std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002260 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002261
2262 // Wait for detecting prefix to complete.
2263 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2264
2265 // hints are necessary in order to let netd know which type of addresses the caller is
2266 // interested in.
Xiao Ma7c75f452018-12-11 17:56:32 +09002267 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachenf52f7a52018-07-17 18:07:23 +08002268 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2269 EXPECT_TRUE(result != nullptr);
2270 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2271
2272 std::string result_str = ToString(result);
2273 EXPECT_EQ(result_str, "64:ff9b::102:304");
2274
2275 // Let's test the case when there's an IPv4 resolver.
2276 servers = {listen_addr, listen_addr2};
Xiao Ma7c75f452018-12-11 17:56:32 +09002277 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002278 dns.clearQueries();
2279 dns2.clearQueries();
2280
2281 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2282 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2283
2284 result = safe_getaddrinfo("v4only", nullptr, &hints);
2285 EXPECT_TRUE(result != nullptr);
2286 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2287
2288 result_str = ToString(result);
2289 EXPECT_EQ(result_str, "1.2.3.4");
2290}
2291
nuccachenf52f7a52018-07-17 18:07:23 +08002292TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2293 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002294 constexpr char dns64_name[] = "ipv4only.arpa.";
2295 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002296 const std::vector<DnsRecord> records = {
2297 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2298 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2299 };
nuccachenf52f7a52018-07-17 18:07:23 +08002300
Xiao Ma7c75f452018-12-11 17:56:32 +09002301 test::DNSResponder dns(listen_addr);
2302 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002303 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002304 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002305
2306 // Wait for detecting prefix to complete.
2307 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2308
2309 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2310 // in AF_INET case.
2311 addrinfo hints;
2312 memset(&hints, 0, sizeof(hints));
2313 hints.ai_family = AF_INET6;
2314 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2315 EXPECT_TRUE(result != nullptr);
2316 std::string result_str = ToString(result);
2317 EXPECT_EQ(result_str, "64:ff9b::102:304");
2318
2319 hints.ai_family = AF_INET;
2320 result = safe_getaddrinfo("v4only", nullptr, &hints);
2321 EXPECT_TRUE(result != nullptr);
2322 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2323 result_str = ToString(result);
2324 EXPECT_EQ(result_str, "1.2.3.4");
2325}
nuccachenf52f7a52018-07-17 18:07:23 +08002326
2327TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2328 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002329 constexpr char dns64_name[] = "ipv4only.arpa.";
2330 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002331 const std::vector<DnsRecord> records = {
2332 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2333 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2334 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2335 };
nuccachenf52f7a52018-07-17 18:07:23 +08002336
Xiao Ma7c75f452018-12-11 17:56:32 +09002337 test::DNSResponder dns(listen_addr);
2338 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002339 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002340 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002341
2342 // Wait for detecting prefix to complete.
2343 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2344
Xiao Ma7c75f452018-12-11 17:56:32 +09002345 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachenf52f7a52018-07-17 18:07:23 +08002346 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2347 EXPECT_TRUE(result != nullptr);
2348 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2349
2350 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma7c75f452018-12-11 17:56:32 +09002351 const std::vector<std::string> result_strs = ToStrings(result);
nuccachenf52f7a52018-07-17 18:07:23 +08002352 for (const auto& str : result_strs) {
2353 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2354 << ", result_str='" << str << "'";
2355 }
2356}
2357
2358TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2359 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002360 constexpr char dns64_name[] = "ipv4only.arpa.";
2361 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002362 const std::vector<DnsRecord> records = {
2363 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2364 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2365 };
nuccachenf52f7a52018-07-17 18:07:23 +08002366
Xiao Ma7c75f452018-12-11 17:56:32 +09002367 test::DNSResponder dns(listen_addr);
2368 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002369 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002370 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002371
2372 // Wait for detecting prefix to complete.
2373 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2374
Xiao Ma7c75f452018-12-11 17:56:32 +09002375 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachenf52f7a52018-07-17 18:07:23 +08002376 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2377 EXPECT_TRUE(result != nullptr);
2378 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2379
2380 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2381 std::string result_str = ToString(result);
2382 EXPECT_EQ(result_str, "64:ff9b::102:304");
2383}
2384
2385TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2386 constexpr char THIS_NETWORK[] = "this_network";
2387 constexpr char LOOPBACK[] = "loopback";
2388 constexpr char LINK_LOCAL[] = "link_local";
2389 constexpr char MULTICAST[] = "multicast";
2390 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2391
2392 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2393 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2394 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2395 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2396 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2397
2398 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002399 constexpr char dns64_name[] = "ipv4only.arpa.";
2400
Xiao Ma7c75f452018-12-11 17:56:32 +09002401 test::DNSResponder dns(listen_addr);
2402 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachenf52f7a52018-07-17 18:07:23 +08002403 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002404 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002405
2406 // Wait for detecting prefix to complete.
2407 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2408
2409 static const struct TestConfig {
2410 std::string name;
2411 std::string addr;
2412
2413 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2414 } testConfigs[]{
2415 {THIS_NETWORK, ADDR_THIS_NETWORK},
2416 {LOOPBACK, ADDR_LOOPBACK},
2417 {LINK_LOCAL, ADDR_LINK_LOCAL},
2418 {MULTICAST, ADDR_MULTICAST},
2419 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2420 };
2421
2422 for (const auto& config : testConfigs) {
2423 const std::string testHostName = config.asHostName();
2424 SCOPED_TRACE(testHostName);
2425
2426 const char* host_name = testHostName.c_str();
2427 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2428
2429 addrinfo hints;
2430 memset(&hints, 0, sizeof(hints));
2431 hints.ai_family = AF_INET6;
2432 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2433 // In AF_INET6 case, don't return IPv4 answers
2434 EXPECT_TRUE(result == nullptr);
2435 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2436 dns.clearQueries();
2437
2438 memset(&hints, 0, sizeof(hints));
2439 hints.ai_family = AF_UNSPEC;
2440 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2441 EXPECT_TRUE(result != nullptr);
2442 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2443 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2444 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2445 std::string result_str = ToString(result);
2446 EXPECT_EQ(result_str, config.addr.c_str());
2447 dns.clearQueries();
2448 }
2449}
2450
2451TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2452 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002453 constexpr char dns64_name[] = "ipv4only.arpa.";
2454 constexpr char host_name[] = "v4only.example.com.";
2455 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002456 const std::vector<DnsRecord> records = {
2457 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2458 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2459 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
2460 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2461 };
nuccachenf52f7a52018-07-17 18:07:23 +08002462
Xiao Ma7c75f452018-12-11 17:56:32 +09002463 test::DNSResponder dns(listen_addr);
2464 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002465 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002466 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002467
2468 // Wait for detecting prefix to complete.
2469 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2470
2471 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2472 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2473 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2474 EXPECT_TRUE(result != nullptr);
2475 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2476 std::string result_str = ToString(result);
2477 EXPECT_EQ(result_str, "64:ff9b::102:304");
2478 dns.clearQueries();
2479
2480 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2481 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2482 EXPECT_TRUE(result != nullptr);
2483 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2484 std::vector<std::string> result_strs = ToStrings(result);
2485 for (const auto& str : result_strs) {
2486 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2487 << ", result_str='" << str << "'";
2488 }
2489}
2490
2491TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2492 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2493 constexpr char ADDR_ANYADDR_V6[] = "::";
2494 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2495 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2496
2497 constexpr char PORT_NAME_HTTP[] = "http";
2498 constexpr char PORT_NUMBER_HTTP[] = "80";
2499
2500 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002501 constexpr char dns64_name[] = "ipv4only.arpa.";
2502
Xiao Ma7c75f452018-12-11 17:56:32 +09002503 test::DNSResponder dns(listen_addr);
2504 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachenf52f7a52018-07-17 18:07:23 +08002505 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002506 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002507
2508 // Wait for detecting prefix to complete.
2509 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2510
2511 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2512 // - passive socket -> anyaddr (0.0.0.0 or ::)
2513 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2514 static const struct TestConfig {
2515 int flag;
2516 std::string addr_v4;
2517 std::string addr_v6;
2518
2519 std::string asParameters() const {
2520 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2521 addr_v6.c_str());
2522 }
2523 } testConfigs[]{
2524 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2525 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2526 };
2527
2528 for (const auto& config : testConfigs) {
2529 SCOPED_TRACE(config.asParameters());
2530
Xiao Ma7c75f452018-12-11 17:56:32 +09002531 addrinfo hints = {
2532 .ai_family = AF_UNSPEC, // any address family
2533 .ai_socktype = 0, // any type
2534 .ai_protocol = 0, // any protocol
2535 .ai_flags = config.flag,
2536 };
nuccachenf52f7a52018-07-17 18:07:23 +08002537
2538 // Assign hostname as null and service as port name.
2539 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2540 ASSERT_TRUE(result != nullptr);
2541
2542 // Can't be synthesized because it should not get into Netd.
2543 std::vector<std::string> result_strs = ToStrings(result);
2544 for (const auto& str : result_strs) {
2545 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2546 << ", result_str='" << str << "'";
2547 }
2548
2549 // Assign hostname as null and service as numeric port number.
2550 hints.ai_flags = config.flag | AI_NUMERICSERV;
2551 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2552 ASSERT_TRUE(result != nullptr);
2553
2554 // Can't be synthesized because it should not get into Netd.
2555 result_strs = ToStrings(result);
2556 for (const auto& str : result_strs) {
2557 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2558 << ", result_str='" << str << "'";
2559 }
2560 }
2561}
2562
2563TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2564 struct hostent* result = nullptr;
2565 struct in_addr v4addr;
2566 struct in6_addr v6addr;
2567
2568 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002569 constexpr char dns64_name[] = "ipv4only.arpa.";
2570 constexpr char ptr_name[] = "v4v6.example.com.";
2571 // PTR record for IPv4 address 1.2.3.4
2572 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2573 // PTR record for IPv6 address 2001:db8::102:304
2574 constexpr char ptr_addr_v6[] =
2575 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002576 const std::vector<DnsRecord> records = {
2577 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2578 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2579 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
2580 };
nuccachenf52f7a52018-07-17 18:07:23 +08002581
Xiao Ma7c75f452018-12-11 17:56:32 +09002582 test::DNSResponder dns(listen_addr);
2583 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002584 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002585 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002586
2587 // Wait for detecting prefix to complete.
2588 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2589
2590 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2591 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2592 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2593 ASSERT_TRUE(result != nullptr);
2594 std::string result_str = result->h_name ? result->h_name : "null";
2595 EXPECT_EQ(result_str, "v4v6.example.com");
2596
2597 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2598 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2599 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2600 ASSERT_TRUE(result != nullptr);
2601 result_str = result->h_name ? result->h_name : "null";
2602 EXPECT_EQ(result_str, "v4v6.example.com");
2603}
2604
2605TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2606 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002607 constexpr char dns64_name[] = "ipv4only.arpa.";
2608 constexpr char ptr_name[] = "v4only.example.com.";
2609 // PTR record for IPv4 address 1.2.3.4
2610 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2611 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2612 constexpr char ptr_addr_v6_nomapping[] =
2613 "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.";
2614 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2615 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2616 constexpr char ptr_addr_v6_synthesis[] =
2617 "8.0.7.0.6.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002618 const std::vector<DnsRecord> records = {
2619 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2620 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2621 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
2622 };
nuccachenf52f7a52018-07-17 18:07:23 +08002623
Xiao Ma7c75f452018-12-11 17:56:32 +09002624 test::DNSResponder dns(listen_addr);
2625 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002626 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachenf52f7a52018-07-17 18:07:23 +08002627 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002628 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002629
2630 // Wait for detecting prefix to complete.
2631 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2632
2633 // Synthesized PTR record doesn't exist on DNS server
2634 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2635 // After querying synthesized address failed, expect that prefix is removed from IPv6
2636 // synthesized address and do reverse IPv4 query instead.
2637 struct in6_addr v6addr;
2638 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2639 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2640 ASSERT_TRUE(result != nullptr);
2641 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2642 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2643 std::string result_str = result->h_name ? result->h_name : "null";
2644 EXPECT_EQ(result_str, "v4only.example.com");
2645 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2646 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2647 // fakes the return IPv4 address as original queried IPv6 address.
2648 result_str = ToString(result);
2649 EXPECT_EQ(result_str, "64:ff9b::102:304");
2650 dns.clearQueries();
2651
2652 // Synthesized PTR record exists on DNS server
2653 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2654 // Expect to Netd pass through synthesized address for DNS queries.
2655 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2656 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2657 ASSERT_TRUE(result != nullptr);
2658 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2659 result_str = result->h_name ? result->h_name : "null";
2660 EXPECT_EQ(result_str, "v6synthesis.example.com");
2661}
2662
2663TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2664 constexpr char dns64_name[] = "ipv4only.arpa.";
2665 constexpr char host_name[] = "localhost";
2666 // The address is synthesized by prefix64:localhost.
2667 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachenf52f7a52018-07-17 18:07:23 +08002668 constexpr char listen_addr[] = "::1";
Xiao Ma7c75f452018-12-11 17:56:32 +09002669
2670 test::DNSResponder dns(listen_addr);
2671 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachenf52f7a52018-07-17 18:07:23 +08002672 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002673 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002674
2675 // Wait for detecting prefix to complete.
2676 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2677
2678 // Using synthesized "localhost" address to be a trick for resolving host name
2679 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2680 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2681 struct in6_addr v6addr;
2682 inet_pton(AF_INET6, host_addr, &v6addr);
2683 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2684 ASSERT_TRUE(result != nullptr);
2685 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2686 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2687
2688 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2689 ASSERT_EQ(AF_INET6, result->h_addrtype);
2690 std::string result_str = ToString(result);
2691 EXPECT_EQ(result_str, host_addr);
2692 result_str = result->h_name ? result->h_name : "null";
2693 EXPECT_EQ(result_str, host_name);
2694}
2695
2696TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2697 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002698 constexpr char dns64_name[] = "ipv4only.arpa.";
2699 constexpr char ptr_name[] = "v4v6.example.com.";
2700 // PTR record for IPv4 address 1.2.3.4
2701 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2702 // PTR record for IPv6 address 2001:db8::102:304
2703 constexpr char ptr_addr_v6[] =
2704 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002705 const std::vector<DnsRecord> records = {
2706 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2707 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2708 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
2709 };
nuccachenf52f7a52018-07-17 18:07:23 +08002710
Xiao Ma7c75f452018-12-11 17:56:32 +09002711 test::DNSResponder dns(listen_addr);
2712 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002713 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002714 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002715
2716 // Wait for detecting prefix to complete.
2717 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2718
2719 static const struct TestConfig {
2720 int flag;
2721 int family;
2722 std::string addr;
2723 std::string host;
2724
2725 std::string asParameters() const {
2726 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2727 host.c_str());
2728 }
2729 } testConfigs[]{
2730 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2731 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2732 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2733 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2734 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2735 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2736 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2737 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2738 };
2739
2740 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2741 for (const auto& config : testConfigs) {
2742 SCOPED_TRACE(config.asParameters());
2743
2744 int rv;
2745 char host[NI_MAXHOST];
2746 struct sockaddr_in sin;
2747 struct sockaddr_in6 sin6;
2748 if (config.family == AF_INET) {
2749 memset(&sin, 0, sizeof(sin));
2750 sin.sin_family = AF_INET;
2751 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2752 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2753 nullptr, 0, config.flag);
2754 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2755 } else if (config.family == AF_INET6) {
2756 memset(&sin6, 0, sizeof(sin6));
2757 sin6.sin6_family = AF_INET6;
2758 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2759 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2760 nullptr, 0, config.flag);
2761 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2762 }
2763 ASSERT_EQ(0, rv);
2764 std::string result_str = host;
2765 EXPECT_EQ(result_str, config.host);
2766 dns.clearQueries();
2767 }
2768}
2769
2770TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2771 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002772 constexpr char dns64_name[] = "ipv4only.arpa.";
2773 constexpr char ptr_name[] = "v4only.example.com.";
2774 // PTR record for IPv4 address 1.2.3.4
2775 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2776 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2777 constexpr char ptr_addr_v6_nomapping[] =
2778 "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.";
2779 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2780 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2781 constexpr char ptr_addr_v6_synthesis[] =
2782 "8.0.7.0.6.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002783 const std::vector<DnsRecord> records = {
2784 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2785 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2786 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
2787 };
nuccachenf52f7a52018-07-17 18:07:23 +08002788
Xiao Ma7c75f452018-12-11 17:56:32 +09002789 test::DNSResponder dns(listen_addr);
2790 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002791 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002792 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002793
2794 // Wait for detecting prefix to complete.
2795 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2796
2797 static const struct TestConfig {
2798 bool hasSynthesizedPtrRecord;
2799 int flag;
2800 std::string addr;
2801 std::string host;
2802
2803 std::string asParameters() const {
2804 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2805 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2806 }
2807 } testConfigs[]{
2808 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2809 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2810 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2811 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2812 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2813 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2814 };
2815
2816 // hasSynthesizedPtrRecord = false
2817 // Synthesized PTR record doesn't exist on DNS server
2818 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2819 // After querying synthesized address failed, expect that prefix is removed from IPv6
2820 // synthesized address and do reverse IPv4 query instead.
2821 //
2822 // hasSynthesizedPtrRecord = true
2823 // Synthesized PTR record exists on DNS server
2824 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2825 // Expect to just pass through synthesized address for DNS queries.
2826 for (const auto& config : testConfigs) {
2827 SCOPED_TRACE(config.asParameters());
2828
2829 char host[NI_MAXHOST];
2830 struct sockaddr_in6 sin6;
2831 memset(&sin6, 0, sizeof(sin6));
2832 sin6.sin6_family = AF_INET6;
2833 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2834 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2835 nullptr, 0, config.flag);
2836 ASSERT_EQ(0, rv);
2837 if (config.flag == NI_NAMEREQD) {
2838 if (config.hasSynthesizedPtrRecord) {
2839 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2840 } else {
2841 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2842 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2843 }
2844 }
2845 std::string result_str = host;
2846 EXPECT_EQ(result_str, config.host);
2847 dns.clearQueries();
2848 }
2849}
2850
2851TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2852 constexpr char dns64_name[] = "ipv4only.arpa.";
2853 constexpr char host_name[] = "localhost";
2854 // The address is synthesized by prefix64:localhost.
2855 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachenf52f7a52018-07-17 18:07:23 +08002856 constexpr char listen_addr[] = "::1";
Xiao Ma7c75f452018-12-11 17:56:32 +09002857
2858 test::DNSResponder dns(listen_addr);
2859 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachenf52f7a52018-07-17 18:07:23 +08002860 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002861 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002862
2863 // Wait for detecting prefix to complete.
2864 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2865
2866 // Using synthesized "localhost" address to be a trick for resolving host name
2867 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2868 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2869 char host[NI_MAXHOST];
Xiao Ma7c75f452018-12-11 17:56:32 +09002870 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachenf52f7a52018-07-17 18:07:23 +08002871 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2872 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2873 0, NI_NAMEREQD);
2874 ASSERT_EQ(0, rv);
2875 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2876 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2877
2878 std::string result_str = host;
2879 EXPECT_EQ(result_str, host_name);
2880}
2881
nuccachenf52f7a52018-07-17 18:07:23 +08002882TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma7c75f452018-12-11 17:56:32 +09002883 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002884 constexpr char dns64_name[] = "ipv4only.arpa.";
2885 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma7c75f452018-12-11 17:56:32 +09002886 const std::vector<DnsRecord> records = {
2887 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2888 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2889 };
nuccachenf52f7a52018-07-17 18:07:23 +08002890
Xiao Ma7c75f452018-12-11 17:56:32 +09002891 test::DNSResponder dns(listen_addr);
2892 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002893 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002894 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002895
2896 // Wait for detecting prefix to complete.
2897 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2898
2899 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2900 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2901 ASSERT_TRUE(result != nullptr);
2902 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2903 std::string result_str = ToString(result);
2904 EXPECT_EQ(result_str, "64:ff9b::102:304");
2905}
nuccachenf52f7a52018-07-17 18:07:23 +08002906
2907TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2908 constexpr char dns64_name[] = "ipv4only.arpa.";
2909 constexpr char host_name[] = "v4v6.example.com.";
nuccachenf52f7a52018-07-17 18:07:23 +08002910 constexpr char listen_addr[] = "::1";
Xiao Ma7c75f452018-12-11 17:56:32 +09002911 const std::vector<DnsRecord> records = {
2912 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2913 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2914 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2915 };
2916
2917 test::DNSResponder dns(listen_addr);
2918 StartDns(dns, records);
nuccachenf52f7a52018-07-17 18:07:23 +08002919 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002920 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002921
2922 // Wait for detecting prefix to complete.
2923 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2924
2925 // IPv4 DNS query. Prefix should have no effect on it.
2926 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2927 ASSERT_TRUE(result != nullptr);
2928 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2929 std::string result_str = ToString(result);
2930 EXPECT_EQ(result_str, "1.2.3.4");
2931 dns.clearQueries();
2932
2933 // IPv6 DNS query. Prefix should have no effect on it.
2934 result = gethostbyname2("v4v6", AF_INET6);
2935 ASSERT_TRUE(result != nullptr);
2936 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2937 result_str = ToString(result);
2938 EXPECT_EQ(result_str, "2001:db8::102:304");
2939}
2940
2941TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2942 constexpr char THIS_NETWORK[] = "this_network";
2943 constexpr char LOOPBACK[] = "loopback";
2944 constexpr char LINK_LOCAL[] = "link_local";
2945 constexpr char MULTICAST[] = "multicast";
2946 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2947
2948 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2949 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2950 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2951 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2952 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2953
2954 constexpr char listen_addr[] = "::1";
nuccachenf52f7a52018-07-17 18:07:23 +08002955 constexpr char dns64_name[] = "ipv4only.arpa.";
2956
Xiao Ma7c75f452018-12-11 17:56:32 +09002957 test::DNSResponder dns(listen_addr);
2958 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachenf52f7a52018-07-17 18:07:23 +08002959 const std::vector<std::string> servers = {listen_addr};
Xiao Ma7c75f452018-12-11 17:56:32 +09002960 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachenf52f7a52018-07-17 18:07:23 +08002961
2962 // Wait for detecting prefix to complete.
2963 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2964
2965 static const struct TestConfig {
2966 std::string name;
2967 std::string addr;
2968
2969 std::string asHostName() const {
2970 return StringPrintf("%s.example.com.",
2971 name.c_str());
2972 }
2973 } testConfigs[]{
2974 {THIS_NETWORK, ADDR_THIS_NETWORK},
2975 {LOOPBACK, ADDR_LOOPBACK},
2976 {LINK_LOCAL, ADDR_LINK_LOCAL},
2977 {MULTICAST, ADDR_MULTICAST},
2978 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2979 };
2980
2981 for (const auto& config : testConfigs) {
2982 const std::string testHostName = config.asHostName();
2983 SCOPED_TRACE(testHostName);
2984
2985 const char* host_name = testHostName.c_str();
2986 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2987
2988 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2989 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2990
2991 // In AF_INET6 case, don't synthesize special use IPv4 address.
2992 // Expect to have no answer
2993 EXPECT_EQ(nullptr, result);
2994
2995 dns.clearQueries();
2996 }
Bernie Innocenticd257642018-12-20 15:56:40 +09002997}