2 * Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 2000-2002 Internet Software Consortium.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
18 /* $Id: lwtest.c,v 1.32 2008/04/02 02:37:42 marka Exp $ */
26 #include <isc/string.h>
28 #include <lwres/lwres.h>
29 #include <lwres/netdb.h>
30 #include <lwres/net.h>
33 * XXX getnameinfo errors, which don't appear to be standard.
35 #define ENI_NOSERVNAME 1
36 #define ENI_NOHOSTNAME 2
41 #define ENI_NOSOCKET 7
46 CHECK(lwres_result_t val, const char *msg) {
48 printf("I:%s returned %d\n", msg, val);
53 static unsigned char TESTSTRING[] =
54 "This is a test. This is only a test. !!!";
56 static lwres_context_t *ctx;
61 lwres_lwpacket_t pkt, pkt2;
62 lwres_nooprequest_t nooprequest, *nooprequest2;
63 lwres_noopresponse_t noopresponse, *noopresponse2;
67 pkt.serial = 0x11223344;
68 pkt.recvlength = 0x55667788;
71 nooprequest.datalength = strlen((char *)TESTSTRING);
72 nooprequest.data = TESTSTRING;
73 ret = lwres_nooprequest_render(ctx, &nooprequest, &pkt, &b);
74 CHECK(ret, "lwres_nooprequest_render");
77 * Now, parse it into a new structure.
79 lwres_buffer_first(&b);
80 ret = lwres_lwpacket_parseheader(&b, &pkt2);
81 CHECK(ret, "lwres_lwpacket_parseheader");
84 ret = lwres_nooprequest_parse(ctx, &b, &pkt2, &nooprequest2);
85 CHECK(ret, "lwres_nooprequest_parse");
87 assert(nooprequest.datalength == nooprequest2->datalength);
88 assert(memcmp(nooprequest.data, nooprequest2->data,
89 nooprequest.datalength) == 0);
91 lwres_nooprequest_free(ctx, &nooprequest2);
93 lwres_context_freemem(ctx, b.base, b.length);
98 pkt.serial = 0x11223344;
99 pkt.recvlength = 0x55667788;
100 pkt.result = 0xdeadbeef;
102 noopresponse.datalength = strlen((char *)TESTSTRING);
103 noopresponse.data = TESTSTRING;
104 ret = lwres_noopresponse_render(ctx, &noopresponse, &pkt, &b);
105 CHECK(ret, "lwres_noopresponse_render");
108 * Now, parse it into a new structure.
110 lwres_buffer_first(&b);
111 ret = lwres_lwpacket_parseheader(&b, &pkt2);
112 CHECK(ret, "lwres_lwpacket_parseheader");
114 noopresponse2 = NULL;
115 ret = lwres_noopresponse_parse(ctx, &b, &pkt2, &noopresponse2);
116 CHECK(ret, "lwres_noopresponse_parse");
118 assert(noopresponse.datalength == noopresponse2->datalength);
119 assert(memcmp(noopresponse.data, noopresponse2->data,
120 noopresponse.datalength) == 0);
122 lwres_noopresponse_free(ctx, &noopresponse2);
124 lwres_context_freemem(ctx, b.base, b.length);
130 test_gabn(const char *target, lwres_result_t expected, const char *address,
133 lwres_gabnresponse_t *res;
134 unsigned char addrbuf[16];
141 ret = lwres_getaddrsbyname(ctx, target,
142 LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6,
144 if (ret != expected) {
145 printf("I:gabn(%s) failed: %d\n", target, ret);
147 lwres_gabnresponse_free(ctx, &res);
151 if (ret == LWRES_R_SUCCESS) {
152 if (af == LWRES_ADDRTYPE_V4) {
154 ret = inet_pton(AF_INET, address, addrbuf);
158 ret = inet_pton(AF_INET6, address, addrbuf);
161 addr = LWRES_LIST_HEAD(res->addrs);
163 printf("I:gabn(%s) returned empty list\n", target);
167 while (addr != NULL) {
168 if (addr->family != af || addr->length != len ||
169 memcmp(addr->address, addrbuf, len) == 0)
171 addr = LWRES_LIST_NEXT(addr, link);
174 addr = LWRES_LIST_HEAD(res->addrs);
175 if (addr->family == LWRES_ADDRTYPE_V4)
176 (void)inet_ntop(AF_INET, addr->address,
177 outbuf, sizeof(outbuf));
179 (void)inet_ntop(AF_INET6, addr->address,
180 outbuf, sizeof(outbuf));
181 printf("I:gabn(%s) returned %s, expected %s\n",
182 target, outbuf, address);
188 lwres_gabnresponse_free(ctx, &res);
192 test_gnba(const char *target, lwres_uint32_t af, lwres_result_t expected,
195 lwres_gnbaresponse_t *res;
197 unsigned char addrbuf[16];
200 if (af == LWRES_ADDRTYPE_V4) {
202 ret = inet_pton(AF_INET, target, addrbuf);
206 ret = inet_pton(AF_INET6, target, addrbuf);
211 ret = lwres_getnamebyaddr(ctx, af, len, addrbuf, &res);
212 if (ret != expected) {
213 printf("I:gnba(%s) failed: %d\n", target, ret);
215 lwres_gnbaresponse_free(ctx, &res);
219 if (ret == LWRES_R_SUCCESS && strcasecmp(res->realname, name) != 0) {
220 printf("I:gnba(%s) returned %s, expected %s\n",
221 target, res->realname, name);
226 lwres_gnbaresponse_free(ctx, &res);
230 test_gethostbyname(const char *name, const char *address) {
232 unsigned char addrbuf[16];
235 hp = gethostbyname(name);
237 if (address == NULL && h_errno == HOST_NOT_FOUND)
239 else if (h_errno != HOST_NOT_FOUND) {
240 printf("I:gethostbyname(%s) failed: %s\n",
241 name, hstrerror(h_errno));
245 printf("I:gethostbyname(%s) returned not found\n",
251 ret = inet_pton(AF_INET, address, addrbuf);
253 if (memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0) {
255 (void)inet_ntop(AF_INET, hp->h_addr_list[0],
256 outbuf, sizeof(outbuf));
257 printf("I:gethostbyname(%s) returned %s, "
258 "expected %s\n", name, outbuf, address);
266 test_gethostbyname2(const char *name, const char *address, int af) {
268 unsigned char addrbuf[16];
271 hp = gethostbyname2(name, af);
273 if (address == NULL && h_errno == HOST_NOT_FOUND)
275 else if (h_errno != HOST_NOT_FOUND) {
276 printf("I:gethostbyname(%s) failed: %s\n",
277 name, hstrerror(h_errno));
281 printf("I:gethostbyname(%s) returned not found\n",
291 ret = inet_pton(af, address, addrbuf);
293 if (hp->h_addrtype != af) {
294 printf("I:gethostbyname(%s) returned wrong family\n",
299 if (len != (int)hp->h_length ||
300 memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0)
303 (void)inet_ntop(af, hp->h_addr_list[0],
304 outbuf, sizeof(outbuf));
305 printf("I:gethostbyname(%s) returned %s, "
306 "expected %s\n", name, outbuf, address);
314 test_getipnodebyname(const char *name, const char *address, int af,
318 unsigned char addrbuf[16];
324 flags |= AI_V4MAPPED;
328 hp = getipnodebyname(name, af, flags, &error_num);
330 if (address == NULL && error_num == HOST_NOT_FOUND)
332 else if (error_num != HOST_NOT_FOUND) {
333 printf("I:getipnodebyname(%s) failed: %d\n",
338 printf("I:getipnodebyname(%s) returned not found\n",
348 ret = inet_pton(af, address, addrbuf);
350 if (hp->h_addrtype != af) {
351 printf("I:getipnodebyname(%s) returned wrong family\n",
357 if (len != (int)hp->h_length ||
358 memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0)
361 (void)inet_ntop(af, hp->h_addr_list[0],
362 outbuf, sizeof(outbuf));
363 printf("I:getipnodebyname(%s) returned %s, "
364 "expected %s\n", name, outbuf, address);
374 test_gethostbyaddr(const char *address, int af, const char *name) {
383 ret = inet_pton(af, address, addrbuf);
386 hp = gethostbyaddr(addrbuf, len, af);
389 if (name == NULL && h_errno == HOST_NOT_FOUND)
391 else if (h_errno != HOST_NOT_FOUND) {
392 printf("I:gethostbyaddr(%s) failed: %s\n",
393 address, hstrerror(h_errno));
397 printf("I:gethostbyaddr(%s) returned not found\n",
403 if (strcmp(hp->h_name, name) != 0) {
404 printf("I:gethostbyname(%s) returned %s, "
405 "expected %s\n", address, hp->h_name, name);
413 test_getipnodebyaddr(const char *address, int af, const char *name) {
423 ret = inet_pton(af, address, addrbuf);
426 hp = getipnodebyaddr(addrbuf, len, af, &error_num);
429 if (name == NULL && error_num == HOST_NOT_FOUND)
431 else if (error_num != HOST_NOT_FOUND) {
432 printf("I:getipnodebyaddr(%s) failed: %d\n",
437 printf("I:getipnodebyaddr(%s) returned not found\n",
443 if (strcmp(hp->h_name, name) != 0) {
444 printf("I:getipnodebyaddr(%s) returned %s, "
445 "expected %s\n", address, hp->h_name, name);
455 test_getaddrinfo(const char *name, int af, int v4ok, int v6ok,
461 struct addrinfo hint;
462 unsigned char addrbuf[16];
464 if (v4ok == 1 && v6ok== 1) {
465 ret = getaddrinfo(name, NULL, NULL, &ai);
467 memset(&hint, 0, sizeof(hint));
469 hint.ai_family = AF_INET;
471 hint.ai_family = AF_INET6;
472 ret = getaddrinfo(name, NULL, &hint, &ai);
475 if (address == NULL && ret == EAI_NODATA)
477 else if (ret != EAI_NODATA) {
478 printf("I:getaddrinfo(%s,%d,%d) failed: %s\n",
479 name, v4ok, v6ok, gai_strerror(ret));
483 printf("I:getaddrinfo(%s,%d,%d) returned not found\n",
490 len = sizeof(struct sockaddr_in);
492 len = sizeof(struct sockaddr_in6);
493 ret = inet_pton(af, address, addrbuf);
495 if (ai->ai_family != af) {
496 printf("I:getaddrinfo(%s) returned wrong family\n",
502 if (len != (unsigned int) ai->ai_addrlen) {
504 (void)inet_ntop(af, ai->ai_addr,
505 outbuf, sizeof(outbuf));
506 printf("I:getaddrinfo(%s) returned %lub, "
507 "expected %ub\n", name,
508 (unsigned long)ai->ai_addrlen, len);
512 } else if (af == AF_INET) {
513 struct sockaddr_in *sin;
514 sin = (struct sockaddr_in *) ai->ai_addr;
515 if (memcmp(&sin->sin_addr.s_addr, addrbuf, 4) != 0) {
517 (void)inet_ntop(af, &sin->sin_addr.s_addr,
518 outbuf, sizeof(outbuf));
519 printf("I:getaddrinfo(%s) returned %s, "
520 "expected %s\n", name, outbuf, address);
526 struct sockaddr_in6 *sin6;
527 sin6 = (struct sockaddr_in6 *) ai->ai_addr;
528 if (memcmp(sin6->sin6_addr.s6_addr, addrbuf, 16) != 0)
531 (void)inet_ntop(af, &sin6->sin6_addr.s6_addr,
532 outbuf, sizeof(outbuf));
533 printf("I:getaddrinfo(%s) returned %s, "
534 "expected %s\n", name, outbuf, address);
545 test_getnameinfo(const char *address, int af, const char *name) {
547 struct sockaddr_in sin;
548 struct sockaddr_in6 sin6;
554 memset(&sin, 0, sizeof(sin));
555 ret = inet_pton(AF_INET, address, &sin.sin_addr.s_addr);
557 sin.sin_family = AF_INET;
558 #ifdef LWRES_PLATFORM_HAVESALEN
559 sin.sin_len = sizeof(sin);
561 sa = (struct sockaddr *) &sin;
564 memset(&sin6, 0, sizeof(sin6));
565 ret = inet_pton(AF_INET6, address, sin6.sin6_addr.s6_addr);
567 sin6.sin6_family = AF_INET6;
568 #ifdef LWRES_PLATFORM_HAVESALEN
569 sin6.sin6_len = sizeof(sin6);
571 sa = (struct sockaddr *) &sin6;
572 salen = sizeof(sin6);
576 ret = getnameinfo(sa, salen, host, sizeof(host), NULL, 0, NI_NAMEREQD);
579 if (name == NULL && ret == ENI_NOHOSTNAME)
581 else if (ret != ENI_NOHOSTNAME) {
582 printf("I:getnameinfo(%s) failed: %d\n",
587 printf("I:getnameinfo(%s) returned not found\n",
594 printf("I:getnameinfo(%s) returned %s, "
595 "expected NULL\n", address, host);
598 } else if (strcmp(host, name) != 0) {
599 printf("I:getnameinfo(%s) returned %s, expected %s\n",
600 address, host, name);
608 test_getrrsetbyname(const char *name, int rdclass, int rdtype,
609 unsigned int nrdatas, unsigned int nsigs,
613 struct rrsetinfo *rrinfo = NULL;
614 ret = getrrsetbyname(name, rdclass, rdtype, 0, &rrinfo);
615 if (ret != 0 && should_pass == 1) {
616 printf("I:getrrsetbyname(%s, %d) failed\n", name, rdtype);
619 } else if (ret == 0 && should_pass == 0) {
620 printf("I:getrrsetbyname(%s, %d) unexpectedly succeeded\n",
627 if (rrinfo->rri_nrdatas != nrdatas) {
628 printf("I:getrrsetbyname(%s, %d): got %d rr, expected %d\n",
629 name, rdtype, rrinfo->rri_nrdatas, nrdatas);
632 if (rrinfo->rri_nsigs != nsigs) {
633 printf("I:getrrsetbyname(%s, %d): got %d sig, expected %d\n",
634 name, rdtype, rrinfo->rri_nsigs, nsigs);
645 lwres_udp_port = 9210;
646 lwres_resolv_conf = "resolv.conf";
648 ret = lwres_context_create(&ctx, NULL, NULL, NULL, 0);
649 CHECK(ret, "lwres_context_create");
651 ret = lwres_conf_parse(ctx, "resolv.conf");
652 CHECK(ret, "lwres_conf_parse");
656 test_gabn("a.example1", LWRES_R_SUCCESS, "10.0.1.1",
658 test_gabn("a.example1.", LWRES_R_SUCCESS, "10.0.1.1",
660 test_gabn("a.example2", LWRES_R_SUCCESS, "10.0.2.1",
662 test_gabn("a.example2.", LWRES_R_SUCCESS, "10.0.2.1",
664 test_gabn("a.example3", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
665 test_gabn("a.example3.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
666 test_gabn("a", LWRES_R_SUCCESS, "10.0.1.1", LWRES_ADDRTYPE_V4);
667 test_gabn("a.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
669 test_gabn("a2", LWRES_R_SUCCESS, "10.0.1.1", LWRES_ADDRTYPE_V4);
670 test_gabn("a3", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
672 test_gabn("b.example1", LWRES_R_SUCCESS,
673 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
675 test_gabn("b.example1.", LWRES_R_SUCCESS,
676 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
678 test_gabn("b.example2", LWRES_R_SUCCESS,
679 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
681 test_gabn("b.example2.", LWRES_R_SUCCESS,
682 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
684 test_gabn("b.example3", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
685 test_gabn("b.example3.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
686 test_gabn("b", LWRES_R_SUCCESS,
687 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
689 test_gabn("b.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
691 test_gabn("d.example1", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
693 test_gabn("x", LWRES_R_SUCCESS, "10.1.10.1", LWRES_ADDRTYPE_V4);
694 test_gabn("x.", LWRES_R_SUCCESS, "10.1.10.1", LWRES_ADDRTYPE_V4);
696 test_gnba("10.10.10.1", LWRES_ADDRTYPE_V4, LWRES_R_SUCCESS,
698 test_gnba("10.10.10.17", LWRES_ADDRTYPE_V4, LWRES_R_NOTFOUND,
700 test_gnba("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
701 LWRES_ADDRTYPE_V6, LWRES_R_SUCCESS, "ip6.int.example");
702 test_gnba("0123:4567:89ab:cdef:0123:4567:89ab:cde0",
703 LWRES_ADDRTYPE_V6, LWRES_R_NOTFOUND, NULL);
704 test_gnba("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
705 LWRES_ADDRTYPE_V6, LWRES_R_SUCCESS, "ip6.arpa.example");
706 test_gnba("1123:4567:89ab:cdef:0123:4567:89ab:cde0",
707 LWRES_ADDRTYPE_V6, LWRES_R_NOTFOUND, NULL);
709 test_gethostbyname("a.example1.", "10.0.1.1");
710 test_gethostbyname("q.example1.", NULL);
712 test_gethostbyname2("a.example1.", "10.0.1.1", AF_INET);
713 test_gethostbyname2("b.example1.",
714 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
716 test_gethostbyname2("q.example1.", NULL, AF_INET);
718 test_getipnodebyname("a.example1.", "10.0.1.1", AF_INET, 0, 0);
719 test_getipnodebyname("b.example1.",
720 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
722 test_getipnodebyname("a.example1.",
723 "::ffff:10.0.1.1", AF_INET6, 1, 0);
724 test_getipnodebyname("a.example1.",
725 "::ffff:10.0.1.1", AF_INET6, 1, 1);
726 test_getipnodebyname("b.example1.",
727 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
729 test_getipnodebyname("q.example1.", NULL, AF_INET, 0, 0);
731 test_gethostbyaddr("10.10.10.1", AF_INET, "ipv4.example");
732 test_gethostbyaddr("10.10.10.17", AF_INET, NULL);
733 test_gethostbyaddr("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
734 AF_INET6, "ip6.int.example");
735 test_gethostbyaddr("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
736 AF_INET6, "ip6.arpa.example");
738 test_getipnodebyaddr("10.10.10.1", AF_INET, "ipv4.example");
739 test_getipnodebyaddr("10.10.10.17", AF_INET, NULL);
740 test_getipnodebyaddr("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
741 AF_INET6, "ip6.int.example");
742 test_getipnodebyaddr("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
743 AF_INET6, "ip6.arpa.example");
745 test_getaddrinfo("a.example1.", AF_INET, 1, 1, "10.0.1.1");
746 test_getaddrinfo("a.example1.", AF_INET, 1, 0, "10.0.1.1");
747 test_getaddrinfo("a.example1.", AF_INET, 0, 1, NULL);
748 test_getaddrinfo("b.example1.", AF_INET6, 1, 1,
749 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff");
750 test_getaddrinfo("b.example1.", AF_INET6, 1, 0, NULL);
751 test_getaddrinfo("b.example1.", AF_INET6, 0, 1,
752 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff");
754 test_getnameinfo("10.10.10.1", AF_INET, "ipv4.example");
755 test_getnameinfo("10.10.10.17", AF_INET, NULL);
756 test_getnameinfo("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
757 AF_INET6, "ip6.int.example");
758 test_getnameinfo("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
759 AF_INET6, "ip6.arpa.example");
760 test_getnameinfo("1122:3344:5566:7788:99aa:bbcc:ddee:ff00",
761 AF_INET6, "dname.example1");
763 test_getrrsetbyname("a", 1, 1, 1, 0, 1);
764 test_getrrsetbyname("a.example1.", 1, 1, 1, 0, 1);
765 test_getrrsetbyname("e.example1.", 1, 1, 1, 1, 1);
766 test_getrrsetbyname("e.example1.", 1, 255, 1, 1, 0);
767 test_getrrsetbyname("e.example1.", 1, 46, 2, 0, 1);
768 test_getrrsetbyname("", 1, 1, 0, 0, 0);