blob: 959b1ed022413c8ead083884e161de9c6e27e20e [file] [log] [blame]
Bernie Innocenti443489e2018-08-10 14:27:23 +09001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless requied by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocentic165ce82018-10-16 23:35:28 +090018#define LOG_TAG "netd_test"
19
Bernie Innocenti443489e2018-08-10 14:27:23 +090020#include <arpa/inet.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080021#include <arpa/nameser.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090022#include <netdb.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080023#include <netinet/in.h>
24#include <poll.h> /* poll */
25#include <resolv.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090026#include <stdarg.h>
27#include <stdio.h>
28#include <stdlib.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080029#include <sys/socket.h>
30#include <sys/un.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090031#include <unistd.h>
32
33#include <algorithm>
34#include <chrono>
35#include <iterator>
36#include <numeric>
37#include <thread>
38
Bernie Innocenti443489e2018-08-10 14:27:23 +090039#include <android-base/stringprintf.h>
Luke Huang952d0942018-12-26 16:53:03 +080040#include <android/multinetwork.h> // ResNsendFlags
Bernie Innocenti0298c682018-10-02 23:18:11 +090041#include <cutils/sockets.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090042#include <gtest/gtest.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090043#include <openssl/base64.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090044#include <private/android_filesystem_config.h>
45#include <utils/Log.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090046
Bernie Innocenti443489e2018-08-10 14:27:23 +090047#include "NetdClient.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090048#include "netid_client.h" // NETID_UNSET
Bernie Innocentic165ce82018-10-16 23:35:28 +090049#include "netd_resolv/params.h" // MAX_NS
Bernie Innocenti443489e2018-08-10 14:27:23 +090050
Ken Chenc68c2de2018-11-13 21:51:13 +080051#include "dns_responder/dns_responder.h"
52#include "dns_responder/dns_responder_client.h"
53#include "dns_responder/dns_tls_frontend.h"
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090054
55#include "NetdConstants.h"
Bernie Innocenti443489e2018-08-10 14:27:23 +090056#include "ResolverStats.h"
57
58#include "android/net/INetd.h"
59#include "android/net/metrics/INetdEventListener.h"
60#include "binder/IServiceManager.h"
61#include "netdutils/SocketOption.h"
62
Bernie Innocentic165ce82018-10-16 23:35:28 +090063// TODO: make this dynamic and stop depending on implementation details.
Luke Huangc68f1b92018-11-21 20:13:38 +080064constexpr int TEST_NETID = 30;
65constexpr int MAXPACKET = (8 * 1024);
Bernie Innocentic165ce82018-10-16 23:35:28 +090066
67// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
68// Tested here for convenience.
69extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
70 const addrinfo* hints, unsigned netid, unsigned mark,
71 struct addrinfo** result);
72
Bernie Innocenti443489e2018-08-10 14:27:23 +090073using android::base::StringPrintf;
74using android::net::ResolverStats;
75using android::net::metrics::INetdEventListener;
76using android::netdutils::enableSockopt;
77
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090078// TODO: move into libnetdutils?
79namespace {
80ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
81 const struct addrinfo* hints) {
82 addrinfo* result = nullptr;
83 if (getaddrinfo(node, service, hints, &result) != 0) {
84 result = nullptr; // Should already be the case, but...
85 }
86 return ScopedAddrinfo(result);
87}
88} // namespace
89
Bernie Innocenti443489e2018-08-10 14:27:23 +090090// Emulates the behavior of UnorderedElementsAreArray, which currently cannot be used.
91// TODO: Use UnorderedElementsAreArray, which depends on being able to compile libgmock_host,
92// if that is not possible, improve this hacky algorithm, which is O(n**2)
93template <class A, class B>
94bool UnorderedCompareArray(const A& a, const B& b) {
95 if (a.size() != b.size()) return false;
96 for (const auto& a_elem : a) {
97 size_t a_count = 0;
98 for (const auto& a_elem2 : a) {
99 if (a_elem == a_elem2) {
100 ++a_count;
101 }
102 }
103 size_t b_count = 0;
104 for (const auto& b_elem : b) {
105 if (a_elem == b_elem) ++b_count;
106 }
107 if (a_count != b_count) return false;
108 }
109 return true;
110}
111
Bernie Innocenti443489e2018-08-10 14:27:23 +0900112class ResolverTest : public ::testing::Test, public DnsResponderClient {
Bernie Innocenti0298c682018-10-02 23:18:11 +0900113 protected:
114 void SetUp() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900115 // Ensure resolutions go via proxy.
116 DnsResponderClient::SetUp();
117
118 // If DNS reporting is off: turn it on so we run through everything.
119 auto rv = mNetdSrv->getMetricsReportingLevel(&mOriginalMetricsLevel);
120 ASSERT_TRUE(rv.isOk());
121 if (mOriginalMetricsLevel != INetdEventListener::REPORTING_LEVEL_FULL) {
122 rv = mNetdSrv->setMetricsReportingLevel(INetdEventListener::REPORTING_LEVEL_FULL);
123 ASSERT_TRUE(rv.isOk());
124 }
125 }
126
Bernie Innocenti0298c682018-10-02 23:18:11 +0900127 void TearDown() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900128 if (mOriginalMetricsLevel != INetdEventListener::REPORTING_LEVEL_FULL) {
129 auto rv = mNetdSrv->setMetricsReportingLevel(mOriginalMetricsLevel);
130 ASSERT_TRUE(rv.isOk());
131 }
132
133 DnsResponderClient::TearDown();
134 }
135
136 bool GetResolverInfo(std::vector<std::string>* servers, std::vector<std::string>* domains,
Mike Yuda77e8e2018-11-26 13:26:21 +0900137 std::vector<std::string>* tlsServers, __res_params* params,
138 std::vector<ResolverStats>* stats) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900139 using android::net::INetd;
140 std::vector<int32_t> params32;
141 std::vector<int32_t> stats32;
Mike Yuda77e8e2018-11-26 13:26:21 +0900142 auto rv = mNetdSrv->getResolverInfo(TEST_NETID, servers, domains, tlsServers, &params32,
143 &stats32);
Bernie Innocenti45238a12018-12-04 14:57:48 +0900144 if (!rv.isOk() || params32.size() != static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT)) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900145 return false;
146 }
147 *params = __res_params {
148 .sample_validity = static_cast<uint16_t>(
149 params32[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY]),
150 .success_threshold = static_cast<uint8_t>(
151 params32[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD]),
152 .min_samples = static_cast<uint8_t>(
153 params32[INetd::RESOLVER_PARAMS_MIN_SAMPLES]),
154 .max_samples = static_cast<uint8_t>(
155 params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES]),
156 .base_timeout_msec = params32[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
157 };
158 return ResolverStats::decodeAll(stats32, stats);
159 }
160
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900161 static std::string ToString(const hostent* he) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900162 if (he == nullptr) return "<null>";
163 char buffer[INET6_ADDRSTRLEN];
164 if (!inet_ntop(he->h_addrtype, he->h_addr_list[0], buffer, sizeof(buffer))) {
165 return "<invalid>";
166 }
167 return buffer;
168 }
169
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900170 static std::string ToString(const addrinfo* ai) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900171 if (!ai)
172 return "<null>";
173 for (const auto* aip = ai ; aip != nullptr ; aip = aip->ai_next) {
174 char host[NI_MAXHOST];
175 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
176 NI_NUMERICHOST);
177 if (rv != 0)
178 return gai_strerror(rv);
179 return host;
180 }
181 return "<invalid>";
182 }
183
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900184 static std::string ToString(const ScopedAddrinfo& ai) { return ToString(ai.get()); }
185
nuccachenf52f7a52018-07-17 18:07:23 +0800186 static std::vector<std::string> ToStrings(const addrinfo* ai) {
187 std::vector<std::string> hosts;
188 if (!ai) {
189 hosts.push_back("<null>");
190 return hosts;
191 }
192 for (const auto* aip = ai; aip != nullptr; aip = aip->ai_next) {
193 char host[NI_MAXHOST];
194 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
195 NI_NUMERICHOST);
196 if (rv != 0) {
197 hosts.clear();
198 hosts.push_back(gai_strerror(rv));
199 return hosts;
200 } else {
201 hosts.push_back(host);
202 }
203 }
204 if (hosts.empty()) hosts.push_back("<invalid>");
205 return hosts;
206 }
207
208 static std::vector<std::string> ToStrings(const ScopedAddrinfo& ai) {
209 return ToStrings(ai.get());
210 }
211
Bernie Innocenti443489e2018-08-10 14:27:23 +0900212 size_t GetNumQueries(const test::DNSResponder& dns, const char* name) const {
213 auto queries = dns.queries();
214 size_t found = 0;
215 for (const auto& p : queries) {
216 if (p.first == name) {
217 ++found;
218 }
219 }
220 return found;
221 }
222
223 size_t GetNumQueriesForType(const test::DNSResponder& dns, ns_type type,
Bernie Innocenti0298c682018-10-02 23:18:11 +0900224 const char* name) const {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900225 auto queries = dns.queries();
226 size_t found = 0;
227 for (const auto& p : queries) {
228 if (p.second == type && p.first == name) {
229 ++found;
230 }
231 }
232 return found;
233 }
234
nuccachenf52f7a52018-07-17 18:07:23 +0800235 bool WaitForPrefix64Detected(int netId, int timeoutMs) {
236 constexpr int intervalMs = 2;
237 const int limit = timeoutMs / intervalMs;
238 for (int count = 0; count <= limit; ++count) {
239 std::string prefix;
240 auto rv = mNetdSrv->getPrefix64(netId, &prefix);
241 if (rv.isOk()) {
242 return true;
243 }
244 usleep(intervalMs * 1000);
245 }
246 return false;
247 }
248
Bernie Innocenti443489e2018-08-10 14:27:23 +0900249 void RunGetAddrInfoStressTest_Binder(unsigned num_hosts, unsigned num_threads,
250 unsigned num_queries) {
251 std::vector<std::string> domains = { "example.com" };
252 std::vector<std::unique_ptr<test::DNSResponder>> dns;
253 std::vector<std::string> servers;
254 std::vector<DnsResponderClient::Mapping> mappings;
255 ASSERT_NO_FATAL_FAILURE(SetupMappings(num_hosts, domains, &mappings));
256 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS, mappings, &dns, &servers));
257
258 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
259
260 auto t0 = std::chrono::steady_clock::now();
261 std::vector<std::thread> threads(num_threads);
262 for (std::thread& thread : threads) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900263 thread = std::thread([&mappings, num_queries]() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900264 for (unsigned i = 0 ; i < num_queries ; ++i) {
265 uint32_t ofs = arc4random_uniform(mappings.size());
266 auto& mapping = mappings[ofs];
267 addrinfo* result = nullptr;
268 int rv = getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result);
269 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
270 if (rv == 0) {
271 std::string result_str = ToString(result);
272 EXPECT_TRUE(result_str == mapping.ip4 || result_str == mapping.ip6)
273 << "result='" << result_str << "', ip4='" << mapping.ip4
274 << "', ip6='" << mapping.ip6;
275 }
276 if (result) {
277 freeaddrinfo(result);
278 result = nullptr;
279 }
280 }
281 });
282 }
283
284 for (std::thread& thread : threads) {
285 thread.join();
286 }
287 auto t1 = std::chrono::steady_clock::now();
288 ALOGI("%u hosts, %u threads, %u queries, %Es", num_hosts, num_threads, num_queries,
289 std::chrono::duration<double>(t1 - t0).count());
290 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
291 }
292
293 const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
294 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
295 const std::vector<int> mDefaultParams_Binder = {
296 300, // SAMPLE_VALIDITY
297 25, // SUCCESS_THRESHOLD
298 8, 8, // {MIN,MAX}_SAMPLES
299 100, // BASE_TIMEOUT_MSEC
300 };
Bernie Innocenti0298c682018-10-02 23:18:11 +0900301
302 private:
303 int mOriginalMetricsLevel;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900304};
305
306TEST_F(ResolverTest, GetHostByName) {
307 const char* listen_addr = "127.0.0.3";
308 const char* listen_srv = "53";
309 const char* host_name = "hello.example.com.";
310 const char *nonexistent_host_name = "nonexistent.example.com.";
311 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
312 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
313 ASSERT_TRUE(dns.startServer());
314 std::vector<std::string> servers = { listen_addr };
315 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
316
317 const hostent* result;
318
319 dns.clearQueries();
320 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");
327 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
328 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);
333
334 dns.stopServer();
335}
336
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900337TEST_F(ResolverTest, GetHostByName_localhost) {
338 constexpr char name[] = "localhost";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900339 constexpr char name_camelcase[] = "LocalHost";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900340 constexpr char addr[] = "127.0.0.1";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900341 constexpr char name_ip6[] = "ip6-localhost";
342 constexpr char addr_ip6[] = "::1";
Bernie Innocenti0298c682018-10-02 23:18:11 +0900343 constexpr char name_ip6_dot[] = "ip6-localhost.";
344 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900345
Bernie Innocenti974233e2018-09-04 20:35:34 +0900346 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900347 constexpr char listen_addr[] = "127.0.0.3";
348 constexpr char listen_srv[] = "53";
349 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
350 ASSERT_TRUE(dns.startServer());
351 std::vector<std::string> servers = {listen_addr};
352 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900353 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900354
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900355 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900356 const hostent* result = gethostbyname(name);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900357 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900358 ASSERT_FALSE(result == nullptr);
359 ASSERT_EQ(4, result->h_length);
360 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
361 EXPECT_EQ(addr, ToString(result));
362 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
363
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900364 // Ensure the hosts file resolver ignores case of hostnames
365 result = gethostbyname(name_camelcase);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900366 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900367 ASSERT_FALSE(result == nullptr);
368 ASSERT_EQ(4, result->h_length);
369 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
370 EXPECT_EQ(addr, ToString(result));
371 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
372
373 // The hosts file also contains ip6-localhost, but gethostbyname() won't
Bernie Innocenti0298c682018-10-02 23:18:11 +0900374 // return it unless the RES_USE_INET6 option is set. This would be easy to
375 // change, but there's no point in changing the legacy behavior; new code
376 // should be calling getaddrinfo() anyway.
377 // So we check the legacy behavior, which results in amusing A-record
378 // lookups for ip6-localhost, with and without search domains appended.
379 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900380 result = gethostbyname(name_ip6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900381 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
382 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
383 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900384 ASSERT_TRUE(result == nullptr);
385
Bernie Innocenti0298c682018-10-02 23:18:11 +0900386 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
387 // the hosts file.
388 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900389 result = gethostbyname2(name_ip6, AF_INET6);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900390 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900391 ASSERT_FALSE(result == nullptr);
392 ASSERT_EQ(16, result->h_length);
393 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
394 EXPECT_EQ(addr_ip6, ToString(result));
395 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
396
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900397 dns.stopServer();
398}
399
Bernie Innocentic1545232018-10-04 17:12:24 +0900400TEST_F(ResolverTest, GetHostByName_numeric) {
401 // Add a dummy nameserver which shouldn't receive any queries
402 constexpr char listen_addr[] = "127.0.0.3";
403 constexpr char listen_srv[] = "53";
404 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
405 ASSERT_TRUE(dns.startServer());
406 ASSERT_TRUE(
407 SetResolversForNetwork({listen_addr}, mDefaultSearchDomains, mDefaultParams_Binder));
408
409 // Numeric v4 address: expect no DNS queries
410 constexpr char numeric_v4[] = "192.168.0.1";
411 dns.clearQueries();
412 const hostent* result = gethostbyname(numeric_v4);
Sehee Park8659b8d2018-11-16 10:53:16 +0900413 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900414 ASSERT_FALSE(result == nullptr);
415 ASSERT_EQ(4, result->h_length); // v4
416 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
417 EXPECT_EQ(numeric_v4, ToString(result));
418 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
419
420 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
421 constexpr char numeric_v6[] = "2001:db8::42";
422 dns.clearQueries();
423 result = gethostbyname(numeric_v6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900424 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900425 EXPECT_TRUE(result == nullptr);
426
427 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
428 dns.clearQueries();
429 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900430 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900431 ASSERT_FALSE(result == nullptr);
432 ASSERT_EQ(16, result->h_length); // v6
433 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
434 EXPECT_EQ(numeric_v6, ToString(result));
435 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
436
437 // Numeric v6 address with scope work with getaddrinfo(),
438 // but gethostbyname2() does not understand them; it issues two dns
439 // queries, then fails. This hardly ever happens, there's no point
440 // in fixing this. This test simply verifies the current (bogus)
441 // behavior to avoid further regressions (like crashes, or leaks).
442 constexpr char numeric_v6_scope[] = "fe80::1%lo";
443 dns.clearQueries();
444 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900445 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Bernie Innocentic1545232018-10-04 17:12:24 +0900446 ASSERT_TRUE(result == nullptr);
447
448 dns.stopServer();
449}
450
Bernie Innocenti443489e2018-08-10 14:27:23 +0900451TEST_F(ResolverTest, BinderSerialization) {
452 using android::net::INetd;
453 std::vector<int> params_offsets = {
454 INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY,
455 INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
456 INetd::RESOLVER_PARAMS_MIN_SAMPLES,
457 INetd::RESOLVER_PARAMS_MAX_SAMPLES,
458 INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
459 };
Bernie Innocenti45238a12018-12-04 14:57:48 +0900460 const int size = static_cast<int>(params_offsets.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900461 EXPECT_EQ(size, INetd::RESOLVER_PARAMS_COUNT);
462 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900463 for (int i = 0; i < size; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900464 EXPECT_EQ(params_offsets[i], i);
465 }
466}
467
468TEST_F(ResolverTest, GetHostByName_Binder) {
469 using android::net::INetd;
470
471 std::vector<std::string> domains = { "example.com" };
472 std::vector<std::unique_ptr<test::DNSResponder>> dns;
473 std::vector<std::string> servers;
474 std::vector<Mapping> mappings;
475 ASSERT_NO_FATAL_FAILURE(SetupMappings(1, domains, &mappings));
476 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(4, mappings, &dns, &servers));
477 ASSERT_EQ(1U, mappings.size());
478 const Mapping& mapping = mappings[0];
479
480 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
481
482 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900483 const size_t total_queries =
484 std::accumulate(dns.begin(), dns.end(), 0, [this, &mapping](size_t total, auto& d) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900485 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
486 });
487
488 EXPECT_LE(1U, total_queries);
489 ASSERT_FALSE(result == nullptr);
490 ASSERT_EQ(4, result->h_length);
491 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
492 EXPECT_EQ(mapping.ip4, ToString(result));
493 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
494
495 std::vector<std::string> res_servers;
496 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900497 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900498 __res_params res_params;
499 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900500 ASSERT_TRUE(
501 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900502 EXPECT_EQ(servers.size(), res_servers.size());
503 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900504 EXPECT_EQ(0U, res_tls_servers.size());
Sehee Park8659b8d2018-11-16 10:53:16 +0900505 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams_Binder.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900506 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY],
507 res_params.sample_validity);
508 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
509 res_params.success_threshold);
510 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
511 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
512 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
513 res_params.base_timeout_msec);
514 EXPECT_EQ(servers.size(), res_stats.size());
515
516 EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
517 EXPECT_TRUE(UnorderedCompareArray(res_domains, domains));
518
519 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
520}
521
522TEST_F(ResolverTest, GetAddrInfo) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900523 const char* listen_addr = "127.0.0.4";
524 const char* listen_addr2 = "127.0.0.5";
525 const char* listen_srv = "53";
526 const char* host_name = "howdy.example.com.";
527 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
528 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
529 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
530 ASSERT_TRUE(dns.startServer());
531
532 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
533 dns2.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
534 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
535 ASSERT_TRUE(dns2.startServer());
536
Bernie Innocenti443489e2018-08-10 14:27:23 +0900537 std::vector<std::string> servers = { listen_addr };
538 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
539 dns.clearQueries();
540 dns2.clearQueries();
541
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900542 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
543 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900544 size_t found = GetNumQueries(dns, host_name);
545 EXPECT_LE(1U, found);
546 // Could be A or AAAA
547 std::string result_str = ToString(result);
548 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
549 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900550
551 // Verify that the name is cached.
552 size_t old_found = found;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900553 result = safe_getaddrinfo("howdy", nullptr, nullptr);
554 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900555 found = GetNumQueries(dns, host_name);
556 EXPECT_LE(1U, found);
557 EXPECT_EQ(old_found, found);
558 result_str = ToString(result);
559 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
560 << result_str;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900561
562 // Change the DNS resolver, ensure that queries are still cached.
563 servers = { listen_addr2 };
564 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
565 dns.clearQueries();
566 dns2.clearQueries();
567
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900568 result = safe_getaddrinfo("howdy", nullptr, nullptr);
569 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900570 found = GetNumQueries(dns, host_name);
571 size_t found2 = GetNumQueries(dns2, host_name);
572 EXPECT_EQ(0U, found);
573 EXPECT_LE(0U, found2);
574
575 // Could be A or AAAA
576 result_str = ToString(result);
577 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
578 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900579
580 dns.stopServer();
581 dns2.stopServer();
582}
583
584TEST_F(ResolverTest, GetAddrInfoV4) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900585 constexpr char listen_addr[] = "127.0.0.5";
586 constexpr char listen_srv[] = "53";
587 constexpr char host_name[] = "hola.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900588 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
589 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.5");
590 ASSERT_TRUE(dns.startServer());
591 std::vector<std::string> servers = { listen_addr };
592 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
593
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900594 addrinfo hints = {.ai_family = AF_INET};
595 ScopedAddrinfo result = safe_getaddrinfo("hola", nullptr, &hints);
596 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900597 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
598 EXPECT_EQ("1.2.3.5", ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900599}
600
601TEST_F(ResolverTest, GetAddrInfo_localhost) {
602 constexpr char name[] = "localhost";
603 constexpr char addr[] = "127.0.0.1";
604 constexpr char name_ip6[] = "ip6-localhost";
605 constexpr char addr_ip6[] = "::1";
606
Bernie Innocenti974233e2018-09-04 20:35:34 +0900607 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900608 constexpr char listen_addr[] = "127.0.0.5";
609 constexpr char listen_srv[] = "53";
610 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
611 ASSERT_TRUE(dns.startServer());
612 std::vector<std::string> servers = {listen_addr};
613 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
614
615 ScopedAddrinfo result = safe_getaddrinfo(name, nullptr, nullptr);
616 EXPECT_TRUE(result != nullptr);
617 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti0298c682018-10-02 23:18:11 +0900618 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900619 EXPECT_EQ(addr, ToString(result));
620
621 result = safe_getaddrinfo(name_ip6, nullptr, nullptr);
622 EXPECT_TRUE(result != nullptr);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900623 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
624 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900625 EXPECT_EQ(addr_ip6, ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900626}
627
Bernie Innocenti443489e2018-08-10 14:27:23 +0900628TEST_F(ResolverTest, MultidomainResolution) {
629 std::vector<std::string> searchDomains = { "example1.com", "example2.com", "example3.com" };
630 const char* listen_addr = "127.0.0.6";
631 const char* listen_srv = "53";
632 const char* host_name = "nihao.example2.com.";
633 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
634 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
635 ASSERT_TRUE(dns.startServer());
636 std::vector<std::string> servers = { listen_addr };
637 ASSERT_TRUE(SetResolversForNetwork(servers, searchDomains, mDefaultParams_Binder));
638
639 dns.clearQueries();
640 const hostent* result = gethostbyname("nihao");
641 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
642 ASSERT_FALSE(result == nullptr);
643 ASSERT_EQ(4, result->h_length);
644 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
645 EXPECT_EQ("1.2.3.3", ToString(result));
646 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
647 dns.stopServer();
648}
649
Bernie Innocenti974233e2018-09-04 20:35:34 +0900650TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
651 constexpr char listen_addr0[] = "127.0.0.7";
652 constexpr char listen_srv[] = "53";
653 constexpr char host_name[] = "ohayou.example.com.";
654 constexpr char numeric_addr[] = "fe80::1%lo";
655
656 test::DNSResponder dns(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
657 dns.setResponseProbability(0.0);
658 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
659 ASSERT_TRUE(dns.startServer());
660 std::vector<std::string> servers = {listen_addr0};
661 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
662
663 addrinfo hints = {.ai_family = AF_INET6};
664 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
665 EXPECT_TRUE(result != nullptr);
666 EXPECT_EQ(numeric_addr, ToString(result));
667 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
668
669 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
670 // We should fail without sending out a DNS query.
671 hints.ai_flags |= AI_NUMERICHOST;
672 result = safe_getaddrinfo(host_name, nullptr, &hints);
673 EXPECT_TRUE(result == nullptr);
674 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
675}
676
Bernie Innocenti443489e2018-08-10 14:27:23 +0900677TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900678 const char* listen_addr0 = "127.0.0.7";
679 const char* listen_addr1 = "127.0.0.8";
680 const char* listen_srv = "53";
681 const char* host_name = "ohayou.example.com.";
682 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
683 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
684 dns0.setResponseProbability(0.0);
685 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
686 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
687 ASSERT_TRUE(dns0.startServer());
688 ASSERT_TRUE(dns1.startServer());
689 std::vector<std::string> servers = { listen_addr0, listen_addr1 };
690 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
691 int sample_count = 8;
692 const std::vector<int> params = { 300, 25, sample_count, sample_count };
693 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, params));
694
695 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
696 // reached the dns0, which is set to fail. No more requests should then arrive at that server
697 // for the next sample_lifetime seconds.
698 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900699 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti45238a12018-12-04 14:57:48 +0900700 for (int i = 0; i < sample_count; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900701 std::string domain = StringPrintf("nonexistent%d", i);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900702 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900703 }
704 // Due to 100% errors for all possible samples, the server should be ignored from now on and
705 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
706 dns0.clearQueries();
707 dns1.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900708 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
709 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900710 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
711 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900712}
713
714TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900715 const char* listen_addr0 = "127.0.0.7";
716 const char* listen_addr1 = "127.0.0.8";
717 const char* listen_srv = "53";
718 const char* host_name1 = "ohayou.example.com.";
719 const char* host_name2 = "ciao.example.com.";
720
721 // dns0 does not respond with 100% probability, while
722 // dns1 responds normally, at least initially.
723 test::DNSResponder dns0(listen_addr0, listen_srv, 250, static_cast<ns_rcode>(-1));
724 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
725 dns0.setResponseProbability(0.0);
726 dns0.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::5");
727 dns1.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::6");
728 dns0.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::5");
729 dns1.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::6");
730 ASSERT_TRUE(dns0.startServer());
731 ASSERT_TRUE(dns1.startServer());
732 std::vector<std::string> servers = {listen_addr0, listen_addr1};
733 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
734
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900735 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900736
737 // dns0 will ignore the request, and we'll fallback to dns1 after the first
738 // retry.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900739 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
740 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900741 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
742 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
743
744 // Now make dns1 also ignore 100% requests... The resolve should alternate
745 // retries between the nameservers and fail after 4 attempts.
746 dns1.setResponseProbability(0.0);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900747 addrinfo* result2 = nullptr;
748 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
749 EXPECT_EQ(nullptr, result2);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900750 EXPECT_EQ(4U, GetNumQueries(dns0, host_name2));
751 EXPECT_EQ(4U, GetNumQueries(dns1, host_name2));
752}
753
754TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
755 const char* listen_addr0 = "127.0.0.9";
756 const char* listen_addr1 = "127.0.0.10";
757 const char* listen_addr2 = "127.0.0.11";
758 const char* listen_srv = "53";
759 const char* host_name = "konbanha.example.com.";
760 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
761 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
762 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
763 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
764 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
765 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::7");
766 ASSERT_TRUE(dns0.startServer());
767 ASSERT_TRUE(dns1.startServer());
768 ASSERT_TRUE(dns2.startServer());
769 const std::vector<std::string> servers = { listen_addr0, listen_addr1, listen_addr2 };
770 std::vector<std::thread> threads(10);
771 for (std::thread& thread : threads) {
772 thread = std::thread([this, &servers]() {
773 unsigned delay = arc4random_uniform(1*1000*1000); // <= 1s
774 usleep(delay);
775 std::vector<std::string> serverSubset;
776 for (const auto& server : servers) {
777 if (arc4random_uniform(2)) {
778 serverSubset.push_back(server);
779 }
780 }
781 if (serverSubset.empty()) serverSubset = servers;
782 ASSERT_TRUE(SetResolversForNetwork(serverSubset, mDefaultSearchDomains,
783 mDefaultParams_Binder));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900784 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900785 addrinfo* result = nullptr;
786 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
787 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
788 if (result) {
789 freeaddrinfo(result);
790 result = nullptr;
791 }
792 });
793 }
794 for (std::thread& thread : threads) {
795 thread.join();
796 }
797}
798
799TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100) {
800 const unsigned num_hosts = 100;
801 const unsigned num_threads = 100;
802 const unsigned num_queries = 100;
803 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
804}
805
806TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100000) {
807 const unsigned num_hosts = 100000;
808 const unsigned num_threads = 100;
809 const unsigned num_queries = 100;
810 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
811}
812
813TEST_F(ResolverTest, EmptySetup) {
814 using android::net::INetd;
815 std::vector<std::string> servers;
816 std::vector<std::string> domains;
817 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
818 std::vector<std::string> res_servers;
819 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900820 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900821 __res_params res_params;
822 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900823 ASSERT_TRUE(
824 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900825 EXPECT_EQ(0U, res_servers.size());
826 EXPECT_EQ(0U, res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900827 EXPECT_EQ(0U, res_tls_servers.size());
Sehee Park8659b8d2018-11-16 10:53:16 +0900828 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams_Binder.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900829 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY],
830 res_params.sample_validity);
831 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
832 res_params.success_threshold);
833 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
834 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
835 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
836 res_params.base_timeout_msec);
837}
838
839TEST_F(ResolverTest, SearchPathChange) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900840 const char* listen_addr = "127.0.0.13";
841 const char* listen_srv = "53";
842 const char* host_name1 = "test13.domain1.org.";
843 const char* host_name2 = "test13.domain2.org.";
844 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
845 dns.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::13");
846 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13");
847 ASSERT_TRUE(dns.startServer());
848 std::vector<std::string> servers = { listen_addr };
849 std::vector<std::string> domains = { "domain1.org" };
850 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
851
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900852 const addrinfo hints = {.ai_family = AF_INET6};
853 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
854 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900855 EXPECT_EQ(1U, dns.queries().size());
856 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
857 EXPECT_EQ("2001:db8::13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900858
859 // Test that changing the domain search path on its own works.
860 domains = { "domain2.org" };
861 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
862 dns.clearQueries();
863
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900864 result = safe_getaddrinfo("test13", nullptr, &hints);
865 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900866 EXPECT_EQ(1U, dns.queries().size());
867 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
868 EXPECT_EQ("2001:db8::1:13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900869}
870
Bernie Innocenti443489e2018-08-10 14:27:23 +0900871static std::string base64Encode(const std::vector<uint8_t>& input) {
872 size_t out_len;
873 EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));
874 // out_len includes the trailing NULL.
875 uint8_t output_bytes[out_len];
876 EXPECT_EQ(out_len - 1, EVP_EncodeBlock(output_bytes, input.data(), input.size()));
877 return std::string(reinterpret_cast<char*>(output_bytes));
878}
879
Mike Yuda77e8e2018-11-26 13:26:21 +0900880// If we move this function to dns_responder_client, it will complicate the dependency need of
881// dns_tls_frontend.h.
882static void setupTlsServers(const std::vector<std::string>& servers,
883 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls,
884 std::vector<std::string>* fingerprints) {
885 const char* listen_udp = "53";
886 const char* listen_tls = "853";
887
888 for (const auto& server : servers) {
889 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
890 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
891 t->startServer();
892 fingerprints->push_back(base64Encode(t->fingerprint()));
893 tls->push_back(std::move(t));
894 }
895}
896
897static void shutdownTlsServers(std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
898 for (const auto& t : *tls) {
899 t->stopServer();
900 }
901 tls->clear();
902}
903
904TEST_F(ResolverTest, MaxServerPrune_Binder) {
905 using android::net::INetd;
906
907 std::vector<std::string> domains;
908 std::vector<std::unique_ptr<test::DNSResponder>> dns;
909 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
910 std::vector<std::string> servers;
911 std::vector<std::string> fingerprints;
912 std::vector<Mapping> mappings;
913
914 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
915 domains.push_back(StringPrintf("example%u.com", i));
916 }
917 ASSERT_NO_FATAL_FAILURE(SetupMappings(1, domains, &mappings));
918 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
919 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls, &fingerprints));
920
921 ASSERT_TRUE(SetResolversWithTls(servers, domains, mDefaultParams_Binder, "", fingerprints));
922
923 std::vector<std::string> res_servers;
924 std::vector<std::string> res_domains;
925 std::vector<std::string> res_tls_servers;
926 __res_params res_params;
927 std::vector<ResolverStats> res_stats;
928 ASSERT_TRUE(
929 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
930
931 // Check the size of the stats and its contents.
932 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
933 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
934 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
935 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
936 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
937 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
938
939 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
940 ASSERT_NO_FATAL_FAILURE(shutdownTlsServers(&tls));
941}
942
943TEST_F(ResolverTest, ResolverStats) {
944 const char* listen_addr1 = "127.0.0.4";
945 const char* listen_addr2 = "127.0.0.5";
946 const char* listen_addr3 = "127.0.0.6";
947 const char* listen_srv = "53";
948 const char* host_name = "hello.example.com.";
949
950 // Set server 1 timeout.
951 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
952 dns1.setResponseProbability(0.0);
953 ASSERT_TRUE(dns1.startServer());
954
955 // Set server 2 responding server failure.
956 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
957 dns2.setResponseProbability(0.0);
958 ASSERT_TRUE(dns2.startServer());
959
960 // Set server 3 workable.
961 test::DNSResponder dns3(listen_addr3, listen_srv, 250, ns_rcode::ns_r_servfail);
962 dns3.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
963 ASSERT_TRUE(dns3.startServer());
964
965 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
966 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
967
968 dns3.clearQueries();
969 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
970 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
971 size_t found = GetNumQueries(dns3, host_name);
972 EXPECT_LE(1U, found);
973 std::string result_str = ToString(result);
974 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
975
976 std::vector<std::string> res_servers;
977 std::vector<std::string> res_domains;
978 std::vector<std::string> res_tls_servers;
979 __res_params res_params;
980 std::vector<ResolverStats> res_stats;
981 ASSERT_TRUE(
982 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
983
984 EXPECT_EQ(1, res_stats[0].timeouts);
985 EXPECT_EQ(1, res_stats[1].errors);
986 EXPECT_EQ(1, res_stats[2].successes);
987
988 dns1.stopServer();
989 dns2.stopServer();
990 dns3.stopServer();
991}
992
Bernie Innocenti443489e2018-08-10 14:27:23 +0900993// Test what happens if the specified TLS server is nonexistent.
994TEST_F(ResolverTest, GetHostByName_TlsMissing) {
995 const char* listen_addr = "127.0.0.3";
996 const char* listen_srv = "53";
997 const char* host_name = "tlsmissing.example.com.";
998 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
999 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
1000 ASSERT_TRUE(dns.startServer());
1001 std::vector<std::string> servers = { listen_addr };
1002
1003 // There's nothing listening on this address, so validation will either fail or
1004 /// hang. Either way, queries will continue to flow to the DNSResponder.
1005 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1006
1007 const hostent* result;
1008
1009 result = gethostbyname("tlsmissing");
1010 ASSERT_FALSE(result == nullptr);
1011 EXPECT_EQ("1.2.3.3", ToString(result));
1012
1013 // Clear TLS bit.
1014 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1015 dns.stopServer();
1016}
1017
1018// Test what happens if the specified TLS server replies with garbage.
1019TEST_F(ResolverTest, GetHostByName_TlsBroken) {
1020 const char* listen_addr = "127.0.0.3";
1021 const char* listen_srv = "53";
1022 const char* host_name1 = "tlsbroken1.example.com.";
1023 const char* host_name2 = "tlsbroken2.example.com.";
1024 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1025 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1026 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1027 ASSERT_TRUE(dns.startServer());
1028 std::vector<std::string> servers = { listen_addr };
1029
1030 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1031 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1032 ASSERT_TRUE(s >= 0);
1033 struct sockaddr_in tlsServer = {
1034 .sin_family = AF_INET,
1035 .sin_port = htons(853),
1036 };
1037 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
Bernie Innocenti6f9fd902018-10-11 20:50:23 +09001038 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1039 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001040 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1041 ASSERT_FALSE(listen(s, 1));
1042
1043 // Trigger TLS validation.
1044 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1045
1046 struct sockaddr_storage cliaddr;
1047 socklen_t sin_size = sizeof(cliaddr);
1048 int new_fd = accept4(s, reinterpret_cast<struct sockaddr *>(&cliaddr), &sin_size, SOCK_CLOEXEC);
1049 ASSERT_TRUE(new_fd > 0);
1050
1051 // We've received the new file descriptor but not written to it or closed, so the
1052 // validation is still pending. Queries should still flow correctly because the
1053 // server is not used until validation succeeds.
1054 const hostent* result;
1055 result = gethostbyname("tlsbroken1");
1056 ASSERT_FALSE(result == nullptr);
1057 EXPECT_EQ("1.2.3.1", ToString(result));
1058
1059 // Now we cause the validation to fail.
1060 std::string garbage = "definitely not a valid TLS ServerHello";
1061 write(new_fd, garbage.data(), garbage.size());
1062 close(new_fd);
1063
1064 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1065 // to the TLS server unless validation succeeds.
1066 result = gethostbyname("tlsbroken2");
1067 ASSERT_FALSE(result == nullptr);
1068 EXPECT_EQ("1.2.3.2", ToString(result));
1069
1070 // Clear TLS bit.
1071 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1072 dns.stopServer();
1073 close(s);
1074}
1075
1076TEST_F(ResolverTest, GetHostByName_Tls) {
1077 const char* listen_addr = "127.0.0.3";
1078 const char* listen_udp = "53";
1079 const char* listen_tls = "853";
1080 const char* host_name1 = "tls1.example.com.";
1081 const char* host_name2 = "tls2.example.com.";
1082 const char* host_name3 = "tls3.example.com.";
1083 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1084 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1085 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1086 dns.addMapping(host_name3, ns_type::ns_t_a, "1.2.3.3");
1087 ASSERT_TRUE(dns.startServer());
1088 std::vector<std::string> servers = { listen_addr };
1089
1090 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1091 ASSERT_TRUE(tls.startServer());
1092 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1093
1094 const hostent* result;
1095
1096 // Wait for validation to complete.
1097 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1098
1099 result = gethostbyname("tls1");
1100 ASSERT_FALSE(result == nullptr);
1101 EXPECT_EQ("1.2.3.1", ToString(result));
1102
1103 // Wait for query to get counted.
1104 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1105
1106 // Stop the TLS server. Since we're in opportunistic mode, queries will
1107 // fall back to the locally-assigned (clear text) nameservers.
1108 tls.stopServer();
1109
1110 dns.clearQueries();
1111 result = gethostbyname("tls2");
1112 EXPECT_FALSE(result == nullptr);
1113 EXPECT_EQ("1.2.3.2", ToString(result));
1114 const auto queries = dns.queries();
1115 EXPECT_EQ(1U, queries.size());
1116 EXPECT_EQ("tls2.example.com.", queries[0].first);
1117 EXPECT_EQ(ns_t_a, queries[0].second);
1118
1119 // Reset the resolvers without enabling TLS. Queries should still be routed
1120 // to the UDP endpoint.
1121 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1122
1123 result = gethostbyname("tls3");
1124 ASSERT_FALSE(result == nullptr);
1125 EXPECT_EQ("1.2.3.3", ToString(result));
1126
1127 dns.stopServer();
1128}
1129
1130TEST_F(ResolverTest, GetHostByName_TlsFingerprint) {
1131 const char* listen_addr = "127.0.0.3";
1132 const char* listen_udp = "53";
1133 const char* listen_tls = "853";
1134 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1135 ASSERT_TRUE(dns.startServer());
1136 for (int chain_length = 1; chain_length <= 3; ++chain_length) {
Bernie Innocentif2572392018-10-02 19:04:56 +09001137 std::string host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001138 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1139 std::vector<std::string> servers = { listen_addr };
1140
1141 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1142 tls.set_chain_length(chain_length);
1143 ASSERT_TRUE(tls.startServer());
1144 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1145 { base64Encode(tls.fingerprint()) }));
1146
1147 const hostent* result;
1148
1149 // Wait for validation to complete.
1150 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1151
1152 result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
1153 EXPECT_FALSE(result == nullptr);
1154 if (result) {
1155 EXPECT_EQ("1.2.3.1", ToString(result));
1156
1157 // Wait for query to get counted.
1158 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1159 }
1160
1161 // Clear TLS bit to ensure revalidation.
1162 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1163 tls.stopServer();
1164 }
1165 dns.stopServer();
1166}
1167
1168TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {
1169 const char* listen_addr = "127.0.0.3";
1170 const char* listen_udp = "53";
1171 const char* listen_tls = "853";
1172 const char* host_name = "badtlsfingerprint.example.com.";
1173 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1174 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1175 ASSERT_TRUE(dns.startServer());
1176 std::vector<std::string> servers = { listen_addr };
1177
1178 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1179 ASSERT_TRUE(tls.startServer());
1180 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1181 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
1182 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1183 { base64Encode(bad_fingerprint) }));
1184
1185 // The initial validation should fail at the fingerprint check before
1186 // issuing a query.
1187 EXPECT_FALSE(tls.waitForQueries(1, 500));
1188
1189 // A fingerprint was provided and failed to match, so the query should fail.
1190 EXPECT_EQ(nullptr, gethostbyname("badtlsfingerprint"));
1191
1192 // Clear TLS bit.
1193 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1194 tls.stopServer();
1195 dns.stopServer();
1196}
1197
1198// Test that we can pass two different fingerprints, and connection succeeds as long as
1199// at least one of them matches the server.
1200TEST_F(ResolverTest, GetHostByName_TwoTlsFingerprints) {
1201 const char* listen_addr = "127.0.0.3";
1202 const char* listen_udp = "53";
1203 const char* listen_tls = "853";
1204 const char* host_name = "twotlsfingerprints.example.com.";
1205 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1206 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1207 ASSERT_TRUE(dns.startServer());
1208 std::vector<std::string> servers = { listen_addr };
1209
1210 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1211 ASSERT_TRUE(tls.startServer());
1212 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1213 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
1214 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1215 { base64Encode(bad_fingerprint), base64Encode(tls.fingerprint()) }));
1216
1217 const hostent* result;
1218
1219 // Wait for validation to complete.
1220 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1221
1222 result = gethostbyname("twotlsfingerprints");
1223 ASSERT_FALSE(result == nullptr);
1224 EXPECT_EQ("1.2.3.1", ToString(result));
1225
1226 // Wait for query to get counted.
1227 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1228
1229 // Clear TLS bit.
1230 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1231 tls.stopServer();
1232 dns.stopServer();
1233}
1234
1235TEST_F(ResolverTest, GetHostByName_TlsFingerprintGoesBad) {
1236 const char* listen_addr = "127.0.0.3";
1237 const char* listen_udp = "53";
1238 const char* listen_tls = "853";
1239 const char* host_name1 = "tlsfingerprintgoesbad1.example.com.";
1240 const char* host_name2 = "tlsfingerprintgoesbad2.example.com.";
1241 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1242 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1243 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1244 ASSERT_TRUE(dns.startServer());
1245 std::vector<std::string> servers = { listen_addr };
1246
1247 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1248 ASSERT_TRUE(tls.startServer());
1249 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1250 { base64Encode(tls.fingerprint()) }));
1251
1252 const hostent* result;
1253
1254 // Wait for validation to complete.
1255 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1256
1257 result = gethostbyname("tlsfingerprintgoesbad1");
1258 ASSERT_FALSE(result == nullptr);
1259 EXPECT_EQ("1.2.3.1", ToString(result));
1260
1261 // Wait for query to get counted.
1262 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1263
1264 // Restart the TLS server. This will generate a new certificate whose fingerprint
1265 // no longer matches the stored fingerprint.
1266 tls.stopServer();
1267 tls.startServer();
1268
1269 result = gethostbyname("tlsfingerprintgoesbad2");
1270 ASSERT_TRUE(result == nullptr);
1271 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
1272
1273 // Clear TLS bit.
1274 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1275 tls.stopServer();
1276 dns.stopServer();
1277}
1278
1279TEST_F(ResolverTest, GetHostByName_TlsFailover) {
1280 const char* listen_addr1 = "127.0.0.3";
1281 const char* listen_addr2 = "127.0.0.4";
1282 const char* listen_udp = "53";
1283 const char* listen_tls = "853";
1284 const char* host_name1 = "tlsfailover1.example.com.";
1285 const char* host_name2 = "tlsfailover2.example.com.";
1286 test::DNSResponder dns1(listen_addr1, listen_udp, 250, ns_rcode::ns_r_servfail);
1287 test::DNSResponder dns2(listen_addr2, listen_udp, 250, ns_rcode::ns_r_servfail);
1288 dns1.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1289 dns1.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1290 dns2.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.3");
1291 dns2.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
1292 ASSERT_TRUE(dns1.startServer());
1293 ASSERT_TRUE(dns2.startServer());
1294 std::vector<std::string> servers = { listen_addr1, listen_addr2 };
1295
1296 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1297 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1298 ASSERT_TRUE(tls1.startServer());
1299 ASSERT_TRUE(tls2.startServer());
1300 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1301 { base64Encode(tls1.fingerprint()), base64Encode(tls2.fingerprint()) }));
1302
1303 const hostent* result;
1304
1305 // Wait for validation to complete.
1306 EXPECT_TRUE(tls1.waitForQueries(1, 5000));
1307 EXPECT_TRUE(tls2.waitForQueries(1, 5000));
1308
1309 result = gethostbyname("tlsfailover1");
1310 ASSERT_FALSE(result == nullptr);
1311 EXPECT_EQ("1.2.3.1", ToString(result));
1312
1313 // Wait for query to get counted.
1314 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1315 // No new queries should have reached tls2.
1316 EXPECT_EQ(1, tls2.queries());
1317
1318 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1319 tls1.stopServer();
1320
1321 result = gethostbyname("tlsfailover2");
1322 EXPECT_EQ("1.2.3.4", ToString(result));
1323
1324 // Wait for query to get counted.
1325 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1326
1327 // No additional queries should have reached the insecure servers.
1328 EXPECT_EQ(2U, dns1.queries().size());
1329 EXPECT_EQ(2U, dns2.queries().size());
1330
1331 // Clear TLS bit.
1332 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1333 tls2.stopServer();
1334 dns1.stopServer();
1335 dns2.stopServer();
1336}
1337
1338TEST_F(ResolverTest, GetHostByName_BadTlsName) {
1339 const char* listen_addr = "127.0.0.3";
1340 const char* listen_udp = "53";
1341 const char* listen_tls = "853";
1342 const char* host_name = "badtlsname.example.com.";
1343 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1344 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1345 ASSERT_TRUE(dns.startServer());
1346 std::vector<std::string> servers = { listen_addr };
1347
1348 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1349 ASSERT_TRUE(tls.startServer());
1350 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
1351 "www.example.com", {}));
1352
1353 // The TLS server's certificate doesn't chain to a known CA, and a nonempty name was specified,
1354 // so the client should fail the TLS handshake before ever issuing a query.
1355 EXPECT_FALSE(tls.waitForQueries(1, 500));
1356
1357 // The query should fail hard, because a name was specified.
1358 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1359
1360 // Clear TLS bit.
1361 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1362 tls.stopServer();
1363 dns.stopServer();
1364}
1365
1366TEST_F(ResolverTest, GetAddrInfo_Tls) {
1367 const char* listen_addr = "127.0.0.3";
1368 const char* listen_udp = "53";
1369 const char* listen_tls = "853";
1370 const char* host_name = "addrinfotls.example.com.";
1371 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1372 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1373 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1374 ASSERT_TRUE(dns.startServer());
1375 std::vector<std::string> servers = { listen_addr };
1376
1377 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1378 ASSERT_TRUE(tls.startServer());
1379 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1380 { base64Encode(tls.fingerprint()) }));
1381
1382 // Wait for validation to complete.
1383 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1384
1385 dns.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001386 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1387 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001388 size_t found = GetNumQueries(dns, host_name);
1389 EXPECT_LE(1U, found);
1390 // Could be A or AAAA
1391 std::string result_str = ToString(result);
1392 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
1393 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001394 // Wait for both A and AAAA queries to get counted.
1395 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1396
1397 // Clear TLS bit.
1398 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1399 tls.stopServer();
1400 dns.stopServer();
1401}
1402
1403TEST_F(ResolverTest, TlsBypass) {
1404 const char OFF[] = "off";
1405 const char OPPORTUNISTIC[] = "opportunistic";
1406 const char STRICT[] = "strict";
1407
1408 const char GETHOSTBYNAME[] = "gethostbyname";
1409 const char GETADDRINFO[] = "getaddrinfo";
1410 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1411
1412 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1413
Mike Yu5ae61542018-10-19 22:11:43 +08001414 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001415
1416 const char ADDR4[] = "192.0.2.1";
1417 const char ADDR6[] = "2001:db8::1";
1418
1419 const char cleartext_addr[] = "127.0.0.53";
1420 const char cleartext_port[] = "53";
1421 const char tls_port[] = "853";
1422 const std::vector<std::string> servers = { cleartext_addr };
1423
1424 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1425 ASSERT_TRUE(dns.startServer());
1426
1427 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
1428
1429 struct TestConfig {
1430 const std::string mode;
1431 const bool withWorkingTLS;
1432 const std::string method;
1433
1434 std::string asHostName() const {
1435 return StringPrintf("%s.%s.%s.",
1436 mode.c_str(),
1437 withWorkingTLS ? "tlsOn" : "tlsOff",
1438 method.c_str());
1439 }
1440 } testConfigs[]{
1441 {OFF, false, GETHOSTBYNAME},
1442 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1443 {STRICT, false, GETHOSTBYNAME},
1444 {OFF, true, GETHOSTBYNAME},
1445 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1446 {STRICT, true, GETHOSTBYNAME},
1447 {OFF, false, GETADDRINFO},
1448 {OPPORTUNISTIC, false, GETADDRINFO},
1449 {STRICT, false, GETADDRINFO},
1450 {OFF, true, GETADDRINFO},
1451 {OPPORTUNISTIC, true, GETADDRINFO},
1452 {STRICT, true, GETADDRINFO},
1453 {OFF, false, GETADDRINFOFORNET},
1454 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1455 {STRICT, false, GETADDRINFOFORNET},
1456 {OFF, true, GETADDRINFOFORNET},
1457 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1458 {STRICT, true, GETADDRINFOFORNET},
1459 };
1460
1461 for (const auto& config : testConfigs) {
1462 const std::string testHostName = config.asHostName();
1463 SCOPED_TRACE(testHostName);
1464
1465 // Don't tempt test bugs due to caching.
1466 const char* host_name = testHostName.c_str();
1467 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1468 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1469
1470 if (config.withWorkingTLS) ASSERT_TRUE(tls.startServer());
1471
1472 if (config.mode == OFF) {
1473 ASSERT_TRUE(SetResolversForNetwork(
1474 servers, mDefaultSearchDomains, mDefaultParams_Binder));
1475 } else if (config.mode == OPPORTUNISTIC) {
1476 ASSERT_TRUE(SetResolversWithTls(
1477 servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1478 // Wait for validation to complete.
1479 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1480 } else if (config.mode == STRICT) {
1481 // We use the existence of fingerprints to trigger strict mode,
1482 // rather than hostname validation.
1483 const auto& fingerprint =
1484 (config.withWorkingTLS) ? tls.fingerprint() : NOOP_FINGERPRINT;
1485 ASSERT_TRUE(SetResolversWithTls(
1486 servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1487 { base64Encode(fingerprint) }));
1488 // Wait for validation to complete.
1489 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1490 } else {
1491 FAIL() << "Unsupported Private DNS mode: " << config.mode;
1492 }
1493
1494 const int tlsQueriesBefore = tls.queries();
1495
1496 const hostent* h_result = nullptr;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001497 ScopedAddrinfo ai_result;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001498
1499 if (config.method == GETHOSTBYNAME) {
1500 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1501 h_result = gethostbyname(host_name);
1502
1503 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1504 ASSERT_FALSE(h_result == nullptr);
1505 ASSERT_EQ(4, h_result->h_length);
1506 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1507 EXPECT_EQ(ADDR4, ToString(h_result));
1508 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1509 } else if (config.method == GETADDRINFO) {
1510 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001511 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1512 EXPECT_TRUE(ai_result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001513
1514 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1515 // Could be A or AAAA
1516 const std::string result_str = ToString(ai_result);
1517 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1518 << ", result_str='" << result_str << "'";
1519 } else if (config.method == GETADDRINFOFORNET) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001520 addrinfo* raw_ai_result = nullptr;
Bernie Innocentic165ce82018-10-16 23:35:28 +09001521 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1522 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1523 &raw_ai_result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001524 ai_result.reset(raw_ai_result);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001525
1526 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1527 // Could be A or AAAA
1528 const std::string result_str = ToString(ai_result);
1529 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1530 << ", result_str='" << result_str << "'";
1531 } else {
1532 FAIL() << "Unsupported query method: " << config.method;
1533 }
1534
1535 const int tlsQueriesAfter = tls.queries();
1536 EXPECT_EQ(0, tlsQueriesAfter - tlsQueriesBefore);
1537
Bernie Innocenti443489e2018-08-10 14:27:23 +09001538 // Clear per-process resolv netid.
1539 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
1540 tls.stopServer();
1541 dns.clearQueries();
1542 }
1543
1544 dns.stopServer();
1545}
1546
1547TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Mike Yu5ae61542018-10-19 22:11:43 +08001548 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001549 const char cleartext_addr[] = "127.0.0.53";
1550 const char cleartext_port[] = "53";
1551 const std::vector<std::string> servers = { cleartext_addr };
1552
1553 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1554 const char* host_name = "strictmode.notlsips.example.com.";
1555 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1556 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1557 ASSERT_TRUE(dns.startServer());
1558
1559 ASSERT_TRUE(SetResolversWithTls(
1560 servers, mDefaultSearchDomains, mDefaultParams_Binder,
1561 {}, "", { base64Encode(NOOP_FINGERPRINT) }));
1562
1563 addrinfo* ai_result = nullptr;
1564 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1565 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1566}
Luke Huangc68f1b92018-11-21 20:13:38 +08001567
1568namespace {
1569
1570int getAsyncResponse(int fd, int* rcode, u_char* buf, int bufLen) {
1571 struct pollfd wait_fd[1];
1572 wait_fd[0].fd = fd;
1573 wait_fd[0].events = POLLIN;
1574 short revents;
1575 int ret;
1576
1577 ret = poll(wait_fd, 1, -1);
1578 revents = wait_fd[0].revents;
1579 if (revents & POLLIN) {
1580 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang952d0942018-12-26 16:53:03 +08001581 // Verify that resNetworkResult() closed the fd
1582 char dummy;
1583 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1584 EXPECT_EQ(EBADF, errno);
Luke Huangc68f1b92018-11-21 20:13:38 +08001585 return n;
1586 }
1587 return -1;
1588}
1589
1590std::string toString(u_char* buf, int bufLen, int ipType) {
1591 ns_msg handle;
1592 int ancount, n = 0;
1593 ns_rr rr;
1594
1595 if (ns_initparse((const uint8_t*) buf, bufLen, &handle) >= 0) {
1596 ancount = ns_msg_count(handle, ns_s_an);
1597 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
1598 const u_char* rdata = ns_rr_rdata(rr);
1599 char buffer[INET6_ADDRSTRLEN];
1600 if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
1601 return buffer;
1602 }
1603 }
1604 }
1605 return "";
1606}
1607
1608int dns_open_proxy() {
1609 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1610 if (s == -1) {
1611 return -1;
1612 }
1613 const int one = 1;
1614 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1615
1616 static const struct sockaddr_un proxy_addr = {
1617 .sun_family = AF_UNIX,
1618 .sun_path = "/dev/socket/dnsproxyd",
1619 };
1620
1621 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) !=
1622 0) {
1623 close(s);
1624 return -1;
1625 }
1626
1627 return s;
1628}
1629
Luke Huang952d0942018-12-26 16:53:03 +08001630void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1631 int rcode = -1;
1632 uint8_t buf[MAXPACKET] = {};
1633
1634 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1635 EXPECT_GT(res, 0);
1636 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1637}
1638
1639void expectAnswersNotValid(int fd, int expectedErrno) {
1640 int rcode = -1;
1641 uint8_t buf[MAXPACKET] = {};
1642
1643 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1644 EXPECT_EQ(expectedErrno, res);
1645}
1646
Luke Huangc68f1b92018-11-21 20:13:38 +08001647} // namespace
1648
1649TEST_F(ResolverTest, Async_NormalQueryV4V6) {
1650 const char listen_addr[] = "127.0.0.4";
1651 const char listen_srv[] = "53";
1652 const char host_name[] = "howdy.example.com.";
1653 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1654 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1655 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1656 ASSERT_TRUE(dns.startServer());
1657 std::vector<std::string> servers = {listen_addr};
1658 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1659 dns.clearQueries();
1660
Luke Huang952d0942018-12-26 16:53:03 +08001661 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1662 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001663 EXPECT_TRUE(fd1 != -1);
1664 EXPECT_TRUE(fd2 != -1);
1665
1666 u_char buf[MAXPACKET] = {};
1667 int rcode;
1668 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1669 EXPECT_GT(res, 0);
1670 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1671
1672 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1673 EXPECT_GT(res, 0);
1674 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1675
1676 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1677
1678 // Re-query verify cache works
Luke Huang952d0942018-12-26 16:53:03 +08001679 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1680 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001681
1682 EXPECT_TRUE(fd1 != -1);
1683 EXPECT_TRUE(fd2 != -1);
1684
1685 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1686 EXPECT_GT(res, 0);
1687 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1688
1689 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1690 EXPECT_GT(res, 0);
1691 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1692
1693 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1694}
1695
1696TEST_F(ResolverTest, Async_BadQuery) {
1697 const char listen_addr[] = "127.0.0.4";
1698 const char listen_srv[] = "53";
1699 const char host_name[] = "howdy.example.com.";
1700 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1701 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1702 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1703 ASSERT_TRUE(dns.startServer());
1704 std::vector<std::string> servers = {listen_addr};
1705 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1706 dns.clearQueries();
1707
1708 static struct {
1709 int fd;
1710 const char* dname;
1711 const int queryType;
1712 const int expectRcode;
1713 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001714 {-1, "", ns_t_aaaa, 0},
1715 {-1, "as65ass46", ns_t_aaaa, 0},
1716 {-1, "454564564564", ns_t_aaaa, 0},
1717 {-1, "h645235", ns_t_a, 0},
1718 {-1, "www.google.com", ns_t_a, 0},
Luke Huangc68f1b92018-11-21 20:13:38 +08001719 };
1720
1721 for (auto& td : kTestData) {
1722 SCOPED_TRACE(td.dname);
Luke Huang952d0942018-12-26 16:53:03 +08001723 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001724 EXPECT_TRUE(td.fd != -1);
1725 }
1726
1727 // dns_responder return empty resp(packet only contains query part) with no error currently
1728 for (const auto& td : kTestData) {
1729 u_char buf[MAXPACKET] = {};
1730 int rcode;
1731 SCOPED_TRACE(td.dname);
1732 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1733 EXPECT_GT(res, 0);
1734 EXPECT_EQ(rcode, td.expectRcode);
1735 }
1736}
1737
1738TEST_F(ResolverTest, Async_EmptyAnswer) {
1739 const char listen_addr[] = "127.0.0.4";
1740 const char listen_srv[] = "53";
1741 const char host_name[] = "howdy.example.com.";
1742 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1743 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1744 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1745 ASSERT_TRUE(dns.startServer());
1746 std::vector<std::string> servers = {listen_addr};
1747 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1748 dns.clearQueries();
1749
Luke Huang26a0e2a2018-12-18 16:44:41 +08001750 // TODO: Disable retry to make this test explicit.
1751 auto& cv = dns.getCv();
1752 auto& cvMutex = dns.getCvMutex();
1753 int fd1;
1754 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1755 {
1756 std::unique_lock lk(cvMutex);
Luke Huang952d0942018-12-26 16:53:03 +08001757 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001758 EXPECT_TRUE(fd1 != -1);
1759 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
1760 }
Luke Huangc68f1b92018-11-21 20:13:38 +08001761
Luke Huangc68f1b92018-11-21 20:13:38 +08001762 dns.setResponseProbability(0.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001763
Luke Huang952d0942018-12-26 16:53:03 +08001764 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001765 EXPECT_TRUE(fd2 != -1);
1766
Luke Huang952d0942018-12-26 16:53:03 +08001767 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001768 EXPECT_TRUE(fd3 != -1);
1769
Luke Huang26a0e2a2018-12-18 16:44:41 +08001770 uint8_t buf[MAXPACKET] = {};
Luke Huangc68f1b92018-11-21 20:13:38 +08001771 int rcode;
1772
Luke Huang26a0e2a2018-12-18 16:44:41 +08001773 // expect no response
1774 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
1775 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001776
Luke Huang26a0e2a2018-12-18 16:44:41 +08001777 // expect no response
Luke Huangc68f1b92018-11-21 20:13:38 +08001778 memset(buf, 0, MAXPACKET);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001779 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1780 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001781
Luke Huangc68f1b92018-11-21 20:13:38 +08001782 dns.setResponseProbability(1.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001783
Luke Huang952d0942018-12-26 16:53:03 +08001784 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001785 EXPECT_TRUE(fd4 != -1);
1786
1787 memset(buf, 0, MAXPACKET);
1788 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
1789 EXPECT_GT(res, 0);
1790 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1791
1792 memset(buf, 0, MAXPACKET);
1793 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1794 EXPECT_GT(res, 0);
1795 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1796}
1797
1798TEST_F(ResolverTest, Async_MalformedQuery) {
1799 const char listen_addr[] = "127.0.0.4";
1800 const char listen_srv[] = "53";
1801 const char host_name[] = "howdy.example.com.";
1802 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1803 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1804 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1805 ASSERT_TRUE(dns.startServer());
1806 std::vector<std::string> servers = {listen_addr};
1807 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1808 dns.clearQueries();
1809
1810 int fd = dns_open_proxy();
1811 EXPECT_TRUE(fd > 0);
1812
1813 const std::string badMsg = "16-52512#";
1814 static struct {
1815 const std::string cmd;
1816 const int expectErr;
1817 } kTestData[] = {
Luke Huang952d0942018-12-26 16:53:03 +08001818 // Too few arguments
Luke Huangc68f1b92018-11-21 20:13:38 +08001819 {"resnsend " + badMsg + '\0', -EINVAL},
1820 // Bad netId
Luke Huang952d0942018-12-26 16:53:03 +08001821 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huangc68f1b92018-11-21 20:13:38 +08001822 // Bad raw data
Luke Huang952d0942018-12-26 16:53:03 +08001823 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huangc68f1b92018-11-21 20:13:38 +08001824 };
1825
1826 for (unsigned int i = 0; i < std::size(kTestData); i++) {
1827 auto& td = kTestData[i];
1828 SCOPED_TRACE(td.cmd);
1829 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
1830 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
1831
1832 int32_t tmp;
1833 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
1834 EXPECT_TRUE(rc > 0);
1835 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
1836 }
1837 // Normal query with answer buffer
1838 // This is raw data of query "howdy.example.com" type 1 class 1
1839 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huang952d0942018-12-26 16:53:03 +08001840 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huangc68f1b92018-11-21 20:13:38 +08001841 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1842 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1843
1844 u_char smallBuf[1] = {};
1845 int rcode;
1846 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huang952d0942018-12-26 16:53:03 +08001847 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huangc68f1b92018-11-21 20:13:38 +08001848
1849 // Do the normal test with large buffer again
1850 fd = dns_open_proxy();
1851 EXPECT_TRUE(fd > 0);
1852 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1853 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1854 u_char buf[MAXPACKET] = {};
1855 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1856 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu5b9ffb22018-12-02 17:54:29 +09001857}
1858
Luke Huang952d0942018-12-26 16:53:03 +08001859TEST_F(ResolverTest, Async_CacheFlags) {
1860 const char listen_addr[] = "127.0.0.4";
1861 const char listen_srv[] = "53";
1862 const char host_name[] = "howdy.example.com.";
1863 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1864 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1865 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1866 ASSERT_TRUE(dns.startServer());
1867 std::vector<std::string> servers = {listen_addr};
1868 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1869 dns.clearQueries();
1870
1871 // ANDROID_RESOLV_NO_CACHE_STORE
1872 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1873 ANDROID_RESOLV_NO_CACHE_STORE);
1874 EXPECT_TRUE(fd1 != -1);
1875 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1876 ANDROID_RESOLV_NO_CACHE_STORE);
1877 EXPECT_TRUE(fd2 != -1);
1878 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1879 ANDROID_RESOLV_NO_CACHE_STORE);
1880 EXPECT_TRUE(fd3 != -1);
1881
1882 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
1883 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1884 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1885
1886 // No cache exists, expect 3 queries
1887 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
1888
1889 // Re-query and cache
1890 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1891
1892 EXPECT_TRUE(fd1 != -1);
1893
1894 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1895
1896 // Now we have cache, expect 4 queries
1897 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1898
1899 // ANDROID_RESOLV_NO_CACHE_LOOKUP
1900 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1901 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1902 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1903 ANDROID_RESOLV_NO_CACHE_LOOKUP);
1904
1905 EXPECT_TRUE(fd1 != -1);
1906 EXPECT_TRUE(fd2 != -1);
1907
1908 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
1909 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1910
1911 // Skip cache, expect 6 queries
1912 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1913
1914 // Re-query verify cache works
1915 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1916 ANDROID_RESOLV_NO_CACHE_STORE);
1917 EXPECT_TRUE(fd1 != -1);
1918 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
1919
1920 // Cache hits, expect still 6 queries
1921 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
1922}
1923
1924TEST_F(ResolverTest, Async_NoRetryFlag) {
1925 const char listen_addr[] = "127.0.0.4";
1926 const char listen_srv[] = "53";
1927 const char host_name[] = "howdy.example.com.";
1928 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1929 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1930 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1931 ASSERT_TRUE(dns.startServer());
1932 std::vector<std::string> servers = {listen_addr};
1933 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1934 dns.clearQueries();
1935
1936 dns.setResponseProbability(0.0);
1937
1938 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
1939 ANDROID_RESOLV_NO_RETRY);
1940 EXPECT_TRUE(fd1 != -1);
1941
1942 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
1943 ANDROID_RESOLV_NO_RETRY);
1944 EXPECT_TRUE(fd2 != -1);
1945
1946 // expect no response
1947 expectAnswersNotValid(fd1, -ETIMEDOUT);
1948 expectAnswersNotValid(fd2, -ETIMEDOUT);
1949
1950 // No retry case, expect 2 queries
1951 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1952
1953 dns.clearQueries();
1954
1955 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1956 EXPECT_TRUE(fd1 != -1);
1957
1958 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
1959 EXPECT_TRUE(fd2 != -1);
1960
1961 // expect no response
1962 expectAnswersNotValid(fd1, -ETIMEDOUT);
1963 expectAnswersNotValid(fd2, -ETIMEDOUT);
1964
1965 // Retry case, expect 4 queries
1966 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
1967}
1968
Mike Yu5b9ffb22018-12-02 17:54:29 +09001969// This test checks that the resolver should not generate the request containing OPT RR when using
1970// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with FORMERR, we
1971// will fallback to no EDNS0 and try again. If the server does no response, we won't retry so that
1972// we get no answer.
1973TEST_F(ResolverTest, BrokenEdns) {
1974 typedef test::DNSResponder::Edns Edns;
1975 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
1976
1977 const char OFF[] = "off";
1978 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
1979 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
1980 const char STRICT[] = "strict";
1981 const char GETHOSTBYNAME[] = "gethostbyname";
1982 const char GETADDRINFO[] = "getaddrinfo";
1983 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
1984 const char ADDR4[] = "192.0.2.1";
1985 const char CLEARTEXT_ADDR[] = "127.0.0.53";
1986 const char CLEARTEXT_PORT[] = "53";
1987 const char TLS_PORT[] = "853";
1988 const std::vector<std::string> servers = { CLEARTEXT_ADDR };
1989
1990 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
1991 ASSERT_TRUE(dns.startServer());
1992
1993 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
1994
1995 static const struct TestConfig {
1996 std::string mode;
1997 std::string method;
1998 Edns edns;
1999 ExpectResult expectResult;
2000
2001 std::string asHostName() const {
2002 const char* ednsString;
2003 switch (edns) {
2004 case Edns::ON:
2005 ednsString = "ednsOn";
2006 break;
2007 case Edns::FORMERR:
2008 ednsString = "ednsFormerr";
2009 break;
2010 case Edns::DROP:
2011 ednsString = "ednsDrop";
2012 break;
2013 default:
2014 ednsString = "";
2015 break;
2016 }
2017 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2018 }
2019 } testConfigs[] = {
2020 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
2021 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2022 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2023 // commented out since TLS timeout is not configurable.
2024 // TODO: Uncomment them after TLS timeout is configurable.
2025 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2026 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2027 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2028 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2029 {OFF, GETHOSTBYNAME, Edns::FORMERR, EXPECT_SUCCESS},
2030 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR, EXPECT_SUCCESS},
2031 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR, EXPECT_FAILURE},
2032 {STRICT, GETHOSTBYNAME, Edns::FORMERR, EXPECT_FAILURE},
2033 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2034 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2035 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2036 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2037 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2038 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2039 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2040 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2041 {OFF, GETADDRINFO, Edns::FORMERR, EXPECT_SUCCESS},
2042 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR, EXPECT_SUCCESS},
2043 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR, EXPECT_FAILURE},
2044 {STRICT, GETADDRINFO, Edns::FORMERR, EXPECT_FAILURE},
2045 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2046 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2047 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2048 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2049 };
2050
2051 for (const auto& config : testConfigs) {
2052 const std::string testHostName = config.asHostName();
2053 SCOPED_TRACE(testHostName);
2054
2055 const char* host_name = testHostName.c_str();
2056 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2057 dns.setEdns(config.edns);
2058
2059 if (config.mode == OFF) {
2060 ASSERT_TRUE(
2061 SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2062 } else if (config.mode == OPPORTUNISTIC_UDP) {
2063 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
2064 "", {}));
2065 } else if (config.mode == OPPORTUNISTIC_TLS) {
2066 ASSERT_TRUE(tls.startServer());
2067 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
2068 "", {}));
2069 // Wait for validation to complete.
2070 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2071 } else if (config.mode == STRICT) {
2072 ASSERT_TRUE(tls.startServer());
2073 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
2074 "", {base64Encode(tls.fingerprint())}));
2075 // Wait for validation to complete.
2076 EXPECT_TRUE(tls.waitForQueries(1, 5000));
2077 }
2078
2079 if (config.method == GETHOSTBYNAME) {
2080 const hostent* h_result = gethostbyname(host_name);
2081 if (config.expectResult == EXPECT_SUCCESS) {
2082 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2083 ASSERT_TRUE(h_result != nullptr);
2084 ASSERT_EQ(4, h_result->h_length);
2085 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2086 EXPECT_EQ(ADDR4, ToString(h_result));
2087 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2088 } else {
2089 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2090 ASSERT_TRUE(h_result == nullptr);
2091 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2092 }
2093 } else if (config.method == GETADDRINFO) {
2094 ScopedAddrinfo ai_result;
2095 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2096 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2097 if (config.expectResult == EXPECT_SUCCESS) {
2098 EXPECT_TRUE(ai_result != nullptr);
2099 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2100 const std::string result_str = ToString(ai_result);
2101 EXPECT_EQ(ADDR4, result_str);
2102 } else {
2103 EXPECT_TRUE(ai_result == nullptr);
2104 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2105 }
2106 } else {
2107 FAIL() << "Unsupported query method: " << config.method;
2108 }
2109
2110 tls.stopServer();
2111 dns.clearQueries();
2112 }
2113
2114 dns.stopServer();
2115}
nuccachenf52f7a52018-07-17 18:07:23 +08002116
2117TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2118 constexpr char listen_addr[] = "::1";
2119 constexpr char listen_addr2[] = "127.0.0.5";
2120 constexpr char listen_srv[] = "53";
2121 constexpr char dns64_name[] = "ipv4only.arpa.";
2122 constexpr char host_name[] = "v4only.example.com.";
2123
2124 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2125 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2126 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2127 ASSERT_TRUE(dns.startServer());
2128
2129 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
2130 dns2.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2131 ASSERT_TRUE(dns2.startServer());
2132
2133 std::vector<std::string> servers = {listen_addr};
2134 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2135 dns.clearQueries();
2136
2137 // Wait for detecting prefix to complete.
2138 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2139
2140 // hints are necessary in order to let netd know which type of addresses the caller is
2141 // interested in.
2142 addrinfo hints;
2143 memset(&hints, 0, sizeof(hints));
2144 hints.ai_family = AF_UNSPEC;
2145 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2146 EXPECT_TRUE(result != nullptr);
2147 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2148
2149 std::string result_str = ToString(result);
2150 EXPECT_EQ(result_str, "64:ff9b::102:304");
2151
2152 // Let's test the case when there's an IPv4 resolver.
2153 servers = {listen_addr, listen_addr2};
2154 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2155 dns.clearQueries();
2156 dns2.clearQueries();
2157
2158 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2159 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2160
2161 result = safe_getaddrinfo("v4only", nullptr, &hints);
2162 EXPECT_TRUE(result != nullptr);
2163 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2164
2165 result_str = ToString(result);
2166 EXPECT_EQ(result_str, "1.2.3.4");
2167}
2168
nuccachenf52f7a52018-07-17 18:07:23 +08002169TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2170 constexpr char listen_addr[] = "::1";
2171 constexpr char listen_srv[] = "53";
2172 constexpr char dns64_name[] = "ipv4only.arpa.";
2173 constexpr char host_name[] = "v4only.example.com.";
2174
2175 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2176 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2177 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2178 ASSERT_TRUE(dns.startServer());
2179
2180 const std::vector<std::string> servers = {listen_addr};
2181 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2182 dns.clearQueries();
2183
2184 // Wait for detecting prefix to complete.
2185 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2186
2187 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2188 // in AF_INET case.
2189 addrinfo hints;
2190 memset(&hints, 0, sizeof(hints));
2191 hints.ai_family = AF_INET6;
2192 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2193 EXPECT_TRUE(result != nullptr);
2194 std::string result_str = ToString(result);
2195 EXPECT_EQ(result_str, "64:ff9b::102:304");
2196
2197 hints.ai_family = AF_INET;
2198 result = safe_getaddrinfo("v4only", nullptr, &hints);
2199 EXPECT_TRUE(result != nullptr);
2200 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2201 result_str = ToString(result);
2202 EXPECT_EQ(result_str, "1.2.3.4");
2203}
nuccachenf52f7a52018-07-17 18:07:23 +08002204
2205TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2206 constexpr char listen_addr[] = "::1";
2207 constexpr char listen_srv[] = "53";
2208 constexpr char dns64_name[] = "ipv4only.arpa.";
2209 constexpr char host_name[] = "v4v6.example.com.";
2210
2211 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2212 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2213 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2214 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2215 ASSERT_TRUE(dns.startServer());
2216
2217 const std::vector<std::string> servers = {listen_addr};
2218 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2219 dns.clearQueries();
2220
2221 // Wait for detecting prefix to complete.
2222 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2223
2224 addrinfo hints;
2225 memset(&hints, 0, sizeof(hints));
2226 hints.ai_family = AF_UNSPEC;
2227 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2228 EXPECT_TRUE(result != nullptr);
2229 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2230
2231 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2232 std::vector<std::string> result_strs = ToStrings(result);
2233 for (const auto& str : result_strs) {
2234 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2235 << ", result_str='" << str << "'";
2236 }
2237}
2238
2239TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2240 constexpr char listen_addr[] = "::1";
2241 constexpr char listen_srv[] = "53";
2242 constexpr char dns64_name[] = "ipv4only.arpa.";
2243 constexpr char host_name[] = "v4v6.example.com.";
2244
2245 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2246 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2247 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2248 ASSERT_TRUE(dns.startServer());
2249
2250 const std::vector<std::string> servers = {listen_addr};
2251 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2252 dns.clearQueries();
2253
2254 // Wait for detecting prefix to complete.
2255 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2256
2257 addrinfo hints;
2258 memset(&hints, 0, sizeof(hints));
2259 hints.ai_family = AF_UNSPEC;
2260 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2261 EXPECT_TRUE(result != nullptr);
2262 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2263
2264 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2265 std::string result_str = ToString(result);
2266 EXPECT_EQ(result_str, "64:ff9b::102:304");
2267}
2268
2269TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2270 constexpr char THIS_NETWORK[] = "this_network";
2271 constexpr char LOOPBACK[] = "loopback";
2272 constexpr char LINK_LOCAL[] = "link_local";
2273 constexpr char MULTICAST[] = "multicast";
2274 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2275
2276 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2277 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2278 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2279 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2280 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2281
2282 constexpr char listen_addr[] = "::1";
2283 constexpr char listen_srv[] = "53";
2284 constexpr char dns64_name[] = "ipv4only.arpa.";
2285
2286 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2287 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2288 ASSERT_TRUE(dns.startServer());
2289
2290 const std::vector<std::string> servers = {listen_addr};
2291 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2292 dns.clearQueries();
2293
2294 // Wait for detecting prefix to complete.
2295 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2296
2297 static const struct TestConfig {
2298 std::string name;
2299 std::string addr;
2300
2301 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2302 } testConfigs[]{
2303 {THIS_NETWORK, ADDR_THIS_NETWORK},
2304 {LOOPBACK, ADDR_LOOPBACK},
2305 {LINK_LOCAL, ADDR_LINK_LOCAL},
2306 {MULTICAST, ADDR_MULTICAST},
2307 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2308 };
2309
2310 for (const auto& config : testConfigs) {
2311 const std::string testHostName = config.asHostName();
2312 SCOPED_TRACE(testHostName);
2313
2314 const char* host_name = testHostName.c_str();
2315 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2316
2317 addrinfo hints;
2318 memset(&hints, 0, sizeof(hints));
2319 hints.ai_family = AF_INET6;
2320 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2321 // In AF_INET6 case, don't return IPv4 answers
2322 EXPECT_TRUE(result == nullptr);
2323 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2324 dns.clearQueries();
2325
2326 memset(&hints, 0, sizeof(hints));
2327 hints.ai_family = AF_UNSPEC;
2328 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2329 EXPECT_TRUE(result != nullptr);
2330 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2331 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2332 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2333 std::string result_str = ToString(result);
2334 EXPECT_EQ(result_str, config.addr.c_str());
2335 dns.clearQueries();
2336 }
2337}
2338
2339TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2340 constexpr char listen_addr[] = "::1";
2341 constexpr char listen_srv[] = "53";
2342 constexpr char dns64_name[] = "ipv4only.arpa.";
2343 constexpr char host_name[] = "v4only.example.com.";
2344 constexpr char host_name2[] = "v4v6.example.com.";
2345
2346 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2347 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2348 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2349 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2350 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2351 ASSERT_TRUE(dns.startServer());
2352
2353 const std::vector<std::string> servers = {listen_addr};
2354 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2355 dns.clearQueries();
2356
2357 // Wait for detecting prefix to complete.
2358 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2359
2360 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2361 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2362 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2363 EXPECT_TRUE(result != nullptr);
2364 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2365 std::string result_str = ToString(result);
2366 EXPECT_EQ(result_str, "64:ff9b::102:304");
2367 dns.clearQueries();
2368
2369 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2370 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2371 EXPECT_TRUE(result != nullptr);
2372 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2373 std::vector<std::string> result_strs = ToStrings(result);
2374 for (const auto& str : result_strs) {
2375 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2376 << ", result_str='" << str << "'";
2377 }
2378}
2379
2380TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2381 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2382 constexpr char ADDR_ANYADDR_V6[] = "::";
2383 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2384 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2385
2386 constexpr char PORT_NAME_HTTP[] = "http";
2387 constexpr char PORT_NUMBER_HTTP[] = "80";
2388
2389 constexpr char listen_addr[] = "::1";
2390 constexpr char listen_srv[] = "53";
2391 constexpr char dns64_name[] = "ipv4only.arpa.";
2392
2393 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2394 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2395 ASSERT_TRUE(dns.startServer());
2396
2397 const std::vector<std::string> servers = {listen_addr};
2398 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2399 dns.clearQueries();
2400
2401 // Wait for detecting prefix to complete.
2402 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2403
2404 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2405 // - passive socket -> anyaddr (0.0.0.0 or ::)
2406 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2407 static const struct TestConfig {
2408 int flag;
2409 std::string addr_v4;
2410 std::string addr_v6;
2411
2412 std::string asParameters() const {
2413 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2414 addr_v6.c_str());
2415 }
2416 } testConfigs[]{
2417 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2418 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2419 };
2420
2421 for (const auto& config : testConfigs) {
2422 SCOPED_TRACE(config.asParameters());
2423
2424 addrinfo hints;
2425 memset(&hints, 0, sizeof(hints));
2426 hints.ai_family = AF_UNSPEC; // any address family
2427 hints.ai_socktype = 0; // any type
2428 hints.ai_protocol = 0; // any protocol
2429 hints.ai_flags = config.flag;
2430
2431 // Assign hostname as null and service as port name.
2432 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2433 ASSERT_TRUE(result != nullptr);
2434
2435 // Can't be synthesized because it should not get into Netd.
2436 std::vector<std::string> result_strs = ToStrings(result);
2437 for (const auto& str : result_strs) {
2438 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2439 << ", result_str='" << str << "'";
2440 }
2441
2442 // Assign hostname as null and service as numeric port number.
2443 hints.ai_flags = config.flag | AI_NUMERICSERV;
2444 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2445 ASSERT_TRUE(result != nullptr);
2446
2447 // Can't be synthesized because it should not get into Netd.
2448 result_strs = ToStrings(result);
2449 for (const auto& str : result_strs) {
2450 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2451 << ", result_str='" << str << "'";
2452 }
2453 }
2454}
2455
2456TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2457 struct hostent* result = nullptr;
2458 struct in_addr v4addr;
2459 struct in6_addr v6addr;
2460
2461 constexpr char listen_addr[] = "::1";
2462 constexpr char listen_srv[] = "53";
2463 constexpr char dns64_name[] = "ipv4only.arpa.";
2464 constexpr char ptr_name[] = "v4v6.example.com.";
2465 // PTR record for IPv4 address 1.2.3.4
2466 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2467 // PTR record for IPv6 address 2001:db8::102:304
2468 constexpr char ptr_addr_v6[] =
2469 "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.";
2470
2471 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2472 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2473 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2474 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2475 ASSERT_TRUE(dns.startServer());
2476
2477 const std::vector<std::string> servers = {listen_addr};
2478 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2479 dns.clearQueries();
2480
2481 // Wait for detecting prefix to complete.
2482 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2483
2484 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2485 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2486 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2487 ASSERT_TRUE(result != nullptr);
2488 std::string result_str = result->h_name ? result->h_name : "null";
2489 EXPECT_EQ(result_str, "v4v6.example.com");
2490
2491 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2492 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2493 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2494 ASSERT_TRUE(result != nullptr);
2495 result_str = result->h_name ? result->h_name : "null";
2496 EXPECT_EQ(result_str, "v4v6.example.com");
2497}
2498
2499TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2500 constexpr char listen_addr[] = "::1";
2501 constexpr char listen_srv[] = "53";
2502 constexpr char dns64_name[] = "ipv4only.arpa.";
2503 constexpr char ptr_name[] = "v4only.example.com.";
2504 // PTR record for IPv4 address 1.2.3.4
2505 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2506 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2507 constexpr char ptr_addr_v6_nomapping[] =
2508 "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.";
2509 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2510 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2511 constexpr char ptr_addr_v6_synthesis[] =
2512 "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.";
2513
2514 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2515 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2516 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2517 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2518 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2519 ASSERT_TRUE(dns.startServer());
2520
2521 const std::vector<std::string> servers = {listen_addr};
2522 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2523 dns.clearQueries();
2524
2525 // Wait for detecting prefix to complete.
2526 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2527
2528 // Synthesized PTR record doesn't exist on DNS server
2529 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2530 // After querying synthesized address failed, expect that prefix is removed from IPv6
2531 // synthesized address and do reverse IPv4 query instead.
2532 struct in6_addr v6addr;
2533 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2534 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2535 ASSERT_TRUE(result != nullptr);
2536 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2537 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2538 std::string result_str = result->h_name ? result->h_name : "null";
2539 EXPECT_EQ(result_str, "v4only.example.com");
2540 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2541 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2542 // fakes the return IPv4 address as original queried IPv6 address.
2543 result_str = ToString(result);
2544 EXPECT_EQ(result_str, "64:ff9b::102:304");
2545 dns.clearQueries();
2546
2547 // Synthesized PTR record exists on DNS server
2548 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2549 // Expect to Netd pass through synthesized address for DNS queries.
2550 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2551 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2552 ASSERT_TRUE(result != nullptr);
2553 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2554 result_str = result->h_name ? result->h_name : "null";
2555 EXPECT_EQ(result_str, "v6synthesis.example.com");
2556}
2557
2558TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2559 constexpr char dns64_name[] = "ipv4only.arpa.";
2560 constexpr char host_name[] = "localhost";
2561 // The address is synthesized by prefix64:localhost.
2562 constexpr char host_addr[] = "64:ff9b::7f00:1";
2563
2564 constexpr char listen_addr[] = "::1";
2565 constexpr char listen_srv[] = "53";
2566 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2567 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2568 ASSERT_TRUE(dns.startServer());
2569 const std::vector<std::string> servers = {listen_addr};
2570 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2571 dns.clearQueries();
2572
2573 // Wait for detecting prefix to complete.
2574 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2575
2576 // Using synthesized "localhost" address to be a trick for resolving host name
2577 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2578 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2579 struct in6_addr v6addr;
2580 inet_pton(AF_INET6, host_addr, &v6addr);
2581 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2582 ASSERT_TRUE(result != nullptr);
2583 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2584 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2585
2586 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2587 ASSERT_EQ(AF_INET6, result->h_addrtype);
2588 std::string result_str = ToString(result);
2589 EXPECT_EQ(result_str, host_addr);
2590 result_str = result->h_name ? result->h_name : "null";
2591 EXPECT_EQ(result_str, host_name);
2592}
2593
2594TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2595 constexpr char listen_addr[] = "::1";
2596 constexpr char listen_srv[] = "53";
2597 constexpr char dns64_name[] = "ipv4only.arpa.";
2598 constexpr char ptr_name[] = "v4v6.example.com.";
2599 // PTR record for IPv4 address 1.2.3.4
2600 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2601 // PTR record for IPv6 address 2001:db8::102:304
2602 constexpr char ptr_addr_v6[] =
2603 "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.";
2604
2605 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2606 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2607 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2608 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2609 ASSERT_TRUE(dns.startServer());
2610
2611 const std::vector<std::string> servers = {listen_addr};
2612 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2613 dns.clearQueries();
2614
2615 // Wait for detecting prefix to complete.
2616 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2617
2618 static const struct TestConfig {
2619 int flag;
2620 int family;
2621 std::string addr;
2622 std::string host;
2623
2624 std::string asParameters() const {
2625 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2626 host.c_str());
2627 }
2628 } testConfigs[]{
2629 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2630 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2631 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2632 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2633 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2634 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2635 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2636 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2637 };
2638
2639 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2640 for (const auto& config : testConfigs) {
2641 SCOPED_TRACE(config.asParameters());
2642
2643 int rv;
2644 char host[NI_MAXHOST];
2645 struct sockaddr_in sin;
2646 struct sockaddr_in6 sin6;
2647 if (config.family == AF_INET) {
2648 memset(&sin, 0, sizeof(sin));
2649 sin.sin_family = AF_INET;
2650 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2651 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2652 nullptr, 0, config.flag);
2653 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2654 } else if (config.family == AF_INET6) {
2655 memset(&sin6, 0, sizeof(sin6));
2656 sin6.sin6_family = AF_INET6;
2657 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2658 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2659 nullptr, 0, config.flag);
2660 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2661 }
2662 ASSERT_EQ(0, rv);
2663 std::string result_str = host;
2664 EXPECT_EQ(result_str, config.host);
2665 dns.clearQueries();
2666 }
2667}
2668
2669TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2670 constexpr char listen_addr[] = "::1";
2671 constexpr char listen_srv[] = "53";
2672 constexpr char dns64_name[] = "ipv4only.arpa.";
2673 constexpr char ptr_name[] = "v4only.example.com.";
2674 // PTR record for IPv4 address 1.2.3.4
2675 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2676 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2677 constexpr char ptr_addr_v6_nomapping[] =
2678 "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.";
2679 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2680 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2681 constexpr char ptr_addr_v6_synthesis[] =
2682 "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.";
2683
2684 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2685 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2686 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2687 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2688 ASSERT_TRUE(dns.startServer());
2689
2690 const std::vector<std::string> servers = {listen_addr};
2691 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2692 dns.clearQueries();
2693
2694 // Wait for detecting prefix to complete.
2695 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2696
2697 static const struct TestConfig {
2698 bool hasSynthesizedPtrRecord;
2699 int flag;
2700 std::string addr;
2701 std::string host;
2702
2703 std::string asParameters() const {
2704 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2705 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2706 }
2707 } testConfigs[]{
2708 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2709 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2710 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2711 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2712 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2713 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2714 };
2715
2716 // hasSynthesizedPtrRecord = false
2717 // Synthesized PTR record doesn't exist on DNS server
2718 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2719 // After querying synthesized address failed, expect that prefix is removed from IPv6
2720 // synthesized address and do reverse IPv4 query instead.
2721 //
2722 // hasSynthesizedPtrRecord = true
2723 // Synthesized PTR record exists on DNS server
2724 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2725 // Expect to just pass through synthesized address for DNS queries.
2726 for (const auto& config : testConfigs) {
2727 SCOPED_TRACE(config.asParameters());
2728
2729 char host[NI_MAXHOST];
2730 struct sockaddr_in6 sin6;
2731 memset(&sin6, 0, sizeof(sin6));
2732 sin6.sin6_family = AF_INET6;
2733 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2734 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2735 nullptr, 0, config.flag);
2736 ASSERT_EQ(0, rv);
2737 if (config.flag == NI_NAMEREQD) {
2738 if (config.hasSynthesizedPtrRecord) {
2739 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2740 } else {
2741 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2742 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2743 }
2744 }
2745 std::string result_str = host;
2746 EXPECT_EQ(result_str, config.host);
2747 dns.clearQueries();
2748 }
2749}
2750
2751TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2752 constexpr char dns64_name[] = "ipv4only.arpa.";
2753 constexpr char host_name[] = "localhost";
2754 // The address is synthesized by prefix64:localhost.
2755 constexpr char host_addr[] = "64:ff9b::7f00:1";
2756
2757 constexpr char listen_addr[] = "::1";
2758 constexpr char listen_srv[] = "53";
2759 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2760 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2761 ASSERT_TRUE(dns.startServer());
2762 const std::vector<std::string> servers = {listen_addr};
2763 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2764 dns.clearQueries();
2765
2766 // Wait for detecting prefix to complete.
2767 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2768
2769 // Using synthesized "localhost" address to be a trick for resolving host name
2770 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2771 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2772 char host[NI_MAXHOST];
2773 struct sockaddr_in6 sin6;
2774 memset(&sin6, 0, sizeof(sin6));
2775 sin6.sin6_family = AF_INET6;
2776 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2777 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2778 0, NI_NAMEREQD);
2779 ASSERT_EQ(0, rv);
2780 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2781 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2782
2783 std::string result_str = host;
2784 EXPECT_EQ(result_str, host_name);
2785}
2786
nuccachenf52f7a52018-07-17 18:07:23 +08002787TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2788 constexpr char dns64_name[] = "ipv4only.arpa.";
2789 constexpr char host_name[] = "ipv4only.example.com.";
2790
2791 constexpr char listen_addr[] = "::1";
2792 constexpr char listen_srv[] = "53";
2793 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2794 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2795 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2796 ASSERT_TRUE(dns.startServer());
2797 const std::vector<std::string> servers = {listen_addr};
2798 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2799 dns.clearQueries();
2800
2801 // Wait for detecting prefix to complete.
2802 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2803
2804 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2805 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2806 ASSERT_TRUE(result != nullptr);
2807 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2808 std::string result_str = ToString(result);
2809 EXPECT_EQ(result_str, "64:ff9b::102:304");
2810}
nuccachenf52f7a52018-07-17 18:07:23 +08002811
2812TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2813 constexpr char dns64_name[] = "ipv4only.arpa.";
2814 constexpr char host_name[] = "v4v6.example.com.";
2815
2816 constexpr char listen_addr[] = "::1";
2817 constexpr char listen_srv[] = "53";
2818 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2819 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2820 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2821 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2822 ASSERT_TRUE(dns.startServer());
2823 const std::vector<std::string> servers = {listen_addr};
2824 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2825 dns.clearQueries();
2826
2827 // Wait for detecting prefix to complete.
2828 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2829
2830 // IPv4 DNS query. Prefix should have no effect on it.
2831 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2832 ASSERT_TRUE(result != nullptr);
2833 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2834 std::string result_str = ToString(result);
2835 EXPECT_EQ(result_str, "1.2.3.4");
2836 dns.clearQueries();
2837
2838 // IPv6 DNS query. Prefix should have no effect on it.
2839 result = gethostbyname2("v4v6", AF_INET6);
2840 ASSERT_TRUE(result != nullptr);
2841 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2842 result_str = ToString(result);
2843 EXPECT_EQ(result_str, "2001:db8::102:304");
2844}
2845
2846TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2847 constexpr char THIS_NETWORK[] = "this_network";
2848 constexpr char LOOPBACK[] = "loopback";
2849 constexpr char LINK_LOCAL[] = "link_local";
2850 constexpr char MULTICAST[] = "multicast";
2851 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2852
2853 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2854 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2855 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2856 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2857 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2858
2859 constexpr char listen_addr[] = "::1";
2860 constexpr char listen_srv[] = "53";
2861 constexpr char dns64_name[] = "ipv4only.arpa.";
2862
2863 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2864 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2865 ASSERT_TRUE(dns.startServer());
2866
2867 const std::vector<std::string> servers = {listen_addr};
2868 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2869 dns.clearQueries();
2870
2871 // Wait for detecting prefix to complete.
2872 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2873
2874 static const struct TestConfig {
2875 std::string name;
2876 std::string addr;
2877
2878 std::string asHostName() const {
2879 return StringPrintf("%s.example.com.",
2880 name.c_str());
2881 }
2882 } testConfigs[]{
2883 {THIS_NETWORK, ADDR_THIS_NETWORK},
2884 {LOOPBACK, ADDR_LOOPBACK},
2885 {LINK_LOCAL, ADDR_LINK_LOCAL},
2886 {MULTICAST, ADDR_MULTICAST},
2887 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2888 };
2889
2890 for (const auto& config : testConfigs) {
2891 const std::string testHostName = config.asHostName();
2892 SCOPED_TRACE(testHostName);
2893
2894 const char* host_name = testHostName.c_str();
2895 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2896
2897 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2898 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2899
2900 // In AF_INET6 case, don't synthesize special use IPv4 address.
2901 // Expect to have no answer
2902 EXPECT_EQ(nullptr, result);
2903
2904 dns.clearQueries();
2905 }
2906}