1 /* MIT License
2 *
3 * Copyright (c) The c-ares project and its contributors
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 *
24 * SPDX-License-Identifier: MIT
25 */
26 // This file includes tests that attempt to do real lookups
27 // of DNS names using the local machine's live infrastructure.
28 // As a result, we don't check the results very closely, to allow
29 // for varying local configurations.
30
31 #include "ares-test.h"
32
33 #ifdef HAVE_NETDB_H
34 #include <netdb.h>
35 #endif
36
37 namespace ares {
38 namespace test {
39
40 // Use the address of CloudFlare's public DNS servers as example addresses that are
41 // likely to be accessible everywhere/everywhen. We used to use google but they
42 // stopped returning reverse dns answers in Dec 2023
43 unsigned char cflare_addr4[4] = { 0x01, 0x01, 0x01, 0x01 };
44 unsigned char cflare_addr6[16] = {
45 0x26, 0x06, 0x47, 0x00, 0x47, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11
47 };
48
49 MATCHER_P(IncludesAtLeastNumAddresses, n, "") {
50 if(!arg)
51 return false;
52 int cnt = 0;
53 for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
54 cnt++;
55 return cnt >= n;
56 }
57
58 MATCHER_P(OnlyIncludesAddrType, addrtype, "") {
59 if(!arg)
60 return false;
61 for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
62 if (ai->ai_family != addrtype)
63 return false;
64 return true;
65 }
66
67 MATCHER_P(IncludesAddrType, addrtype, "") {
68 if(!arg)
69 return false;
70 for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
71 if (ai->ai_family == addrtype)
72 return true;
73 return false;
74 }
75
76 //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV4) {
77 //struct ares_addrinfo_hints hints = {0, 0, 0, 0};
78 //hints.ai_family = AF_INET;
79 //AddrInfoResult result;
80 //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
81 //Process();
82 //EXPECT_TRUE(result.done_);
83 //EXPECT_EQ(ARES_SUCCESS, result.status_);
84 //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
85 //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET));
86 //}
87
88 //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV6) {
89 //struct ares_addrinfo_hints hints = {0, 0, 0, 0};
90 //hints.ai_family = AF_INET6;
91 //AddrInfoResult result;
92 //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
93 //Process();
94 //EXPECT_TRUE(result.done_);
95 //EXPECT_EQ(ARES_SUCCESS, result.status_);
96 //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
97 //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET6));
98 //}
99
100 //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoUnspec) {
101 //struct ares_addrinfo_hints hints = {0, 0, 0, 0};
102 //hints.ai_family = AF_UNSPEC;
103 //AddrInfoResult result;
104 //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
105 //Process();
106 //EXPECT_TRUE(result.done_);
107 //EXPECT_EQ(ARES_SUCCESS, result.status_);
108 //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(2));
109 //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET6));
110 //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET));
111 //}
112
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetHostByNameV4)113 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameV4) {
114 HostResult result;
115 ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
116 Process();
117 EXPECT_TRUE(result.done_);
118 EXPECT_EQ(ARES_SUCCESS, result.status_);
119 EXPECT_LT(0, (int)result.host_.addrs_.size());
120 EXPECT_EQ(AF_INET, result.host_.addrtype_);
121 }
122
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetHostByNameV6)123 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameV6) {
124 HostResult result;
125 ares_gethostbyname(channel_, "www.google.com.", AF_INET6, HostCallback, &result);
126 Process();
127 EXPECT_TRUE(result.done_);
128 EXPECT_EQ(ARES_SUCCESS, result.status_);
129 EXPECT_LT(0, (int)result.host_.addrs_.size());
130 EXPECT_EQ(AF_INET6, result.host_.addrtype_);
131 }
132
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetHostByAddrV4)133 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByAddrV4) {
134 HostResult result;
135 ares_gethostbyaddr(channel_, cflare_addr4, sizeof(cflare_addr4), AF_INET, HostCallback, &result);
136 Process();
137 EXPECT_TRUE(result.done_);
138 EXPECT_EQ(ARES_SUCCESS, result.status_);
139 EXPECT_LT(0, (int)result.host_.addrs_.size());
140 EXPECT_EQ(AF_INET, result.host_.addrtype_);
141 }
142
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetHostByAddrV6)143 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByAddrV6) {
144 HostResult result;
145 ares_gethostbyaddr(channel_, cflare_addr6, sizeof(cflare_addr6), AF_INET6, HostCallback, &result);
146 Process();
147 EXPECT_TRUE(result.done_);
148 EXPECT_EQ(ARES_SUCCESS, result.status_);
149 EXPECT_LT(0, (int)result.host_.addrs_.size());
150 EXPECT_EQ(AF_INET6, result.host_.addrtype_);
151 }
152
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetHostByNameFile)153 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameFile) {
154 struct hostent *host = nullptr;
155
156 // Still need a channel even to query /etc/hosts.
157 EXPECT_EQ(ARES_ENOTFOUND,
158 ares_gethostbyname_file(nullptr, "localhost", AF_INET, &host));
159
160 int rc = ares_gethostbyname_file(channel_, "bogus.mcname", AF_INET, &host);
161 EXPECT_EQ(nullptr, host);
162 EXPECT_EQ(ARES_ENOTFOUND, rc);
163
164 rc = ares_gethostbyname_file(channel_, "localhost", AF_INET, &host);
165 if (rc == ARES_SUCCESS) {
166 EXPECT_NE(nullptr, host);
167 ares_free_hostent(host);
168 }
169 }
170
TEST_P(DefaultChannelModeTest,LiveGetLocalhostByNameV4)171 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV4) {
172 HostResult result;
173 ares_gethostbyname(channel_, "localhost", AF_INET, HostCallback, &result);
174 Process();
175 EXPECT_TRUE(result.done_);
176 if (result.status_ != ARES_ECONNREFUSED) {
177 EXPECT_EQ(ARES_SUCCESS, result.status_);
178 EXPECT_EQ(1, (int)result.host_.addrs_.size());
179 EXPECT_EQ(AF_INET, result.host_.addrtype_);
180 EXPECT_NE(SIZE_MAX, result.host_.name_.find("localhost"));
181 }
182 }
183
TEST_P(DefaultChannelModeTest,LiveGetLocalhostByNameV6)184 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV6) {
185 HostResult result;
186 ares_gethostbyname(channel_, "localhost", AF_INET6, HostCallback, &result);
187 Process();
188 EXPECT_TRUE(result.done_);
189 if (result.status_ != ARES_ECONNREFUSED) {
190 EXPECT_EQ(ARES_SUCCESS, result.status_);
191 EXPECT_EQ(1, (int)result.host_.addrs_.size());
192 EXPECT_EQ(AF_INET6, result.host_.addrtype_);
193 std::stringstream ss;
194 ss << HostEnt(result.host_);
195 EXPECT_NE(SIZE_MAX, result.host_.name_.find("localhost"));
196 }
197 }
198
TEST_P(DefaultChannelModeTest,LiveGetNonExistLocalhostByNameV4)199 TEST_P(DefaultChannelModeTest, LiveGetNonExistLocalhostByNameV4) {
200 HostResult result;
201 ares_gethostbyname(channel_, "idonotexist.localhost", AF_INET, HostCallback, &result);
202 Process();
203 EXPECT_TRUE(result.done_);
204 if (result.status_ != ARES_ECONNREFUSED) {
205 EXPECT_EQ(ARES_SUCCESS, result.status_);
206 EXPECT_EQ(1, (int)result.host_.addrs_.size());
207 EXPECT_EQ(AF_INET, result.host_.addrtype_);
208 EXPECT_NE(SIZE_MAX, result.host_.name_.find("idonotexist.localhost"));
209 }
210 }
211
TEST_P(DefaultChannelModeTest,LiveGetNonExistLocalhostByNameV6)212 TEST_P(DefaultChannelModeTest, LiveGetNonExistLocalhostByNameV6) {
213 HostResult result;
214 ares_gethostbyname(channel_, "idonotexist.localhost", AF_INET6, HostCallback, &result);
215 Process();
216 EXPECT_TRUE(result.done_);
217 if (result.status_ != ARES_ECONNREFUSED) {
218 EXPECT_EQ(ARES_SUCCESS, result.status_);
219 EXPECT_EQ(1, (int)result.host_.addrs_.size());
220 EXPECT_EQ(AF_INET6, result.host_.addrtype_);
221 std::stringstream ss;
222 ss << HostEnt(result.host_);
223 EXPECT_NE(SIZE_MAX, result.host_.name_.find("idonotexist.localhost"));
224 }
225 }
226
TEST_P(DefaultChannelModeTest,LiveGetLocalhostByNameIPV4)227 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV4) {
228 HostResult result;
229 ares_gethostbyname(channel_, "127.0.0.1", AF_INET, HostCallback, &result);
230 Process();
231 EXPECT_TRUE(result.done_);
232 EXPECT_EQ(ARES_SUCCESS, result.status_);
233 EXPECT_EQ(1, (int)result.host_.addrs_.size());
234 EXPECT_EQ(AF_INET, result.host_.addrtype_);
235 std::stringstream ss;
236 ss << HostEnt(result.host_);
237 EXPECT_EQ("{'127.0.0.1' aliases=[] addrs=[127.0.0.1]}", ss.str());
238 }
239
TEST_P(DefaultChannelModeTest,LiveGetLocalhostByNameIPV6)240 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV6) {
241 HostResult result;
242 ares_gethostbyname(channel_, "::1", AF_INET6, HostCallback, &result);
243 Process();
244 EXPECT_TRUE(result.done_);
245 if (result.status_ != ARES_ENOTFOUND) {
246 EXPECT_EQ(ARES_SUCCESS, result.status_);
247 EXPECT_EQ(1, (int)result.host_.addrs_.size());
248 EXPECT_EQ(AF_INET6, result.host_.addrtype_);
249 std::stringstream ss;
250 ss << HostEnt(result.host_);
251 EXPECT_EQ("{'::1' aliases=[] addrs=[0000:0000:0000:0000:0000:0000:0000:0001]}", ss.str());
252 }
253 }
254
TEST_P(DefaultChannelModeTest,LiveGetLocalhostFailFamily)255 TEST_P(DefaultChannelModeTest, LiveGetLocalhostFailFamily) {
256 HostResult result;
257 ares_gethostbyname(channel_, "127.0.0.1", AF_INET+AF_INET6, HostCallback, &result);
258 Process();
259 EXPECT_TRUE(result.done_);
260 EXPECT_EQ(ARES_ENOTIMP, result.status_);
261 }
262
TEST_P(DefaultChannelModeTest,LiveGetLocalhostByAddrV4)263 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV4) {
264 HostResult result;
265 struct in_addr addr;
266 addr.s_addr = htonl(INADDR_LOOPBACK);
267 ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET, HostCallback, &result);
268 Process();
269 EXPECT_TRUE(result.done_);
270 if (result.status_ != ARES_ENOTFOUND) {
271 EXPECT_EQ(ARES_SUCCESS, result.status_);
272 EXPECT_LT(0, (int)result.host_.addrs_.size());
273 EXPECT_EQ(AF_INET, result.host_.addrtype_);
274 // oddly, travis does not resolve to localhost, but a random hostname starting with travis-job
275 if (result.host_.name_.find("travis-job") == SIZE_MAX) {
276 EXPECT_NE(SIZE_MAX,
277 result.host_.name_.find("localhost"));
278 }
279 }
280 }
281
TEST_P(DefaultChannelModeTest,LiveGetLocalhostByAddrV6)282 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV6) {
283 HostResult result;
284 struct in6_addr addr;
285 memset(&addr, 0, sizeof(addr));
286 addr.s6_addr[15] = 1; // in6addr_loopback
287 ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET6, HostCallback, &result);
288 Process();
289 EXPECT_TRUE(result.done_);
290 if (result.status_ != ARES_ENOTFOUND) {
291 EXPECT_EQ(ARES_SUCCESS, result.status_);
292 EXPECT_LT(0, (int)result.host_.addrs_.size());
293 EXPECT_EQ(AF_INET6, result.host_.addrtype_);
294 const std::string& name = result.host_.name_;
295 EXPECT_TRUE(SIZE_MAX != name.find("localhost") ||
296 SIZE_MAX != name.find("ip6-loopback"));
297 }
298 }
299
TEST_P(DefaultChannelModeTest,LiveGetHostByAddrFailFamily)300 TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailFamily) {
301 HostResult result;
302 unsigned char addr[4] = {8, 8, 8, 8};
303 ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET6+AF_INET,
304 HostCallback, &result);
305 EXPECT_TRUE(result.done_);
306 EXPECT_EQ(ARES_ENOTIMP, result.status_);
307 }
308
TEST_P(DefaultChannelModeTest,LiveGetHostByAddrFailAddrSize)309 TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAddrSize) {
310 HostResult result;
311 unsigned char addr[4] = {8, 8, 8, 8};
312 ares_gethostbyaddr(channel_, addr, sizeof(addr) - 1, AF_INET,
313 HostCallback, &result);
314 EXPECT_TRUE(result.done_);
315 EXPECT_EQ(ARES_ENOTIMP, result.status_);
316 }
317
TEST_P(DefaultChannelModeTest,LiveGetHostByAddrFailAlloc)318 TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAlloc) {
319 HostResult result;
320 unsigned char addr[4] = {8, 8, 8, 8};
321 SetAllocFail(1);
322 ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET,
323 HostCallback, &result);
324 EXPECT_TRUE(result.done_);
325 EXPECT_EQ(ARES_ENOMEM, result.status_);
326 }
327
328 INSTANTIATE_TEST_SUITE_P(Modes, DefaultChannelModeTest,
329 ::testing::Values("f", "b", "fb", "bf"));
330
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchA)331 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchA) {
332 SearchResult result;
333 ares_search(channel_, "www.youtube.com.", C_IN, T_A,
334 SearchCallback, &result);
335 Process();
336 EXPECT_TRUE(result.done_);
337 EXPECT_EQ(ARES_SUCCESS, result.status_);
338 }
339
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchEmptyA)340 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchEmptyA) {
341 SearchResult result;
342 ares_search(channel_, "", C_IN, T_A,
343 SearchCallback, &result);
344 Process();
345 EXPECT_TRUE(result.done_);
346 EXPECT_NE(ARES_SUCCESS, result.status_);
347 }
348
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchNS)349 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchNS) {
350 SearchResult result;
351 ares_search(channel_, "google.com.", C_IN, T_NS,
352 SearchCallback, &result);
353 Process();
354 EXPECT_TRUE(result.done_);
355 EXPECT_EQ(ARES_SUCCESS, result.status_);
356 }
357
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchMX)358 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchMX) {
359 SearchResult result;
360 ares_search(channel_, "google.com.", C_IN, T_MX,
361 SearchCallback, &result);
362 Process();
363 EXPECT_TRUE(result.done_);
364 EXPECT_EQ(ARES_SUCCESS, result.status_);
365 }
366
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchTXT)367 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchTXT) {
368 SearchResult result;
369 ares_search(channel_, "google.com.", C_IN, T_TXT,
370 SearchCallback, &result);
371 Process();
372 EXPECT_TRUE(result.done_);
373 EXPECT_EQ(ARES_SUCCESS, result.status_);
374 }
375
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchSOA)376 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchSOA) {
377 SearchResult result;
378 ares_search(channel_, "google.com.", C_IN, T_SOA,
379 SearchCallback, &result);
380 Process();
381 EXPECT_TRUE(result.done_);
382 EXPECT_EQ(ARES_SUCCESS, result.status_);
383 }
384
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchSRV)385 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchSRV) {
386 SearchResult result;
387 ares_search(channel_, "_imap._tcp.gmail.com.", C_IN, T_SRV,
388 SearchCallback, &result);
389 Process();
390 EXPECT_TRUE(result.done_);
391 EXPECT_EQ(ARES_SUCCESS, result.status_);
392 }
393
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveSearchANY)394 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchANY) {
395 SearchResult result;
396 ares_search(channel_, "google.com.", C_IN, T_ANY,
397 SearchCallback, &result);
398 Process();
399 EXPECT_TRUE(result.done_);
400 EXPECT_EQ(ARES_SUCCESS, result.status_);
401 }
402
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV4)403 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4) {
404 NameInfoResult result;
405 struct sockaddr_in sockaddr;
406 memset(&sockaddr, 0, sizeof(sockaddr));
407 sockaddr.sin_family = AF_INET;
408 sockaddr.sin_port = htons(53);
409 sockaddr.sin_addr.s_addr = htonl(0x08080808);
410 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
411 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
412 NameInfoCallback, &result);
413 Process();
414 EXPECT_TRUE(result.done_);
415 EXPECT_EQ(ARES_SUCCESS, result.status_);
416 if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
417 }
418
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV4NoPort)419 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NoPort) {
420 NameInfoResult result;
421 struct sockaddr_in sockaddr;
422 memset(&sockaddr, 0, sizeof(sockaddr));
423 sockaddr.sin_family = AF_INET;
424 sockaddr.sin_port = htons(0);
425 sockaddr.sin_addr.s_addr = htonl(0x08080808);
426 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
427 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
428 NameInfoCallback, &result);
429 Process();
430 EXPECT_TRUE(result.done_);
431 EXPECT_EQ(ARES_SUCCESS, result.status_);
432 if (verbose) std::cerr << "8.8.8.8:0 => " << result.node_ << "/" << result.service_ << std::endl;
433 }
434
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV4UnassignedPort)435 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4UnassignedPort) {
436 NameInfoResult result;
437 struct sockaddr_in sockaddr;
438 memset(&sockaddr, 0, sizeof(sockaddr));
439 sockaddr.sin_family = AF_INET;
440 sockaddr.sin_port = htons(4); // Unassigned at IANA
441 sockaddr.sin_addr.s_addr = htonl(0x08080808);
442 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
443 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
444 NameInfoCallback, &result);
445 Process();
446 EXPECT_TRUE(result.done_);
447 EXPECT_EQ(ARES_SUCCESS, result.status_);
448 if (verbose) std::cerr << "8.8.8.8:4 => " << result.node_ << "/" << result.service_ << std::endl;
449 }
450
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV6Both)451 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Both) {
452 NameInfoResult result;
453 struct sockaddr_in6 sockaddr;
454 memset(&sockaddr, 0, sizeof(sockaddr));
455 sockaddr.sin6_family = AF_INET6;
456 sockaddr.sin6_port = htons(53);
457 memcpy(sockaddr.sin6_addr.s6_addr, cflare_addr6, 16);
458 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
459 ARES_NI_TCP|ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_NOFQDN,
460 NameInfoCallback, &result);
461 Process();
462 EXPECT_TRUE(result.done_);
463 EXPECT_EQ(ARES_SUCCESS, result.status_);
464 if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
465 }
466
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV6Neither)467 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Neither) {
468 NameInfoResult result;
469 struct sockaddr_in6 sockaddr;
470 memset(&sockaddr, 0, sizeof(sockaddr));
471 sockaddr.sin6_family = AF_INET6;
472 sockaddr.sin6_port = htons(53);
473 memcpy(sockaddr.sin6_addr.s6_addr, cflare_addr6, 16);
474 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
475 ARES_NI_TCP|ARES_NI_NOFQDN, // Neither specified => assume lookup host.
476 NameInfoCallback, &result);
477 Process();
478 EXPECT_TRUE(result.done_);
479 EXPECT_EQ(ARES_SUCCESS, result.status_);
480 if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
481 }
482
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV4Numeric)483 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4Numeric) {
484 NameInfoResult result;
485 struct sockaddr_in sockaddr;
486 memset(&sockaddr, 0, sizeof(sockaddr));
487 sockaddr.sin_family = AF_INET;
488 sockaddr.sin_port = htons(53);
489 sockaddr.sin_addr.s_addr = htonl(0x08080808);
490 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
491 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_TCP|ARES_NI_NUMERICHOST,
492 NameInfoCallback, &result);
493 Process();
494 EXPECT_TRUE(result.done_);
495 EXPECT_EQ(ARES_SUCCESS, result.status_);
496 EXPECT_EQ("8.8.8.8", result.node_);
497 if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
498 }
499
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV6Numeric)500 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Numeric) {
501 NameInfoResult result;
502 struct sockaddr_in6 sockaddr;
503 memset(&sockaddr, 0, sizeof(sockaddr));
504 sockaddr.sin6_family = AF_INET6;
505 sockaddr.sin6_port = htons(53);
506 memcpy(sockaddr.sin6_addr.s6_addr, cflare_addr6, 16);
507 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
508 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_DCCP|ARES_NI_NUMERICHOST,
509 NameInfoCallback, &result);
510 Process();
511 EXPECT_TRUE(result.done_);
512 EXPECT_EQ(ARES_SUCCESS, result.status_);
513 EXPECT_EQ("2606:4700:4700::1111%0", result.node_);
514 if (verbose) std::cerr << "[2606:4700:4700::1111]:53 => " << result.node_ << "/" << result.service_ << std::endl;
515 }
516
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV6LinkLocal)517 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6LinkLocal) {
518 NameInfoResult result;
519 struct sockaddr_in6 sockaddr;
520 memset(&sockaddr, 0, sizeof(sockaddr));
521 sockaddr.sin6_family = AF_INET6;
522 sockaddr.sin6_port = htons(53);
523 unsigned char addr6[16] = {0xfe, 0x80, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00,
524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
525 memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
526 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
527 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_DCCP|ARES_NI_NUMERICHOST,
528 NameInfoCallback, &result);
529 Process();
530 EXPECT_TRUE(result.done_);
531 EXPECT_EQ(ARES_SUCCESS, result.status_);
532 EXPECT_EQ("fe80:102:102::304%0", result.node_);
533 if (verbose) std::cerr << "[fe80:102:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
534 }
535
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV4NotFound)536 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFound) {
537 NameInfoResult result;
538 struct sockaddr_in sockaddr;
539 memset(&sockaddr, 0, sizeof(sockaddr));
540 sockaddr.sin_family = AF_INET;
541 sockaddr.sin_port = htons(4); // Port 4 unassigned at IANA
542 // RFC5737 says 192.0.2.0 should not be used publicly.
543 sockaddr.sin_addr.s_addr = htonl(0xC0000200);
544 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
545 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
546 NameInfoCallback, &result);
547 Process();
548 EXPECT_TRUE(result.done_);
549 EXPECT_EQ(ARES_SUCCESS, result.status_);
550 EXPECT_EQ("192.0.2.0", result.node_);
551 if (verbose) std::cerr << "192.0.2.0:53 => " << result.node_ << "/" << result.service_ << std::endl;
552 }
553
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV4NotFoundFail)554 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFoundFail) {
555 NameInfoResult result;
556 struct sockaddr_in sockaddr;
557 memset(&sockaddr, 0, sizeof(sockaddr));
558 sockaddr.sin_family = AF_INET;
559 sockaddr.sin_port = htons(53);
560 // RFC5737 says 192.0.2.0 should not be used publicly.
561 sockaddr.sin_addr.s_addr = htonl(0xC0000200);
562 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
563 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP|ARES_NI_NAMEREQD,
564 NameInfoCallback, &result);
565 Process();
566 EXPECT_TRUE(result.done_);
567 EXPECT_EQ(ARES_ENOTFOUND, result.status_);
568 }
569
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoV6NotFound)570 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6NotFound) {
571 NameInfoResult result;
572 struct sockaddr_in6 sockaddr;
573 memset(&sockaddr, 0, sizeof(sockaddr));
574 sockaddr.sin6_family = AF_INET6;
575 sockaddr.sin6_port = htons(53);
576 // 2001:db8::/32 is only supposed to be used in documentation.
577 unsigned char addr6[16] = {0x20, 0x01, 0x0d, 0xb8, 0x01, 0x02, 0x00, 0x00,
578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
579 memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
580 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
581 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
582 NameInfoCallback, &result);
583 Process();
584 EXPECT_TRUE(result.done_);
585 EXPECT_EQ(ARES_SUCCESS, result.status_);
586 EXPECT_EQ("2001:db8:102::304%0", result.node_);
587 if (verbose) std::cerr << "[2001:db8:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
588 }
589
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInvalidFamily)590 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFamily) {
591 NameInfoResult result;
592 struct sockaddr_in6 sockaddr;
593 memset(&sockaddr, 0, sizeof(sockaddr));
594 sockaddr.sin6_family = AF_INET6 + AF_INET;
595 sockaddr.sin6_port = htons(53);
596 memcpy(sockaddr.sin6_addr.s6_addr, cflare_addr6, 16);
597 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
598 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
599 NameInfoCallback, &result);
600 Process();
601 EXPECT_TRUE(result.done_);
602 EXPECT_EQ(ARES_ENOTIMP, result.status_);
603 }
604
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInvalidFlags)605 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFlags) {
606 NameInfoResult result;
607 struct sockaddr_in6 sockaddr;
608 memset(&sockaddr, 0, sizeof(sockaddr));
609 sockaddr.sin6_family = AF_INET6;
610 sockaddr.sin6_port = htons(53);
611 memcpy(sockaddr.sin6_addr.s6_addr, cflare_addr6, 16);
612 // Ask for both a name-required, and a numeric host.
613 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
614 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP|ARES_NI_NUMERICHOST|ARES_NI_NAMEREQD,
615 NameInfoCallback, &result);
616 Process();
617 EXPECT_TRUE(result.done_);
618 EXPECT_EQ(ARES_EBADFLAGS, result.status_);
619 }
620
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetServiceInfo)621 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfo) {
622 NameInfoResult result;
623 struct sockaddr_in sockaddr;
624 memset(&sockaddr, 0, sizeof(sockaddr));
625 sockaddr.sin_family = AF_INET;
626 sockaddr.sin_port = htons(53);
627 sockaddr.sin_addr.s_addr = htonl(0x08080808);
628 // Just look up service info
629 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
630 ARES_NI_LOOKUPSERVICE|ARES_NI_SCTP,
631 NameInfoCallback, &result);
632 Process();
633 EXPECT_TRUE(result.done_);
634 EXPECT_EQ(ARES_SUCCESS, result.status_);
635 EXPECT_EQ("", result.node_);
636 }
637
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetServiceInfoNumeric)638 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfoNumeric) {
639 NameInfoResult result;
640 struct sockaddr_in sockaddr;
641 memset(&sockaddr, 0, sizeof(sockaddr));
642 sockaddr.sin_family = AF_INET;
643 sockaddr.sin_port = htons(53);
644 sockaddr.sin_addr.s_addr = htonl(0x08080808);
645 // Just look up service info
646 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
647 ARES_NI_LOOKUPSERVICE|ARES_NI_SCTP|ARES_NI_NUMERICSERV,
648 NameInfoCallback, &result);
649 Process();
650 EXPECT_TRUE(result.done_);
651 EXPECT_EQ(ARES_SUCCESS, result.status_);
652 EXPECT_EQ("", result.node_);
653 EXPECT_EQ("53", result.service_);
654 }
655
VIRT_NONVIRT_TEST_F(DefaultChannelTest,LiveGetNameInfoAllocFail)656 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoAllocFail) {
657 NameInfoResult result;
658 struct sockaddr_in sockaddr;
659 memset(&sockaddr, 0, sizeof(sockaddr));
660 sockaddr.sin_family = AF_INET;
661 sockaddr.sin_port = htons(53);
662 sockaddr.sin_addr.s_addr = htonl(0x08080808);
663 SetAllocFail(1);
664 ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
665 ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
666 NameInfoCallback, &result);
667 Process();
668 EXPECT_TRUE(result.done_);
669 EXPECT_EQ(ARES_ENOMEM, result.status_);
670 }
671
672
673
TEST_F(DefaultChannelTest,LiveSetServers)674 TEST_F(DefaultChannelTest, LiveSetServers) {
675 struct ares_addr_node server1;
676 struct ares_addr_node server2;
677 server1.next = &server2;
678 server1.family = AF_INET;
679 server1.addr.addr4.s_addr = htonl(0x01020304);
680 server2.next = nullptr;
681 server2.family = AF_INET;
682 server2.addr.addr4.s_addr = htonl(0x02030405);
683
684 HostResult result;
685 ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
686 EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, &server1));
687 ares_cancel(channel_);
688 }
689
TEST_F(DefaultChannelTest,LiveSetServersPorts)690 TEST_F(DefaultChannelTest, LiveSetServersPorts) {
691 struct ares_addr_port_node server1;
692 struct ares_addr_port_node server2;
693 server1.next = &server2;
694 server1.family = AF_INET;
695 server1.addr.addr4.s_addr = htonl(0x01020304);
696 server1.udp_port = 111;
697 server1.tcp_port = 111;
698 server2.next = nullptr;
699 server2.family = AF_INET;
700 server2.addr.addr4.s_addr = htonl(0x02030405);
701 server2.udp_port = 0;
702 server2.tcp_port = 0;
703 EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
704
705 // Change while pending will requeue any requests to new servers
706 HostResult result;
707 ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
708 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, &server1));
709 ares_cancel(channel_);
710 }
711
TEST_F(DefaultChannelTest,LiveSetServersCSV)712 TEST_F(DefaultChannelTest, LiveSetServersCSV) {
713 HostResult result;
714 ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
715 // Change while pending will requeue any requests to new servers
716 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5"));
717 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports_csv(channel_, "1.2.3.4:56,2.3.4.5:67"));
718 ares_cancel(channel_);
719 }
720
721
722 } // namespace test
723 } // namespace ares
724