xref: /minix3/external/bsd/bind/dist/lib/dns/tests/master_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: master_test.c,v 1.6 2015/07/08 17:28:59 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011-2013, 2015  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*! \file */
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <atf-c.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <stdio.h>
28*00b67f09SDavid van Moolenbroek #include <unistd.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include <isc/print.h>
31*00b67f09SDavid van Moolenbroek #include <isc/xml.h>
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include <dns/cache.h>
34*00b67f09SDavid van Moolenbroek #include <dns/callbacks.h>
35*00b67f09SDavid van Moolenbroek #include <dns/db.h>
36*00b67f09SDavid van Moolenbroek #include <dns/master.h>
37*00b67f09SDavid van Moolenbroek #include <dns/masterdump.h>
38*00b67f09SDavid van Moolenbroek #include <dns/name.h>
39*00b67f09SDavid van Moolenbroek #include <dns/rdata.h>
40*00b67f09SDavid van Moolenbroek #include <dns/rdatalist.h>
41*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek #include "dnstest.h"
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek /*
46*00b67f09SDavid van Moolenbroek  * Helper functions
47*00b67f09SDavid van Moolenbroek  */
48*00b67f09SDavid van Moolenbroek 
49*00b67f09SDavid van Moolenbroek #define	BUFLEN		255
50*00b67f09SDavid van Moolenbroek #define	BIGBUFLEN	(70 * 1024)
51*00b67f09SDavid van Moolenbroek #define TEST_ORIGIN	"test"
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek static dns_masterrawheader_t header;
54*00b67f09SDavid van Moolenbroek static isc_boolean_t headerset;
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek dns_name_t dns_origin;
57*00b67f09SDavid van Moolenbroek char origin[sizeof(TEST_ORIGIN)];
58*00b67f09SDavid van Moolenbroek unsigned char name_buf[BUFLEN];
59*00b67f09SDavid van Moolenbroek dns_rdatacallbacks_t callbacks;
60*00b67f09SDavid van Moolenbroek char *include_file = NULL;
61*00b67f09SDavid van Moolenbroek 
62*00b67f09SDavid van Moolenbroek static isc_result_t
63*00b67f09SDavid van Moolenbroek add_callback(void *arg, dns_name_t *owner, dns_rdataset_t *dataset);
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek static void
66*00b67f09SDavid van Moolenbroek rawdata_callback(dns_zone_t *zone, dns_masterrawheader_t *header);
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek static isc_result_t
add_callback(void * arg,dns_name_t * owner,dns_rdataset_t * dataset)69*00b67f09SDavid van Moolenbroek add_callback(void *arg, dns_name_t *owner, dns_rdataset_t *dataset) {
70*00b67f09SDavid van Moolenbroek 	char buf[BIGBUFLEN];
71*00b67f09SDavid van Moolenbroek 	isc_buffer_t target;
72*00b67f09SDavid van Moolenbroek 	isc_result_t result;
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek 	UNUSED(arg);
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&target, buf, BIGBUFLEN);
77*00b67f09SDavid van Moolenbroek 	result = dns_rdataset_totext(dataset, owner, ISC_FALSE, ISC_FALSE,
78*00b67f09SDavid van Moolenbroek 				     &target);
79*00b67f09SDavid van Moolenbroek 	return(result);
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek static void
rawdata_callback(dns_zone_t * zone,dns_masterrawheader_t * h)83*00b67f09SDavid van Moolenbroek rawdata_callback(dns_zone_t *zone, dns_masterrawheader_t *h) {
84*00b67f09SDavid van Moolenbroek 	UNUSED(zone);
85*00b67f09SDavid van Moolenbroek 	header = *h;
86*00b67f09SDavid van Moolenbroek 	headerset = ISC_TRUE;
87*00b67f09SDavid van Moolenbroek }
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek static isc_result_t
setup_master(void (* warn)(struct dns_rdatacallbacks *,const char *,...),void (* error)(struct dns_rdatacallbacks *,const char *,...))90*00b67f09SDavid van Moolenbroek setup_master(void (*warn)(struct dns_rdatacallbacks *, const char *, ...),
91*00b67f09SDavid van Moolenbroek 	     void (*error)(struct dns_rdatacallbacks *, const char *, ...))
92*00b67f09SDavid van Moolenbroek {
93*00b67f09SDavid van Moolenbroek 	isc_result_t		result;
94*00b67f09SDavid van Moolenbroek 	int			len;
95*00b67f09SDavid van Moolenbroek 	isc_buffer_t		source;
96*00b67f09SDavid van Moolenbroek 	isc_buffer_t		target;
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek 	strcpy(origin, TEST_ORIGIN);
99*00b67f09SDavid van Moolenbroek 	len = strlen(origin);
100*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&source, origin, len);
101*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&source, len);
102*00b67f09SDavid van Moolenbroek 	isc_buffer_setactive(&source, len);
103*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&target, name_buf, BUFLEN);
104*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_origin, NULL);
105*00b67f09SDavid van Moolenbroek 	dns_master_initrawheader(&header);
106*00b67f09SDavid van Moolenbroek 
107*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(&dns_origin, &source, dns_rootname,
108*00b67f09SDavid van Moolenbroek 				   0, &target);
109*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
110*00b67f09SDavid van Moolenbroek 		return(result);
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek 	dns_rdatacallbacks_init_stdio(&callbacks);
113*00b67f09SDavid van Moolenbroek 	callbacks.add = add_callback;
114*00b67f09SDavid van Moolenbroek 	callbacks.rawdata = rawdata_callback;
115*00b67f09SDavid van Moolenbroek 	callbacks.zone = NULL;
116*00b67f09SDavid van Moolenbroek 	if (warn != NULL)
117*00b67f09SDavid van Moolenbroek 		callbacks.warn = warn;
118*00b67f09SDavid van Moolenbroek 	if (error != NULL)
119*00b67f09SDavid van Moolenbroek 		callbacks.error = error;
120*00b67f09SDavid van Moolenbroek 	headerset = ISC_FALSE;
121*00b67f09SDavid van Moolenbroek 	return (result);
122*00b67f09SDavid van Moolenbroek }
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek static isc_result_t
test_master(const char * testfile,dns_masterformat_t format,void (* warn)(struct dns_rdatacallbacks *,const char *,...),void (* error)(struct dns_rdatacallbacks *,const char *,...))125*00b67f09SDavid van Moolenbroek test_master(const char *testfile, dns_masterformat_t format,
126*00b67f09SDavid van Moolenbroek 	    void (*warn)(struct dns_rdatacallbacks *, const char *, ...),
127*00b67f09SDavid van Moolenbroek 	    void (*error)(struct dns_rdatacallbacks *, const char *, ...))
128*00b67f09SDavid van Moolenbroek {
129*00b67f09SDavid van Moolenbroek 	isc_result_t		result;
130*00b67f09SDavid van Moolenbroek 
131*00b67f09SDavid van Moolenbroek 	result = setup_master(warn, error);
132*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
133*00b67f09SDavid van Moolenbroek 		return(result);
134*00b67f09SDavid van Moolenbroek 
135*00b67f09SDavid van Moolenbroek 	result = dns_master_loadfile2(testfile, &dns_origin, &dns_origin,
136*00b67f09SDavid van Moolenbroek 				      dns_rdataclass_in, ISC_TRUE,
137*00b67f09SDavid van Moolenbroek 				      &callbacks, mctx, format);
138*00b67f09SDavid van Moolenbroek 	return (result);
139*00b67f09SDavid van Moolenbroek }
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek static void
include_callback(const char * filename,void * arg)142*00b67f09SDavid van Moolenbroek include_callback(const char *filename, void *arg) {
143*00b67f09SDavid van Moolenbroek 	char **argp = (char **) arg;
144*00b67f09SDavid van Moolenbroek 	*argp = isc_mem_strdup(mctx, filename);
145*00b67f09SDavid van Moolenbroek }
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek /*
148*00b67f09SDavid van Moolenbroek  * Individual unit tests
149*00b67f09SDavid van Moolenbroek  */
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek /* Successful load test */
152*00b67f09SDavid van Moolenbroek ATF_TC(load);
ATF_TC_HEAD(load,tc)153*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(load, tc) {
154*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() loads a "
155*00b67f09SDavid van Moolenbroek 				       "valid master file and returns success");
156*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(load,tc)157*00b67f09SDavid van Moolenbroek ATF_TC_BODY(load, tc) {
158*00b67f09SDavid van Moolenbroek 	isc_result_t result;
159*00b67f09SDavid van Moolenbroek 
160*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
161*00b67f09SDavid van Moolenbroek 
162*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
163*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master1.data",
166*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
167*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
168*00b67f09SDavid van Moolenbroek 
169*00b67f09SDavid van Moolenbroek 	dns_test_end();
170*00b67f09SDavid van Moolenbroek }
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek /* Unepxected end of file test */
174*00b67f09SDavid van Moolenbroek ATF_TC(unexpected);
ATF_TC_HEAD(unexpected,tc)175*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(unexpected, tc) {
176*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() returns "
177*00b67f09SDavid van Moolenbroek 				       "DNS_R_UNEXPECTED when file ends "
178*00b67f09SDavid van Moolenbroek 				       "too soon");
179*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(unexpected,tc)180*00b67f09SDavid van Moolenbroek ATF_TC_BODY(unexpected, tc) {
181*00b67f09SDavid van Moolenbroek 	isc_result_t result;
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
184*00b67f09SDavid van Moolenbroek 
185*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
186*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master2.data",
189*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
190*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_UNEXPECTEDEND);
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek 	dns_test_end();
193*00b67f09SDavid van Moolenbroek }
194*00b67f09SDavid van Moolenbroek 
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek /* No owner test */
197*00b67f09SDavid van Moolenbroek ATF_TC(noowner);
ATF_TC_HEAD(noowner,tc)198*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(noowner, tc) {
199*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() accepts broken "
200*00b67f09SDavid van Moolenbroek 				       "zones with no TTL for first record "
201*00b67f09SDavid van Moolenbroek 				       "if it is an SOA");
202*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(noowner,tc)203*00b67f09SDavid van Moolenbroek ATF_TC_BODY(noowner, tc) {
204*00b67f09SDavid van Moolenbroek 	isc_result_t result;
205*00b67f09SDavid van Moolenbroek 
206*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
207*00b67f09SDavid van Moolenbroek 
208*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
209*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
210*00b67f09SDavid van Moolenbroek 
211*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master3.data",
212*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
213*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_NOOWNER);
214*00b67f09SDavid van Moolenbroek 
215*00b67f09SDavid van Moolenbroek 	dns_test_end();
216*00b67f09SDavid van Moolenbroek }
217*00b67f09SDavid van Moolenbroek 
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek /* No TTL test */
220*00b67f09SDavid van Moolenbroek ATF_TC(nottl);
ATF_TC_HEAD(nottl,tc)221*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(nottl, tc) {
222*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() returns "
223*00b67f09SDavid van Moolenbroek 				       "DNS_R_NOOWNER when no owner name "
224*00b67f09SDavid van Moolenbroek 				       "is specified");
225*00b67f09SDavid van Moolenbroek }
226*00b67f09SDavid van Moolenbroek 
ATF_TC_BODY(nottl,tc)227*00b67f09SDavid van Moolenbroek ATF_TC_BODY(nottl, tc) {
228*00b67f09SDavid van Moolenbroek 	isc_result_t result;
229*00b67f09SDavid van Moolenbroek 
230*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
231*00b67f09SDavid van Moolenbroek 
232*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
233*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
234*00b67f09SDavid van Moolenbroek 
235*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master4.data",
236*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
237*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
238*00b67f09SDavid van Moolenbroek 
239*00b67f09SDavid van Moolenbroek 	dns_test_end();
240*00b67f09SDavid van Moolenbroek }
241*00b67f09SDavid van Moolenbroek 
242*00b67f09SDavid van Moolenbroek 
243*00b67f09SDavid van Moolenbroek /* Bad class test */
244*00b67f09SDavid van Moolenbroek ATF_TC(badclass);
ATF_TC_HEAD(badclass,tc)245*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(badclass, tc) {
246*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() returns "
247*00b67f09SDavid van Moolenbroek 				       "DNS_R_BADCLASS when record class "
248*00b67f09SDavid van Moolenbroek 				       "doesn't match zone class");
249*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(badclass,tc)250*00b67f09SDavid van Moolenbroek ATF_TC_BODY(badclass, tc) {
251*00b67f09SDavid van Moolenbroek 	isc_result_t result;
252*00b67f09SDavid van Moolenbroek 
253*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
254*00b67f09SDavid van Moolenbroek 
255*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
256*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master5.data",
259*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
260*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_BADCLASS);
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	dns_test_end();
263*00b67f09SDavid van Moolenbroek }
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek /* Too big rdata test */
266*00b67f09SDavid van Moolenbroek ATF_TC(toobig);
ATF_TC_HEAD(toobig,tc)267*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(toobig, tc) {
268*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() returns "
269*00b67f09SDavid van Moolenbroek 				       "ISC_R_NOSPACE when record is too big");
270*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(toobig,tc)271*00b67f09SDavid van Moolenbroek ATF_TC_BODY(toobig, tc) {
272*00b67f09SDavid van Moolenbroek 	isc_result_t result;
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
275*00b67f09SDavid van Moolenbroek 
276*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
277*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
278*00b67f09SDavid van Moolenbroek 
279*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master15.data",
280*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
281*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_NOSPACE);
282*00b67f09SDavid van Moolenbroek 
283*00b67f09SDavid van Moolenbroek 	dns_test_end();
284*00b67f09SDavid van Moolenbroek }
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek /* Maximum rdata test */
287*00b67f09SDavid van Moolenbroek ATF_TC(maxrdata);
ATF_TC_HEAD(maxrdata,tc)288*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(maxrdata, tc) {
289*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() returns "
290*00b67f09SDavid van Moolenbroek 				       "ISC_R_SUCCESS when record is maximum "
291*00b67f09SDavid van Moolenbroek 				       "size");
292*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(maxrdata,tc)293*00b67f09SDavid van Moolenbroek ATF_TC_BODY(maxrdata, tc) {
294*00b67f09SDavid van Moolenbroek 	isc_result_t result;
295*00b67f09SDavid van Moolenbroek 
296*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
297*00b67f09SDavid van Moolenbroek 
298*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
299*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
300*00b67f09SDavid van Moolenbroek 
301*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master16.data",
302*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
303*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
304*00b67f09SDavid van Moolenbroek 
305*00b67f09SDavid van Moolenbroek 	dns_test_end();
306*00b67f09SDavid van Moolenbroek }
307*00b67f09SDavid van Moolenbroek 
308*00b67f09SDavid van Moolenbroek /* DNSKEY test */
309*00b67f09SDavid van Moolenbroek ATF_TC(dnskey);
ATF_TC_HEAD(dnskey,tc)310*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(dnskey, tc) {
311*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() understands "
312*00b67f09SDavid van Moolenbroek 				       "DNSKEY with key material");
313*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(dnskey,tc)314*00b67f09SDavid van Moolenbroek ATF_TC_BODY(dnskey, tc) {
315*00b67f09SDavid van Moolenbroek 	isc_result_t result;
316*00b67f09SDavid van Moolenbroek 
317*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
318*00b67f09SDavid van Moolenbroek 
319*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
320*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
321*00b67f09SDavid van Moolenbroek 
322*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master6.data",
323*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
324*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
325*00b67f09SDavid van Moolenbroek 
326*00b67f09SDavid van Moolenbroek 	dns_test_end();
327*00b67f09SDavid van Moolenbroek }
328*00b67f09SDavid van Moolenbroek 
329*00b67f09SDavid van Moolenbroek 
330*00b67f09SDavid van Moolenbroek /* DNSKEY with no key material test */
331*00b67f09SDavid van Moolenbroek ATF_TC(dnsnokey);
ATF_TC_HEAD(dnsnokey,tc)332*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(dnsnokey, tc) {
333*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() understands "
334*00b67f09SDavid van Moolenbroek 				       "DNSKEY with no key material");
335*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(dnsnokey,tc)336*00b67f09SDavid van Moolenbroek ATF_TC_BODY(dnsnokey, tc) {
337*00b67f09SDavid van Moolenbroek 	isc_result_t result;
338*00b67f09SDavid van Moolenbroek 
339*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
340*00b67f09SDavid van Moolenbroek 
341*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
342*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
343*00b67f09SDavid van Moolenbroek 
344*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master7.data",
345*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
346*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
347*00b67f09SDavid van Moolenbroek 
348*00b67f09SDavid van Moolenbroek 	dns_test_end();
349*00b67f09SDavid van Moolenbroek }
350*00b67f09SDavid van Moolenbroek 
351*00b67f09SDavid van Moolenbroek /* Include test */
352*00b67f09SDavid van Moolenbroek ATF_TC(include);
ATF_TC_HEAD(include,tc)353*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(include, tc) {
354*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() understands "
355*00b67f09SDavid van Moolenbroek 				       "$INCLUDE");
356*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(include,tc)357*00b67f09SDavid van Moolenbroek ATF_TC_BODY(include, tc) {
358*00b67f09SDavid van Moolenbroek 	isc_result_t result;
359*00b67f09SDavid van Moolenbroek 
360*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
361*00b67f09SDavid van Moolenbroek 
362*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
363*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
364*00b67f09SDavid van Moolenbroek 
365*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master8.data",
366*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
367*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_SEENINCLUDE);
368*00b67f09SDavid van Moolenbroek 
369*00b67f09SDavid van Moolenbroek 	dns_test_end();
370*00b67f09SDavid van Moolenbroek }
371*00b67f09SDavid van Moolenbroek 
372*00b67f09SDavid van Moolenbroek /* Include file list test */
373*00b67f09SDavid van Moolenbroek ATF_TC(master_includelist);
ATF_TC_HEAD(master_includelist,tc)374*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(master_includelist, tc) {
375*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile4() returns "
376*00b67f09SDavid van Moolenbroek 				       "names of included file");
377*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(master_includelist,tc)378*00b67f09SDavid van Moolenbroek ATF_TC_BODY(master_includelist, tc) {
379*00b67f09SDavid van Moolenbroek 	isc_result_t result;
380*00b67f09SDavid van Moolenbroek 	char *filename = NULL;
381*00b67f09SDavid van Moolenbroek 
382*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
383*00b67f09SDavid van Moolenbroek 
384*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
385*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
386*00b67f09SDavid van Moolenbroek 
387*00b67f09SDavid van Moolenbroek 	result = setup_master(NULL, NULL);
388*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
389*00b67f09SDavid van Moolenbroek 
390*00b67f09SDavid van Moolenbroek 	result = dns_master_loadfile4("testdata/master/master8.data",
391*00b67f09SDavid van Moolenbroek 				      &dns_origin, &dns_origin,
392*00b67f09SDavid van Moolenbroek 				      dns_rdataclass_in, 0, ISC_TRUE,
393*00b67f09SDavid van Moolenbroek 				      &callbacks, include_callback,
394*00b67f09SDavid van Moolenbroek 				      &filename, mctx, dns_masterformat_text);
395*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, DNS_R_SEENINCLUDE);
396*00b67f09SDavid van Moolenbroek 	ATF_CHECK(filename != NULL);
397*00b67f09SDavid van Moolenbroek 	if (filename != NULL) {
398*00b67f09SDavid van Moolenbroek 		ATF_CHECK_STREQ(filename, "testdata/master/master7.data");
399*00b67f09SDavid van Moolenbroek 		isc_mem_free(mctx, filename);
400*00b67f09SDavid van Moolenbroek 	}
401*00b67f09SDavid van Moolenbroek 
402*00b67f09SDavid van Moolenbroek 	dns_test_end();
403*00b67f09SDavid van Moolenbroek }
404*00b67f09SDavid van Moolenbroek 
405*00b67f09SDavid van Moolenbroek /* Include failure test */
406*00b67f09SDavid van Moolenbroek ATF_TC(includefail);
ATF_TC_HEAD(includefail,tc)407*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(includefail, tc) {
408*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() understands "
409*00b67f09SDavid van Moolenbroek 				       "$INCLUDE failures");
410*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(includefail,tc)411*00b67f09SDavid van Moolenbroek ATF_TC_BODY(includefail, tc) {
412*00b67f09SDavid van Moolenbroek 	isc_result_t result;
413*00b67f09SDavid van Moolenbroek 
414*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
415*00b67f09SDavid van Moolenbroek 
416*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
417*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
418*00b67f09SDavid van Moolenbroek 
419*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master9.data",
420*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
421*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_BADCLASS);
422*00b67f09SDavid van Moolenbroek 
423*00b67f09SDavid van Moolenbroek 	dns_test_end();
424*00b67f09SDavid van Moolenbroek }
425*00b67f09SDavid van Moolenbroek 
426*00b67f09SDavid van Moolenbroek 
427*00b67f09SDavid van Moolenbroek /* Non-empty blank lines test */
428*00b67f09SDavid van Moolenbroek ATF_TC(blanklines);
ATF_TC_HEAD(blanklines,tc)429*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(blanklines, tc) {
430*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() handles "
431*00b67f09SDavid van Moolenbroek 				       "non-empty blank lines");
432*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(blanklines,tc)433*00b67f09SDavid van Moolenbroek ATF_TC_BODY(blanklines, tc) {
434*00b67f09SDavid van Moolenbroek 	isc_result_t result;
435*00b67f09SDavid van Moolenbroek 
436*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
437*00b67f09SDavid van Moolenbroek 
438*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
439*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
440*00b67f09SDavid van Moolenbroek 
441*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master10.data",
442*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
443*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
444*00b67f09SDavid van Moolenbroek 
445*00b67f09SDavid van Moolenbroek 	dns_test_end();
446*00b67f09SDavid van Moolenbroek }
447*00b67f09SDavid van Moolenbroek 
448*00b67f09SDavid van Moolenbroek /* SOA leading zeroes test */
449*00b67f09SDavid van Moolenbroek ATF_TC(leadingzero);
ATF_TC_HEAD(leadingzero,tc)450*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(leadingzero, tc) {
451*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() allows "
452*00b67f09SDavid van Moolenbroek 				       "leading zeroes in SOA");
453*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(leadingzero,tc)454*00b67f09SDavid van Moolenbroek ATF_TC_BODY(leadingzero, tc) {
455*00b67f09SDavid van Moolenbroek 	isc_result_t result;
456*00b67f09SDavid van Moolenbroek 
457*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
458*00b67f09SDavid van Moolenbroek 
459*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
460*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
461*00b67f09SDavid van Moolenbroek 
462*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master11.data",
463*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, NULL, NULL);
464*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
465*00b67f09SDavid van Moolenbroek 
466*00b67f09SDavid van Moolenbroek 	dns_test_end();
467*00b67f09SDavid van Moolenbroek }
468*00b67f09SDavid van Moolenbroek 
469*00b67f09SDavid van Moolenbroek ATF_TC(totext);
ATF_TC_HEAD(totext,tc)470*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(totext, tc) {
471*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "masterfile totext tests");
472*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(totext,tc)473*00b67f09SDavid van Moolenbroek ATF_TC_BODY(totext, tc) {
474*00b67f09SDavid van Moolenbroek 	isc_result_t result;
475*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
476*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t rdatalist;
477*00b67f09SDavid van Moolenbroek 	isc_buffer_t target;
478*00b67f09SDavid van Moolenbroek 	unsigned char buf[BIGBUFLEN];
479*00b67f09SDavid van Moolenbroek 
480*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
481*00b67f09SDavid van Moolenbroek 
482*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
483*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
484*00b67f09SDavid van Moolenbroek 
485*00b67f09SDavid van Moolenbroek 	/* First, test with an empty rdataset */
486*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = dns_rdataclass_in;
487*00b67f09SDavid van Moolenbroek 	rdatalist.type = dns_rdatatype_none;
488*00b67f09SDavid van Moolenbroek 	rdatalist.covers = dns_rdatatype_none;
489*00b67f09SDavid van Moolenbroek 	rdatalist.ttl = 0;
490*00b67f09SDavid van Moolenbroek 	ISC_LIST_INIT(rdatalist.rdata);
491*00b67f09SDavid van Moolenbroek 	ISC_LINK_INIT(&rdatalist, link);
492*00b67f09SDavid van Moolenbroek 
493*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
494*00b67f09SDavid van Moolenbroek 	result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
495*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
496*00b67f09SDavid van Moolenbroek 
497*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&target, buf, BIGBUFLEN);
498*00b67f09SDavid van Moolenbroek 	result = dns_master_rdatasettotext(dns_rootname,
499*00b67f09SDavid van Moolenbroek 					   &rdataset, &dns_master_style_debug,
500*00b67f09SDavid van Moolenbroek 					   &target);
501*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
502*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(isc_buffer_usedlength(&target), 0);
503*00b67f09SDavid van Moolenbroek 
504*00b67f09SDavid van Moolenbroek 	/*
505*00b67f09SDavid van Moolenbroek 	 * XXX: We will also need to add tests for dumping various
506*00b67f09SDavid van Moolenbroek 	 * rdata types, classes, etc, and comparing the results against
507*00b67f09SDavid van Moolenbroek 	 * known-good output.
508*00b67f09SDavid van Moolenbroek 	 */
509*00b67f09SDavid van Moolenbroek 
510*00b67f09SDavid van Moolenbroek 	dns_test_end();
511*00b67f09SDavid van Moolenbroek }
512*00b67f09SDavid van Moolenbroek 
513*00b67f09SDavid van Moolenbroek /* Raw load */
514*00b67f09SDavid van Moolenbroek ATF_TC(loadraw);
ATF_TC_HEAD(loadraw,tc)515*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(loadraw, tc) {
516*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() loads a "
517*00b67f09SDavid van Moolenbroek 				       "valid raw file and returns success");
518*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(loadraw,tc)519*00b67f09SDavid van Moolenbroek ATF_TC_BODY(loadraw, tc) {
520*00b67f09SDavid van Moolenbroek 	isc_result_t result;
521*00b67f09SDavid van Moolenbroek 
522*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
523*00b67f09SDavid van Moolenbroek 
524*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
525*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
526*00b67f09SDavid van Moolenbroek 
527*00b67f09SDavid van Moolenbroek 	/* Raw format version 0 */
528*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master12.data",
529*00b67f09SDavid van Moolenbroek 			     dns_masterformat_raw, NULL, NULL);
530*00b67f09SDavid van Moolenbroek 	ATF_CHECK_STREQ(isc_result_totext(result), "success");
531*00b67f09SDavid van Moolenbroek 	ATF_CHECK(headerset);
532*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(header.flags, 0);
533*00b67f09SDavid van Moolenbroek 
534*00b67f09SDavid van Moolenbroek 	/* Raw format version 1, no source serial  */
535*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master13.data",
536*00b67f09SDavid van Moolenbroek 			     dns_masterformat_raw, NULL, NULL);
537*00b67f09SDavid van Moolenbroek 	ATF_CHECK_STREQ(isc_result_totext(result), "success");
538*00b67f09SDavid van Moolenbroek 	ATF_CHECK(headerset);
539*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(header.flags, 0);
540*00b67f09SDavid van Moolenbroek 
541*00b67f09SDavid van Moolenbroek 	/* Raw format version 1, source serial == 2011120101 */
542*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master14.data",
543*00b67f09SDavid van Moolenbroek 			     dns_masterformat_raw, NULL, NULL);
544*00b67f09SDavid van Moolenbroek 	ATF_CHECK_STREQ(isc_result_totext(result), "success");
545*00b67f09SDavid van Moolenbroek 	ATF_CHECK(headerset);
546*00b67f09SDavid van Moolenbroek 	ATF_CHECK((header.flags & DNS_MASTERRAW_SOURCESERIALSET) != 0);
547*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(header.sourceserial, 2011120101);
548*00b67f09SDavid van Moolenbroek 
549*00b67f09SDavid van Moolenbroek 	dns_test_end();
550*00b67f09SDavid van Moolenbroek }
551*00b67f09SDavid van Moolenbroek 
552*00b67f09SDavid van Moolenbroek /* Raw dump*/
553*00b67f09SDavid van Moolenbroek ATF_TC(dumpraw);
ATF_TC_HEAD(dumpraw,tc)554*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(dumpraw, tc) {
555*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_dump*() functions "
556*00b67f09SDavid van Moolenbroek 				       "dump valid raw files");
557*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(dumpraw,tc)558*00b67f09SDavid van Moolenbroek ATF_TC_BODY(dumpraw, tc) {
559*00b67f09SDavid van Moolenbroek 	isc_result_t result;
560*00b67f09SDavid van Moolenbroek 	dns_db_t *db = NULL;
561*00b67f09SDavid van Moolenbroek 	dns_dbversion_t *version = NULL;
562*00b67f09SDavid van Moolenbroek 	char myorigin[sizeof(TEST_ORIGIN)];
563*00b67f09SDavid van Moolenbroek 	dns_name_t dnsorigin;
564*00b67f09SDavid van Moolenbroek 	isc_buffer_t source, target;
565*00b67f09SDavid van Moolenbroek 	unsigned char namebuf[BUFLEN];
566*00b67f09SDavid van Moolenbroek 	int len;
567*00b67f09SDavid van Moolenbroek 
568*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
569*00b67f09SDavid van Moolenbroek 
570*00b67f09SDavid van Moolenbroek 	strcpy(myorigin, TEST_ORIGIN);
571*00b67f09SDavid van Moolenbroek 	len = strlen(myorigin);
572*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&source, myorigin, len);
573*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&source, len);
574*00b67f09SDavid van Moolenbroek 	isc_buffer_setactive(&source, len);
575*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&target, namebuf, BUFLEN);
576*00b67f09SDavid van Moolenbroek 	dns_name_init(&dnsorigin, NULL);
577*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(&dnsorigin, &source, dns_rootname,
578*00b67f09SDavid van Moolenbroek 				   0, &target);
579*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
580*00b67f09SDavid van Moolenbroek 
581*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
582*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
583*00b67f09SDavid van Moolenbroek 
584*00b67f09SDavid van Moolenbroek 	result = dns_db_create(mctx, "rbt", &dnsorigin, dns_dbtype_zone,
585*00b67f09SDavid van Moolenbroek 			       dns_rdataclass_in, 0, NULL, &db);
586*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
587*00b67f09SDavid van Moolenbroek 
588*00b67f09SDavid van Moolenbroek 	result = dns_db_load(db, "testdata/master/master1.data");
589*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
590*00b67f09SDavid van Moolenbroek 
591*00b67f09SDavid van Moolenbroek 	dns_db_currentversion(db, &version);
592*00b67f09SDavid van Moolenbroek 
593*00b67f09SDavid van Moolenbroek 	result = dns_master_dump2(mctx, db, version,
594*00b67f09SDavid van Moolenbroek 				  &dns_master_style_default, "test.dump",
595*00b67f09SDavid van Moolenbroek 				  dns_masterformat_raw);
596*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
597*00b67f09SDavid van Moolenbroek 
598*00b67f09SDavid van Moolenbroek 	result = test_master("test.dump", dns_masterformat_raw, NULL, NULL);
599*00b67f09SDavid van Moolenbroek 	ATF_CHECK_STREQ(isc_result_totext(result), "success");
600*00b67f09SDavid van Moolenbroek 	ATF_CHECK(headerset);
601*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(header.flags, 0);
602*00b67f09SDavid van Moolenbroek 
603*00b67f09SDavid van Moolenbroek 	dns_master_initrawheader(&header);
604*00b67f09SDavid van Moolenbroek 	header.sourceserial = 12345;
605*00b67f09SDavid van Moolenbroek 	header.flags |= DNS_MASTERRAW_SOURCESERIALSET;
606*00b67f09SDavid van Moolenbroek 
607*00b67f09SDavid van Moolenbroek 	unlink("test.dump");
608*00b67f09SDavid van Moolenbroek 	result = dns_master_dump3(mctx, db, version,
609*00b67f09SDavid van Moolenbroek 				  &dns_master_style_default, "test.dump",
610*00b67f09SDavid van Moolenbroek 				  dns_masterformat_raw, &header);
611*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
612*00b67f09SDavid van Moolenbroek 
613*00b67f09SDavid van Moolenbroek 	result = test_master("test.dump", dns_masterformat_raw, NULL, NULL);
614*00b67f09SDavid van Moolenbroek 	ATF_CHECK_STREQ(isc_result_totext(result), "success");
615*00b67f09SDavid van Moolenbroek 	ATF_CHECK(headerset);
616*00b67f09SDavid van Moolenbroek 	ATF_CHECK((header.flags & DNS_MASTERRAW_SOURCESERIALSET) != 0);
617*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(header.sourceserial, 12345);
618*00b67f09SDavid van Moolenbroek 
619*00b67f09SDavid van Moolenbroek 	unlink("test.dump");
620*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &version, ISC_FALSE);
621*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
622*00b67f09SDavid van Moolenbroek 	dns_test_end();
623*00b67f09SDavid van Moolenbroek }
624*00b67f09SDavid van Moolenbroek 
625*00b67f09SDavid van Moolenbroek static const char *warn_expect_value;
626*00b67f09SDavid van Moolenbroek static isc_boolean_t warn_expect_result;
627*00b67f09SDavid van Moolenbroek 
628*00b67f09SDavid van Moolenbroek static void
warn_expect(struct dns_rdatacallbacks * mycallbacks,const char * fmt,...)629*00b67f09SDavid van Moolenbroek warn_expect(struct dns_rdatacallbacks *mycallbacks, const char *fmt, ...) {
630*00b67f09SDavid van Moolenbroek 	char buf[4096];
631*00b67f09SDavid van Moolenbroek 	va_list ap;
632*00b67f09SDavid van Moolenbroek 
633*00b67f09SDavid van Moolenbroek 	UNUSED(mycallbacks);
634*00b67f09SDavid van Moolenbroek 
635*00b67f09SDavid van Moolenbroek 	va_start(ap, fmt);
636*00b67f09SDavid van Moolenbroek 	vsnprintf(buf, sizeof(buf), fmt, ap);
637*00b67f09SDavid van Moolenbroek 	va_end(ap);
638*00b67f09SDavid van Moolenbroek 	if (warn_expect_value != NULL && strstr(buf, warn_expect_value) != NULL)
639*00b67f09SDavid van Moolenbroek 		warn_expect_result = ISC_TRUE;
640*00b67f09SDavid van Moolenbroek }
641*00b67f09SDavid van Moolenbroek 
642*00b67f09SDavid van Moolenbroek /* Origin change test */
643*00b67f09SDavid van Moolenbroek ATF_TC(neworigin);
ATF_TC_HEAD(neworigin,tc)644*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(neworigin, tc) {
645*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() rejects "
646*00b67f09SDavid van Moolenbroek 				       "zones with inherited name following "
647*00b67f09SDavid van Moolenbroek 				       "$ORIGIN");
648*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(neworigin,tc)649*00b67f09SDavid van Moolenbroek ATF_TC_BODY(neworigin, tc) {
650*00b67f09SDavid van Moolenbroek 	isc_result_t result;
651*00b67f09SDavid van Moolenbroek 
652*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
653*00b67f09SDavid van Moolenbroek 
654*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
655*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
656*00b67f09SDavid van Moolenbroek 
657*00b67f09SDavid van Moolenbroek 	warn_expect_value = "record with inherited owner";
658*00b67f09SDavid van Moolenbroek 	warn_expect_result = ISC_FALSE;
659*00b67f09SDavid van Moolenbroek 	result = test_master("testdata/master/master17.data",
660*00b67f09SDavid van Moolenbroek 			     dns_masterformat_text, warn_expect, NULL);
661*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
662*00b67f09SDavid van Moolenbroek 	ATF_CHECK_MSG(warn_expect_result, "'%s' warning not emitted",
663*00b67f09SDavid van Moolenbroek 		      warn_expect_value);
664*00b67f09SDavid van Moolenbroek 
665*00b67f09SDavid van Moolenbroek 	dns_test_end();
666*00b67f09SDavid van Moolenbroek }
667*00b67f09SDavid van Moolenbroek 
668*00b67f09SDavid van Moolenbroek /*
669*00b67f09SDavid van Moolenbroek  * Main
670*00b67f09SDavid van Moolenbroek  */
ATF_TP_ADD_TCS(tp)671*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
672*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, load);
673*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, unexpected);
674*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, noowner);
675*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, nottl);
676*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, badclass);
677*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, dnskey);
678*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, dnsnokey);
679*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, include);
680*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, master_includelist);
681*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, includefail);
682*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, blanklines);
683*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, leadingzero);
684*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, totext);
685*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, loadraw);
686*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, dumpraw);
687*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, toobig);
688*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, maxrdata);
689*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, neworigin);
690*00b67f09SDavid van Moolenbroek 
691*00b67f09SDavid van Moolenbroek 	return (atf_no_error());
692*00b67f09SDavid van Moolenbroek }
693*00b67f09SDavid van Moolenbroek 
694