ares-test-live.cc
Go to the documentation of this file.
1 // This file includes tests that attempt to do real lookups
2 // of DNS names using the local machine's live infrastructure.
3 // As a result, we don't check the results very closely, to allow
4 // for varying local configurations.
5 
6 #include "ares-test.h"
7 
8 #ifdef HAVE_NETDB_H
9 #include <netdb.h>
10 #endif
11 
12 namespace ares {
13 namespace test {
14 
15 // Use the address of Google's public DNS servers as example addresses that are
16 // likely to be accessible everywhere/everywhen.
17 unsigned char gdns_addr4[4] = {0x08, 0x08, 0x08, 0x08};
18 unsigned char gdns_addr6[16] = {0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00,
19  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88};
20 
21 MATCHER_P(IncludesAtLeastNumAddresses, n, "") {
22  if(!arg)
23  return false;
24  int cnt = 0;
25  for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
26  cnt++;
27  return cnt >= n;
28 }
29 
30 MATCHER_P(OnlyIncludesAddrType, addrtype, "") {
31  if(!arg)
32  return false;
33  for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
34  if (ai->ai_family != addrtype)
35  return false;
36  return true;
37 }
38 
39 MATCHER_P(IncludesAddrType, addrtype, "") {
40  if(!arg)
41  return false;
42  for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
43  if (ai->ai_family == addrtype)
44  return true;
45  return false;
46 }
47 
48 //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV4) {
49  //struct ares_addrinfo_hints hints = {};
50  //hints.ai_family = AF_INET;
51  //AddrInfoResult result;
52  //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
53  //Process();
54  //EXPECT_TRUE(result.done_);
55  //EXPECT_EQ(ARES_SUCCESS, result.status_);
56  //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
57  //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET));
58 //}
59 
60 //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV6) {
61  //struct ares_addrinfo_hints hints = {};
62  //hints.ai_family = AF_INET6;
63  //AddrInfoResult result;
64  //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
65  //Process();
66  //EXPECT_TRUE(result.done_);
67  //EXPECT_EQ(ARES_SUCCESS, result.status_);
68  //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
69  //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET6));
70 //}
71 
72 //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoUnspec) {
73  //struct ares_addrinfo_hints hints = {};
74  //hints.ai_family = AF_UNSPEC;
75  //AddrInfoResult result;
76  //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
77  //Process();
78  //EXPECT_TRUE(result.done_);
79  //EXPECT_EQ(ARES_SUCCESS, result.status_);
80  //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(2));
81  //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET6));
82  //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET));
83 //}
84 
85 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameV4) {
87  ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
88  Process();
89  EXPECT_TRUE(result.done_);
90  EXPECT_EQ(ARES_SUCCESS, result.status_);
91  EXPECT_LT(0, (int)result.host_.addrs_.size());
92  EXPECT_EQ(AF_INET, result.host_.addrtype_);
93 }
94 
95 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameV6) {
97  ares_gethostbyname(channel_, "www.google.com.", AF_INET6, HostCallback, &result);
98  Process();
99  EXPECT_TRUE(result.done_);
100  EXPECT_EQ(ARES_SUCCESS, result.status_);
101  EXPECT_LT(0, (int)result.host_.addrs_.size());
102  EXPECT_EQ(AF_INET6, result.host_.addrtype_);
103 }
104 
108  Process();
109  EXPECT_TRUE(result.done_);
110  EXPECT_EQ(ARES_SUCCESS, result.status_);
111  EXPECT_LT(0, (int)result.host_.addrs_.size());
112  EXPECT_EQ(AF_INET, result.host_.addrtype_);
113 }
114 
118  Process();
119  EXPECT_TRUE(result.done_);
120  EXPECT_EQ(ARES_SUCCESS, result.status_);
121  EXPECT_LT(0, (int)result.host_.addrs_.size());
122  EXPECT_EQ(AF_INET6, result.host_.addrtype_);
123 }
124 
125 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameFile) {
126  struct hostent *host = nullptr;
127 
128  // Still need a channel even to query /etc/hosts.
130  ares_gethostbyname_file(nullptr, "localhost", AF_INET, &host));
131 
132  int rc = ares_gethostbyname_file(channel_, "bogus.mcname", AF_INET, &host);
133  EXPECT_EQ(nullptr, host);
135 
136  rc = ares_gethostbyname_file(channel_, "localhost", AF_INET, &host);
137  if (rc == ARES_SUCCESS) {
138  EXPECT_NE(nullptr, host);
139  ares_free_hostent(host);
140  }
141 }
142 
143 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV4) {
145  ares_gethostbyname(channel_, "localhost", AF_INET, HostCallback, &result);
146  Process();
147  EXPECT_TRUE(result.done_);
148  if ((result.status_ != ARES_ENOTFOUND) && (result.status_ != ARES_ECONNREFUSED)) {
149  EXPECT_EQ(ARES_SUCCESS, result.status_);
150  EXPECT_EQ(1, (int)result.host_.addrs_.size());
151  EXPECT_EQ(AF_INET, result.host_.addrtype_);
152  EXPECT_NE(std::string::npos, result.host_.name_.find("localhost"));
153  }
154 }
155 
156 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV6) {
159  Process();
160  EXPECT_TRUE(result.done_);
161  if (result.status_ == ARES_SUCCESS) {
162  EXPECT_EQ(1, (int)result.host_.addrs_.size());
163  EXPECT_EQ(AF_INET6, result.host_.addrtype_);
164  std::stringstream ss;
165  ss << HostEnt(result.host_);
166  EXPECT_NE(std::string::npos, result.host_.name_.find("localhost"));
167  }
168 }
169 
170 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV4) {
172  ares_gethostbyname(channel_, "127.0.0.1", AF_INET, HostCallback, &result);
173  Process();
174  EXPECT_TRUE(result.done_);
175  EXPECT_EQ(ARES_SUCCESS, result.status_);
176  EXPECT_EQ(1, (int)result.host_.addrs_.size());
177  EXPECT_EQ(AF_INET, result.host_.addrtype_);
178  std::stringstream ss;
179  ss << HostEnt(result.host_);
180  EXPECT_EQ("{'127.0.0.1' aliases=[] addrs=[127.0.0.1]}", ss.str());
181 }
182 
183 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV6) {
186  Process();
187  EXPECT_TRUE(result.done_);
188  if (result.status_ != ARES_ENOTFOUND) {
189  EXPECT_EQ(ARES_SUCCESS, result.status_);
190  EXPECT_EQ(1, (int)result.host_.addrs_.size());
191  EXPECT_EQ(AF_INET6, result.host_.addrtype_);
192  std::stringstream ss;
193  ss << HostEnt(result.host_);
194  EXPECT_EQ("{'::1' aliases=[] addrs=[0000:0000:0000:0000:0000:0000:0000:0001]}", ss.str());
195  }
196 }
197 
198 TEST_P(DefaultChannelModeTest, LiveGetLocalhostFailFamily) {
200  ares_gethostbyname(channel_, "127.0.0.1", AF_INET+AF_INET6, HostCallback, &result);
201  Process();
202  EXPECT_TRUE(result.done_);
203  EXPECT_EQ(ARES_ENOTIMP, result.status_);
204 }
205 
206 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV4) {
208  struct in_addr addr;
209  addr.s_addr = htonl(INADDR_LOOPBACK);
210  ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET, HostCallback, &result);
211  Process();
212  EXPECT_TRUE(result.done_);
213  if (result.status_ != ARES_ENOTFOUND) {
214  EXPECT_EQ(ARES_SUCCESS, result.status_);
215  EXPECT_LT(0, (int)result.host_.addrs_.size());
216  EXPECT_EQ(AF_INET, result.host_.addrtype_);
217  // oddly, travis does not resolve to localhost, but a random hostname starting with travis-job
218  if (result.host_.name_.find("travis-job") == std::string::npos) {
219  EXPECT_NE(std::string::npos,
220  result.host_.name_.find("localhost"));
221  }
222  }
223 }
224 
225 TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV6) {
227  struct in6_addr addr;
228  memset(&addr, 0, sizeof(addr));
229  addr.s6_addr[15] = 1; // in6addr_loopback
231  Process();
232  EXPECT_TRUE(result.done_);
233  if (result.status_ != ARES_ENOTFOUND) {
234  EXPECT_EQ(ARES_SUCCESS, result.status_);
235  EXPECT_LT(0, (int)result.host_.addrs_.size());
236  EXPECT_EQ(AF_INET6, result.host_.addrtype_);
237  const std::string& name = result.host_.name_;
238  EXPECT_TRUE(std::string::npos != name.find("localhost") ||
239  std::string::npos != name.find("ip6-loopback"));
240  }
241 }
242 
243 TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailFamily) {
245  unsigned char addr[4] = {8, 8, 8, 8};
246  ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET6+AF_INET,
247  HostCallback, &result);
248  EXPECT_TRUE(result.done_);
249  EXPECT_EQ(ARES_ENOTIMP, result.status_);
250 }
251 
252 TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAddrSize) {
254  unsigned char addr[4] = {8, 8, 8, 8};
255  ares_gethostbyaddr(channel_, addr, sizeof(addr) - 1, AF_INET,
256  HostCallback, &result);
257  EXPECT_TRUE(result.done_);
258  EXPECT_EQ(ARES_ENOTIMP, result.status_);
259 }
260 
261 TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAlloc) {
263  unsigned char addr[4] = {8, 8, 8, 8};
264  SetAllocFail(1);
265  ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET,
266  HostCallback, &result);
267  EXPECT_TRUE(result.done_);
268  EXPECT_EQ(ARES_ENOMEM, result.status_);
269 }
270 
271 INSTANTIATE_TEST_CASE_P(Modes, DefaultChannelModeTest,
272  ::testing::Values("f", "b", "fb", "bf"));
273 
276  ares_search(channel_, "www.youtube.com.", C_IN, T_A,
278  Process();
279  EXPECT_TRUE(result.done_);
280  EXPECT_EQ(ARES_SUCCESS, result.status_);
281 }
282 
287  Process();
288  EXPECT_TRUE(result.done_);
289  EXPECT_NE(ARES_SUCCESS, result.status_);
290 }
291 
294  ares_search(channel_, "google.com.", C_IN, T_NS,
296  Process();
297  EXPECT_TRUE(result.done_);
298  EXPECT_EQ(ARES_SUCCESS, result.status_);
299 }
300 
303  ares_search(channel_, "google.com.", C_IN, T_MX,
305  Process();
306  EXPECT_TRUE(result.done_);
307  EXPECT_EQ(ARES_SUCCESS, result.status_);
308 }
309 
312  ares_search(channel_, "google.com.", C_IN, T_TXT,
314  Process();
315  EXPECT_TRUE(result.done_);
316  EXPECT_EQ(ARES_SUCCESS, result.status_);
317 }
318 
321  ares_search(channel_, "google.com.", C_IN, T_SOA,
323  Process();
324  EXPECT_TRUE(result.done_);
325  EXPECT_EQ(ARES_SUCCESS, result.status_);
326 }
327 
330  ares_search(channel_, "_imap._tcp.gmail.com.", C_IN, T_SRV,
332  Process();
333  EXPECT_TRUE(result.done_);
334  EXPECT_EQ(ARES_SUCCESS, result.status_);
335 }
336 
339  ares_search(channel_, "google.com.", C_IN, T_ANY,
341  Process();
342  EXPECT_TRUE(result.done_);
343  EXPECT_EQ(ARES_SUCCESS, result.status_);
344 }
345 
348  struct sockaddr_in sockaddr;
349  memset(&sockaddr, 0, sizeof(sockaddr));
350  sockaddr.sin_family = AF_INET;
351  sockaddr.sin_port = htons(53);
352  sockaddr.sin_addr.s_addr = htonl(0x08080808);
353  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
356  Process();
357  EXPECT_TRUE(result.done_);
358  EXPECT_EQ(ARES_SUCCESS, result.status_);
359  if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
360 }
361 
362 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NoPort) {
364  struct sockaddr_in sockaddr;
365  memset(&sockaddr, 0, sizeof(sockaddr));
366  sockaddr.sin_family = AF_INET;
367  sockaddr.sin_port = htons(0);
368  sockaddr.sin_addr.s_addr = htonl(0x08080808);
369  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
372  Process();
373  EXPECT_TRUE(result.done_);
374  EXPECT_EQ(ARES_SUCCESS, result.status_);
375  if (verbose) std::cerr << "8.8.8.8:0 => " << result.node_ << "/" << result.service_ << std::endl;
376 }
377 
378 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4UnassignedPort) {
380  struct sockaddr_in sockaddr;
381  memset(&sockaddr, 0, sizeof(sockaddr));
382  sockaddr.sin_family = AF_INET;
383  sockaddr.sin_port = htons(4); // Unassigned at IANA
384  sockaddr.sin_addr.s_addr = htonl(0x08080808);
385  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
388  Process();
389  EXPECT_TRUE(result.done_);
390  EXPECT_EQ(ARES_SUCCESS, result.status_);
391  if (verbose) std::cerr << "8.8.8.8:4 => " << result.node_ << "/" << result.service_ << std::endl;
392 }
393 
394 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Both) {
396  struct sockaddr_in6 sockaddr;
397  memset(&sockaddr, 0, sizeof(sockaddr));
398  sockaddr.sin6_family = AF_INET6;
399  sockaddr.sin6_port = htons(53);
400  memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
401  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
404  Process();
405  EXPECT_TRUE(result.done_);
406  EXPECT_EQ(ARES_SUCCESS, result.status_);
407  if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
408 }
409 
410 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Neither) {
412  struct sockaddr_in6 sockaddr;
413  memset(&sockaddr, 0, sizeof(sockaddr));
414  sockaddr.sin6_family = AF_INET6;
415  sockaddr.sin6_port = htons(53);
416  memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
417  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
418  ARES_NI_TCP|ARES_NI_NOFQDN, // Neither specified => assume lookup host.
420  Process();
421  EXPECT_TRUE(result.done_);
422  EXPECT_EQ(ARES_SUCCESS, result.status_);
423  if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
424 }
425 
426 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4Numeric) {
428  struct sockaddr_in sockaddr;
429  memset(&sockaddr, 0, sizeof(sockaddr));
430  sockaddr.sin_family = AF_INET;
431  sockaddr.sin_port = htons(53);
432  sockaddr.sin_addr.s_addr = htonl(0x08080808);
433  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
436  Process();
437  EXPECT_TRUE(result.done_);
438  EXPECT_EQ(ARES_SUCCESS, result.status_);
439  EXPECT_EQ("8.8.8.8", result.node_);
440  if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
441 }
442 
443 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Numeric) {
445  struct sockaddr_in6 sockaddr;
446  memset(&sockaddr, 0, sizeof(sockaddr));
447  sockaddr.sin6_family = AF_INET6;
448  sockaddr.sin6_port = htons(53);
449  memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
450  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
453  Process();
454  EXPECT_TRUE(result.done_);
455  EXPECT_EQ(ARES_SUCCESS, result.status_);
456  EXPECT_EQ("2001:4860:4860::8888%0", result.node_);
457  if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
458 }
459 
460 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6LinkLocal) {
462  struct sockaddr_in6 sockaddr;
463  memset(&sockaddr, 0, sizeof(sockaddr));
464  sockaddr.sin6_family = AF_INET6;
465  sockaddr.sin6_port = htons(53);
466  unsigned char addr6[16] = {0xfe, 0x80, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00,
467  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
468  memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
469  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
472  Process();
473  EXPECT_TRUE(result.done_);
474  EXPECT_EQ(ARES_SUCCESS, result.status_);
475  EXPECT_EQ("fe80:102:102::304%0", result.node_);
476  if (verbose) std::cerr << "[fe80:102:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
477 }
478 
479 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFound) {
481  struct sockaddr_in sockaddr;
482  memset(&sockaddr, 0, sizeof(sockaddr));
483  sockaddr.sin_family = AF_INET;
484  sockaddr.sin_port = htons(4); // Port 4 unassigned at IANA
485  // RFC5737 says 192.0.2.0 should not be used publically.
486  sockaddr.sin_addr.s_addr = htonl(0xC0000200);
487  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
490  Process();
491  EXPECT_TRUE(result.done_);
492  EXPECT_EQ(ARES_SUCCESS, result.status_);
493  EXPECT_EQ("192.0.2.0", result.node_);
494  if (verbose) std::cerr << "192.0.2.0:53 => " << result.node_ << "/" << result.service_ << std::endl;
495 }
496 
497 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFoundFail) {
499  struct sockaddr_in sockaddr;
500  memset(&sockaddr, 0, sizeof(sockaddr));
501  sockaddr.sin_family = AF_INET;
502  sockaddr.sin_port = htons(53);
503  // RFC5737 says 192.0.2.0 should not be used publically.
504  sockaddr.sin_addr.s_addr = htonl(0xC0000200);
505  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
508  Process();
509  EXPECT_TRUE(result.done_);
510  EXPECT_EQ(ARES_ENOTFOUND, result.status_);
511 }
512 
513 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6NotFound) {
515  struct sockaddr_in6 sockaddr;
516  memset(&sockaddr, 0, sizeof(sockaddr));
517  sockaddr.sin6_family = AF_INET6;
518  sockaddr.sin6_port = htons(53);
519  // 2001:db8::/32 is only supposed to be used in documentation.
520  unsigned char addr6[16] = {0x20, 0x01, 0x0d, 0xb8, 0x01, 0x02, 0x00, 0x00,
521  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
522  memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
523  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
526  Process();
527  EXPECT_TRUE(result.done_);
528  EXPECT_EQ(ARES_SUCCESS, result.status_);
529  EXPECT_EQ("2001:db8:102::304%0", result.node_);
530  if (verbose) std::cerr << "[2001:db8:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
531 }
532 
533 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFamily) {
535  struct sockaddr_in6 sockaddr;
536  memset(&sockaddr, 0, sizeof(sockaddr));
537  sockaddr.sin6_family = AF_INET6 + AF_INET;
538  sockaddr.sin6_port = htons(53);
539  memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
540  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
543  Process();
544  EXPECT_TRUE(result.done_);
545  EXPECT_EQ(ARES_ENOTIMP, result.status_);
546 }
547 
548 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFlags) {
550  struct sockaddr_in6 sockaddr;
551  memset(&sockaddr, 0, sizeof(sockaddr));
552  sockaddr.sin6_family = AF_INET6;
553  sockaddr.sin6_port = htons(53);
554  memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
555  // Ask for both a name-required, and a numeric host.
556  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
559  Process();
560  EXPECT_TRUE(result.done_);
561  EXPECT_EQ(ARES_EBADFLAGS, result.status_);
562 }
563 
566  struct sockaddr_in sockaddr;
567  memset(&sockaddr, 0, sizeof(sockaddr));
568  sockaddr.sin_family = AF_INET;
569  sockaddr.sin_port = htons(53);
570  sockaddr.sin_addr.s_addr = htonl(0x08080808);
571  // Just look up service info
572  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
575  Process();
576  EXPECT_TRUE(result.done_);
577  EXPECT_EQ(ARES_SUCCESS, result.status_);
578  EXPECT_EQ("", result.node_);
579 }
580 
581 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfoNumeric) {
583  struct sockaddr_in sockaddr;
584  memset(&sockaddr, 0, sizeof(sockaddr));
585  sockaddr.sin_family = AF_INET;
586  sockaddr.sin_port = htons(53);
587  sockaddr.sin_addr.s_addr = htonl(0x08080808);
588  // Just look up service info
589  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
592  Process();
593  EXPECT_TRUE(result.done_);
594  EXPECT_EQ(ARES_SUCCESS, result.status_);
595  EXPECT_EQ("", result.node_);
596  EXPECT_EQ("53", result.service_);
597 }
598 
599 VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoAllocFail) {
601  struct sockaddr_in sockaddr;
602  memset(&sockaddr, 0, sizeof(sockaddr));
603  sockaddr.sin_family = AF_INET;
604  sockaddr.sin_port = htons(53);
605  sockaddr.sin_addr.s_addr = htonl(0x08080808);
606  SetAllocFail(1);
607  ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
610  Process();
611  EXPECT_TRUE(result.done_);
612  EXPECT_EQ(ARES_ENOMEM, result.status_);
613 }
614 
617  int bitmask = ares_getsock(channel_, socks, 3);
618  EXPECT_EQ(0, bitmask);
619  bitmask = ares_getsock(channel_, nullptr, 0);
620  EXPECT_EQ(0, bitmask);
621 
622  // Ask again with a pending query.
624  ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
625  bitmask = ares_getsock(channel_, socks, 3);
626  EXPECT_NE(0, bitmask);
627  bitmask = ares_getsock(channel_, nullptr, 0);
628  EXPECT_EQ(0, bitmask);
629 
630  Process();
631 }
632 
633 TEST_F(LibraryTest, GetTCPSock) {
635  struct ares_options opts = {0};
636  opts.tcp_port = 53;
637  opts.flags = ARES_FLAG_USEVC;
638  int optmask = ARES_OPT_TCP_PORT | ARES_OPT_FLAGS;
640  EXPECT_NE(nullptr, channel);
641 
643  int bitmask = ares_getsock(channel, socks, 3);
644  EXPECT_EQ(0, bitmask);
645  bitmask = ares_getsock(channel, nullptr, 0);
646  EXPECT_EQ(0, bitmask);
647 
648  // Ask again with a pending query.
650  ares_gethostbyname(channel, "www.google.com.", AF_INET, HostCallback, &result);
651  bitmask = ares_getsock(channel, socks, 3);
652  EXPECT_NE(0, bitmask);
653  bitmask = ares_getsock(channel, nullptr, 0);
654  EXPECT_EQ(0, bitmask);
655 
656  ProcessWork(channel, NoExtraFDs, nullptr);
657 
659 }
660 
661 TEST_F(DefaultChannelTest, VerifySocketFunctionCallback) {
662  VirtualizeIO vio(channel_);
663 
664  auto my_functions = VirtualizeIO::default_functions;
665  size_t count = 0;
666 
667  my_functions.asocket = [](int af, int type, int protocol, void * p) {
668  EXPECT_NE(nullptr, p);
669  (*reinterpret_cast<size_t *>(p))++;
671  };
672 
673  ares_set_socket_functions(channel_, &my_functions, &count);
674 
675  {
676  count = 0;
678  ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
679  Process();
680  EXPECT_TRUE(result.done_);
681  EXPECT_NE(0, count);
682  }
683 
684  {
685  count = 0;
688 
690  ares_gethostbyname(copy, "www.google.com.", AF_INET, HostCallback, &result);
691  ProcessWork(copy, NoExtraFDs, nullptr);
692  EXPECT_TRUE(result.done_);
694  EXPECT_NE(0, count);
695  }
696 
697 }
698 
699 TEST_F(DefaultChannelTest, LiveSetServers) {
700  struct ares_addr_node server1;
701  struct ares_addr_node server2;
702  server1.next = &server2;
703  server1.family = AF_INET;
704  server1.addr.addr4.s_addr = htonl(0x01020304);
705  server2.next = nullptr;
706  server2.family = AF_INET;
707  server2.addr.addr4.s_addr = htonl(0x02030405);
708 
709  // Change not allowed while request is pending
711  ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
714 }
715 
716 TEST_F(DefaultChannelTest, LiveSetServersPorts) {
717  struct ares_addr_port_node server1;
718  struct ares_addr_port_node server2;
719  server1.next = &server2;
720  server1.family = AF_INET;
721  server1.addr.addr4.s_addr = htonl(0x01020304);
722  server1.udp_port = 111;
723  server1.tcp_port = 111;
724  server2.next = nullptr;
725  server2.family = AF_INET;
726  server2.addr.addr4.s_addr = htonl(0x02030405);
727  server2.udp_port = 0;
728  server2.tcp_port = 0;;
729  EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
730 
731  // Change not allowed while request is pending
733  ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
736 }
737 
738 TEST_F(DefaultChannelTest, LiveSetServersCSV) {
739  // Change not allowed while request is pending
741  ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
742  EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5"));
743  EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_ports_csv(channel_, "1.2.3.4:56,2.3.4.5:67"));
745 }
746 
747 
748 } // namespace test
749 } // namespace ares
T_NS
#define T_NS
Definition: ares_nameser.h:313
ARES_NI_LOOKUPHOST
#define ARES_NI_LOOKUPHOST
Definition: ares.h:183
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
ARES_ENOMEM
#define ARES_ENOMEM
Definition: ares.h:117
ares::test::VIRT_NONVIRT_TEST_F
VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameV4)
Definition: ares-test-live.cc:85
ARES_NI_SCTP
#define ARES_NI_SCTP
Definition: ares.h:180
ares_addr_node::family
int family
Definition: ares.h:697
ares_addrinfo_node
Definition: ares.h:593
T_A
#define T_A
Definition: ares_nameser.h:310
ares::test::VirtualizeIO::default_functions
static const ares_socket_functions default_functions
Definition: ares-test.h:457
AF_INET6
#define AF_INET6
Definition: ares_setup.h:208
ares_options
Definition: ares.h:259
T_SRV
#define T_SRV
Definition: ares_nameser.h:406
memset
return memset(p, 0, total)
ares::test::INSTANTIATE_TEST_CASE_P
INSTANTIATE_TEST_CASE_P(Modes, DefaultChannelModeTest, ::testing::Values("f", "b", "fb", "bf"))
ares_addr_node::addr4
struct in_addr addr4
Definition: ares.h:699
test
Definition: spinlock_test.cc:36
ares_addr_port_node
Definition: ares.h:704
ARES_FLAG_USEVC
#define ARES_FLAG_USEVC
Definition: ares.h:142
copy
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
Definition: message_compress.cc:145
ares_addr_node
Definition: ares.h:695
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
ares_addr_port_node::addr
union ares_addr_port_node::@383 addr
protocol
Protocol protocol
Definition: client_callback_end2end_test.cc:67
ares_addr_node::addr
union ares_addr_node::@382 addr
cstest_report.opts
opts
Definition: cstest_report.py:81
ARES_NI_NUMERICSERV
#define ARES_NI_NUMERICSERV
Definition: ares.h:176
ares::test::MATCHER_P
MATCHER_P(IncludesAtLeastNumAddresses, n, "")
Definition: ares-test-live.cc:21
ares_addr_node::next
struct ares_addr_node * next
Definition: ares.h:696
setup.name
name
Definition: setup.py:542
ares_set_servers_csv
CARES_EXTERN int ares_set_servers_csv(ares_channel channel, const char *servers)
Definition: ares_options.c:395
ares::test::gdns_addr6
unsigned char gdns_addr6[16]
Definition: ares-test-live.cc:18
xds_manager.p
p
Definition: xds_manager.py:60
ares_set_servers_ports_csv
CARES_EXTERN int ares_set_servers_ports_csv(ares_channel channel, const char *servers)
Definition: ares_options.c:401
T_TXT
#define T_TXT
Definition: ares_nameser.h:355
ARES_OPT_FLAGS
#define ARES_OPT_FLAGS
Definition: ares.h:153
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
T_ANY
#define T_ANY
Definition: ares_nameser.h:469
ARES_NI_NUMERICHOST
#define ARES_NI_NUMERICHOST
Definition: ares.h:174
ares_free_hostent
CARES_EXTERN void ares_free_hostent(struct hostent *host)
Definition: ares_free_hostent.c:26
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
ares_set_socket_functions
CARES_EXTERN void ares_set_socket_functions(ares_channel channel, const struct ares_socket_functions *funcs, void *user_data)
Definition: ares_init.c:2606
ares_addr_port_node::addr4
struct in_addr addr4
Definition: ares.h:708
ARES_ENOTFOUND
#define ARES_ENOTFOUND
Definition: ares.h:104
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
ares_cancel
CARES_EXTERN void ares_cancel(ares_channel channel)
Definition: ares_cancel.c:26
sockaddr_in6
Definition: ares_ipv6.h:25
sockaddr_in6::sin6_port
unsigned short sin6_port
Definition: ares_ipv6.h:28
ares_getnameinfo
CARES_EXTERN void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, ares_socklen_t salen, int flags, ares_nameinfo_callback callback, void *arg)
Definition: ares_getnameinfo.c:76
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
T_SOA
#define T_SOA
Definition: ares_nameser.h:325
ares_dup
CARES_EXTERN int ares_dup(ares_channel *dest, ares_channel src)
Definition: ares_init.c:243
ARES_ENODATA
#define ARES_ENODATA
Definition: ares.h:101
ares::test::verbose
bool verbose
Definition: ares-test.cc:34
addr6
static struct sockaddr_in6 addr6
Definition: test-getnameinfo.c:34
ares::test::SearchCallback
void SearchCallback(void *data, int status, int timeouts, unsigned char *abuf, int alen)
Definition: ares-test.cc:686
ares::test::NameInfoResult
Definition: ares-test.h:271
channel_
RefCountedPtr< Channel > channel_
Definition: channel_connectivity.cc:209
arg
Definition: cmdline.cc:40
sockaddr_in6::sin6_family
unsigned short sin6_family
Definition: ares_ipv6.h:27
ares_gethostbyname_file
CARES_EXTERN int ares_gethostbyname_file(ares_channel channel, const char *name, int family, struct hostent **host)
Definition: ares_gethostbyname.c:321
ARES_OPT_TCP_PORT
#define ARES_OPT_TCP_PORT
Definition: ares.h:158
ares_addr_port_node::family
int family
Definition: ares.h:706
ares::test::TEST_P
TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV4)
Definition: ares-test-live.cc:143
ares-test.h
ARES_SUCCESS
#define ARES_SUCCESS
Definition: ares.h:98
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
ARES_NI_DCCP
#define ARES_NI_DCCP
Definition: ares.h:181
ares_set_servers
CARES_EXTERN int ares_set_servers(ares_channel channel, struct ares_addr_node *servers)
Definition: ares_options.c:143
ARES_ECONNREFUSED
#define ARES_ECONNREFUSED
Definition: ares.h:113
ares_getsock
CARES_EXTERN int ares_getsock(ares_channel channel, ares_socket_t *socks, int numsocks)
Definition: ares_getsock.c:20
ares::test::HostEnt
Definition: ares-test.h:237
ares::test::DefaultChannelTest
Definition: ares-test.h:91
ARES_SOCKET_BAD
#define ARES_SOCKET_BAD
Definition: ares.h:230
ares_channeldata
Definition: ares_private.h:266
ares_set_servers_ports
CARES_EXTERN int ares_set_servers_ports(ares_channel channel, struct ares_addr_port_node *servers)
Definition: ares_options.c:195
testing::Values
internal::ValueArray< T... > Values(T... v)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:335
ares::test::HostCallback
void HostCallback(void *data, int status, int timeouts, struct hostent *hostent)
Definition: ares-test.cc:591
C_IN
#define C_IN
Definition: ares_nameser.h:292
ares_search
CARES_EXTERN void ares_search(ares_channel channel, const char *name, int dnsclass, int type, ares_callback callback, void *arg)
Definition: ares_search.c:47
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
ares::test::NameInfoCallback
void NameInfoCallback(void *data, int status, int timeouts, char *node, char *service)
Definition: ares-test.cc:708
ares_addr_port_node::next
struct ares_addr_port_node * next
Definition: ares.h:705
ares_destroy
CARES_EXTERN void ares_destroy(ares_channel channel)
Definition: ares_destroy.c:43
ares_socket_t
int ares_socket_t
Definition: ares.h:229
EXPECT_LT
#define EXPECT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2032
ARES_NI_LOOKUPSERVICE
#define ARES_NI_LOOKUPSERVICE
Definition: ares.h:184
ares::test::VirtualizeIO
Definition: ares-test-internal.cc:555
ares_addr_port_node::tcp_port
int tcp_port
Definition: ares.h:712
ares::test::SearchResult
Definition: ares-test.h:260
ares::test::NoExtraFDs
std::set< int > NoExtraFDs()
Definition: ares-test.cc:163
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
ARES_NI_NOFQDN
#define ARES_NI_NOFQDN
Definition: ares.h:173
ares_gethostbyaddr
CARES_EXTERN void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, int family, ares_host_callback callback, void *arg)
Definition: ares_gethostbyaddr.c:58
ares::test::ProcessWork
void ProcessWork(ares_channel channel, std::function< std::set< int >()> get_extrafds, std::function< void(int)> process_extra)
Definition: ares-test.cc:64
sockaddr_in6::sin6_addr
struct ares_in6_addr sin6_addr
Definition: ares_ipv6.h:30
ares::test::HostResult
Definition: ares-test.h:248
test_server.socket
socket
Definition: test_server.py:65
ares_init_options
CARES_EXTERN int ares_init_options(ares_channel *channelptr, struct ares_options *options, int optmask)
Definition: ares_init.c:103
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
ARES_NI_NAMEREQD
#define ARES_NI_NAMEREQD
Definition: ares.h:175
ares::test::TEST_F
TEST_F(LibraryTest, OptionsChannelInit)
Definition: ares-test-init.cc:55
ARES_NI_TCP
#define ARES_NI_TCP
Definition: ares.h:178
ares::test::DefaultChannelModeTest
Definition: ares-test.h:111
ARES_NI_UDP
#define ARES_NI_UDP
Definition: ares.h:179
ARES_ENOTIMP
#define ARES_ENOTIMP
Definition: ares.h:105
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
ARES_EBADFLAGS
#define ARES_EBADFLAGS
Definition: ares.h:122
ares::test::gdns_addr4
unsigned char gdns_addr4[4]
Definition: ares-test-live.cc:17
ares_gethostbyname
CARES_EXTERN void ares_gethostbyname(ares_channel channel, const char *name, int family, ares_host_callback callback, void *arg)
Definition: ares_gethostbyname.c:75
ares
Definition: ares-test-ai.h:9
ares::test::LibraryTest
Definition: ares-test.h:60
ares_addr_port_node::udp_port
int udp_port
Definition: ares.h:711
T_MX
#define T_MX
Definition: ares_nameser.h:352


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:42