diff options
author | Martin Nagy <mnagy@redhat.com> | 2009-02-11 20:37:59 +0100 |
---|---|---|
committer | Martin Nagy <mnagy@redhat.com> | 2009-02-11 20:37:59 +0100 |
commit | f50ae72ec3417cae55dd4e085991c01af9fdc5f1 (patch) | |
tree | 0e36c9a3320f6d068df93d3ff6d84b821d23db40 /bin/tests/names | |
download | bind_dynamic-f50ae72ec3417cae55dd4e085991c01af9fdc5f1.tar.gz bind_dynamic-f50ae72ec3417cae55dd4e085991c01af9fdc5f1.tar.xz bind_dynamic-f50ae72ec3417cae55dd4e085991c01af9fdc5f1.zip |
Initial commitstart
Diffstat (limited to 'bin/tests/names')
34 files changed, 2961 insertions, 0 deletions
diff --git a/bin/tests/names/Makefile.in b/bin/tests/names/Makefile.in new file mode 100644 index 0000000..31b12fe --- /dev/null +++ b/bin/tests/names/Makefile.in @@ -0,0 +1,58 @@ +# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 1999-2002 Internet Software Consortium. +# +# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL ISC 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. + +# $Id: Makefile.in,v 1.28 2007/06/19 23:47:00 tbox Exp $ + +srcdir = @srcdir@ +VPATH = @srcdir@ +top_srcdir = @top_srcdir@ + +@BIND9_MAKE_INCLUDES@ + +CINCLUDES = ${TEST_INCLUDES} ${DNS_INCLUDES} ${ISC_INCLUDES} + +CDEFINES = +CWARNINGS = + +# Note that we do not want to use libtool for libt_api +DNSLIBS = ../../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ +ISCLIBS = ../../../lib/isc/libisc.@A@ + +DNSDEPLIBS = ../../../lib/dns/libdns.@A@ +ISCDEPLIBS = ../../../lib/isc/libisc.@A@ + +DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} + +LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ + +TLIB = ../../../lib/tests/libt_api.@A@ + +TARGETS = t_names@EXEEXT@ + +SRCS = t_names.c + +@BIND9_MAKE_RULES@ + +t_names@EXEEXT@: t_names.@O@ ${DEPLIBS} ${TLIB} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ t_names.@O@ ${TLIB} ${LIBS} + +test: t_names@EXEEXT@ + -@./t_names@EXEEXT@ -c @top_srcdir@/t_config -b @srcdir@ -a + +testhelp: + @./t_names@EXEEXT@ -h + +clean distclean:: + rm -f ${TARGETS} diff --git a/bin/tests/names/dns_name_compare_data b/bin/tests/names/dns_name_compare_data new file mode 100644 index 0000000..0467fcf --- /dev/null +++ b/bin/tests/names/dns_name_compare_data @@ -0,0 +1,11 @@ +# +# test data for dns_name_compare +# format: +# <name1> <tab> <name2> <tab> <exp_order> +# where: exp_order may be one of: -1, 0, 1 +# +# and where: exp_nlabels and exp_nbits are not tested if < 0 +# +c.d a.b.c.d -1 +a.b.c.d c.d 1 +a.b.c a.b.c 0 diff --git a/bin/tests/names/dns_name_countlabels_data b/bin/tests/names/dns_name_countlabels_data new file mode 100644 index 0000000..f11c387 --- /dev/null +++ b/bin/tests/names/dns_name_countlabels_data @@ -0,0 +1,10 @@ +# +# test data for dns_name_countlabels +# format: +# <name> <tab> <nlabels> +# +c.d 2 +c.d. 3 +a.b.c.d 4 +a.b.c 3 +. 1 diff --git a/bin/tests/names/dns_name_fromregion_data b/bin/tests/names/dns_name_fromregion_data new file mode 100644 index 0000000..32b4220 --- /dev/null +++ b/bin/tests/names/dns_name_fromregion_data @@ -0,0 +1,12 @@ +# +# test data for dns_name_fromregion +# format: +# <test_name> +# where: exp_order may be one of: -1, 0, 1 +# +# and where: exp_nlabels and exp_nbits are not tested if < 0 +# +a.b.c.d. +a.b.c.d.[A].[aaa. +Ba\x\aa.b.c\[\[o\\.Z +Ba\x\aa.b.c\[\[o\\\..\.Z diff --git a/bin/tests/names/dns_name_fromtext_data b/bin/tests/names/dns_name_fromtext_data new file mode 100644 index 0000000..16554a5 --- /dev/null +++ b/bin/tests/names/dns_name_fromtext_data @@ -0,0 +1,9 @@ +# +# test data for dns_name_fromtext +# format: +# <name1> <tab> <name2> <tab> <origin> <tab> <downcase> +# +a.b a.b.c.d C.d 1 +a.b a.b.c.d C.d 1 +a.b a.b.C.d C.d 0 +a.b. a.b. C.d 0 diff --git a/bin/tests/names/dns_name_fromwire_1_data b/bin/tests/names/dns_name_fromwire_1_data new file mode 100644 index 0000000..b7ae69b --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_1_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_1 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test1.data 25 1 DNS_COMPRESS_ALL vix.com. ISC_R_SUCCESS diff --git a/bin/tests/names/dns_name_fromwire_2_data b/bin/tests/names/dns_name_fromwire_2_data new file mode 100644 index 0000000..90dfec4 --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_2_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_2 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test2.data 25 1 DNS_COMPRESS_ALL vix.com. ISC_R_NOSPACE diff --git a/bin/tests/names/dns_name_fromwire_3_data b/bin/tests/names/dns_name_fromwire_3_data new file mode 100644 index 0000000..f4253b4 --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_3_data @@ -0,0 +1,31 @@ +# +# test data for dns_name_fromwire_3 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test3_1.data 25 1 DNS_COMPRESS_ALL vix.com. DNS_R_BADLABELTYPE +wire_test3_2.data 25 1 DNS_COMPRESS_ALL vix.com. DNS_R_BADLABELTYPE diff --git a/bin/tests/names/dns_name_fromwire_4_data b/bin/tests/names/dns_name_fromwire_4_data new file mode 100644 index 0000000..b76b326 --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_4_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_4 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test4.data 550 1 DNS_COMPRESS_ALL vix.com. DNS_R_NAMETOOLONG diff --git a/bin/tests/names/dns_name_fromwire_5_data b/bin/tests/names/dns_name_fromwire_5_data new file mode 100644 index 0000000..1a4221b --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_5_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_5 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test5.data 25 1 DNS_COMPRESS_NONE vix.com. DNS_R_DISALLOWED diff --git a/bin/tests/names/dns_name_fromwire_6_data b/bin/tests/names/dns_name_fromwire_6_data new file mode 100644 index 0000000..e4460ce --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_6_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_6 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test6.data 25 1 DNS_COMPRESS_ALL vix.com. DNS_R_BADPOINTER diff --git a/bin/tests/names/dns_name_fromwire_7_data b/bin/tests/names/dns_name_fromwire_7_data new file mode 100644 index 0000000..5828bfc --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_7_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_7 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test7.data 25 1 DNS_COMPRESS_ALL vix.com. ISC_R_UNEXPECTEDEND diff --git a/bin/tests/names/dns_name_fromwire_8_data b/bin/tests/names/dns_name_fromwire_8_data new file mode 100644 index 0000000..9ddd3f3 --- /dev/null +++ b/bin/tests/names/dns_name_fromwire_8_data @@ -0,0 +1,30 @@ +# +# test data for dns_name_fromwire_9 +# format: +# <msgfile> <testname_offset> <downcase> +# <dc_method> <exp_name> <exp_result> +# +# where msgfile contains a DNS message in hex form +# +# and where testname_offset is the byte offset in this message of +# the start of a name +# +# and where downcase is 1 or 0 +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_name is the expected name after any decompression +# or case conversion +# +# and where exp_result may be one of +# ISC_R_NOSPACE +# DNS_R_BADLABELTYPE +# DNS_R_DISALLOWED +# DNS_R_BADPOINTER +# ISC_R_UNEXPECTEDEND +# DNS_R_TOOMANYHOPS +# +wire_test8.data 25 1 DNS_COMPRESS_ALL vix.com. ISC_R_NOSPACE diff --git a/bin/tests/names/dns_name_fullcompare_data b/bin/tests/names/dns_name_fullcompare_data new file mode 100644 index 0000000..f40e7e6 --- /dev/null +++ b/bin/tests/names/dns_name_fullcompare_data @@ -0,0 +1,10 @@ +# +# test data for dns_name_fullcompare +# format: +# <name1> <tab> <name2> <tab> <exp_reln> <tab> <exp_order> <tab> <exp_nlabels> <tab> <exp_nbits> +# where: exp_reln may be one of: +# none, equal, contains, subdomain, commonancestor +# and where: exp_nlabels and exp_nbits are not tested if < 0 +# +c.d a.b.c.d contains -1 2 0 +a.b.c.d c.d subdomain 1 2 0 diff --git a/bin/tests/names/dns_name_getlabel_data b/bin/tests/names/dns_name_getlabel_data new file mode 100644 index 0000000..d8dc880 --- /dev/null +++ b/bin/tests/names/dns_name_getlabel_data @@ -0,0 +1,10 @@ +# +# test data for dns_name_compare +# format: +# <name1> <tab> <label1_pos> <tab> <name2> <tab> <label2_pos> +# where: label1_pos and label2_pos identify the label position of +# the common label shared by name1 and name2 respectively +# +c.d 1 a.b.c.d 3 +a.b.c.d 3 c.d 1 +a.b.c. 3 a.b.c. 3 diff --git a/bin/tests/names/dns_name_getlabelsequence_data b/bin/tests/names/dns_name_getlabelsequence_data new file mode 100644 index 0000000..339604a --- /dev/null +++ b/bin/tests/names/dns_name_getlabelsequence_data @@ -0,0 +1,9 @@ +# +# test data for dns_name_getlabelsequence +# format: +# <name1> <tab> <label1_start> <tab> <name2> <tab> <label2_start> <tab> <extent> +# +# +c.d 1 a.b.c.d 3 1 +a.b.c.d.e 2 c.d 0 2 +a.b.c 0 a.b.c 0 3 diff --git a/bin/tests/names/dns_name_hash_data b/bin/tests/names/dns_name_hash_data new file mode 100644 index 0000000..093ba45 --- /dev/null +++ b/bin/tests/names/dns_name_hash_data @@ -0,0 +1,12 @@ +# +# test data for dns_name_hash +# format: +# <testname1> <tab> <testname2> <tab> <cshm> <tab> <cishm> +# where: +# cshm is 0 if a case sensitive hash of testname1 should match a +# case sensitive hash of testname2, otherwise cshm != 0 +# and: +# cishm is 0 if a case insensitive hash of testname1 should match a +# case insensitive hash of testname2, otherwise cishm != 0 +# +a.b.c.d a.b.c.d. 0 0 diff --git a/bin/tests/names/dns_name_isabsolute_data b/bin/tests/names/dns_name_isabsolute_data new file mode 100644 index 0000000..a17c9b8 --- /dev/null +++ b/bin/tests/names/dns_name_isabsolute_data @@ -0,0 +1,8 @@ +# +# test data for dns_name_isabsolute +# format is: +# <testname> <tab> <expected value> +# +x. 1 +a.b.c.d 0 +x.z. 1 diff --git a/bin/tests/names/dns_name_issubdomain_data b/bin/tests/names/dns_name_issubdomain_data new file mode 100644 index 0000000..102b072 --- /dev/null +++ b/bin/tests/names/dns_name_issubdomain_data @@ -0,0 +1,11 @@ +# +# test data for dns_name_issubdomain +# format: +# <name1> <tab> <name2> <tab> <issubdomain> +# where: issubdomain is 0 if false, else non-zero +# +# and where: exp_nlabels and exp_nbits are not tested if < 0 +# +c.d a.b.c.d 0 +a.b.c.d c.d 1 +a.b.c. a.b.c. 1 diff --git a/bin/tests/names/dns_name_rdatacompare_data b/bin/tests/names/dns_name_rdatacompare_data new file mode 100644 index 0000000..7f0c6a2 --- /dev/null +++ b/bin/tests/names/dns_name_rdatacompare_data @@ -0,0 +1,11 @@ +# +# test data for dns_name_rdatacompare +# format: +# <name1> <tab> <name2> <tab> <exp_order> +# where: exp_order may be one of: -1, 0, 1 +# +# and where: exp_nlabels and exp_nbits are not tested if < 0 +# +c.d. a.b.c.d. 1 +a.b.c.d. c.d. -1 +a.b.c. a.b.c. 0 diff --git a/bin/tests/names/dns_name_toregion_data b/bin/tests/names/dns_name_toregion_data new file mode 100644 index 0000000..00c10f4 --- /dev/null +++ b/bin/tests/names/dns_name_toregion_data @@ -0,0 +1,8 @@ +# +# test data for dns_name_toregion +# format: +# <test_name> +# +a.b.c.d. +a.b.c.d.[A].[aaa. +Ba\x\aa.b.c\[\[o\\.Z diff --git a/bin/tests/names/dns_name_totext_data b/bin/tests/names/dns_name_totext_data new file mode 100644 index 0000000..9db22aa --- /dev/null +++ b/bin/tests/names/dns_name_totext_data @@ -0,0 +1,9 @@ +# +# test data for dns_name_totext +# format: +# <name1> <tab> <omit_final_dot> +# +a.b.c.d 1 +a.\\[\[.c.d 1 +a.b.C.d 0 +a.b. 0 diff --git a/bin/tests/names/dns_name_towire_1_data b/bin/tests/names/dns_name_towire_1_data new file mode 100644 index 0000000..a45d80a --- /dev/null +++ b/bin/tests/names/dns_name_towire_1_data @@ -0,0 +1,17 @@ +# test data for dns_name_towire_1 +# format: +# <testname> <dc_method> <exp_data> +# <exp_data_len> <exp_result> +# +# where testname is the test name to be converted to wire format +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_data is the expected wire format data in hex format +# and where exp_data_len is the length of the expected data in decimal format +# and where exp_result is the expected return value of dns_name_towire +# +a.vix.com. DNS_COMPRESS_NONE 01610376697803636f6d00 11 ISC_R_SUCCESS diff --git a/bin/tests/names/dns_name_towire_2_data b/bin/tests/names/dns_name_towire_2_data new file mode 100644 index 0000000..35479be --- /dev/null +++ b/bin/tests/names/dns_name_towire_2_data @@ -0,0 +1,17 @@ +# test data for dns_name_towire_1 +# format: +# <testname> <dc_method> <exp_data> +# <exp_data_len> <exp_result> +# +# where testname is the test name to be converted to wire format +# +# and where dc_method is one of +# DNS_COMPRESS_ALL +# DNS_COMPRESS_GLOBAL14 +# DNS_COMPRESS_NONE +# +# and where exp_data is the expected wire format data in hex format +# and where exp_data_len is the length of the expected data in decimal format +# and where exp_result is the expected return value of dns_name_towire +# +a.vix.com DNS_COMPRESS_NONE 01610376697803636f6d 10 ISC_R_NOSPACE diff --git a/bin/tests/names/t_names.c b/bin/tests/names/t_names.c new file mode 100644 index 0000000..68ce53b --- /dev/null +++ b/bin/tests/names/t_names.c @@ -0,0 +1,2345 @@ +/* + * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 1998-2003 Internet Software Consortium. + * + * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC 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. + */ + +/* $Id: t_names.c,v 1.46 2008/01/18 23:46:57 tbox Exp $ */ + +#include <config.h> + +#include <ctype.h> +#include <stdlib.h> + +#include <isc/buffer.h> +#include <isc/mem.h> +#include <isc/string.h> + +#include <dns/compress.h> +#include <dns/name.h> +#include <dns/result.h> + +#include <tests/t_api.h> + +#define MAXTOKS 16 +#define BUFLEN 256 +#define BIGBUFLEN 4096 + +static char *Tokens[MAXTOKS + 1]; + + +#ifdef NEED_PBUF + +/*% + * get a hex formatted dns message from a data + * file into an isc_buffer_t + * caller supplies data storage and the isc_buffer + * we read the file, convert, setup the buffer + * and return the data length + */ + +static char * +ctoh(unsigned char c) { + int val; + static char buf[3]; + + val = (c >> 4) & 0x0f; + if ((0 <= val) && (val <= 9)) + buf[0] = '0' + val; + else if ((10 <= val) && (val <= 16)) + buf[0] = 'a' + val - 10; + val = c & 0x0f; + if ((0 <= val) && (val <= 9)) + buf[1] = '0' + val; + else if ((10 <= val) && (val <= 16)) + buf[1] = 'a' + val - 10; + buf[2] = '\0'; + return (buf); +} + +static void +pbuf(isc_buffer_t *pbuf) { + size_t len; + unsigned char *p; + + len = 0; + p = pbuf->base; + while (len < pbuf->length) { + printf("%s", ctoh(*p)); + ++p; + ++len; + if ((len % 40) == 0) + printf("\n"); + } +} + +#endif /* NEED_PBUF */ + +/*% + * Compare data at buf with data in hex representation at exp_data, + * of length exp_data_len, for equality. + * Return 0 if equal, else non-zero. + */ + +static int +chkdata(unsigned char *buf, size_t buflen, char *exp_data, + size_t exp_data_len) +{ + int result; + unsigned char *p; + unsigned char *v; + char *q; + unsigned char *data; + size_t cnt; + + if (buflen == exp_data_len) { + data = (unsigned char *)malloc(exp_data_len * + sizeof(unsigned char)); + if (data == NULL) { + t_info("malloc failed unexpectedly\n"); + return (-1); + } + + /* + * First convert exp_data from hex format. + */ + p = data; + q = exp_data; + cnt = 0; + while (cnt < exp_data_len) { + + if (('0' <= *q) && (*q <= '9')) + *p = *q - '0'; + else if (('a' <= *q) && (*q <= 'z')) + *p = *q - 'a' + 10; + else if (('A' <= *q) && (*q <= 'Z')) + *p = *q - 'A' + 10; + ++q; + + *p <<= 4; + + if (('0' <= *q) && (*q <= '9')) + *p |= ((*q - '0') & 0x0f); + else if (('a' <= *q) && (*q <= 'z')) + *p |= ((*q - 'a' + 10) & 0x0f); + else if (('A' <= *q) && (*q <= 'Z')) + *p |= ((*q - 'A' + 10) & 0x0f); + ++p; + ++q; + ++cnt; + } + + /* + * Now compare data. + */ + p = buf; + v = data; + for (cnt = 0; cnt < exp_data_len; ++cnt) { + if (*p != *v) + break; + ++p; + ++v; + } + if (cnt == exp_data_len) + result = 0; + else { + t_info("bad data at position %lu, " + "got 0x%.2x, expected 0x%.2x\n", + (unsigned long)cnt, *p, *q); + result = cnt + 1; + } + (void)free(data); + } else { + t_info("data length error, expected %lu, got %lu\n", + (unsigned long)exp_data_len, (unsigned long)buflen); + result = exp_data_len - buflen; + } + return (result); +} + +/*% + * Get a hex formatted dns message from a data file into an isc_buffer_t. + * Caller supplies data storage and the isc_buffer. We read the file, convert, + * setup the buffer and return the data length. + */ +static int +getmsg(char *datafile_name, unsigned char *buf, int buflen, isc_buffer_t *pbuf) +{ + int c; + int len; + int cnt; + unsigned int val; + unsigned char *p; + FILE *fp; + + fp = fopen(datafile_name, "r"); + if (fp == NULL) { + t_info("No such file %s\n", datafile_name); + return (0); + } + + p = buf; + cnt = 0; + len = 0; + val = 0; + while ((c = getc(fp)) != EOF) { + if ( (c == ' ') || (c == '\t') || + (c == '\r') || (c == '\n')) + continue; + if (c == '#') { + while ((c = getc(fp)) != '\n') + ; + continue; + } + if (('0' <= c) && (c <= '9')) + val = c - '0'; + else if (('a' <= c) && (c <= 'z')) + val = c - 'a' + 10; + else if (('A' <= c) && (c <= 'Z')) + val = c - 'A'+ 10; + else { + (void)fclose(fp); + t_info("Bad format in datafile\n"); + return (0); + } + if ((len % 2) == 0) { + *p = (val << 4); + } else { + *p += val; + ++p; + ++cnt; + if (cnt >= buflen) { + /* + * Buffer too small. + */ + (void)fclose(fp); + t_info("Buffer overflow error\n"); + return (0); + } + } + ++len; + } + (void)fclose(fp); + + if (len % 2) { + t_info("Bad format in %s\n", datafile_name); + return (0); + } + + *p = '\0'; + isc_buffer_init(pbuf, buf, cnt); + isc_buffer_add(pbuf, cnt); + return (cnt); +} + +static int +bustline(char *line, char **toks) { + int cnt; + char *p; + + cnt = 0; + if (line && *line) { + while ((p = strtok(line, "\t")) && (cnt < MAXTOKS)) { + *toks++ = p; + line = NULL; + ++cnt; + } + } + return (cnt); +} + + +#ifdef NEED_HNAME_TO_TNAME + +/*% + * convert a name from hex representation to text form + * format of hex notation is: + * %xXXXXXXXX + */ + +static int +hname_to_tname(char *src, char *target, size_t len) { + int i; + int c; + unsigned int val; + size_t srclen; + char *p; + char *q; + + p = src; + srclen = strlen(p); + if ((srclen >= 2) && ((*p != '%') || (*(p+1) != 'x'))) { + /* + * No conversion needed. + */ + if (srclen >= len) + return (1); + memcpy(target, src, srclen + 1); + return (0); + } + + i = 0; + p += 2; + q = target; + while (*p) { + c = *p; + if (('0' < c) && (c <= '9')) + val = c - '0'; + else if (('a' <= c) && (c <= 'z')) + val = c + 10 - 'a'; + else if (('A' <= c) && (c <= 'Z')) + val = c + 10 - 'A'; + else { + return (1); + } + if (i % 2) { + *q |= val; + ++q; + } else + *q = (val << 4); + ++i; + ++p; + } + if (i % 2) { + return (1); + } else { + *q = '\0'; + return (0); + } +} + +#endif /* NEED_HNAME_TO_TNAME */ + +/*% + * initialize a dns_name_t from a text name, hiding all + * buffer and other object initialization from the caller + * + */ + +static isc_result_t +dname_from_tname(char *name, dns_name_t *dns_name) { + int len; + isc_buffer_t txtbuf; + isc_buffer_t *binbuf; + unsigned char *junk; + isc_result_t result; + + len = strlen(name); + isc_buffer_init(&txtbuf, name, len); + isc_buffer_add(&txtbuf, len); + junk = (unsigned char *)malloc(sizeof(unsigned char) * BUFLEN); + binbuf = (isc_buffer_t *)malloc(sizeof(isc_buffer_t)); + if ((junk != NULL) && (binbuf != NULL)) { + isc_buffer_init(binbuf, junk, BUFLEN); + dns_name_init(dns_name, NULL); + dns_name_setbuffer(dns_name, binbuf); + result = dns_name_fromtext(dns_name, &txtbuf, + NULL, ISC_FALSE, NULL); + } else { + result = ISC_R_NOSPACE; + if (junk != NULL) + (void)free(junk); + if (binbuf != NULL) + (void)free(binbuf); + } + return (result); +} + +static const char *a3 = "dns_name_init initializes 'name' to the empty name"; + +static void +t_dns_name_init(void) { + int rval; + int result; + dns_name_t name; + unsigned char offsets[1]; + + rval = 0; + t_assert("dns_name_init", 1, T_REQUIRED, a3); + + dns_name_init(&name, offsets); + /* magic is hidden in name.c ... + if (name.magic != NAME_MAGIC) { + t_info("name.magic is not set to NAME_MAGIC\n"); + ++rval; + } + */ + if (name.ndata != NULL) { + t_info("name.ndata is not NULL\n"); + ++rval; + } + if (name.length != 0) { + t_info("name.length is not 0\n"); + ++rval; + } + if (name.labels != 0) { + t_info("name.labels is not 0\n"); + ++rval; + } + if (name.attributes != 0) { + t_info("name.attributes is not 0\n"); + ++rval; + } + if (name.offsets != offsets) { + t_info("name.offsets is incorrect\n"); + ++rval; + } + if (name.buffer != NULL) { + t_info("name.buffer is not NULL\n"); + ++rval; + } + + if (rval == 0) + result = T_PASS; + else + result = T_FAIL; + t_result(result); +} + +static const char *a4 = "dns_name_invalidate invalidates 'name'"; + +static void +t_dns_name_invalidate(void) { + int rval; + int result; + dns_name_t name; + unsigned char offsets[1]; + + t_assert("dns_name_invalidate", 1, T_REQUIRED, a4); + + rval = 0; + dns_name_init(&name, offsets); + dns_name_invalidate(&name); + + /* magic is hidden in name.c ... + if (name.magic != 0) { + t_info("name.magic is not set to NAME_MAGIC\n"); + ++rval; + } + */ + if (name.ndata != NULL) { + t_info("name.ndata is not NULL\n"); + ++rval; + } + if (name.length != 0) { + t_info("name.length is not 0\n"); + ++rval; + } + if (name.labels != 0) { + t_info("name.labels is not 0\n"); + ++rval; + } + if (name.attributes != 0) { + t_info("name.attributes is not 0\n"); + ++rval; + } + if (name.offsets != NULL) { + t_info("name.offsets is not NULL\n"); + ++rval; + } + if (name.buffer != NULL) { + t_info("name.buffer is not NULL\n"); + ++rval; + } + + if (rval == 0) + result = T_PASS; + else + result = T_FAIL; + t_result(result); +} + +static const char *a5 = "dns_name_setbuffer dedicates a buffer for use " + "with 'name'"; + +static void +t_dns_name_setbuffer(void) { + int result; + unsigned char junk[BUFLEN]; + dns_name_t name; + isc_buffer_t buffer; + + t_assert("dns_name_setbuffer", 1, T_REQUIRED, a5); + + isc_buffer_init(&buffer, junk, BUFLEN); + dns_name_init(&name, NULL); + dns_name_setbuffer(&name, &buffer); + if (name.buffer == &buffer) + result = T_PASS; + else + result = T_FAIL; + + t_result(result); +} + +static const char *a6 = "dns_name_hasbuffer returns ISC_TRUE if 'name' has a " + "dedicated buffer, otherwise it returns ISC_FALSE"; + +static void +t_dns_name_hasbuffer(void) { + int result; + int rval; + unsigned char junk[BUFLEN]; + dns_name_t name; + isc_buffer_t buffer; + + t_assert("dns_name_hasbuffer", 1, T_REQUIRED, a6); + + rval = 0; + isc_buffer_init(&buffer, junk, BUFLEN); + dns_name_init(&name, NULL); + if (dns_name_hasbuffer(&name) != ISC_FALSE) + ++rval; + dns_name_setbuffer(&name, &buffer); + if (dns_name_hasbuffer(&name) != ISC_TRUE) + ++rval; + if (rval == 0) + result = T_PASS; + else + result = T_FAIL; + + t_result(result); +} + +static const char *a7 = "dns_name_isabsolute returns ISC_TRUE if 'name' ends " + "in the root label"; + +static int +test_dns_name_isabsolute(char *test_name, isc_boolean_t expected) { + dns_name_t name; + isc_buffer_t buf; + isc_buffer_t binbuf; + unsigned char junk[BUFLEN]; + int len; + int rval; + isc_boolean_t isabs_p; + isc_result_t result; + + rval = T_UNRESOLVED; + + t_info("testing name %s\n", test_name); + len = strlen(test_name); + isc_buffer_init(&buf, test_name, len); + isc_buffer_add(&buf, len); + isc_buffer_init(&binbuf, &junk[0], BUFLEN); + dns_name_init(&name, NULL); + dns_name_setbuffer(&name, &binbuf); + result = dns_name_fromtext(&name, &buf, NULL, ISC_FALSE, NULL); + if (result == ISC_R_SUCCESS) { + isabs_p = dns_name_isabsolute(&name); + if (isabs_p == expected) + rval = T_PASS; + else + rval = T_FAIL; + } else { + t_info("dns_name_fromtext %s failed, result = %s\n", + test_name, dns_result_totext(result)); + } + return (rval); +} + +static void +t_dns_name_isabsolute(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_isabsolute", 1, T_REQUIRED, a7); + + result = T_UNRESOLVED; + fp = fopen("dns_name_isabsolute_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 2) { + /* + * label, bitpos, expected value. + */ + result = test_dns_name_isabsolute(Tokens[0], + atoi(Tokens[1]) + == 0 ? + ISC_FALSE : + ISC_TRUE); + } else { + t_info("bad datafile format at line %d\n", + line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_isabsolute_data\n"); + t_result(result); + } +} + +static const char *a8 = "dns_name_hash(name, case_sensitive) returns " + "a hash of 'name' which is case_sensitive if case_sensitive " + "is true"; + +/*% + * a9 merged with a8. + */ + +static int +test_dns_name_hash(char *test_name1, char *test_name2, + isc_boolean_t csh_match, isc_boolean_t cish_match) { + int rval; + int failures; + isc_boolean_t match; + unsigned int hash1; + unsigned int hash2; + dns_name_t dns_name1; + dns_name_t dns_name2; + isc_result_t result; + + rval = T_UNRESOLVED; + failures = 0; + + t_info("testing names %s and %s\n", test_name1, test_name2); + + result = dname_from_tname(test_name1, &dns_name1); + if (result == ISC_R_SUCCESS) { + result = dname_from_tname(test_name2, &dns_name2); + if (result == ISC_R_SUCCESS) { + hash1 = dns_name_hash(&dns_name1, ISC_TRUE); + hash2 = dns_name_hash(&dns_name2, ISC_TRUE); + match = ISC_FALSE; + if (hash1 == hash2) + match = ISC_TRUE; + if (match != csh_match) { + ++failures; + t_info("hash mismatch when ISC_TRUE\n"); + } + hash1 = dns_name_hash(&dns_name1, ISC_FALSE); + hash2 = dns_name_hash(&dns_name2, ISC_FALSE); + match = ISC_FALSE; + if (hash1 == hash2) + match = ISC_TRUE; + if (match != cish_match) { + ++failures; + t_info("hash mismatch when ISC_FALSE\n"); + } + if (failures == 0) + rval = T_PASS; + else + rval = T_FAIL; + } else { + t_info("dns_fromtext %s failed, result = %s\n", + test_name2, dns_result_totext(result)); + } + } else { + t_info("dns_fromtext %s failed, result = %s\n", + test_name1, dns_result_totext(result)); + } + return (rval); +} + +static void +t_dns_name_hash(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_hash", 1, T_REQUIRED, a8); + + result = T_UNRESOLVED; + fp = fopen("dns_name_hash_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 4) { + /* + * name1, name2, exp match value if + * case_sensitive true, + * exp match value of case_sensitive false + */ + result = test_dns_name_hash( + Tokens[0], + Tokens[1], + atoi(Tokens[2]) == 0 ? + ISC_FALSE : ISC_TRUE, + atoi(Tokens[3]) == 0 ? + ISC_FALSE : ISC_TRUE); + } else { + t_info("bad datafile format at line %d\n", + line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_hash_data\n"); + t_result(result); + } +} + +static const char *a10 = + "dns_name_fullcompare(name1, name2, orderp, nlabelsp) " + "returns the DNSSEC ordering relationship between name1 and " + "name2, sets orderp to -1 if name1 < name2, to 0 if " + "name1 == name2, or to 1 if name1 > name2, sets nlabelsp " + "to the number of labels name1 and name2 have in common, " + "and sets nbitsp to the number of bits name1 and name2 " + "have in common"; + +/*% + * a11 thru a22 merged into a10. + */ +static const char * +dns_namereln_to_text(dns_namereln_t reln) { + const char *p; + + if (reln == dns_namereln_contains) + p = "contains"; + else if (reln == dns_namereln_subdomain) + p = "subdomain"; + else if (reln == dns_namereln_equal) + p = "equal"; + else if (reln == dns_namereln_none) + p = "none"; + else if (reln == dns_namereln_commonancestor) + p = "commonancestor"; + else + p = "unknown"; + + return (p); +} + +static int +test_dns_name_fullcompare(char *name1, char *name2, + dns_namereln_t exp_dns_reln, + int exp_order, int exp_nlabels) +{ + int result; + int nfails; + int order; + unsigned int nlabels; + dns_name_t dns_name1; + dns_name_t dns_name2; + isc_result_t dns_result; + dns_namereln_t dns_reln; + + nfails = 0; + result = T_UNRESOLVED; + + + t_info("testing names %s and %s for relation %s\n", name1, name2, + dns_namereln_to_text(exp_dns_reln)); + + dns_result = dname_from_tname(name1, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + dns_result = dname_from_tname(name2, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + dns_reln = dns_name_fullcompare(&dns_name1, &dns_name2, + &order, &nlabels); + + if (dns_reln != exp_dns_reln) { + ++nfails; + t_info("expected relationship of %s, got %s\n", + dns_namereln_to_text(exp_dns_reln), + dns_namereln_to_text(dns_reln)); + } + /* + * Normalize order. + */ + if (order < 0) + order = -1; + else if (order > 0) + order = 1; + if (order != exp_order) { + ++nfails; + t_info("expected ordering %d, got %d\n", + exp_order, order); + } + if ((exp_nlabels >= 0) && + (nlabels != (unsigned int)exp_nlabels)) { + ++nfails; + t_info("expecting %d labels, got %d\n", + exp_nlabels, nlabels); + } + if (nfails == 0) + result = T_PASS; + else + result = T_FAIL; + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + + return (result); +} + +static void +t_dns_name_fullcompare(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + dns_namereln_t reln; + + t_assert("dns_name_fullcompare", 1, T_REQUIRED, a10); + + result = T_UNRESOLVED; + fp = fopen("dns_name_fullcompare_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 6) { + /* + * name1, name2, exp_reln, exp_order, + * exp_nlabels + */ + if (!strcmp(Tokens[2], "none")) + reln = dns_namereln_none; + else if (!strcmp(Tokens[2], "contains")) + reln = dns_namereln_contains; + else if (!strcmp(Tokens[2], "subdomain")) + reln = dns_namereln_subdomain; + else if (!strcmp(Tokens[2], "equal")) + reln = dns_namereln_equal; + else if (!strcmp(Tokens[2], "commonancestor")) + reln = dns_namereln_commonancestor; + else { + t_info("bad format at line %d\n", + line); + continue; + } + result = test_dns_name_fullcompare( + Tokens[0], + Tokens[1], + reln, + atoi(Tokens[3]), + atoi(Tokens[4])); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_fullcompare_data\n"); + t_result(result); + } +} + +static const char *a23 = + "dns_name_compare(name1, name2) returns information about " + "the relative ordering under the DNSSEC ordering relationship " + "of name1 and name2"; + +/*% + * a24 thru a29 merged into a23. + */ + +static int +test_dns_name_compare(char *name1, char *name2, int exp_order) { + int result; + int order; + isc_result_t dns_result; + dns_name_t dns_name1; + dns_name_t dns_name2; + + result = T_UNRESOLVED; + + t_info("testing %s %s %s\n", name1, + exp_order == 0 ? "==": (exp_order == -1 ? "<" : ">"), + name2); + + dns_result = dname_from_tname(name1, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + dns_result = dname_from_tname(name2, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + order = dns_name_compare(&dns_name1, &dns_name2); + /* + * Normalize order. + */ + if (order < 0) + order = -1; + else if (order > 0) + order = 1; + if (order != exp_order) { + t_info("expected order of %d, got %d\n", + exp_order, order); + result = T_FAIL; + } else + result = T_PASS; + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + + return (result); +} + +static void +t_dns_name_compare(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_compare", 1, T_REQUIRED, a23); + + result = T_UNRESOLVED; + fp = fopen("dns_name_compare_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 3) { + /* + * name1, name2, order. + */ + result = test_dns_name_compare( + Tokens[0], + Tokens[1], + atoi(Tokens[2])); + } else { + t_info("bad datafile format at line %d\n", + line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_compare_data\n"); + t_result(result); + } +} + +static const char *a30 = + "dns_name_rdatacompare(name1, name2) returns information " + "about the relative ordering of name1 and name2 as if they " + "are part of rdata in DNSSEC canonical form"; + +/*% + * a31, a32 merged into a30. + */ + +static int +test_dns_name_rdatacompare(char *name1, char *name2, int exp_order) { + int result; + int order; + isc_result_t dns_result; + dns_name_t dns_name1; + dns_name_t dns_name2; + + result = T_UNRESOLVED; + + t_info("testing %s %s %s\n", name1, + exp_order == 0 ? "==": (exp_order == -1 ? "<" : ">"), name2); + + dns_result = dname_from_tname(name1, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + dns_result = dname_from_tname(name2, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + order = dns_name_rdatacompare(&dns_name1, &dns_name2); + /* + * Normalize order. + */ + if (order < 0) + order = -1; + else if (order > 0) + order = 1; + if (order != exp_order) { + t_info("expected order of %d, got %d\n", + exp_order, order); + result = T_FAIL; + } else + result = T_PASS; + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + + return (result); +} + +static void +t_dns_name_rdatacompare(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_rdatacompare", 1, T_REQUIRED, a30); + + result = T_UNRESOLVED; + fp = fopen("dns_name_rdatacompare_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 3) { + /* + * name1, name2, order. + */ + result = test_dns_name_rdatacompare( + Tokens[0], + Tokens[1], + atoi(Tokens[2])); + } else { + t_info("bad datafile format at line %d\n", + line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_rdatacompare_data\n"); + t_result(result); + } +} + + +static const char *a33 = + "when name1 is a subdomain of name2, " + "dns_name_issubdomain(name1, name2) returns true, " + "otherwise it returns false."; + +/*% + * a34 merged into a33. + */ + +static int +test_dns_name_issubdomain(char *name1, char *name2, isc_boolean_t exp_rval) { + int result; + isc_boolean_t rval; + isc_result_t dns_result; + dns_name_t dns_name1; + dns_name_t dns_name2; + + result = T_UNRESOLVED; + + t_info("testing %s %s a subdomain of %s\n", name1, + exp_rval == 0 ? "is not" : "is", name2); + + dns_result = dname_from_tname(name1, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + dns_result = dname_from_tname(name2, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + rval = dns_name_issubdomain(&dns_name1, &dns_name2); + + if (rval != exp_rval) { + t_info("expected return value of %s, got %s\n", + exp_rval == ISC_TRUE ? "true" : "false", + rval == ISC_TRUE ? "true" : "false"); + result = T_FAIL; + } else + result = T_PASS; + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + + return (result); +} + +static void +t_dns_name_issubdomain(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_issubdomain", 1, T_REQUIRED, a33); + + result = T_UNRESOLVED; + fp = fopen("dns_name_issubdomain_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 3) { + /* + * name1, name2, issubdomain_p. + */ + result = test_dns_name_issubdomain( + Tokens[0], + Tokens[1], + atoi(Tokens[2]) == 0 ? + ISC_FALSE : ISC_TRUE); + } else { + t_info("bad datafile format at line %d\n", + line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_issubdomain_data\n"); + t_result(result); + } +} + +static const char *a35 = + "dns_name_countlabels(name) returns the number " + "of labels in name"; + +static int +test_dns_name_countlabels(char *test_name, unsigned int exp_nlabels) { + int result; + unsigned int nlabels; + isc_result_t dns_result; + dns_name_t dns_name; + + result = T_UNRESOLVED; + + t_info("testing %s\n", test_name); + + dns_result = dname_from_tname(test_name, &dns_name); + if (dns_result == ISC_R_SUCCESS) { + nlabels = dns_name_countlabels(&dns_name); + + if (nlabels != exp_nlabels) { + t_info("expected %d, got %d\n", exp_nlabels, nlabels); + result = T_FAIL; + } else + result = T_PASS; + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(dns_result)); + } + + return (result); +} + +static void +t_dns_name_countlabels(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_countlabels", 1, T_REQUIRED, a35); + + result = T_UNRESOLVED; + fp = fopen("dns_name_countlabels_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 2) { + /* + * name, nlabels. + */ + result = test_dns_name_countlabels(Tokens[0], + atoi(Tokens[1])); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_countlabels_data\n"); + t_result(result); + } +} + +static const char *a36 = + "when n is less than the number of labels in name, " + "dns_name_getlabel(name, n, labelp) initializes labelp " + "to point to the nth label in name"; + +/*% + * The strategy here is two take two dns names with a shared label in + * different positions, get the two labels and compare them for equality. + * If they don't match, dns_name_getlabel failed. + */ + +static int +test_dns_name_getlabel(char *test_name1, int label1_pos, char *test_name2, + int label2_pos) +{ + int result; + int nfails; + unsigned int cnt; + unsigned char *p; + unsigned char *q; + dns_name_t dns_name1; + dns_name_t dns_name2; + dns_label_t dns_label1; + dns_label_t dns_label2; + isc_result_t dns_result; + + nfails = 0; + result = T_UNRESOLVED; + + t_info("testing with %s and %s\n", test_name1, test_name2); + + dns_result = dname_from_tname(test_name1, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + dns_result = dname_from_tname(test_name2, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + dns_name_getlabel(&dns_name1, label1_pos, &dns_label1); + dns_name_getlabel(&dns_name2, label2_pos, &dns_label2); + if (dns_label1.length != dns_label2.length) { + t_info("label lengths differ\n"); + ++nfails; + } + p = dns_label1.base; + q = dns_label2.base; + for (cnt = 0; cnt < dns_label1.length; ++cnt) { + if (*p++ != *q++) { + t_info("labels differ at position %d", + cnt); + ++nfails; + } + } + if (nfails == 0) + result = T_PASS; + else + result = T_FAIL; + } else { + t_info("dname_from_tname failed, result == %s", + dns_result_totext(result)); + } + } else { + t_info("dname_from_tname failed, result == %s", + dns_result_totext(result)); + } + return (result); +} + +static void +t_dns_name_getlabel(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_getlabel", 1, T_REQUIRED, a36); + + result = T_UNRESOLVED; + fp = fopen("dns_name_getlabel_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 4) { + /* + * name1, name2, nlabels. + */ + result = test_dns_name_getlabel(Tokens[0], + atoi(Tokens[1]), + Tokens[2], + atoi(Tokens[3])); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_getlabel_data\n"); + t_result(result); + } +} + +static const char *a37 = + "when source contains at least first + n labels, " + "dns_name_getlabelsequence(source, first, n, target) " + "initializes target to point to the n label sequence of " + "labels in source starting with first"; + +/*% + * We adopt a similiar strategy to that used by the dns_name_getlabel test. + */ + +static int +test_dns_name_getlabelsequence(char *test_name1, int label1_start, + char *test_name2, int label2_start, int range) +{ + int result; + int nfails; + unsigned int cnt; + unsigned char *p; + unsigned char *q; + dns_name_t dns_name1; + dns_name_t dns_name2; + dns_name_t dns_targetname1; + dns_name_t dns_targetname2; + isc_result_t dns_result; + isc_buffer_t buffer1; + isc_buffer_t buffer2; + unsigned char junk1[BUFLEN]; + unsigned char junk2[BUFLEN]; + + nfails = 0; + result = T_UNRESOLVED; + dns_result = dname_from_tname(test_name1, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + dns_result = dname_from_tname(test_name2, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + t_info("testing %s %s\n", test_name1, test_name2); + dns_name_init(&dns_targetname1, NULL); + dns_name_init(&dns_targetname2, NULL); + dns_name_getlabelsequence(&dns_name1, label1_start, + range, &dns_targetname1); + dns_name_getlabelsequence(&dns_name2, label2_start, + range, &dns_targetname2); + + /* + * Now convert both targets to text for comparison. + */ + isc_buffer_init(&buffer1, junk1, BUFLEN); + isc_buffer_init(&buffer2, junk2, BUFLEN); + dns_name_totext(&dns_targetname1, ISC_TRUE, &buffer1); + dns_name_totext(&dns_targetname2, ISC_TRUE, &buffer2); + if (buffer1.used == buffer2.used) { + p = buffer1.base; + q = buffer2.base; + for (cnt = 0; cnt < buffer1.used; ++cnt) { + if (*p != *q) { + ++nfails; + t_info("names differ at %d\n", + cnt); + break; + } + ++p; ++q; + } + } else { + ++nfails; + t_info("lengths differ\n"); + } + if (nfails == 0) + result = T_PASS; + else + result = T_FAIL; + } else { + t_info("dname_from_tname failed, result == %s", + dns_result_totext(dns_result)); + } + } else { + t_info("dname_from_tname failed, result == %s", + dns_result_totext(dns_result)); + } + return (result); +} + +static void +t_dns_name_getlabelsequence(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_getlabelsequence", 1, T_REQUIRED, a37); + + result = T_UNRESOLVED; + fp = fopen("dns_name_getlabelsequence_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 5) { + /* + * name1, name2, nlabels. + */ + result = test_dns_name_getlabelsequence( + Tokens[0], + atoi(Tokens[1]), + Tokens[2], + atoi(Tokens[3]), + atoi(Tokens[4])); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_getlabelsequence_data\n"); + t_result(result); + } +} + +static const char *a38 = + "dns_name_fromregion(name, region) converts a DNS name " + "from a region representation to a name representation"; + +static int +test_dns_name_fromregion(char *test_name) { + int result; + int order; + unsigned int nlabels; + isc_result_t dns_result; + dns_name_t dns_name1; + dns_name_t dns_name2; + dns_namereln_t dns_namereln; + isc_region_t region; + + result = T_UNRESOLVED; + + t_info("testing %s\n", test_name); + + dns_result = dname_from_tname(test_name, &dns_name1); + if (dns_result == ISC_R_SUCCESS) { + + dns_name_toregion(&dns_name1, ®ion); + + dns_name_init(&dns_name2, NULL); + dns_name_fromregion(&dns_name2, ®ion); + dns_namereln = dns_name_fullcompare(&dns_name1, &dns_name2, + &order, &nlabels); + if (dns_namereln == dns_namereln_equal) + result = T_PASS; + else + result = T_FAIL; + } else { + t_info("dname_from_tname failed, result == %s\n", + dns_result_totext(result)); + } + return (result); +} + +static void +t_dns_name_fromregion(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_fromregion", 1, T_REQUIRED, a38); + + result = T_UNRESOLVED; + fp = fopen("dns_name_fromregion_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 1) { + /* + * test_name. + */ + result = test_dns_name_fromregion(Tokens[0]); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_fromregion_data\n"); + t_result(result); + } +} + +static const char *a39 = + "dns_name_toregion(name, region) converts a DNS name " + "from a region representation to a name representation"; + +static void +t_dns_name_toregion(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_toregion", 1, T_REQUIRED, a39); + + result = T_UNRESOLVED; + fp = fopen("dns_name_toregion_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 1) { + /* + * test_name. + */ + result = test_dns_name_fromregion(Tokens[0]); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_toregion_data\n"); + t_result(result); + } +} + +static const char *a40 = + "dns_name_fromtext(name, source, origin, downcase, target) " + "converts the textual representation of a DNS name at source " + "into uncompressed wire form at target, appending origin to " + "the converted name if origin is non-NULL and converting " + "upper case to lower case during conversion " + "if downcase is true."; + +static int +test_dns_name_fromtext(char *test_name1, char *test_name2, char *test_origin, + isc_boolean_t downcase) +{ + int result; + int order; + unsigned int nlabels; + unsigned char junk1[BUFLEN]; + unsigned char junk2[BUFLEN]; + unsigned char junk3[BUFLEN]; + isc_buffer_t binbuf1; + isc_buffer_t binbuf2; + isc_buffer_t binbuf3; + isc_buffer_t txtbuf1; + isc_buffer_t txtbuf2; + isc_buffer_t txtbuf3; + dns_name_t dns_name1; + dns_name_t dns_name2; + dns_name_t dns_name3; + isc_result_t dns_result; + dns_namereln_t dns_namereln; + + result = T_UNRESOLVED; + + t_info("testing %s %s %s\n", test_name1, test_name2, test_origin); + + isc_buffer_init(&binbuf1, junk1, BUFLEN); + isc_buffer_init(&binbuf2, junk2, BUFLEN); + isc_buffer_init(&binbuf3, junk3, BUFLEN); + + isc_buffer_init(&txtbuf1, test_name1, strlen(test_name1)); + isc_buffer_add(&txtbuf1, strlen(test_name1)); + + isc_buffer_init(&txtbuf2, test_name2, strlen(test_name2)); + isc_buffer_add(&txtbuf2, strlen(test_name2)); + + isc_buffer_init(&txtbuf3, test_origin, strlen(test_origin)); + isc_buffer_add(&txtbuf3, strlen(test_origin)); + dns_name_init(&dns_name1, NULL); + dns_name_init(&dns_name2, NULL); + dns_name_init(&dns_name3, NULL); + dns_name_setbuffer(&dns_name1, &binbuf1); + dns_name_setbuffer(&dns_name2, &binbuf2); + dns_name_setbuffer(&dns_name3, &binbuf3); + + dns_result = dns_name_fromtext(&dns_name3, &txtbuf3, NULL, + ISC_FALSE, &binbuf3); + if (dns_result != ISC_R_SUCCESS) { + t_info("dns_name_fromtext(dns_name3) failed, result == %s\n", + dns_result_totext(dns_result)); + return (T_FAIL); + } + + dns_result = dns_name_fromtext(&dns_name1, &txtbuf1, &dns_name3, + downcase, &binbuf1); + if (dns_result != ISC_R_SUCCESS) { + t_info("dns_name_fromtext(dns_name1) failed, result == %s\n", + dns_result_totext(dns_result)); + return (T_FAIL); + } + + dns_result = dns_name_fromtext(&dns_name2, &txtbuf2, NULL, + ISC_FALSE, &binbuf2); + if (dns_result != ISC_R_SUCCESS) { + t_info("dns_name_fromtext(dns_name2) failed, result == %s\n", + dns_result_totext(dns_result)); + return (T_FAIL); + } + + dns_namereln = dns_name_fullcompare(&dns_name1, &dns_name2, &order, + &nlabels); + + if (dns_namereln == dns_namereln_equal) + result = T_PASS; + else { + t_info("dns_name_fullcompare returned %s\n", + dns_namereln_to_text(dns_namereln)); + result = T_FAIL; + } + + return (result); +} + +static void +t_dns_name_fromtext(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_fromtext", 1, T_REQUIRED, a40); + + result = T_UNRESOLVED; + fp = fopen("dns_name_fromtext_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 4) { + /* + * test_name1, test_name2, test_origin, + * downcase. + */ + result = test_dns_name_fromtext(Tokens[0], + Tokens[1], + Tokens[2], + atoi(Tokens[3]) + == 0 ? + ISC_FALSE : + ISC_TRUE); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_fromtext\n"); + t_result(result); + } +} + +static const char *a41 = + "dns_name_totext(name, omit_final_dot, target) converts " + "the DNS name 'name' in wire format to textual format " + "at target, and adds a final '.' to the name if " + "omit_final_dot is false"; + +static int +test_dns_name_totext(char *test_name, isc_boolean_t omit_final) { + int result; + int len; + int order; + unsigned int nlabels; + unsigned char junk1[BUFLEN]; + unsigned char junk2[BUFLEN]; + unsigned char junk3[BUFLEN]; + isc_buffer_t buf1; + isc_buffer_t buf2; + isc_buffer_t buf3; + dns_name_t dns_name1; + dns_name_t dns_name2; + isc_result_t dns_result; + dns_namereln_t dns_namereln; + + result = T_UNRESOLVED; + + t_info("testing %s\n", test_name); + + len = strlen(test_name); + isc_buffer_init(&buf1, test_name, len); + isc_buffer_add(&buf1, len); + + dns_name_init(&dns_name1, NULL); + isc_buffer_init(&buf2, junk2, BUFLEN); + + /* + * Out of the data file to dns_name1. + */ + dns_result = dns_name_fromtext(&dns_name1, &buf1, NULL, ISC_FALSE, + &buf2); + if (dns_result != ISC_R_SUCCESS) { + t_info("dns_name_fromtext failed, result == %s\n", + dns_result_totext(dns_result)); + return (T_UNRESOLVED); + } + + /* + * From dns_name1 into a text buffer. + */ + isc_buffer_invalidate(&buf1); + isc_buffer_init(&buf1, junk1, BUFLEN); + dns_result = dns_name_totext(&dns_name1, omit_final, &buf1); + if (dns_result != ISC_R_SUCCESS) { + t_info("dns_name_totext failed, result == %s\n", + dns_result_totext(dns_result)); + return (T_FAIL); + } + + /* + * From the text buffer into dns_name2. + */ + dns_name_init(&dns_name2, NULL); + isc_buffer_init(&buf3, junk3, BUFLEN); + dns_result = dns_name_fromtext(&dns_name2, &buf1, NULL, ISC_FALSE, + &buf3); + if (dns_result != ISC_R_SUCCESS) { + t_info("dns_name_fromtext failed, result == %s\n", + dns_result_totext(dns_result)); + return (T_UNRESOLVED); + } + + dns_namereln = dns_name_fullcompare(&dns_name1, &dns_name2, + &order, &nlabels); + if (dns_namereln == dns_namereln_equal) + result = T_PASS; + else { + t_info("dns_name_fullcompare returned %s\n", + dns_namereln_to_text(dns_namereln)); + result = T_FAIL; + } + + return (result); +} + +static void +t_dns_name_totext(void) { + int line; + int cnt; + int result; + char *p; + FILE *fp; + + t_assert("dns_name_totext", 1, T_REQUIRED, a41); + + result = T_UNRESOLVED; + fp = fopen("dns_name_totext_data", "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 2) { + /* + * test_name, omit_final. + */ + result = test_dns_name_totext(Tokens[0], + atoi(Tokens[1]) == 0 ? + ISC_FALSE : + ISC_TRUE); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile dns_name_totext\n"); + t_result(result); + } +} + +static const char *a42 = + "dns_name_fromwire(name, source, dctx, downcase, target) " + "converts the possibly compressed DNS name 'name' in wire " + "format to canonicalized form at target, performing upper to " + "lower case conversion if downcase is true, and returns " + "ISC_R_SUCCESS"; + +#if 0 + /* + * XXXRTH these tests appear to be broken, so I have + * disabled them. + */ +static const char *a43 = + "when a label length is invalid, dns_name_fromwire() " + "returns DNS_R_FORMERR"; + +static const char *a44 = + "when a label type is invalid, dns_name_fromwire() " + "returns DNS_R_BADLABELTYPE"; +#endif + +static const char *a45 = + "when a name length is invalid, dns_name_fromwire() " + "returns DNS_R_FORMERR"; + +static const char *a46 = + "when a compression type is invalid, dns_name_fromwire() " + "returns DNS_R_DISALLOWED"; + +static const char *a47 = + "when a bad compression pointer is encountered, " + "dns_name_fromwire() returns DNS_R_BADPOINTER"; + +static const char *a48 = + "when input ends unexpected, dns_name_fromwire() " + "returns ISC_R_UNEXPECTEDEND"; + +static const char *a49 = + "when there is not enough space in target, " + "dns_name_fromwire(name, source, dcts, downcase, target) " + "returns ISC_R_NOSPACE"; + +static int +test_dns_name_fromwire(char *datafile_name, int testname_offset, int downcase, + unsigned int dc_method, char *exp_name, + isc_result_t exp_result, size_t buflen) +{ + int result; + int order; + unsigned int nlabels; + int len; + unsigned char buf1[BIGBUFLEN]; + char buf2[BUFLEN]; + isc_buffer_t iscbuf1; + isc_buffer_t iscbuf2; + dns_name_t dns_name1; + dns_name_t dns_name2; + isc_result_t dns_result; + dns_namereln_t dns_namereln; + dns_decompress_t dctx; + + result = T_UNRESOLVED; + + t_info("testing using %s\n", datafile_name); + len = getmsg(datafile_name, buf1, BIGBUFLEN, &iscbuf1); + + isc_buffer_setactive(&iscbuf1, len); + iscbuf1.current = testname_offset; + + isc_buffer_init(&iscbuf2, buf2, buflen); + dns_name_init(&dns_name1, NULL); + dns_decompress_init(&dctx, -1, DNS_DECOMPRESS_STRICT); + dns_decompress_setmethods(&dctx, dc_method); + dns_result = dns_name_fromwire(&dns_name1, &iscbuf1, + &dctx, downcase ? ISC_TRUE : ISC_FALSE, + &iscbuf2); + + if ((dns_result == exp_result) && (exp_result == ISC_R_SUCCESS)) { + + dns_result = dname_from_tname(exp_name, &dns_name2); + if (dns_result == ISC_R_SUCCESS) { + dns_namereln = dns_name_fullcompare(&dns_name1, + &dns_name2, + &order, &nlabels); + if (dns_namereln != dns_namereln_equal) { + t_info("dns_name_fullcompare returned %s\n", + dns_namereln_to_text(dns_namereln)); + result = T_FAIL; + } else { + result = T_PASS; + } + } else { + t_info("dns_name_fromtext %s failed, result = %s\n", + exp_name, dns_result_totext(dns_result)); + result = T_UNRESOLVED; + } + } else if (dns_result == exp_result) { + result = T_PASS; + } else { + t_info("dns_name_fromwire returned %s\n", + dns_result_totext(dns_result)); + result = T_FAIL; + } + + return (result); +} + +static void +t_dns_name_fromwire_x(const char *testfile, size_t buflen) { + int line; + int cnt; + int result; + unsigned int dc_method; + isc_result_t exp_result; + char *p; + char *tok; + FILE *fp; + + result = T_UNRESOLVED; + fp = fopen(testfile, "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 6) { + /* + * datafile_name, testname_offset, + * downcase, dc_method, + * exp_name, exp_result. + */ + + tok = Tokens[5]; + exp_result = ISC_R_SUCCESS; + if (! strcmp(tok, "ISC_R_SUCCESS")) + exp_result = ISC_R_SUCCESS; + else if (! strcmp(tok, "ISC_R_NOSPACE")) + exp_result = ISC_R_NOSPACE; + else if (! strcmp(tok, "DNS_R_BADLABELTYPE")) + exp_result = DNS_R_BADLABELTYPE; + else if (! strcmp(tok, "DNS_R_FORMERR")) + exp_result = DNS_R_FORMERR; + else if (! strcmp(tok, "DNS_R_BADPOINTER")) + exp_result = DNS_R_BADPOINTER; + else if (! strcmp(tok, "ISC_R_UNEXPECTEDEND")) + exp_result = ISC_R_UNEXPECTEDEND; + else if (! strcmp(tok, "DNS_R_TOOMANYHOPS")) + exp_result = DNS_R_TOOMANYHOPS; + else if (! strcmp(tok, "DNS_R_DISALLOWED")) + exp_result = DNS_R_DISALLOWED; + else if (! strcmp(tok, "DNS_R_NAMETOOLONG")) + exp_result = DNS_R_NAMETOOLONG; + + tok = Tokens[3]; + dc_method = DNS_COMPRESS_NONE; + if (! strcmp(tok, "DNS_COMPRESS_GLOBAL14")) + dc_method = DNS_COMPRESS_GLOBAL14; + else if (! strcmp(tok, "DNS_COMPRESS_ALL")) + dc_method = DNS_COMPRESS_ALL; + + result = test_dns_name_fromwire(Tokens[0], + atoi(Tokens[1]), + atoi(Tokens[2]), + dc_method, + Tokens[4], + exp_result, + buflen); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile %s\n", testfile); + t_result(result); + } +} + +static void +t_dns_name_fromwire(void) { + t_assert("dns_name_fromwire", 1, T_REQUIRED, a42); + t_dns_name_fromwire_x("dns_name_fromwire_1_data", BUFLEN); + +#if 0 + /* + * XXXRTH these tests appear to be broken, so I have + * disabled them. + */ + t_assert("dns_name_fromwire", 2, T_REQUIRED, a43); + t_dns_name_fromwire_x("dns_name_fromwire_2_data", BUFLEN); + + t_assert("dns_name_fromwire", 3, T_REQUIRED, a44); + t_dns_name_fromwire_x("dns_name_fromwire_3_data", BUFLEN); +#endif + + t_assert("dns_name_fromwire", 4, T_REQUIRED, a45); + t_dns_name_fromwire_x("dns_name_fromwire_4_data", BUFLEN); + + t_assert("dns_name_fromwire", 5, T_REQUIRED, a46); + t_dns_name_fromwire_x("dns_name_fromwire_5_data", BUFLEN); + + t_assert("dns_name_fromwire", 6, T_REQUIRED, a47); + t_dns_name_fromwire_x("dns_name_fromwire_6_data", BUFLEN); + + t_assert("dns_name_fromwire", 7, T_REQUIRED, a48); + t_dns_name_fromwire_x("dns_name_fromwire_7_data", BUFLEN); + + t_assert("dns_name_fromwire", 9, T_REQUIRED, a49); + t_dns_name_fromwire_x("dns_name_fromwire_8_data", 2); +} + + +static const char *a51 = + "dns_name_towire(name, cctx, target) converts the DNS name " + "'name' into wire format, compresses it as specified " + "by the compression context cctx, stores the result in " + "target and returns DNS_SUCCESS"; + +static const char *a52 = + "when not enough space exists in target, " + "dns_name_towire(name, cctx, target) returns ISC_R_NOSPACE"; + +static int +test_dns_name_towire(char *testname, unsigned int dc_method, char *exp_data, + int exp_data_len, isc_result_t exp_result, size_t buflen) +{ + int result; + int val; + int len; + unsigned char buf2[BUFLEN]; + unsigned char buf3[BUFLEN]; + isc_buffer_t iscbuf1; + isc_buffer_t iscbuf2; + isc_buffer_t iscbuf3; + dns_name_t dns_name; + isc_result_t dns_result; + isc_result_t isc_result; + dns_compress_t cctx; + isc_mem_t *mctx; + + t_info("testing using %s\n", testname); + + result = T_UNRESOLVED; + mctx = NULL; + + isc_result = isc_mem_create(0, 0, &mctx); + if (isc_result != ISC_R_SUCCESS) { + t_info("isc_mem_create failed\n"); + return (result); + } + dns_compress_init(&cctx, -1, mctx); + dns_compress_setmethods(&cctx, dc_method); + dns_name_init(&dns_name, NULL); + len = strlen(testname); + isc_buffer_init(&iscbuf1, testname, len); + isc_buffer_add(&iscbuf1, len); + isc_buffer_init(&iscbuf2, buf2, BUFLEN); + dns_result = dns_name_fromtext(&dns_name, &iscbuf1, NULL, ISC_FALSE, + &iscbuf2); + if (dns_result == ISC_R_SUCCESS) { + isc_buffer_init(&iscbuf3, buf3, buflen); + dns_result = dns_name_towire(&dns_name, &cctx, &iscbuf3); + if (dns_result == exp_result) { + if (exp_result == ISC_R_SUCCESS) { + /* + * Compare results with expected data. + */ + val = chkdata(buf3, iscbuf3.used, exp_data, + exp_data_len); + if (val == 0) + result = T_PASS; + else + result = T_FAIL; + } else + result = T_PASS; + } else { + t_info("dns_name_towire unexpectedly returned %s\n", + dns_result_totext(dns_result)); + result = T_FAIL; + } + } else { + t_info("dns_name_fromtext %s failed, result = %s\n", + testname, dns_result_totext(dns_result)); + } + return (result); +} + +static void +t_dns_name_towire_x(const char *testfile, size_t buflen) { + int line; + int cnt; + int result; + unsigned int dc_method; + isc_result_t exp_result; + char *p; + FILE *fp; + + result = T_UNRESOLVED; + fp = fopen(testfile, "r"); + if (fp != NULL) { + line = 0; + while ((p = t_fgetbs(fp)) != NULL) { + + ++line; + + /* + * Skip comment lines. + */ + if ((isspace((unsigned char)*p)) || (*p == '#')) { + (void)free(p); + continue; + } + + cnt = bustline(p, Tokens); + if (cnt == 5) { + /* + * testname, dc_method, + * exp_data, exp_data_len, + * exp_result. + */ + + dc_method = t_dc_method_fromtext(Tokens[3]); + exp_result = t_dns_result_fromtext(Tokens[4]); + + result = test_dns_name_towire(Tokens[0], + dc_method, + Tokens[2], + atoi(Tokens[3]), + exp_result, + buflen); + } else { + t_info("bad format at line %d\n", line); + } + + (void)free(p); + t_result(result); + } + (void)fclose(fp); + } else { + t_info("Missing datafile %s\n", testfile); + t_result(result); + } +} + +static void +t_dns_name_towire_1(void) { + t_assert("dns_name_towire", 1, T_REQUIRED, a51); + t_dns_name_towire_x("dns_name_towire_1_data", BUFLEN); +} + +static void +t_dns_name_towire_2(void) { + t_assert("dns_name_towire", 2, T_REQUIRED, a52); + t_dns_name_towire_x("dns_name_towire_2_data", 2); +} + +static void +t_dns_name_towire(void) { + t_dns_name_towire_1(); + t_dns_name_towire_2(); +} + +#if 0 /* This is silly. A test should either exist, or not, but not + * one that just returns "UNTESTED." + */ +static const char *a53 = + "dns_name_concatenate(prefix, suffix, name, target) " + "concatenates prefix and suffix, stores the result " + "in target, canonicalizes any bitstring labels " + "and returns ISC_R_SUCCESS"; + +static void +t_dns_name_concatenate(void) { + t_assert("dns_name_concatenate", 1, T_REQUIRED, a53); + t_result(T_UNTESTED); +} +#endif + +testspec_t T_testlist[] = { + { t_dns_name_init, "dns_name_init" }, + { t_dns_name_invalidate, "dns_name_invalidate" }, + { t_dns_name_setbuffer, "dns_name_setbuffer" }, + { t_dns_name_hasbuffer, "dns_name_hasbuffer" }, + { t_dns_name_isabsolute, "dns_name_isabsolute" }, + { t_dns_name_hash, "dns_name_hash" }, + { t_dns_name_fullcompare, "dns_name_fullcompare" }, + { t_dns_name_compare, "dns_name_compare" }, + { t_dns_name_rdatacompare, "dns_name_rdatacompare" }, + { t_dns_name_issubdomain, "dns_name_issubdomain" }, + { t_dns_name_countlabels, "dns_name_countlabels" }, + { t_dns_name_getlabel, "dns_name_getlabel" }, + { t_dns_name_getlabelsequence, "dns_name_getlabelsequence" }, + { t_dns_name_fromregion, "dns_name_fromregion" }, + { t_dns_name_toregion, "dns_name_toregion" }, + { t_dns_name_fromwire, "dns_name_fromwire" }, + { t_dns_name_towire, "dns_name_towire" }, + { t_dns_name_fromtext, "dns_name_fromtext" }, + { t_dns_name_totext, "dns_name_totext" }, +#if 0 + { t_dns_name_concatenate, "dns_name_concatenate" }, +#endif + { NULL, NULL } + +}; + diff --git a/bin/tests/names/wire_test1.data b/bin/tests/names/wire_test1.data new file mode 100644 index 0000000..505134a --- /dev/null +++ b/bin/tests/names/wire_test1.data @@ -0,0 +1,13 @@ +# +# a global14 compression pointer +# +000a85800001000300000003 +0376697803636f6d0000020001c00c00 +02000100000e10000b05697372763102 +7061c00cc00c0002000100000e100009 +066e732d657874c00cc00c0002000100 +000e10000e036e733104676e61630363 +6f6d00c0250001000100000e100004cc +98b886c03c0001000100000e100004cc +98b840c051000100010002a14a0004c6 +97f8f6 diff --git a/bin/tests/names/wire_test2.data b/bin/tests/names/wire_test2.data new file mode 100644 index 0000000..ea03557 --- /dev/null +++ b/bin/tests/names/wire_test2.data @@ -0,0 +1,13 @@ +# +# a global14 compression pointer +# +000a85800001000300000003 +8376697803636f6d0000020001c00c00 +02000100000e10000b05697372763102 +7061c00cc00c0002000100000e100009 +066e732d657874c00cc00c0002000100 +000e10000e036e733104676e61630363 +6f6d00c0250001000100000e100004cc +98b886c03c0001000100000e100004cc +98b840c051000100010002a14a0004c6 +97f8f6 diff --git a/bin/tests/names/wire_test3_1.data b/bin/tests/names/wire_test3_1.data new file mode 100644 index 0000000..5f5ec59 --- /dev/null +++ b/bin/tests/names/wire_test3_1.data @@ -0,0 +1,11 @@ +# +# a bad compression pointer starting with the bits 1111 +# +000a85800001000300000003 +03766978 03636f6d 00 0002 0001 +f00c 0002 0001 0000 0e10 000b 056973727631 027061 c00c +c00c 0002 0001 0000 0e10 0009 066e732d657874 c00c +c00c 0002 0001 0000 0e10 000e 036e7331 04676e6163 03636f6d 00 +c025 0001 0001 0000 0e10 0004 cc98b886 +c03c 0001 0001 0000 0e10 0004 cc98b840 +c051 0001 0001 0002 a14a 0004 c697f8f6 diff --git a/bin/tests/names/wire_test3_2.data b/bin/tests/names/wire_test3_2.data new file mode 100644 index 0000000..fae2fe2 --- /dev/null +++ b/bin/tests/names/wire_test3_2.data @@ -0,0 +1,12 @@ +# +# a bad compression pointer due to forward reference of 0x30 to +# another compression pointer with a valid backreference +# +000a85800001000300000003 +03766978 03636f6d 00 0002 0001 +c030 0002 0001 0000 0e10 000b 056973727631 027061 c00c +c00c 0002 0001 0000 0e10 0009 066e732d657874 c00c +c00c 0002 0001 0000 0e10 000e 036e7331 04676e6163 03636f6d 00 +c025 0001 0001 0000 0e10 0004 cc98b886 +c03c 0001 0001 0000 0e10 0004 cc98b840 +c051 0001 0001 0002 a14a 0004 c697f8f6 diff --git a/bin/tests/names/wire_test4.data b/bin/tests/names/wire_test4.data new file mode 100644 index 0000000..dba6035 --- /dev/null +++ b/bin/tests/names/wire_test4.data @@ -0,0 +1,45 @@ +# +# invalid name length, pointer at offset 0x0226 points to +# long name at offset 0x25 +# +000a 8580 0001 0003 0000 0001 +03 766978 03 636f6d 00 0002 0001 +c00c 0002 0001 00000e10 +0101 +# long name starts here +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a +03616263 0358595a 03616263 0358595a +03414243 0378797a 03414243 0378797a 00 +# compression pointer start here and refers back to long name +c023 0002 0001 00000e10 0009 066e732d657874 c00c +c00c 0002 0001 00000e10 000e 036e733104676e616303636f6d00 +c025 0001 0001 00000e10 0004 cc98b886 diff --git a/bin/tests/names/wire_test5.data b/bin/tests/names/wire_test5.data new file mode 100644 index 0000000..505134a --- /dev/null +++ b/bin/tests/names/wire_test5.data @@ -0,0 +1,13 @@ +# +# a global14 compression pointer +# +000a85800001000300000003 +0376697803636f6d0000020001c00c00 +02000100000e10000b05697372763102 +7061c00cc00c0002000100000e100009 +066e732d657874c00cc00c0002000100 +000e10000e036e733104676e61630363 +6f6d00c0250001000100000e100004cc +98b886c03c0001000100000e100004cc +98b840c051000100010002a14a0004c6 +97f8f6 diff --git a/bin/tests/names/wire_test6.data b/bin/tests/names/wire_test6.data new file mode 100644 index 0000000..1a05d26 --- /dev/null +++ b/bin/tests/names/wire_test6.data @@ -0,0 +1,13 @@ +# +# a bad pointer +# +000a85800001000300000003 +0376697803636f6d0000020001f00c00 +02000100000e10000b05697372763102 +7061c00cc00c0002000100000e100009 +066e732d657874c00cc00c0002000100 +000e10000e036e733104676e61630363 +6f6d00c0250001000100000e100004cc +98b886c03c0001000100000e100004cc +98b840c051000100010002a14a0004c6 +97f8f6 diff --git a/bin/tests/names/wire_test7.data b/bin/tests/names/wire_test7.data new file mode 100644 index 0000000..40fbbed --- /dev/null +++ b/bin/tests/names/wire_test7.data @@ -0,0 +1,5 @@ +# +# input ends unexpectedly +# +000a85800001000300000003 +0376697803636f6d0000020001c0 diff --git a/bin/tests/names/wire_test8.data b/bin/tests/names/wire_test8.data new file mode 100644 index 0000000..beabbf7 --- /dev/null +++ b/bin/tests/names/wire_test8.data @@ -0,0 +1,28 @@ +# +# too many hops DNS_POINTER_MAXHOPS is defined as 16 +# in lib/dns/include/dns/name.h +# +000a85800001000300000013 +03 766978 03 636f6d 00 0002 0001 +c00c 0002 0001 00000e10 000b 056973727631027061 c00c +c019 0002 0001 00000e10 0009 066e732d657874 c00c +c030 0002 0001 00000e10 000e 036e7331 04676e6163 03636f6d 00 +c045 0001 0001 00000e10 0004 cc98b886 +c05f 0001 0001 00000e10 0004 cc98b840 +c06f 0001 0001 0002a14a 0004 c697f8f6 +c07f 0001 0001 0002a14a 0004 c697f8f6 +c08f 0001 0001 0002a14a 0004 c697f8f6 +c09f 0001 0001 0002a14a 0004 c697f8f6 +c0af 0001 0001 0002a14a 0004 c697f8f6 +c0bf 0001 0001 0002a14a 0004 c697f8f6 +c0cf 0001 0001 0002a14a 0004 c697f8f6 +c0df 0001 0001 0002a14a 0004 c697f8f6 +c0ef 0001 0001 0002a14a 0004 c697f8f6 +c0ff 0001 0001 0002a14a 0004 c697f8f6 +c10f 0001 0001 0002a14a 0004 c697f8f6 +c11f 0001 0001 0002a14a 0004 c697f8f6 +c12f 0001 0001 0002a14a 0004 c697f8f6 +c13f 0001 0001 0002a14a 0004 c697f8f6 +c14f 0001 0001 0002a14a 0004 c697f8f6 +c15f 0001 0001 0002a14a 0004 c697f8f6 +c16f 0001 0001 0002a14a 0004 c697f8f6 |