ares-test-mock-ai.cc
Go to the documentation of this file.
1 #include "ares-test-ai.h"
2 #include "dns-proto.h"
3 
4 #ifdef HAVE_NETINET_IN_H
5 #include <netinet/in.h>
6 #endif
7 
8 #include <sstream>
9 #include <vector>
10 
12 using testing::DoAll;
13 
14 namespace ares {
15 namespace test {
16 
17 MATCHER_P(IncludesNumAddresses, n, "") {
18  if(!arg)
19  return false;
20  int cnt = 0;
21  for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
22  cnt++;
23  return n == cnt;
24 }
25 
26 MATCHER_P(IncludesV4Address, address, "") {
27  if(!arg)
28  return false;
29  in_addr addressnum = {};
30  if (!ares_inet_pton(AF_INET, address, &addressnum))
31  return false; // wrong number format?
32  for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next) {
33  if (ai->ai_family != AF_INET)
34  continue;
35  if (reinterpret_cast<sockaddr_in*>(ai->ai_addr)->sin_addr.s_addr ==
36  addressnum.s_addr)
37  return true; // found
38  }
39  return false;
40 }
41 
42 MATCHER_P(IncludesV6Address, address, "") {
43  if(!arg)
44  return false;
45  in6_addr addressnum = {};
46  if (!ares_inet_pton(AF_INET6, address, &addressnum)) {
47  return false; // wrong number format?
48  }
49  for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next) {
50  if (ai->ai_family != AF_INET6)
51  continue;
52  if (!memcmp(
53  reinterpret_cast<sockaddr_in6*>(ai->ai_addr)->sin6_addr.s6_addr,
54  addressnum.s6_addr, sizeof(addressnum.s6_addr)))
55  return true; // found
56  }
57  return false;
58 }
59 
60 // UDP only so mock server doesn't get confused by concatenated requests
61 TEST_P(MockUDPChannelTestAI, GetAddrInfoParallelLookups) {
62  DNSPacket rsp1;
63  rsp1.set_response().set_aa()
64  .add_question(new DNSQuestion("www.google.com", T_A))
65  .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
66  ON_CALL(server_, OnRequest("www.google.com", T_A))
67  .WillByDefault(SetReply(&server_, &rsp1));
68  DNSPacket rsp2;
69  rsp2.set_response().set_aa()
70  .add_question(new DNSQuestion("www.example.com", T_A))
71  .add_answer(new DNSARR("www.example.com", 100, {1, 2, 3, 4}));
72  ON_CALL(server_, OnRequest("www.example.com", T_A))
73  .WillByDefault(SetReply(&server_, &rsp2));
74 
75  struct ares_addrinfo_hints hints = {};
76  hints.ai_family = AF_INET;
77  hints.ai_flags = ARES_AI_NOSORT;
78  AddrInfoResult result1;
79  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result1);
80  AddrInfoResult result2;
81  ares_getaddrinfo(channel_, "www.example.com.", NULL, &hints, AddrInfoCallback, &result2);
82  AddrInfoResult result3;
83  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result3);
84  Process();
85 
86  EXPECT_TRUE(result1.done_);
87  EXPECT_EQ(result1.status_, ARES_SUCCESS);
88  EXPECT_THAT(result1.ai_, IncludesNumAddresses(1));
89  EXPECT_THAT(result1.ai_, IncludesV4Address("2.3.4.5"));
90 
91  EXPECT_TRUE(result2.done_);
92  EXPECT_EQ(result2.status_, ARES_SUCCESS);
93  EXPECT_THAT(result2.ai_, IncludesNumAddresses(1));
94  EXPECT_THAT(result2.ai_, IncludesV4Address("1.2.3.4"));
95 
96  EXPECT_TRUE(result3.done_);
97  EXPECT_EQ(result3.status_, ARES_SUCCESS);
98  EXPECT_THAT(result3.ai_, IncludesNumAddresses(1));
99  EXPECT_THAT(result3.ai_, IncludesV4Address("2.3.4.5"));
100 }
101 
102 // UDP to TCP specific test
103 TEST_P(MockUDPChannelTestAI, TruncationRetry) {
104  DNSPacket rsptruncated;
105  rsptruncated.set_response().set_aa().set_tc()
106  .add_question(new DNSQuestion("www.google.com", T_A));
107  DNSPacket rspok;
108  rspok.set_response()
109  .add_question(new DNSQuestion("www.google.com", T_A))
110  .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
111  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
112  .WillOnce(SetReply(&server_, &rsptruncated))
113  .WillOnce(SetReply(&server_, &rspok));
114 
116  struct ares_addrinfo_hints hints = {};
117  hints.ai_family = AF_INET;
118  hints.ai_flags = ARES_AI_NOSORT;
119  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
120  Process();
121  EXPECT_TRUE(result.done_);
122  EXPECT_EQ(result.status_, ARES_SUCCESS);
123  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
124  EXPECT_THAT(result.ai_, IncludesV4Address("1.2.3.4"));
125 }
126 
127 // TCP only to prevent retries
128 TEST_P(MockTCPChannelTestAI, MalformedResponse) {
129  std::vector<byte> one = {0x01};
130  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
131  .WillOnce(SetReplyData(&server_, one));
132 
134  struct ares_addrinfo_hints hints = {};
135  hints.ai_family = AF_INET;
136  hints.ai_flags = ARES_AI_NOSORT;
137  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
138  Process();
139  EXPECT_TRUE(result.done_);
140  EXPECT_EQ(ARES_ETIMEOUT, result.status_);
141 }
142 
143 TEST_P(MockTCPChannelTestAI, FormErrResponse) {
144  DNSPacket rsp;
145  rsp.set_response().set_aa()
146  .add_question(new DNSQuestion("www.google.com", T_A));
147  rsp.set_rcode(FORMERR);
148  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
149  .WillOnce(SetReply(&server_, &rsp));
150 
152  struct ares_addrinfo_hints hints = {};
153  hints.ai_family = AF_INET;
154  hints.ai_flags = ARES_AI_NOSORT;
155  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
156  Process();
157  EXPECT_TRUE(result.done_);
158  EXPECT_EQ(ARES_EFORMERR, result.status_);
159 }
160 
161 TEST_P(MockTCPChannelTestAI, ServFailResponse) {
162  DNSPacket rsp;
163  rsp.set_response().set_aa()
164  .add_question(new DNSQuestion("www.google.com", T_A));
165  rsp.set_rcode(SERVFAIL);
166  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
167  .WillOnce(SetReply(&server_, &rsp));
168 
170  struct ares_addrinfo_hints hints = {};
171  hints.ai_family = AF_INET;
172  hints.ai_flags = ARES_AI_NOSORT;
173  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
174  Process();
175  EXPECT_TRUE(result.done_);
176  // ARES_FLAG_NOCHECKRESP not set, so SERVFAIL consumed
178 }
179 
180 TEST_P(MockTCPChannelTestAI, NotImplResponse) {
181  DNSPacket rsp;
182  rsp.set_response().set_aa()
183  .add_question(new DNSQuestion("www.google.com", T_A));
184  rsp.set_rcode(NOTIMP);
185  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
186  .WillOnce(SetReply(&server_, &rsp));
187 
189  struct ares_addrinfo_hints hints = {};
190  hints.ai_family = AF_INET;
191  hints.ai_flags = ARES_AI_NOSORT;
192  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
193  Process();
194  EXPECT_TRUE(result.done_);
195  // ARES_FLAG_NOCHECKRESP not set, so NOTIMP consumed
197 }
198 
199 TEST_P(MockTCPChannelTestAI, RefusedResponse) {
200  DNSPacket rsp;
201  rsp.set_response().set_aa()
202  .add_question(new DNSQuestion("www.google.com", T_A));
203  rsp.set_rcode(REFUSED);
204  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
205  .WillOnce(SetReply(&server_, &rsp));
206 
208  struct ares_addrinfo_hints hints = {};
209  hints.ai_family = AF_INET;
210  hints.ai_flags = ARES_AI_NOSORT;
211  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
212  Process();
213  EXPECT_TRUE(result.done_);
214  // ARES_FLAG_NOCHECKRESP not set, so REFUSED consumed
216 }
217 
218 TEST_P(MockTCPChannelTestAI, YXDomainResponse) {
219  DNSPacket rsp;
220  rsp.set_response().set_aa()
221  .add_question(new DNSQuestion("www.google.com", T_A));
222  rsp.set_rcode(YXDOMAIN);
223  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
224  .WillOnce(SetReply(&server_, &rsp));
225 
227  struct ares_addrinfo_hints hints = {};
228  hints.ai_family = AF_INET;
229  hints.ai_flags = ARES_AI_NOSORT;
230  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
231  Process();
232  EXPECT_TRUE(result.done_);
233  EXPECT_EQ(ARES_ENODATA, result.status_);
234 }
235 
237  : public MockChannelOptsTest,
238  public ::testing::WithParamInterface< std::pair<int, bool> > {
239  public:
242  FillOptions(&opts_),
244  static struct ares_options* FillOptions(struct ares_options * opts) {
245  memset(opts, 0, sizeof(struct ares_options));
246  // Set a few options that affect socket communications
247  opts->socket_send_buffer_size = 514;
248  opts->socket_receive_buffer_size = 514;
249  return opts;
250  }
251  private:
253 };
254 
256  ares_set_local_ip4(channel_, 0x7F000001);
257  byte addr6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
260  ares_set_local_dev(channel_, "dummy");
261 
262  DNSPacket rsp;
263  rsp.set_response().set_aa()
264  .add_question(new DNSQuestion("www.google.com", T_A))
265  .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
266  ON_CALL(server_, OnRequest("www.google.com", T_A))
267  .WillByDefault(SetReply(&server_, &rsp));
268 
270  struct ares_addrinfo_hints hints = {};
271  hints.ai_family = AF_INET;
272  hints.ai_flags = ARES_AI_NOSORT;
273  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
274  Process();
275  EXPECT_TRUE(result.done_);
276  EXPECT_EQ(ARES_SUCCESS, result.status_);
277  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
278  EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
279 }
280 
282  : public MockChannelOptsTest,
283  public ::testing::WithParamInterface< std::pair<int, bool> > {
284  public:
287  FillOptions(&opts_, ndots),
289  static struct ares_options* FillOptions(struct ares_options * opts, int ndots) {
290  memset(opts, 0, sizeof(struct ares_options));
291  // Set a few options that affect socket communications
292  opts->socket_send_buffer_size = 514;
293  opts->socket_receive_buffer_size = 514;
294  opts->ndots = ndots;
295  return opts;
296  }
297  private:
299 };
300 
302  public:
304 };
305 
307  ares_set_local_ip4(channel_, 0x7F000001);
308  byte addr6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
311  ares_set_local_dev(channel_, "dummy");
312 
313  DNSPacket rsp;
314  rsp.set_response().set_aa()
315  .add_question(new DNSQuestion("dynamodb.us-east-1.amazonaws.com", T_A))
316  .add_answer(new DNSARR("dynamodb.us-east-1.amazonaws.com", 100, {123, 45, 67, 8}));
317  ON_CALL(server_, OnRequest("dynamodb.us-east-1.amazonaws.com", T_A))
318  .WillByDefault(SetReply(&server_, &rsp));
319 
321  struct ares_addrinfo_hints hints = {};
322  hints.ai_family = AF_INET;
323  hints.ai_flags = ARES_AI_NOSORT;
324  ares_getaddrinfo(channel_, "dynamodb.us-east-1.amazonaws.com.", NULL, &hints, AddrInfoCallback, &result);
325  Process();
326  EXPECT_TRUE(result.done_);
327  EXPECT_EQ(ARES_SUCCESS, result.status_);
328  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
329  EXPECT_THAT(result.ai_, IncludesV4Address("123.45.67.8"));
330 }
331 
333  : public MockChannelOptsTest,
334  public ::testing::WithParamInterface< std::pair<int, bool> > {
335  public:
339  static struct ares_options* FillOptions(struct ares_options * opts, int flags) {
340  memset(opts, 0, sizeof(struct ares_options));
341  opts->flags = flags;
342  return opts;
343  }
344  private:
346 };
347 
349  public:
351 };
352 
354  DNSPacket rsp;
355  rsp.set_response().set_aa()
356  .add_question(new DNSQuestion("www.google.com", T_A));
357  rsp.set_rcode(SERVFAIL);
358  ON_CALL(server_, OnRequest("www.google.com", T_A))
359  .WillByDefault(SetReply(&server_, &rsp));
360 
362  struct ares_addrinfo_hints hints = {};
363  hints.ai_family = AF_INET;
364  hints.ai_flags = ARES_AI_NOSORT;
365  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
366  Process();
367  EXPECT_TRUE(result.done_);
368  EXPECT_EQ(ARES_ESERVFAIL, result.status_);
369 }
370 
372  DNSPacket rsp;
373  rsp.set_response().set_aa()
374  .add_question(new DNSQuestion("www.google.com", T_A));
375  rsp.set_rcode(NOTIMP);
376  ON_CALL(server_, OnRequest("www.google.com", T_A))
377  .WillByDefault(SetReply(&server_, &rsp));
378 
380  struct ares_addrinfo_hints hints = {};
381  hints.ai_family = AF_INET;
382  hints.ai_flags = ARES_AI_NOSORT;
383  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
384  Process();
385  EXPECT_TRUE(result.done_);
386  EXPECT_EQ(ARES_ENOTIMP, result.status_);
387 }
388 
390  DNSPacket rsp;
391  rsp.set_response().set_aa()
392  .add_question(new DNSQuestion("www.google.com", T_A));
393  rsp.set_rcode(REFUSED);
394  ON_CALL(server_, OnRequest("www.google.com", T_A))
395  .WillByDefault(SetReply(&server_, &rsp));
396 
398  struct ares_addrinfo_hints hints = {};
399  hints.ai_family = AF_INET;
400  hints.ai_flags = ARES_AI_NOSORT;
401  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
402  Process();
403  EXPECT_TRUE(result.done_);
404  EXPECT_EQ(ARES_EREFUSED, result.status_);
405 }
406 
408  DNSPacket rsp6;
409  rsp6.set_response().set_aa()
410  .add_question(new DNSQuestion("example.com", T_AAAA))
411  .add_answer(new DNSAaaaRR("example.com", 100,
412  {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
414  ON_CALL(server_, OnRequest("example.com", T_AAAA))
415  .WillByDefault(SetReply(&server_, &rsp6));
417  struct ares_addrinfo_hints hints = {};
418  hints.ai_family = AF_INET6;
419  hints.ai_flags = ARES_AI_NOSORT;
420  ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
422  Process();
423  EXPECT_TRUE(result.done_);
424  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
425  EXPECT_THAT(result.ai_, IncludesV6Address("2121:0000:0000:0000:0000:0000:0000:0303"));
426 }
427 
429  DNSPacket rsp4;
430  rsp4.set_response().set_aa()
431  .add_question(new DNSQuestion("example.com", T_A))
432  .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
433  ON_CALL(server_, OnRequest("example.com", T_A))
434  .WillByDefault(SetReply(&server_, &rsp4));
435  AddrInfoResult result = {};
436  struct ares_addrinfo_hints hints = {};
437  hints.ai_family = AF_INET;
438  hints.ai_flags = ARES_AI_NOSORT;
439  ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
441  Process();
442  EXPECT_TRUE(result.done_);
443  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
444  EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
445 }
446 
447 TEST_P(MockChannelTestAI, FamilyV4_MultipleAddresses) {
448  DNSPacket rsp4;
449  rsp4.set_response().set_aa()
450  .add_question(new DNSQuestion("example.com", T_A))
451  .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}))
452  .add_answer(new DNSARR("example.com", 100, {7, 8, 9, 0}));
453  ON_CALL(server_, OnRequest("example.com", T_A))
454  .WillByDefault(SetReply(&server_, &rsp4));
455  AddrInfoResult result = {};
456  struct ares_addrinfo_hints hints = {};
457  hints.ai_family = AF_INET;
458  hints.ai_flags = ARES_AI_NOSORT;
459  ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
461  Process();
462  EXPECT_TRUE(result.done_);
463  std::stringstream ss;
464  ss << result.ai_;
465  EXPECT_EQ("{addr=[2.3.4.5], addr=[7.8.9.0]}", ss.str());
466 }
467 
468 TEST_P(MockChannelTestAI, FamilyUnspecified) {
469  DNSPacket rsp6;
470  rsp6.set_response().set_aa()
471  .add_question(new DNSQuestion("example.com", T_AAAA))
472  .add_answer(new DNSAaaaRR("example.com", 100,
473  {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
475  ON_CALL(server_, OnRequest("example.com", T_AAAA))
476  .WillByDefault(SetReply(&server_, &rsp6));
477  DNSPacket rsp4;
478  rsp4.set_response().set_aa()
479  .add_question(new DNSQuestion("example.com", T_A))
480  .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
481  ON_CALL(server_, OnRequest("example.com", T_A))
482  .WillByDefault(SetReply(&server_, &rsp4));
484  struct ares_addrinfo_hints hints = {};
485  hints.ai_family = AF_UNSPEC;
486  hints.ai_flags = ARES_AI_NOSORT;
487  ares_getaddrinfo(channel_, "example.com.", NULL, &hints,
489  Process();
490  EXPECT_TRUE(result.done_);
491  EXPECT_THAT(result.ai_, IncludesNumAddresses(2));
492  EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
493  EXPECT_THAT(result.ai_, IncludesV6Address("2121:0000:0000:0000:0000:0000:0000:0303"));
494 }
495 
497  public:
499 };
500 
501 TEST_P(MockEDNSChannelTestAI, RetryWithoutEDNS) {
502  DNSPacket rspfail;
503  rspfail.set_response().set_aa().set_rcode(FORMERR)
504  .add_question(new DNSQuestion("www.google.com", T_A));
505  DNSPacket rspok;
506  rspok.set_response()
507  .add_question(new DNSQuestion("www.google.com", T_A))
508  .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
509  EXPECT_CALL(server_, OnRequest("www.google.com", T_A))
510  .WillOnce(SetReply(&server_, &rspfail))
511  .WillOnce(SetReply(&server_, &rspok));
512 
514  struct ares_addrinfo_hints hints = {};
515  hints.ai_family = AF_INET;
516  hints.ai_flags = ARES_AI_NOSORT;
517  ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
518  Process();
519  EXPECT_TRUE(result.done_);
520  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
521  EXPECT_THAT(result.ai_, IncludesV4Address("1.2.3.4"));
522 }
523 
524 TEST_P(MockChannelTestAI, SearchDomains) {
525  DNSPacket nofirst;
527  .add_question(new DNSQuestion("www.first.com", T_A));
528  ON_CALL(server_, OnRequest("www.first.com", T_A))
529  .WillByDefault(SetReply(&server_, &nofirst));
530  DNSPacket nosecond;
531  nosecond.set_response().set_aa().set_rcode(NXDOMAIN)
532  .add_question(new DNSQuestion("www.second.org", T_A));
533  ON_CALL(server_, OnRequest("www.second.org", T_A))
534  .WillByDefault(SetReply(&server_, &nosecond));
535  DNSPacket yesthird;
536  yesthird.set_response().set_aa()
537  .add_question(new DNSQuestion("www.third.gov", T_A))
538  .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
539  ON_CALL(server_, OnRequest("www.third.gov", T_A))
540  .WillByDefault(SetReply(&server_, &yesthird));
541 
543  struct ares_addrinfo_hints hints = {};
544  hints.ai_family = AF_INET;
545  hints.ai_flags = ARES_AI_NOSORT;
546  ares_getaddrinfo(channel_, "www", NULL, &hints, AddrInfoCallback, &result);
547  Process();
548  EXPECT_TRUE(result.done_);
549  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
550  EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
551 }
552 
553 TEST_P(MockChannelTestAI, SearchDomainsServFailOnAAAA) {
554  DNSPacket nofirst;
556  .add_question(new DNSQuestion("www.first.com", T_AAAA));
557  ON_CALL(server_, OnRequest("www.first.com", T_AAAA))
558  .WillByDefault(SetReply(&server_, &nofirst));
559  DNSPacket nofirst4;
560  nofirst4.set_response().set_aa().set_rcode(NXDOMAIN)
561  .add_question(new DNSQuestion("www.first.com", T_A));
562  ON_CALL(server_, OnRequest("www.first.com", T_A))
563  .WillByDefault(SetReply(&server_, &nofirst4));
564 
565  DNSPacket nosecond;
566  nosecond.set_response().set_aa().set_rcode(NXDOMAIN)
567  .add_question(new DNSQuestion("www.second.org", T_AAAA));
568  ON_CALL(server_, OnRequest("www.second.org", T_AAAA))
569  .WillByDefault(SetReply(&server_, &nosecond));
570  DNSPacket yessecond4;
571  yessecond4.set_response().set_aa()
572  .add_question(new DNSQuestion("www.second.org", T_A))
573  .add_answer(new DNSARR("www.second.org", 0x0200, {2, 3, 4, 5}));
574  ON_CALL(server_, OnRequest("www.second.org", T_A))
575  .WillByDefault(SetReply(&server_, &yessecond4));
576 
577  DNSPacket failthird;
578  failthird.set_response().set_aa().set_rcode(SERVFAIL)
579  .add_question(new DNSQuestion("www.third.gov", T_AAAA));
580  ON_CALL(server_, OnRequest("www.third.gov", T_AAAA))
581  .WillByDefault(SetReply(&server_, &failthird));
582  DNSPacket failthird4;
583  failthird4.set_response().set_aa().set_rcode(SERVFAIL)
584  .add_question(new DNSQuestion("www.third.gov", T_A));
585  ON_CALL(server_, OnRequest("www.third.gov", T_A))
586  .WillByDefault(SetReply(&server_, &failthird4));
587 
589  struct ares_addrinfo_hints hints = {};
590  hints.ai_family = AF_UNSPEC;
591  hints.ai_flags = ARES_AI_NOSORT;
592  ares_getaddrinfo(channel_, "www", NULL, &hints, AddrInfoCallback, &result);
593  Process();
594  EXPECT_TRUE(result.done_);
595  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
596  EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
597 }
598 
600  : public MockChannelOptsTest,
601  public ::testing::WithParamInterface< std::pair<int, bool> > {
602  public:
605  void CheckExample() {
607  struct ares_addrinfo_hints hints = {};
608  hints.ai_family = AF_INET;
609  hints.ai_flags = ARES_AI_NOSORT;
610  ares_getaddrinfo(channel_, "www.example.com.", NULL, &hints, AddrInfoCallback, &result);
611  Process();
612  EXPECT_TRUE(result.done_);
613  EXPECT_EQ(result.status_, ARES_SUCCESS);
614  EXPECT_THAT(result.ai_, IncludesNumAddresses(1));
615  EXPECT_THAT(result.ai_, IncludesV4Address("2.3.4.5"));
616  }
617 };
618 
620  public:
622 };
623 
625  public:
627 };
628 
629 
631  struct ares_options opts = {0};
632  int optmask = 0;
634  EXPECT_EQ(0, (optmask & ARES_OPT_NOROTATE));
636 
637  DNSPacket servfailrsp;
638  servfailrsp.set_response().set_aa().set_rcode(SERVFAIL)
639  .add_question(new DNSQuestion("www.example.com", T_A));
640  DNSPacket notimplrsp;
641  notimplrsp.set_response().set_aa().set_rcode(NOTIMP)
642  .add_question(new DNSQuestion("www.example.com", T_A));
643  DNSPacket okrsp;
644  okrsp.set_response().set_aa()
645  .add_question(new DNSQuestion("www.example.com", T_A))
646  .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
647 
648  EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A))
649  .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
650  EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A))
651  .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
652  EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A))
653  .WillOnce(SetReply(servers_[2].get(), &okrsp));
654  CheckExample();
655 
656  // Second time around, starts from server [1].
657  EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A))
658  .WillOnce(SetReply(servers_[1].get(), &servfailrsp));
659  EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A))
660  .WillOnce(SetReply(servers_[2].get(), &notimplrsp));
661  EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A))
662  .WillOnce(SetReply(servers_[0].get(), &okrsp));
663  CheckExample();
664 
665  // Third time around, starts from server [2].
666  EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A))
667  .WillOnce(SetReply(servers_[2].get(), &servfailrsp));
668  EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A))
669  .WillOnce(SetReply(servers_[0].get(), &notimplrsp));
670  EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A))
671  .WillOnce(SetReply(servers_[1].get(), &okrsp));
672  CheckExample();
673 }
674 
676  struct ares_options opts = {0};
677  int optmask = 0;
681 
682  DNSPacket servfailrsp;
683  servfailrsp.set_response().set_aa().set_rcode(SERVFAIL)
684  .add_question(new DNSQuestion("www.example.com", T_A));
685  DNSPacket notimplrsp;
686  notimplrsp.set_response().set_aa().set_rcode(NOTIMP)
687  .add_question(new DNSQuestion("www.example.com", T_A));
688  DNSPacket okrsp;
689  okrsp.set_response().set_aa()
690  .add_question(new DNSQuestion("www.example.com", T_A))
691  .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
692 
693  EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A))
694  .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
695  EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A))
696  .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
697  EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A))
698  .WillOnce(SetReply(servers_[2].get(), &okrsp));
699  CheckExample();
700 
701  // Second time around, still starts from server [0].
702  EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A))
703  .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
704  EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A))
705  .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
706  EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A))
707  .WillOnce(SetReply(servers_[2].get(), &okrsp));
708  CheckExample();
709 
710  // Third time around, still starts from server [0].
711  EXPECT_CALL(*servers_[0], OnRequest("www.example.com", T_A))
712  .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
713  EXPECT_CALL(*servers_[1], OnRequest("www.example.com", T_A))
714  .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
715  EXPECT_CALL(*servers_[2], OnRequest("www.example.com", T_A))
716  .WillOnce(SetReply(servers_[2].get(), &okrsp));
717  CheckExample();
718 }
719 
720 TEST_P(MockChannelTestAI, FamilyV4ServiceName) {
721  DNSPacket rsp4;
722  rsp4.set_response().set_aa()
723  .add_question(new DNSQuestion("example.com", T_A))
724  .add_answer(new DNSARR("example.com", 100, {1, 1, 1, 1}))
725  .add_answer(new DNSARR("example.com", 100, {2, 2, 2, 2}));
726  ON_CALL(server_, OnRequest("example.com", T_A))
727  .WillByDefault(SetReply(&server_, &rsp4));
728  AddrInfoResult result = {};
729  struct ares_addrinfo_hints hints = {};
730  hints.ai_family = AF_INET;
731  hints.ai_flags = ARES_AI_NOSORT;
732  ares_getaddrinfo(channel_, "example.com", "http", &hints, AddrInfoCallback, &result);
733  Process();
734  EXPECT_TRUE(result.done_);
735  std::stringstream ss;
736  ss << result.ai_;
737  EXPECT_EQ("{addr=[1.1.1.1:80], addr=[2.2.2.2:80]}", ss.str());
738 }
739 
740 // force-tcp does currently not work, possibly test DNS server swallows
741 // bytes from second query
742 //INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockChannelTestAI,
743 // ::testing::ValuesIn(ares::test::families_modes));
744 //const std::vector<std::pair<int, bool>> both_families_udponly = {
745 // std::make_pair<int, bool>(AF_INET, false),
746 // std::make_pair<int, bool>(AF_INET6, false)
747 //};
748 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockChannelTestAI,
749  ::testing::Values(std::make_pair<int, bool>(AF_INET, false)));
750 
751 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockUDPChannelTestAI,
753 
754 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockTCPChannelTestAI,
756 
757 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockExtraOptsTestAI,
759 
760 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockExtraOptsNDots5TestAI,
762 
763 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockNoCheckRespChannelTestAI,
765 
766 INSTANTIATE_TEST_CASE_P(AddressFamiliesAI, MockEDNSChannelTestAI,
768 
769 INSTANTIATE_TEST_CASE_P(TransportModesAI, RotateMultiMockTestAI,
771 
772 INSTANTIATE_TEST_CASE_P(TransportModesAI, NoRotateMultiMockTestAI,
774 
775 
776 } // namespace test
777 } // namespace ares
ares_set_local_ip4
CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip)
Definition: ares_init.c:2568
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
ares::test::MockFlagsChannelOptsTestAI::opts_
struct ares_options opts_
Definition: ares-test-mock-ai.cc:345
ares::DNSPacket
Definition: dns-proto.h:188
ares::DNSPacket::set_tc
DNSPacket & set_tc(bool v=true)
Definition: dns-proto.h:214
ares_inet_pton
CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst)
Definition: inet_net_pton.c:418
ares_addrinfo_node
Definition: ares.h:593
T_A
#define T_A
Definition: ares_nameser.h:310
ares::DNSPacket::set_aa
DNSPacket & set_aa(bool v=true)
Definition: dns-proto.h:213
testing::WithParamInterface
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1848
get
absl::string_view get(const Cont &c)
Definition: abseil-cpp/absl/strings/str_replace_test.cc:185
ares::test::RotateMultiMockTestAI
Definition: ares-test-mock-ai.cc:619
AF_INET6
#define AF_INET6
Definition: ares_setup.h:208
ares_options
Definition: ares.h:259
ares::test::AddrInfoResult
Definition: ares-test.h:294
NXDOMAIN
#define NXDOMAIN
Definition: ares_nameser.h:261
memset
return memset(p, 0, total)
ares::test::INSTANTIATE_TEST_CASE_P
INSTANTIATE_TEST_CASE_P(Modes, DefaultChannelModeTest, ::testing::Values("f", "b", "fb", "bf"))
EXPECT_THAT
#define EXPECT_THAT(value, matcher)
false
#define false
Definition: setup_once.h:323
ares::test::MockNoCheckRespChannelTestAI::MockNoCheckRespChannelTestAI
MockNoCheckRespChannelTestAI()
Definition: ares-test-mock-ai.cc:350
ares_set_local_ip6
CARES_EXTERN void ares_set_local_ip6(ares_channel channel, const unsigned char *local_ip6)
Definition: ares_init.c:2574
test
Definition: spinlock_test.cc:36
ARES_EFORMERR
#define ARES_EFORMERR
Definition: ares.h:102
YXDOMAIN
#define YXDOMAIN
Definition: ares_nameser.h:265
ares_addrinfo_hints
Definition: ares.h:621
ares::test::MockExtraOptsTestAI::FillOptions
static struct ares_options * FillOptions(struct ares_options *opts)
Definition: ares-test-mock-ai.cc:244
ares::test::MockTCPChannelTestAI
Definition: ares-test-ai.h:26
cstest_report.opts
opts
Definition: cstest_report.py:81
ares_destroy_options
CARES_EXTERN void ares_destroy_options(struct ares_options *options)
Definition: ares_destroy.c:25
ares::DNSAaaaRR
Definition: dns-proto.h:85
ARES_OPT_NOROTATE
#define ARES_OPT_NOROTATE
Definition: ares.h:169
ares::test::MATCHER_P
MATCHER_P(IncludesAtLeastNumAddresses, n, "")
Definition: ares-test-live.cc:21
ARES_OPT_ROTATE
#define ARES_OPT_ROTATE
Definition: ares.h:167
ares::test::MockUDPChannelTestAI
Definition: ares-test-ai.h:19
ares::test::MockExtraOptsTestAI
Definition: ares-test-mock-ai.cc:236
ARES_FLAG_NOCHECKRESP
#define ARES_FLAG_NOCHECKRESP
Definition: ares.h:149
ARES_ETIMEOUT
#define ARES_ETIMEOUT
Definition: ares.h:114
second
StrT second
Definition: cxa_demangle.cpp:4885
ARES_OPT_NDOTS
#define ARES_OPT_NDOTS
Definition: ares.h:156
FORMERR
#define FORMERR
Definition: ares_nameser.h:258
ARES_OPT_FLAGS
#define ARES_OPT_FLAGS
Definition: ares.h:153
ares::test::MockExtraOptsNDots5TestAI
Definition: ares-test-mock-ai.cc:301
true
#define true
Definition: setup_once.h:324
server_
Server *const server_
Definition: chttp2_server.cc:260
ares::test::families
std::vector< int > families
Definition: ares-test.cc:58
ares_options::ndots
int ndots
Definition: ares.h:263
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
ares::DNSPacket::add_question
DNSPacket & add_question(DNSQuestion *q)
Definition: dns-proto.h:194
ares_addrinfo_hints::ai_family
int ai_family
Definition: ares.h:623
sockaddr_in6
Definition: ares_ipv6.h:25
ares::test::MockChannelOptsTest::Process
void Process()
Definition: ares-test.cc:531
ARES_ESERVFAIL
#define ARES_ESERVFAIL
Definition: ares.h:103
ares::test::MockExtraOptsNDotsTestAI::opts_
struct ares_options opts_
Definition: ares-test-mock-ai.cc:298
ARES_ENODATA
#define ARES_ENODATA
Definition: ares.h:101
ares::test::NoRotateMultiMockTestAI
Definition: ares-test-mock-ai.cc:624
testing::DoAll
internal::DoAllAction< typename std::decay< Action >::type... > DoAll(Action &&... action)
Definition: bloaty/third_party/googletest/googlemock/include/gmock/gmock-actions.h:964
ARES_OPT_SOCK_RCVBUF
#define ARES_OPT_SOCK_RCVBUF
Definition: ares.h:165
ARES_AI_NOSORT
#define ARES_AI_NOSORT
Definition: ares.h:198
addr6
static struct sockaddr_in6 addr6
Definition: test-getnameinfo.c:34
channel_
RefCountedPtr< Channel > channel_
Definition: channel_connectivity.cc:209
arg
Definition: cmdline.cc:40
T_AAAA
#define T_AAAA
Definition: ares_nameser.h:391
ares::test::MockFlagsChannelOptsTestAI::FillOptions
static struct ares_options * FillOptions(struct ares_options *opts, int flags)
Definition: ares-test-mock-ai.cc:339
ares::test::MockExtraOptsTestAI::opts_
struct ares_options opts_
Definition: ares-test-mock-ai.cc:252
ares-test-ai.h
ares::test::MockNoCheckRespChannelTestAI
Definition: ares-test-mock-ai.cc:348
ares::test::TEST_P
TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV4)
Definition: ares-test-live.cc:143
ares::test::MockEDNSChannelTestAI::MockEDNSChannelTestAI
MockEDNSChannelTestAI()
Definition: ares-test-mock-ai.cc:498
ARES_SUCCESS
#define ARES_SUCCESS
Definition: ares.h:98
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
ares::test::MockExtraOptsNDots5TestAI::MockExtraOptsNDots5TestAI
MockExtraOptsNDots5TestAI()
Definition: ares-test-mock-ai.cc:303
NOTIMP
#define NOTIMP
Definition: ares_nameser.h:246
EXPECT_CALL
#define EXPECT_CALL(obj, call)
ARES_ECONNREFUSED
#define ARES_ECONNREFUSED
Definition: ares.h:113
ARES_FLAG_EDNS
#define ARES_FLAG_EDNS
Definition: ares.h:150
ON_CALL
#define ON_CALL(obj, call)
ares::DNSPacket::add_answer
DNSPacket & add_answer(DNSRR *q)
Definition: dns-proto.h:198
ares_save_options
CARES_EXTERN int ares_save_options(ares_channel channel, struct ares_options *options, int *optmask)
Definition: ares_init.c:314
ares::test::MockChannelTestAI
Definition: ares-test-ai.h:12
testing::Values
internal::ValueArray< T... > Values(T... v)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:335
ares::DNSPacket::set_rcode
DNSPacket & set_rcode(int rcode)
Definition: dns-proto.h:220
ARES_OPT_SOCK_SNDBUF
#define ARES_OPT_SOCK_SNDBUF
Definition: ares.h:164
ares::test::MockMultiServerChannelTestAI
Definition: ares-test-mock-ai.cc:599
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
ares::test::families_modes
std::vector< std::pair< int, bool > > families_modes
Definition: ares-test.cc:59
ares_set_local_dev
CARES_EXTERN void ares_set_local_dev(ares_channel channel, const char *local_dev_name)
Definition: ares_init.c:2581
ares::DNSPacket::set_response
DNSPacket & set_response(bool v=true)
Definition: dns-proto.h:212
ares::test::MockExtraOptsNDotsTestAI::MockExtraOptsNDotsTestAI
MockExtraOptsNDotsTestAI(int ndots)
Definition: ares-test-mock-ai.cc:285
REFUSED
#define REFUSED
Definition: ares_nameser.h:249
ares_addrinfo_hints::ai_flags
int ai_flags
Definition: ares.h:622
first
StrT first
Definition: cxa_demangle.cpp:4884
ares::test::MockExtraOptsNDotsTestAI
Definition: ares-test-mock-ai.cc:281
ares::test::AddrInfoResult::ai_
AddrInfo ai_
Definition: ares-test.h:302
absl::rotate
ForwardIterator rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last)
Definition: abseil-cpp/absl/algorithm/algorithm.h:148
ares::test::NoRotateMultiMockTestAI::NoRotateMultiMockTestAI
NoRotateMultiMockTestAI()
Definition: ares-test-mock-ai.cc:626
testing::WithParamInterface< std::pair< int, bool > >::GetParam
static const ParamType & GetParam()
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1855
ares::test::MockEDNSChannelTestAI
Definition: ares-test-mock-ai.cc:496
SERVFAIL
#define SERVFAIL
Definition: ares_nameser.h:243
ares::DNSARR
Definition: dns-proto.h:78
ares::test::MockExtraOptsTestAI::MockExtraOptsTestAI
MockExtraOptsTestAI()
Definition: ares-test-mock-ai.cc:240
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
ares::test::MockFlagsChannelOptsTestAI::MockFlagsChannelOptsTestAI
MockFlagsChannelOptsTestAI(int flags)
Definition: ares-test-mock-ai.cc:336
sockaddr_in6::sin6_addr
struct ares_in6_addr sin6_addr
Definition: ares_ipv6.h:30
ares::test::MockChannelOptsTest::channel_
ares_channel channel_
Definition: ares-test.h:197
ares::test::MockMultiServerChannelTestAI::CheckExample
void CheckExample()
Definition: ares-test-mock-ai.cc:605
ares::test::MockChannelOptsTest
Definition: ares-test.h:176
flags
uint32_t flags
Definition: retry_filter.cc:632
ares::test::AddrInfoResult::done_
bool done_
Definition: ares-test.h:297
ares_getaddrinfo
CARES_EXTERN void ares_getaddrinfo(ares_channel channel, const char *node, const char *service, const struct ares_addrinfo_hints *hints, ares_addrinfo_callback callback, void *arg)
Definition: ares_getaddrinfo.c:580
testing::ValuesIn
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:297
ares::test::AddrInfoResult::status_
int status_
Definition: ares-test.h:299
ares::test::MockExtraOptsNDotsTestAI::FillOptions
static struct ares_options * FillOptions(struct ares_options *opts, int ndots)
Definition: ares-test-mock-ai.cc:289
ares::test::RotateMultiMockTestAI::RotateMultiMockTestAI
RotateMultiMockTestAI()
Definition: ares-test-mock-ai.cc:621
ares::test::AddrInfoCallback
void AddrInfoCallback(void *data, int status, int timeouts, struct ares_addrinfo *ai)
Definition: ares-test.cc:664
ARES_ENOTIMP
#define ARES_ENOTIMP
Definition: ares.h:105
ares::DNSQuestion
Definition: dns-proto.h:45
ares
Definition: ares-test-ai.h:9
ARES_EREFUSED
#define ARES_EREFUSED
Definition: ares.h:106
testing::InvokeWithoutArgs
internal::InvokeWithoutArgsAction< typename std::decay< FunctionImpl >::type > InvokeWithoutArgs(FunctionImpl function_impl)
Definition: bloaty/third_party/googletest/googlemock/include/gmock/gmock-actions.h:1099
servers_
std::vector< std::unique_ptr< ServerData > > servers_
Definition: client_lb_end2end_test.cc:522
ares::test::MockFlagsChannelOptsTestAI
Definition: ares-test-mock-ai.cc:332
ares::test::MockMultiServerChannelTestAI::MockMultiServerChannelTestAI
MockMultiServerChannelTestAI(bool rotate)
Definition: ares-test-mock-ai.cc:603
dns-proto.h


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