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