1*00b67f09SDavid van Moolenbroek /* $NetBSD: t_master.c,v 1.6 2014/12/10 04:37:53 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2005, 2007, 2009, 2011, 2013 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1998-2001, 2003 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: t_master.c,v 1.41 2011/03/12 04:59:46 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <ctype.h>
25*00b67f09SDavid van Moolenbroek #include <stdlib.h>
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
28*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
29*00b67f09SDavid van Moolenbroek #include <isc/string.h> /* Required for HP/UX (and others?) */
30*00b67f09SDavid van Moolenbroek #include <isc/util.h>
31*00b67f09SDavid van Moolenbroek
32*00b67f09SDavid van Moolenbroek #include <dns/callbacks.h>
33*00b67f09SDavid van Moolenbroek #include <dns/master.h>
34*00b67f09SDavid van Moolenbroek #include <dns/name.h>
35*00b67f09SDavid van Moolenbroek #include <dns/rdataclass.h>
36*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
37*00b67f09SDavid van Moolenbroek #include <dns/result.h>
38*00b67f09SDavid van Moolenbroek
39*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
40*00b67f09SDavid van Moolenbroek
41*00b67f09SDavid van Moolenbroek #define BUFLEN 255
42*00b67f09SDavid van Moolenbroek #define BIGBUFLEN (64 * 1024)
43*00b67f09SDavid van Moolenbroek
44*00b67f09SDavid van Moolenbroek static isc_result_t
45*00b67f09SDavid van Moolenbroek t1_add_callback(void *arg, dns_name_t *owner, dns_rdataset_t *dataset);
46*00b67f09SDavid van Moolenbroek
47*00b67f09SDavid van Moolenbroek isc_mem_t *T1_mctx;
48*00b67f09SDavid van Moolenbroek char *Tokens[T_MAXTOKS + 1];
49*00b67f09SDavid van Moolenbroek
50*00b67f09SDavid van Moolenbroek static isc_result_t
t1_add_callback(void * arg,dns_name_t * owner,dns_rdataset_t * dataset)51*00b67f09SDavid van Moolenbroek t1_add_callback(void *arg, dns_name_t *owner, dns_rdataset_t *dataset) {
52*00b67f09SDavid van Moolenbroek char buf[BIGBUFLEN];
53*00b67f09SDavid van Moolenbroek isc_buffer_t target;
54*00b67f09SDavid van Moolenbroek isc_result_t result;
55*00b67f09SDavid van Moolenbroek
56*00b67f09SDavid van Moolenbroek UNUSED(arg);
57*00b67f09SDavid van Moolenbroek
58*00b67f09SDavid van Moolenbroek isc_buffer_init(&target, buf, BIGBUFLEN);
59*00b67f09SDavid van Moolenbroek result = dns_rdataset_totext(dataset, owner, ISC_FALSE, ISC_FALSE,
60*00b67f09SDavid van Moolenbroek &target);
61*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS)
62*00b67f09SDavid van Moolenbroek t_info("dns_rdataset_totext: %s\n", dns_result_totext(result));
63*00b67f09SDavid van Moolenbroek
64*00b67f09SDavid van Moolenbroek return(result);
65*00b67f09SDavid van Moolenbroek }
66*00b67f09SDavid van Moolenbroek
67*00b67f09SDavid van Moolenbroek static int
test_master(char * testfile,char * origin,char * class,isc_result_t exp_result)68*00b67f09SDavid van Moolenbroek test_master(char *testfile, char *origin, char *class, isc_result_t exp_result)
69*00b67f09SDavid van Moolenbroek {
70*00b67f09SDavid van Moolenbroek int result;
71*00b67f09SDavid van Moolenbroek int len;
72*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
73*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
74*00b67f09SDavid van Moolenbroek dns_name_t dns_origin;
75*00b67f09SDavid van Moolenbroek isc_buffer_t source;
76*00b67f09SDavid van Moolenbroek isc_buffer_t target;
77*00b67f09SDavid van Moolenbroek unsigned char name_buf[BUFLEN];
78*00b67f09SDavid van Moolenbroek dns_rdatacallbacks_t callbacks;
79*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
80*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
81*00b67f09SDavid van Moolenbroek
82*00b67f09SDavid van Moolenbroek if (T1_mctx == NULL)
83*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &T1_mctx);
84*00b67f09SDavid van Moolenbroek else
85*00b67f09SDavid van Moolenbroek isc_result = ISC_R_SUCCESS;
86*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
87*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %d\n", isc_result);
88*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
89*00b67f09SDavid van Moolenbroek }
90*00b67f09SDavid van Moolenbroek
91*00b67f09SDavid van Moolenbroek len = strlen(origin);
92*00b67f09SDavid van Moolenbroek isc_buffer_init(&source, origin, len);
93*00b67f09SDavid van Moolenbroek isc_buffer_add(&source, len);
94*00b67f09SDavid van Moolenbroek isc_buffer_setactive(&source, len);
95*00b67f09SDavid van Moolenbroek isc_buffer_init(&target, name_buf, BUFLEN);
96*00b67f09SDavid van Moolenbroek dns_name_init(&dns_origin, NULL);
97*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(&dns_origin, &source, dns_rootname,
98*00b67f09SDavid van Moolenbroek 0, &target);
99*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
100*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
101*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
102*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
103*00b67f09SDavid van Moolenbroek }
104*00b67f09SDavid van Moolenbroek
105*00b67f09SDavid van Moolenbroek dns_rdatacallbacks_init_stdio(&callbacks);
106*00b67f09SDavid van Moolenbroek callbacks.add = t1_add_callback;
107*00b67f09SDavid van Moolenbroek
108*00b67f09SDavid van Moolenbroek textregion.base = class;
109*00b67f09SDavid van Moolenbroek textregion.length = strlen(class);
110*00b67f09SDavid van Moolenbroek
111*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
112*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
113*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
114*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
115*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
116*00b67f09SDavid van Moolenbroek }
117*00b67f09SDavid van Moolenbroek
118*00b67f09SDavid van Moolenbroek dns_result = dns_master_loadfile( testfile,
119*00b67f09SDavid van Moolenbroek &dns_origin,
120*00b67f09SDavid van Moolenbroek &dns_origin,
121*00b67f09SDavid van Moolenbroek rdataclass,
122*00b67f09SDavid van Moolenbroek ISC_TRUE,
123*00b67f09SDavid van Moolenbroek &callbacks,
124*00b67f09SDavid van Moolenbroek T1_mctx);
125*00b67f09SDavid van Moolenbroek
126*00b67f09SDavid van Moolenbroek if (dns_result == exp_result)
127*00b67f09SDavid van Moolenbroek result = T_PASS;
128*00b67f09SDavid van Moolenbroek else {
129*00b67f09SDavid van Moolenbroek t_info("dns_master_loadfile: got %s, expected %s\n",
130*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result),
131*00b67f09SDavid van Moolenbroek dns_result_totext(exp_result));
132*00b67f09SDavid van Moolenbroek result = T_FAIL;
133*00b67f09SDavid van Moolenbroek }
134*00b67f09SDavid van Moolenbroek return(result);
135*00b67f09SDavid van Moolenbroek }
136*00b67f09SDavid van Moolenbroek
137*00b67f09SDavid van Moolenbroek static int
test_master_x(const char * filename)138*00b67f09SDavid van Moolenbroek test_master_x(const char *filename) {
139*00b67f09SDavid van Moolenbroek FILE *fp;
140*00b67f09SDavid van Moolenbroek char *p;
141*00b67f09SDavid van Moolenbroek int line;
142*00b67f09SDavid van Moolenbroek int cnt;
143*00b67f09SDavid van Moolenbroek int result;
144*00b67f09SDavid van Moolenbroek
145*00b67f09SDavid van Moolenbroek result = T_UNRESOLVED;
146*00b67f09SDavid van Moolenbroek
147*00b67f09SDavid van Moolenbroek fp = fopen(filename, "r");
148*00b67f09SDavid van Moolenbroek if (fp != NULL) {
149*00b67f09SDavid van Moolenbroek line = 0;
150*00b67f09SDavid van Moolenbroek while ((p = t_fgetbs(fp)) != NULL) {
151*00b67f09SDavid van Moolenbroek
152*00b67f09SDavid van Moolenbroek ++line;
153*00b67f09SDavid van Moolenbroek
154*00b67f09SDavid van Moolenbroek /*
155*00b67f09SDavid van Moolenbroek * Skip comment lines.
156*00b67f09SDavid van Moolenbroek */
157*00b67f09SDavid van Moolenbroek if ((isspace(*p & 0xff)) || (*p == '#')) {
158*00b67f09SDavid van Moolenbroek (void)free(p);
159*00b67f09SDavid van Moolenbroek continue;
160*00b67f09SDavid van Moolenbroek }
161*00b67f09SDavid van Moolenbroek
162*00b67f09SDavid van Moolenbroek /*
163*00b67f09SDavid van Moolenbroek * Name of data file, origin, zclass, expected result.
164*00b67f09SDavid van Moolenbroek */
165*00b67f09SDavid van Moolenbroek cnt = t_bustline(p, Tokens);
166*00b67f09SDavid van Moolenbroek if (cnt == 4) {
167*00b67f09SDavid van Moolenbroek result = test_master(Tokens[0], Tokens[1],
168*00b67f09SDavid van Moolenbroek Tokens[2],
169*00b67f09SDavid van Moolenbroek t_dns_result_fromtext(Tokens[3]));
170*00b67f09SDavid van Moolenbroek } else {
171*00b67f09SDavid van Moolenbroek t_info("bad format in %s at line %d\n",
172*00b67f09SDavid van Moolenbroek filename, line);
173*00b67f09SDavid van Moolenbroek }
174*00b67f09SDavid van Moolenbroek
175*00b67f09SDavid van Moolenbroek (void)free(p);
176*00b67f09SDavid van Moolenbroek }
177*00b67f09SDavid van Moolenbroek (void)fclose(fp);
178*00b67f09SDavid van Moolenbroek } else {
179*00b67f09SDavid van Moolenbroek t_info("Missing datafile %s\n", filename);
180*00b67f09SDavid van Moolenbroek }
181*00b67f09SDavid van Moolenbroek return(result);
182*00b67f09SDavid van Moolenbroek }
183*00b67f09SDavid van Moolenbroek
184*00b67f09SDavid van Moolenbroek static const char *a1 = "dns_master_loadfile loads a valid master file and "
185*00b67f09SDavid van Moolenbroek "returns ISC_R_SUCCESS";
186*00b67f09SDavid van Moolenbroek static void
t1(void)187*00b67f09SDavid van Moolenbroek t1(void) {
188*00b67f09SDavid van Moolenbroek int result;
189*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 1, T_REQUIRED, "%s", a1);
190*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_1_data");
191*00b67f09SDavid van Moolenbroek t_result(result);
192*00b67f09SDavid van Moolenbroek }
193*00b67f09SDavid van Moolenbroek
194*00b67f09SDavid van Moolenbroek static const char *a2 =
195*00b67f09SDavid van Moolenbroek "dns_master_loadfile returns ISC_R_UNEXPECTEDEND when the "
196*00b67f09SDavid van Moolenbroek "masterfile input ends unexpectedly";
197*00b67f09SDavid van Moolenbroek
198*00b67f09SDavid van Moolenbroek static void
t2(void)199*00b67f09SDavid van Moolenbroek t2(void) {
200*00b67f09SDavid van Moolenbroek int result;
201*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 2, T_REQUIRED, "%s", a2);
202*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_2_data");
203*00b67f09SDavid van Moolenbroek t_result(result);
204*00b67f09SDavid van Moolenbroek }
205*00b67f09SDavid van Moolenbroek
206*00b67f09SDavid van Moolenbroek static const char *a3 = "dns_master_loadfile returns DNS_R_NOOWNER when the "
207*00b67f09SDavid van Moolenbroek "an ownername is not specified";
208*00b67f09SDavid van Moolenbroek
209*00b67f09SDavid van Moolenbroek static void
t3()210*00b67f09SDavid van Moolenbroek t3() {
211*00b67f09SDavid van Moolenbroek int result;
212*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 3, T_REQUIRED, "%s", a3);
213*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_3_data");
214*00b67f09SDavid van Moolenbroek t_result(result);
215*00b67f09SDavid van Moolenbroek }
216*00b67f09SDavid van Moolenbroek
217*00b67f09SDavid van Moolenbroek static const char *a4 = "dns_master_loadfile accepts broken zone files "
218*00b67f09SDavid van Moolenbroek "where the first record has an undefined TTL, "
219*00b67f09SDavid van Moolenbroek "as long as it is a SOA";
220*00b67f09SDavid van Moolenbroek
221*00b67f09SDavid van Moolenbroek static void
t4()222*00b67f09SDavid van Moolenbroek t4() {
223*00b67f09SDavid van Moolenbroek int result;
224*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 4, T_REQUIRED, "%s", a4);
225*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_4_data");
226*00b67f09SDavid van Moolenbroek t_result(result);
227*00b67f09SDavid van Moolenbroek }
228*00b67f09SDavid van Moolenbroek
229*00b67f09SDavid van Moolenbroek static const char *a5 = "dns_master_loadfile returns DNS_R_BADCLASS when the "
230*00b67f09SDavid van Moolenbroek "the record class did not match the zone class";
231*00b67f09SDavid van Moolenbroek
232*00b67f09SDavid van Moolenbroek static void
t5()233*00b67f09SDavid van Moolenbroek t5() {
234*00b67f09SDavid van Moolenbroek int result;
235*00b67f09SDavid van Moolenbroek
236*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 5, T_REQUIRED, "%s", a5);
237*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_5_data");
238*00b67f09SDavid van Moolenbroek
239*00b67f09SDavid van Moolenbroek t_result(result);
240*00b67f09SDavid van Moolenbroek }
241*00b67f09SDavid van Moolenbroek
242*00b67f09SDavid van Moolenbroek static const char *a6 =
243*00b67f09SDavid van Moolenbroek "dns_master_loadfile understands DNSKEY RR specifications "
244*00b67f09SDavid van Moolenbroek "containing key material";
245*00b67f09SDavid van Moolenbroek
246*00b67f09SDavid van Moolenbroek static void
t6()247*00b67f09SDavid van Moolenbroek t6() {
248*00b67f09SDavid van Moolenbroek int result;
249*00b67f09SDavid van Moolenbroek
250*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 6, T_REQUIRED, "%s", a6);
251*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_6_data");
252*00b67f09SDavid van Moolenbroek
253*00b67f09SDavid van Moolenbroek t_result(result);
254*00b67f09SDavid van Moolenbroek }
255*00b67f09SDavid van Moolenbroek
256*00b67f09SDavid van Moolenbroek static const char *a7 =
257*00b67f09SDavid van Moolenbroek "dns_master_loadfile understands DNSKEY RR specifications "
258*00b67f09SDavid van Moolenbroek "containing no key material";
259*00b67f09SDavid van Moolenbroek
260*00b67f09SDavid van Moolenbroek static void
t7()261*00b67f09SDavid van Moolenbroek t7() {
262*00b67f09SDavid van Moolenbroek int result;
263*00b67f09SDavid van Moolenbroek
264*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 7, T_REQUIRED, "%s", a7);
265*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_7_data");
266*00b67f09SDavid van Moolenbroek
267*00b67f09SDavid van Moolenbroek t_result(result);
268*00b67f09SDavid van Moolenbroek }
269*00b67f09SDavid van Moolenbroek
270*00b67f09SDavid van Moolenbroek static const char *a8 =
271*00b67f09SDavid van Moolenbroek "dns_master_loadfile understands $INCLUDE";
272*00b67f09SDavid van Moolenbroek
273*00b67f09SDavid van Moolenbroek static void
t8()274*00b67f09SDavid van Moolenbroek t8() {
275*00b67f09SDavid van Moolenbroek int result;
276*00b67f09SDavid van Moolenbroek
277*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 8, T_REQUIRED, "%s", a8);
278*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_8_data");
279*00b67f09SDavid van Moolenbroek
280*00b67f09SDavid van Moolenbroek t_result(result);
281*00b67f09SDavid van Moolenbroek }
282*00b67f09SDavid van Moolenbroek
283*00b67f09SDavid van Moolenbroek static const char *a9 =
284*00b67f09SDavid van Moolenbroek "dns_master_loadfile understands $INCLUDE with failure";
285*00b67f09SDavid van Moolenbroek
286*00b67f09SDavid van Moolenbroek static void
t9()287*00b67f09SDavid van Moolenbroek t9() {
288*00b67f09SDavid van Moolenbroek int result;
289*00b67f09SDavid van Moolenbroek
290*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 9, T_REQUIRED, "%s", a9);
291*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_9_data");
292*00b67f09SDavid van Moolenbroek
293*00b67f09SDavid van Moolenbroek t_result(result);
294*00b67f09SDavid van Moolenbroek }
295*00b67f09SDavid van Moolenbroek
296*00b67f09SDavid van Moolenbroek static const char *a10 =
297*00b67f09SDavid van Moolenbroek "dns_master_loadfile non-empty blank lines";
298*00b67f09SDavid van Moolenbroek
299*00b67f09SDavid van Moolenbroek static void
t10()300*00b67f09SDavid van Moolenbroek t10() {
301*00b67f09SDavid van Moolenbroek int result;
302*00b67f09SDavid van Moolenbroek
303*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 10, T_REQUIRED, "%s", a10);
304*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_10_data");
305*00b67f09SDavid van Moolenbroek
306*00b67f09SDavid van Moolenbroek t_result(result);
307*00b67f09SDavid van Moolenbroek }
308*00b67f09SDavid van Moolenbroek
309*00b67f09SDavid van Moolenbroek static const char *a11 =
310*00b67f09SDavid van Moolenbroek "dns_master_loadfile allow leading zeros in SOA";
311*00b67f09SDavid van Moolenbroek
312*00b67f09SDavid van Moolenbroek static void
t11()313*00b67f09SDavid van Moolenbroek t11() {
314*00b67f09SDavid van Moolenbroek int result;
315*00b67f09SDavid van Moolenbroek
316*00b67f09SDavid van Moolenbroek t_assert("dns_master_loadfile", 11, T_REQUIRED, "%s", a11);
317*00b67f09SDavid van Moolenbroek result = test_master_x("dns_master_load_11_data");
318*00b67f09SDavid van Moolenbroek
319*00b67f09SDavid van Moolenbroek t_result(result);
320*00b67f09SDavid van Moolenbroek }
321*00b67f09SDavid van Moolenbroek
322*00b67f09SDavid van Moolenbroek
323*00b67f09SDavid van Moolenbroek testspec_t T_testlist[] = {
324*00b67f09SDavid van Moolenbroek { (PFV) t1, "ISC_R_SUCCESS" },
325*00b67f09SDavid van Moolenbroek { (PFV) t2, "ISC_R_UNEXPECTEDEND" },
326*00b67f09SDavid van Moolenbroek { (PFV) t3, "DNS_NOOWNER" },
327*00b67f09SDavid van Moolenbroek { (PFV) t4, "DNS_NOTTL" },
328*00b67f09SDavid van Moolenbroek { (PFV) t5, "DNS_BADCLASS" },
329*00b67f09SDavid van Moolenbroek { (PFV) t6, "DNSKEY RR 1" },
330*00b67f09SDavid van Moolenbroek { (PFV) t7, "DNSKEY RR 2" },
331*00b67f09SDavid van Moolenbroek { (PFV) t8, "$INCLUDE" },
332*00b67f09SDavid van Moolenbroek { (PFV) t9, "$INCLUDE w/ DNS_BADCLASS" },
333*00b67f09SDavid van Moolenbroek { (PFV) t10, "non empty blank lines" },
334*00b67f09SDavid van Moolenbroek { (PFV) t11, "leading zeros in serial" },
335*00b67f09SDavid van Moolenbroek { (PFV) 0, NULL }
336*00b67f09SDavid van Moolenbroek };
337*00b67f09SDavid van Moolenbroek
338*00b67f09SDavid van Moolenbroek #ifdef WIN32
339*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)340*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
341*00b67f09SDavid van Moolenbroek t_settests(T_testlist);
342*00b67f09SDavid van Moolenbroek return (t_main(argc, argv));
343*00b67f09SDavid van Moolenbroek }
344*00b67f09SDavid van Moolenbroek #endif
345