Commit cc1eee4f authored by Brian Wellington's avatar Brian Wellington
Browse files

Add lwresd test

parent 659bdaf3
# Copyright (C) 2000 Internet Software Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
# ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
# CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
# SOFTWARE.
srcdir = @srcdir@
VPATH = @srcdir@
top_srcdir = @top_srcdir@
@BIND9_VERSION@
@BIND9_INCLUDES@
CINCLUDES = ${LWRES_INCLUDES} ${ISC_INCLUDES}
CDEFINES =
CWARNINGS =
LWRESLIBS = ${top_srcdir}/lib/lwres/liblwres.@A@
LWRESDEPLIBS = ${top_srcdir}/lib/lwres/liblwres.@A@
DEPLIBS = ${LWRESDEPLIBS}
LIBS = ${LWRESLIBS} @LIBS@
TARGETS = lwtest
OBJS = lwtest.@O@
SRCS = lwtest.c
@BIND9_MAKE_RULES@
lwtest: ${OBJS} ${DEPLIBS}
${LIBTOOL} ${CC} ${CFLAGS} -o $@ ${OBJS} ${UOBJS} ${LIBS}
clean distclean::
rm -f ${TARGETS}
nameserver 10.53.0.1
search example1.
/*
* Copyright (C) 2000 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include <config.h>
#include <assert.h>
#include <stdlib.h>
#include <isc/net.h>
#include <lwres/lwres.h>
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
static int fails = 0;
static void
CHECK(int val, const char *msg) {
if (val != 0) {
printf("I: %s returned %d\n", msg, val);
exit(1);
}
}
#if 0
static void
hexdump(const char *msg, void *base, size_t len) {
unsigned char *p;
unsigned int cnt;
p = base;
cnt = 0;
printf("*** %s (%u bytes @ %p)\n", msg, len, base);
while (cnt < len) {
if (cnt % 16 == 0)
printf("%p: ", p);
else if (cnt % 8 == 0)
printf(" |");
printf(" %02x", *p++);
cnt++;
if (cnt % 16 == 0)
printf("\n");
}
if (cnt % 16 != 0)
printf("\n");
}
#endif
static char TESTSTRING[] = "This is a test. This is only a test. !!!";
static lwres_context_t *ctx;
static void
test_noop() {
int ret;
lwres_lwpacket_t pkt, pkt2;
lwres_nooprequest_t nooprequest, *nooprequest2;
lwres_noopresponse_t noopresponse, *noopresponse2;
lwres_buffer_t b;
pkt.pktflags = 0;
pkt.serial = 0x11223344;
pkt.recvlength = 0x55667788;
pkt.result = 0;
nooprequest.datalength = strlen(TESTSTRING);
nooprequest.data = TESTSTRING;
ret = lwres_nooprequest_render(ctx, &nooprequest, &pkt, &b);
CHECK(ret, "lwres_nooprequest_render");
/*
* Now, parse it into a new structure.
*/
lwres_buffer_first(&b);
ret = lwres_lwpacket_parseheader(&b, &pkt2);
CHECK(ret, "lwres_lwpacket_parseheader");
nooprequest2 = NULL;
ret = lwres_nooprequest_parse(ctx, &b, &pkt2, &nooprequest2);
CHECK(ret, "lwres_nooprequest_parse");
assert(nooprequest.datalength == nooprequest2->datalength);
assert(memcmp(nooprequest.data, nooprequest2->data,
nooprequest.datalength) == 0);
lwres_nooprequest_free(ctx, &nooprequest2);
lwres_context_freemem(ctx, b.base, b.length);
b.base = NULL;
b.length = 0;
pkt.pktflags = 0;
pkt.serial = 0x11223344;
pkt.recvlength = 0x55667788;
pkt.result = 0xdeadbeef;
noopresponse.data = TESTSTRING;
ret = lwres_noopresponse_render(ctx, &noopresponse, &pkt, &b);
CHECK(ret, "lwres_noopresponse_render");
/*
* Now, parse it into a new structure.
*/
lwres_buffer_first(&b);
ret = lwres_lwpacket_parseheader(&b, &pkt2);
CHECK(ret, "lwres_lwpacket_parseheader");
noopresponse2 = NULL;
ret = lwres_noopresponse_parse(ctx, &b, &pkt2, &noopresponse2);
CHECK(ret, "lwres_noopresponse_parse");
assert(noopresponse.datalength == noopresponse2->datalength);
assert(memcmp(noopresponse.data, noopresponse2->data,
noopresponse.datalength) == 0);
lwres_noopresponse_free(ctx, &noopresponse2);
lwres_context_freemem(ctx, b.base, b.length);
b.base = NULL;
b.length = 0;
}
static void
test_gabn(const char *target, int pass) {
lwres_gabnresponse_t *res;
#if 0
lwres_addr_t *addr;
unsigned int i;
char outbuf[64];
#endif
int ret;
res = NULL;
ret = lwres_getaddrsbyname(ctx, target,
LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6,
&res);
if ((pass && ret != LWRES_R_SUCCESS) ||
(!pass && ret != LWRES_R_NOTFOUND))
{
printf("I: gabn(%s) failed: %d\n", target, ret);
if (res != NULL)
lwres_gabnresponse_free(ctx, &res);
fails++;
return;
}
#if 0
printf("Returned real name: (%u, %s)\n",
res->realnamelen, res->realname);
printf("%u aliases:\n", res->naliases);
for (i = 0 ; i < res->naliases ; i++)
printf("\t(%u, %s)\n", res->aliaslen[i], res->aliases[i]);
printf("%u addresses:\n", res->naddrs);
addr = LWRES_LIST_HEAD(res->addrs);
for (i = 0 ; i < res->naddrs ; i++) {
if (addr->family == LWRES_ADDRTYPE_V4)
(void)inet_ntop(AF_INET, addr->address,
outbuf, sizeof(outbuf));
else
(void)inet_ntop(AF_INET6, addr->address,
outbuf, sizeof(outbuf));
printf("\tAddr len %u family %08x %s\n",
addr->length, addr->family, outbuf);
addr = LWRES_LIST_NEXT(addr, link);
}
#endif
if (res != NULL)
lwres_gabnresponse_free(ctx, &res);
}
static void
test_gnba(const char *target, lwres_uint32_t af, int pass) {
lwres_gnbaresponse_t *res;
int ret;
#if 0
unsigned int i;
#endif
unsigned char addrbuf[16];
unsigned int len;
if (af == LWRES_ADDRTYPE_V4) {
len = 4;
ret = inet_pton(AF_INET, target, addrbuf);
assert(ret == 1);
} else {
len = 16;
ret = inet_pton(AF_INET6, target, addrbuf);
assert(ret == 1);
}
res = NULL;
ret = lwres_getnamebyaddr(ctx, af, len, addrbuf, &res);
if ((pass && ret != LWRES_R_SUCCESS) ||
(!pass && ret != LWRES_R_NOTFOUND))
{
printf("I: gnba(%s) failed: %d\n", target, ret);
if (res != NULL)
lwres_gnbaresponse_free(ctx, &res);
fails++;
return;
}
#if 0
printf("Returned real name: (%u, %s)\n",
res->realnamelen, res->realname);
printf("%u aliases:\n", res->naliases);
for (i = 0 ; i < res->naliases ; i++)
printf("\t(%u, %s)\n", res->aliaslen[i], res->aliases[i]);
#endif
if (res != NULL)
lwres_gnbaresponse_free(ctx, &res);
}
int
main() {
lwres_result_t ret;
lwres_udp_port = 9210;
ret = lwres_context_create(&ctx, NULL, NULL, NULL, 0);
CHECK(ret, "lwres_context_create");
ret = lwres_conf_parse(ctx, "resolv.conf");
CHECK(ret, "lwres_conf_parse");
test_noop();
test_gabn("a.example1", TRUE);
test_gabn("a.example1.", TRUE);
test_gabn("a.example2", TRUE);
test_gabn("a.example2.", TRUE);
test_gabn("a.example3", FALSE);
test_gabn("a.example3.", FALSE);
test_gabn("a", TRUE);
test_gabn("a.", FALSE);
test_gabn("b.example1", TRUE);
test_gabn("b.example1.", TRUE);
test_gabn("b.example2", TRUE);
test_gabn("b.example2.", TRUE);
test_gabn("b.example3", FALSE);
test_gabn("b.example3.", FALSE);
test_gabn("b", TRUE);
test_gabn("b.", FALSE);
test_gabn("d.example1", FALSE);
test_gabn("x", TRUE);
test_gabn("x.", TRUE);
test_gnba("10.10.10.1", LWRES_ADDRTYPE_V4, TRUE);
test_gnba("10.10.10.17", LWRES_ADDRTYPE_V4, FALSE);
test_gnba("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
LWRES_ADDRTYPE_V6, TRUE);
test_gnba("0123:4567:89ab:cdef:0123:4567:89ab:cde0",
LWRES_ADDRTYPE_V6, FALSE);
return (fails);
}
$TTL 300 ; 5 minutes
@ IN SOA mname1. . (
2000062001 ; serial
20 ; refresh (20 seconds)
20 ; retry (20 seconds)
1814400 ; expire (3 weeks)
3600 ; minimum (1 hour)
)
NS ns
ns A 10.53.0.1
1 PTR test1.example
2 PTR test2.example
$TTL 300 ; 5 minutes
@ IN SOA mname1. . (
2000062001 ; serial
20 ; refresh (20 seconds)
20 ; retry (20 seconds)
1814400 ; expire (3 weeks)
3600 ; minimum (1 hour)
)
NS ns
ns A 10.53.0.1
a A 10.0.1.1
b A6 64 ::ffff:ffff:ffff:ffff c
c A6 0 eeee:eeee:eeee:eeee::
d A6 64 ::ffff:ffff:ffff:ffff e
$TTL 300 ; 5 minutes
@ IN SOA mname1. . (
2000062001 ; serial
20 ; refresh (20 seconds)
20 ; retry (20 seconds)
1814400 ; expire (3 weeks)
3600 ; minimum (1 hour)
)
NS ns
ns A 10.53.0.1
a A 10.0.2.1
b A6 64 ::ffff:ffff:ffff:ffff c
c A6 0 eeee:eeee:eeee:eeee::
$TTL 300 ; 5 minutes
@ IN SOA mname1. . (
2000062001 ; serial
20 ; refresh (20 seconds)
20 ; retry (20 seconds)
1814400 ; expire (3 weeks)
3600 ; minimum (1 hour)
)
NS ns
ns A 10.53.0.1
f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0 PTR test.example.
options {
query-source address 10.53.0.1;
port 5300;
directory ".";
pid-file "named.pid";
listen-on { 10.53.0.1; };
listen-on-v6 {none;};
recursion no;
notify no;
};
zone "." {
type master;
file "root.db";
};
zone "example1." {
type master;
file "example1.db";
};
zone "example2." {
type master;
file "example2.db";
};
zone "10.10.10.in-addr.arpa." {
type master;
file "10.10.10.in-addr.arpa.db";
};
zone "ip6.int." {
type master;
file "ip6.int.db";
};
$TTL 300
. IN SOA gson.nominum.com. a.root.servers.nil. (
2000042100 ; serial
600 ; refresh
600 ; retry
1200 ; expire
600 ; minimum
)
. NS a.root-servers.nil.
a.root-servers.nil. A 10.53.0.1
example1. NS ns.example1.
ns.example1. A 10.53.0.2
example2. NS ns.example2.
ns.example2. A 10.53.0.2
x A 10.1.10.1
nameserver 10.53.0.1
search example1.
ndots 1
#!/bin/sh
#
# Copyright (C) 2000 Internet Software Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
# ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
# CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
# SOFTWARE.
SYSTEMTESTTOP=..
. $SYSTEMTESTTOP/conf.sh
#
# Perform tests
#
sleep 5
status=0;
./lwtest
status=`expr $status + $?`
if [ $status != 0 ]; then
echo "R:FAIL"
else
echo "R:PASS"
fi
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment