2 * Copyright (C) Jakub Hrozek 2014 <jakub.hrozek@posteo.se>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the author nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 #include <netinet/in.h>
47 #include <arpa/nameser.h>
48 #include <arpa/inet.h>
54 static void test_res_fake_a_query(void **state)
57 struct __res_state dnsstate;
58 unsigned char answer[ANSIZE];
59 char addr[INET_ADDRSTRLEN];
61 ns_rr rr; /* expanded resource record */
63 (void) state; /* unused */
65 memset(&dnsstate, 0, sizeof(struct __res_state));
66 rv = res_ninit(&dnsstate);
67 assert_int_equal(rv, 0);
69 rv = res_nquery(&dnsstate, "cwrap.org", ns_c_in, ns_t_a,
70 answer, sizeof(answer));
71 assert_in_range(rv, 1, 100);
73 ns_initparse(answer, sizeof(answer), &handle);
74 /* The query must finish w/o an error, have one answer and the answer
75 * must be a parseable RR of type A and have the address that our
76 * fake hosts file contains
78 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
79 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
80 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
81 assert_int_equal(ns_rr_type(rr), ns_t_a);
82 assert_non_null(inet_ntop(AF_INET, ns_rr_rdata(rr),
84 assert_string_equal(addr, "127.0.0.21");
87 static void test_res_fake_a_query_case_insensitive(void **state)
90 struct __res_state dnsstate;
91 unsigned char answer[ANSIZE];
92 char addr[INET_ADDRSTRLEN];
94 ns_rr rr; /* expanded resource record */
96 (void) state; /* unused */
98 memset(&dnsstate, 0, sizeof(struct __res_state));
99 rv = res_ninit(&dnsstate);
100 assert_int_equal(rv, 0);
102 rv = res_nquery(&dnsstate, "CWRAP.ORG", ns_c_in, ns_t_a,
103 answer, sizeof(answer));
104 assert_in_range(rv, 1, 100);
106 ns_initparse(answer, sizeof(answer), &handle);
107 /* The query must finish w/o an error, have one answer and the answer
108 * must be a parseable RR of type A and have the address that our
109 * fake hosts file contains. Case does not matter.
111 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
112 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
113 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
114 assert_int_equal(ns_rr_type(rr), ns_t_a);
115 assert_non_null(inet_ntop(AF_INET, ns_rr_rdata(rr),
116 addr, sizeof(addr)));
117 assert_string_equal(addr, "127.0.0.21");
119 res_nclose(&dnsstate);
122 static void test_res_fake_a_query_trailing_dot(void **state)
125 struct __res_state dnsstate;
126 unsigned char answer[ANSIZE];
127 char addr[INET_ADDRSTRLEN];
129 ns_rr rr; /* expanded resource record */
131 (void) state; /* unused */
133 memset(&dnsstate, 0, sizeof(struct __res_state));
134 rv = res_ninit(&dnsstate);
135 assert_int_equal(rv, 0);
137 rv = res_nquery(&dnsstate, "cwrap.org.", ns_c_in, ns_t_a,
139 assert_in_range(rv, 1, 100);
141 ns_initparse(answer, sizeof(answer), &handle);
142 /* The query must finish w/o an error, have one answer and the answer
143 * must be a parseable RR of type A and have the address that our
144 * fake hosts file contains
146 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
147 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
148 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
149 assert_int_equal(ns_rr_type(rr), ns_t_a);
150 assert_non_null(inet_ntop(AF_INET, ns_rr_rdata(rr), addr, sizeof(addr)));
152 assert_string_equal(addr, "127.0.0.21");
154 res_nclose(&dnsstate);
157 static void test_res_fake_a_query_notfound(void **state)
160 struct __res_state dnsstate;
161 unsigned char answer[ANSIZE];
164 (void) state; /* unused */
166 memset(&dnsstate, 0, sizeof(struct __res_state));
167 rv = res_ninit(&dnsstate);
168 assert_int_equal(rv, 0);
170 rv = res_nquery(&dnsstate, "nosuchentry.org", ns_c_in, ns_t_a,
171 answer, sizeof(answer));
172 assert_in_range(rv, 1, 100);
174 ns_initparse(answer, sizeof(answer), &handle);
175 /* The query must finish w/o an error and have no answer */
176 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
177 assert_int_equal(ns_msg_count(handle, ns_s_an), 0);
180 static void test_res_fake_aaaa_query(void **state)
183 struct __res_state dnsstate;
184 unsigned char answer[ANSIZE];
185 char addr[INET6_ADDRSTRLEN];
187 ns_rr rr; /* expanded resource record */
189 (void) state; /* unused */
191 memset(&dnsstate, 0, sizeof(struct __res_state));
192 rv = res_ninit(&dnsstate);
193 assert_int_equal(rv, 0);
195 rv = res_nquery(&dnsstate, "cwrap6.org", ns_c_in, ns_t_aaaa,
196 answer, sizeof(answer));
197 assert_in_range(rv, 1, 100);
199 ns_initparse(answer, sizeof(answer), &handle);
200 /* The query must finish w/o an error, have one answer and the answer
201 * must be a parseable RR of type AAAA and have the address that our
202 * fake hosts file contains
204 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
205 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
206 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
207 assert_int_equal(ns_rr_type(rr), ns_t_aaaa);
208 assert_non_null(inet_ntop(AF_INET6, ns_rr_rdata(rr),
209 addr, sizeof(addr)));
210 assert_string_equal(addr, "2a00:1450:4013:c01::63");
213 static void test_res_fake_aaaa_query_notfound(void **state)
216 struct __res_state dnsstate;
217 unsigned char answer[ANSIZE];
220 (void) state; /* unused */
222 memset(&dnsstate, 0, sizeof(struct __res_state));
223 rv = res_ninit(&dnsstate);
224 assert_int_equal(rv, 0);
226 rv = res_nquery(&dnsstate, "nosuchentry.org", ns_c_in, ns_t_aaaa,
227 answer, sizeof(answer));
228 assert_in_range(rv, 1, 100);
230 ns_initparse(answer, sizeof(answer), &handle);
231 /* The query must finish w/o an error and have no answer */
232 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
233 assert_int_equal(ns_msg_count(handle, ns_s_an), 0);
236 static void test_res_fake_srv_query(void **state)
239 struct __res_state dnsstate;
240 unsigned char answer[ANSIZE];
242 ns_rr rr; /* expanded resource record */
243 const uint8_t *rrdata;
247 char hostname[MAXDNAME];
249 (void) state; /* unused */
251 memset(&dnsstate, 0, sizeof(struct __res_state));
252 rv = res_ninit(&dnsstate);
253 assert_int_equal(rv, 0);
255 rv = res_nquery(&dnsstate, "_ldap._tcp.cwrap.org", ns_c_in, ns_t_srv,
256 answer, sizeof(answer));
257 assert_in_range(rv, 1, 100);
259 ns_initparse(answer, sizeof(answer), &handle);
262 * The query must finish w/o an error, have one answer and the answer
263 * must be a parseable RR of type SRV and have the priority, weight,
264 * port and hostname as in the fake hosts file
266 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
267 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
268 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
269 assert_int_equal(ns_rr_type(rr), ns_t_srv);
271 rrdata = ns_rr_rdata(rr);
272 NS_GET16(prio, rrdata);
273 NS_GET16(weight, rrdata);
274 NS_GET16(port, rrdata);
276 rv = ns_name_uncompress(ns_msg_base(handle),
280 assert_int_not_equal(rv, -1);
282 assert_int_equal(prio, 1);
283 assert_int_equal(weight, 5);
284 assert_int_equal(port, 389);
285 assert_string_equal(hostname, "ldap.cwrap.org");
289 * Test the case of a SRV record query where the
290 * fake hosts file entry is minimal in the sense
291 * that it omits the priority and weight entries.
292 * The server then fills in some default values.
294 static void test_res_fake_srv_query_minimal(void **state)
297 struct __res_state dnsstate;
298 unsigned char answer[ANSIZE];
300 ns_rr rr; /* expanded resource record */
301 const uint8_t *rrdata;
305 char hostname[MAXDNAME];
306 char addr[INET_ADDRSTRLEN];
308 (void) state; /* unused */
310 memset(&dnsstate, 0, sizeof(struct __res_state));
311 rv = res_ninit(&dnsstate);
312 assert_int_equal(rv, 0);
314 rv = res_nquery(&dnsstate, "_krb5._tcp.cwrap.org", ns_c_in, ns_t_srv,
315 answer, sizeof(answer));
316 assert_in_range(rv, 1, 256);
318 ns_initparse(answer, sizeof(answer), &handle);
321 * The query must finish w/o an error, have one answer and the answer
322 * must be a parseable RR of type SRV and have the priority, weight,
323 * port and hostname as in the fake hosts file
325 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
326 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
327 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
328 assert_int_equal(ns_rr_type(rr), ns_t_srv);
330 rrdata = ns_rr_rdata(rr);
331 NS_GET16(prio, rrdata);
332 NS_GET16(weight, rrdata);
333 NS_GET16(port, rrdata);
335 rv = ns_name_uncompress(ns_msg_base(handle),
339 assert_int_not_equal(rv, -1);
341 assert_int_equal(prio, 1);
342 assert_int_equal(weight, 100);
343 assert_int_equal(port, 88);
344 assert_string_equal(hostname, "krb5.cwrap.org");
346 /* The additional section contains the A record of krb5.cwrap.org */
347 assert_int_equal(ns_msg_count(handle, ns_s_ar), 1);
348 assert_int_equal(ns_parserr(&handle, ns_s_ar, 0, &rr), 0);
349 assert_int_equal(ns_rr_type(rr), ns_t_a);
350 assert_string_equal(ns_rr_name(rr), "krb5.cwrap.org");
351 assert_non_null(inet_ntop(AF_INET, ns_rr_rdata(rr),
352 addr, sizeof(addr)));
353 assert_string_equal(addr, "127.0.0.23");
356 static void test_res_fake_uri_query(void **state)
359 struct __res_state dnsstate;
360 unsigned char answer[ANSIZE];
362 ns_rr rr; /* expanded resource record */
363 const uint8_t *rrdata;
367 (void) state; /* unused */
369 memset(&dnsstate, 0, sizeof(struct __res_state));
370 rv = res_ninit(&dnsstate);
371 assert_int_equal(rv, 0);
373 rv = res_nquery(&dnsstate, "_vpn.cwrap.org", ns_c_in, ns_t_uri,
374 answer, sizeof(answer));
375 assert_in_range(rv, 1, ANSIZE);
377 ns_initparse(answer, sizeof(answer), &handle);
380 * The query must finish w/o an error, have three answers and they must be
381 * a parseable RR of type URI and have the priority, weight, and URI string
382 * as in the hosts file.
384 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
385 assert_int_equal(ns_msg_count(handle, ns_s_an), 3);
387 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
388 assert_int_equal(ns_rr_type(rr), ns_t_uri);
389 rrdata = ns_rr_rdata(rr);
390 NS_GET16(prio, rrdata);
391 NS_GET16(weight, rrdata);
393 assert_int_equal(prio, 2);
394 assert_int_equal(weight, 5);
395 assert_string_equal(rrdata, "https://vpn.cwrap.org/VPN");
397 assert_int_equal(ns_parserr(&handle, ns_s_an, 1, &rr), 0);
398 assert_int_equal(ns_rr_type(rr), ns_t_uri);
399 rrdata = ns_rr_rdata(rr);
400 NS_GET16(prio, rrdata);
401 NS_GET16(weight, rrdata);
403 assert_int_equal(prio, 2);
404 assert_int_equal(weight, 10);
405 assert_string_equal(rrdata, "https://vpn2.cwrap.org/VPN");
407 assert_int_equal(ns_parserr(&handle, ns_s_an, 2, &rr), 0);
408 assert_int_equal(ns_rr_type(rr), ns_t_uri);
409 rrdata = ns_rr_rdata(rr);
410 NS_GET16(prio, rrdata);
411 NS_GET16(weight, rrdata);
413 assert_int_equal(prio, 2);
414 assert_int_equal(weight, 20);
415 assert_string_equal(rrdata, "https://vpn3.cwrap.org/VPN");
420 * Test the case of a URI record query where the
421 * fake hosts file entry is minimal in the sense
422 * that it omits the priority and weight entries.
423 * The server then fills in some default values.
425 static void test_res_fake_uri_query_minimal(void **state)
428 struct __res_state dnsstate;
429 unsigned char answer[ANSIZE];
431 ns_rr rr; /* expanded resource record */
432 const uint8_t *rrdata;
436 (void) state; /* unused */
438 memset(&dnsstate, 0, sizeof(struct __res_state));
439 rv = res_ninit(&dnsstate);
440 assert_int_equal(rv, 0);
442 rv = res_nquery(&dnsstate, "_ftp.cwrap.org", ns_c_in, ns_t_uri,
443 answer, sizeof(answer));
444 assert_in_range(rv, 1, 256);
446 ns_initparse(answer, sizeof(answer), &handle);
449 * The query must finish w/o an error, have one answer and the answer
450 * must be a parseable RR of type URI and have the priority, weight, and
451 * URI string as in the fake hosts file
453 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
454 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
455 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
456 assert_int_equal(ns_rr_type(rr), ns_t_uri);
458 rrdata = ns_rr_rdata(rr);
459 NS_GET16(prio, rrdata);
460 NS_GET16(weight, rrdata);
462 assert_int_equal(prio, 1);
463 assert_int_equal(weight, 100);
464 assert_string_equal(rrdata, "ftp://ftp.cwrap.org/public");
467 static void test_res_fake_soa_query(void **state)
470 struct __res_state dnsstate;
471 unsigned char answer[ANSIZE];
473 ns_rr rr; /* expanded resource record */
474 const uint8_t *rrdata;
475 char nameser[MAXDNAME];
476 char admin[MAXDNAME];
483 (void) state; /* unused */
485 memset(&dnsstate, 0, sizeof(struct __res_state));
486 rv = res_ninit(&dnsstate);
487 assert_int_equal(rv, 0);
489 rv = res_nquery(&dnsstate, "cwrap.org", ns_c_in, ns_t_soa,
490 answer, sizeof(answer));
491 assert_in_range(rv, 1, 100);
493 ns_initparse(answer, sizeof(answer), &handle);
496 * The query must finish w/o an error, have one answer and the answer
497 * must be a parseable RR of type SOA and have the data as in the fake
500 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
501 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
502 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
503 assert_int_equal(ns_rr_type(rr), ns_t_soa);
505 rrdata = ns_rr_rdata(rr);
507 rv = ns_name_uncompress(ns_msg_base(handle),
511 assert_int_not_equal(rv, -1);
514 rv = ns_name_uncompress(ns_msg_base(handle),
518 assert_int_not_equal(rv, -1);
521 NS_GET32(serial, rrdata);
522 NS_GET32(refresh, rrdata);
523 NS_GET32(retry, rrdata);
524 NS_GET32(expire, rrdata);
525 NS_GET32(minimum, rrdata);
527 assert_string_equal(nameser, "ns1.cwrap.org");
528 assert_string_equal(admin, "admin.cwrap.org");
529 assert_int_equal(serial, 2014100457);
530 assert_int_equal(refresh, 3600);
531 assert_int_equal(retry, 300);
532 assert_int_equal(expire, 1814400);
533 assert_int_equal(minimum, 600);
536 static void test_res_fake_cname_query(void **state)
539 struct __res_state dnsstate;
540 unsigned char answer[ANSIZE];
542 ns_rr rr; /* expanded resource record */
543 const uint8_t *rrdata;
544 char cname[MAXDNAME];
545 char addr[INET_ADDRSTRLEN];
547 (void) state; /* unused */
549 memset(&dnsstate, 0, sizeof(struct __res_state));
550 rv = res_ninit(&dnsstate);
551 assert_int_equal(rv, 0);
553 rv = res_nquery(&dnsstate, "rwrap.org", ns_c_in, ns_t_cname,
554 answer, sizeof(answer));
555 assert_in_range(rv, 1, 256);
557 ns_initparse(answer, 256, &handle);
558 ns_initparse(answer, sizeof(answer), &handle);
561 * The query must finish w/o an error, have one answer and the answer
562 * must be a parseable RR of type CNAME and have the cname as in the
565 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
566 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
567 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
568 assert_int_equal(ns_rr_type(rr), ns_t_cname);
570 rrdata = ns_rr_rdata(rr);
572 rv = ns_name_uncompress(ns_msg_base(handle),
576 assert_int_not_equal(rv, -1);
578 assert_string_equal(cname, "web.cwrap.org");
580 /* The CNAME points to an A record that's present in the additional
583 assert_int_equal(ns_msg_count(handle, ns_s_ar), 2);
585 assert_int_equal(ns_parserr(&handle, ns_s_ar, 0, &rr), 0);
586 assert_int_equal(ns_rr_type(rr), ns_t_cname);
587 assert_string_equal(ns_rr_name(rr), "web.cwrap.org");
588 rrdata = ns_rr_rdata(rr);
590 rv = ns_name_uncompress(ns_msg_base(handle),
594 assert_int_not_equal(rv, -1);
596 assert_string_equal(cname, "www.cwrap.org");
598 assert_int_equal(ns_parserr(&handle, ns_s_ar, 1, &rr), 0);
599 assert_int_equal(ns_rr_type(rr), ns_t_a);
600 assert_string_equal(ns_rr_name(rr), "www.cwrap.org");
601 assert_non_null(inet_ntop(AF_INET, ns_rr_rdata(rr),
602 addr, sizeof(addr)));
603 assert_string_equal(addr, "127.0.0.22");
606 static void test_res_fake_a_via_cname(void **state)
609 struct __res_state dnsstate;
610 unsigned char answer[ANSIZE];
612 ns_rr rr; /* expanded resource record */
613 const uint8_t *rrdata;
614 char cname[MAXDNAME];
615 char addr[INET_ADDRSTRLEN];
617 (void) state; /* unused */
619 memset(&dnsstate, 0, sizeof(struct __res_state));
620 rv = res_ninit(&dnsstate);
621 assert_int_equal(rv, 0);
623 /* Query for A record, but the key is a CNAME. The expected result is
624 * that the whole chain of CNAMEs will be included in the answer section
625 * along with the resulting A
627 rv = res_nquery(&dnsstate, "rwrap.org", ns_c_in, ns_t_a,
628 answer, sizeof(answer));
629 assert_in_range(rv, 1, 256);
631 ns_initparse(answer, sizeof(answer), &handle);
634 * The query must finish w/o an error, have three answers and the answers
635 * must be a parseable RR of type CNAME and have the cname as in the
638 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
639 assert_int_equal(ns_msg_count(handle, ns_s_an), 3);
641 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
642 assert_int_equal(ns_rr_type(rr), ns_t_cname);
644 rrdata = ns_rr_rdata(rr);
646 rv = ns_name_uncompress(ns_msg_base(handle),
650 assert_int_not_equal(rv, -1);
652 assert_string_equal(cname, "web.cwrap.org");
654 assert_int_equal(ns_parserr(&handle, ns_s_an, 1, &rr), 0);
655 assert_int_equal(ns_rr_type(rr), ns_t_cname);
657 rrdata = ns_rr_rdata(rr);
659 rv = ns_name_uncompress(ns_msg_base(handle),
663 assert_int_not_equal(rv, -1);
665 assert_string_equal(cname, "www.cwrap.org");
667 assert_int_equal(ns_parserr(&handle, ns_s_an, 2, &rr), 0);
668 assert_int_equal(ns_rr_type(rr), ns_t_a);
669 assert_string_equal(ns_rr_name(rr), "www.cwrap.org");
670 assert_non_null(inet_ntop(AF_INET, ns_rr_rdata(rr),
671 addr, sizeof(addr)));
672 assert_string_equal(addr, "127.0.0.22");
675 static void test_res_fake_ptr_query(void **state)
678 struct __res_state dnsstate;
679 unsigned char answer[ANSIZE];
680 const uint8_t *rrdata;
681 char ptrname[MAXDNAME];
683 ns_rr rr; /* expanded resource record */
685 (void) state; /* unused */
687 memset(&dnsstate, 0, sizeof(struct __res_state));
688 rv = res_ninit(&dnsstate);
689 assert_int_equal(rv, 0);
691 rv = res_nquery(&dnsstate, "22.0.0.127.in-addr.arpa", ns_c_in, ns_t_ptr,
692 answer, sizeof(answer));
693 assert_in_range(rv, 1, 100);
695 ns_initparse(answer, sizeof(answer), &handle);
698 * The query must finish w/o an error, have one answer and the answer
699 * must be a parseable RR of type PTR and have the name that our
700 * fake hosts file contains
702 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
703 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
704 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
705 assert_int_equal(ns_rr_type(rr), ns_t_ptr);
707 rrdata = ns_rr_rdata(rr);
709 rv = ns_name_uncompress(ns_msg_base(handle),
713 assert_int_not_equal(rv, -1);
715 assert_string_equal(ptrname, "www.cwrap.org");
718 static void test_res_fake_txt_query(void **state)
721 struct __res_state dnsstate;
722 unsigned char answer[ANSIZE];
724 ns_rr rr; /* expanded resource record */
725 const uint8_t *rrdata;
727 (void) state; /* unused */
729 memset(&dnsstate, 0, sizeof(struct __res_state));
730 rv = res_ninit(&dnsstate);
731 assert_int_equal(rv, 0);
733 rv = res_nquery(&dnsstate, "cwrap.org", ns_c_in, ns_t_txt,
734 answer, sizeof(answer));
735 assert_in_range(rv, 1, 256);
737 ns_initparse(answer, sizeof(answer), &handle);
740 * The query must finish w/o an error, have one answer and the answer
741 * must be a parseable RR of type TXT
743 assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
744 assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
745 assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
746 assert_int_equal(ns_rr_type(rr), ns_t_txt);
748 rrdata = ns_rr_rdata(rr);
749 assert_string_equal(rrdata, "v=spf1 mx");
756 const struct CMUnitTest fake_tests[] = {
757 cmocka_unit_test(test_res_fake_a_query),
758 cmocka_unit_test(test_res_fake_a_query_case_insensitive),
759 cmocka_unit_test(test_res_fake_a_query_trailing_dot),
760 cmocka_unit_test(test_res_fake_a_query_notfound),
761 cmocka_unit_test(test_res_fake_aaaa_query),
762 cmocka_unit_test(test_res_fake_aaaa_query_notfound),
763 cmocka_unit_test(test_res_fake_srv_query),
764 cmocka_unit_test(test_res_fake_srv_query_minimal),
765 cmocka_unit_test(test_res_fake_uri_query),
766 cmocka_unit_test(test_res_fake_uri_query_minimal),
767 cmocka_unit_test(test_res_fake_soa_query),
768 cmocka_unit_test(test_res_fake_cname_query),
769 cmocka_unit_test(test_res_fake_a_via_cname),
770 cmocka_unit_test(test_res_fake_ptr_query),
771 cmocka_unit_test(test_res_fake_txt_query),
774 rc = cmocka_run_group_tests(fake_tests, NULL, NULL);