xref: /minix3/external/bsd/bind/dist/lib/dns/tests/dbversion_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: dbversion_test.c,v 1.1.1.5 2015/07/08 15:38:04 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011, 2012, 2014, 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 <stdlib.h>
28*00b67f09SDavid van Moolenbroek #include <time.h>
29*00b67f09SDavid van Moolenbroek #include <unistd.h>
30*00b67f09SDavid van Moolenbroek 
31*00b67f09SDavid van Moolenbroek #include <isc/file.h>
32*00b67f09SDavid van Moolenbroek #include <isc/result.h>
33*00b67f09SDavid van Moolenbroek #include <isc/serial.h>
34*00b67f09SDavid van Moolenbroek #include <isc/stdtime.h>
35*00b67f09SDavid van Moolenbroek #include <isc/msgcat.h>
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek #include <dns/db.h>
38*00b67f09SDavid van Moolenbroek #include <dns/rdatalist.h>
39*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
40*00b67f09SDavid van Moolenbroek #include <dns/rdatasetiter.h>
41*00b67f09SDavid van Moolenbroek #include <dns/nsec3.h>
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek #include "dnstest.h"
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek static char tempname[11] = "dtXXXXXXXX";
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek static void
local_callback(const char * file,int line,isc_assertiontype_t type,const char * cond)48*00b67f09SDavid van Moolenbroek local_callback(const char *file, int line, isc_assertiontype_t type,
49*00b67f09SDavid van Moolenbroek 	       const char *cond)
50*00b67f09SDavid van Moolenbroek {
51*00b67f09SDavid van Moolenbroek 	UNUSED(file); UNUSED(line); UNUSED(type); UNUSED(cond);
52*00b67f09SDavid van Moolenbroek 	if (strcmp(tempname, "dtXXXXXXXX"))
53*00b67f09SDavid van Moolenbroek 		unlink(tempname);
54*00b67f09SDavid van Moolenbroek 	atf_tc_pass();
55*00b67f09SDavid van Moolenbroek 	exit(0);
56*00b67f09SDavid van Moolenbroek }
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek static dns_db_t *db1 = NULL, *db2 = NULL;
59*00b67f09SDavid van Moolenbroek static dns_dbversion_t *v1 = NULL, *v2 = NULL;
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek static void
setup_db(void)62*00b67f09SDavid van Moolenbroek setup_db(void) {
63*00b67f09SDavid van Moolenbroek 	isc_result_t result;
64*00b67f09SDavid van Moolenbroek 	result = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
65*00b67f09SDavid van Moolenbroek 			       dns_rdataclass_in, 0, NULL, &db1);
66*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
67*00b67f09SDavid van Moolenbroek 	dns_db_newversion(db1, &v1);
68*00b67f09SDavid van Moolenbroek 
69*00b67f09SDavid van Moolenbroek 	result = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
70*00b67f09SDavid van Moolenbroek 			       dns_rdataclass_in, 0, NULL, &db2);
71*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
72*00b67f09SDavid van Moolenbroek 	dns_db_newversion(db2, &v2);
73*00b67f09SDavid van Moolenbroek }
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek static void
close_db(void)76*00b67f09SDavid van Moolenbroek close_db(void) {
77*00b67f09SDavid van Moolenbroek 	if (v1 != NULL) {
78*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db1, &v1, ISC_FALSE);
79*00b67f09SDavid van Moolenbroek 		ATF_REQUIRE_EQ(v1, NULL);
80*00b67f09SDavid van Moolenbroek 	}
81*00b67f09SDavid van Moolenbroek 	if (db1 != NULL) {
82*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db1);
83*00b67f09SDavid van Moolenbroek 		ATF_REQUIRE_EQ(db1, NULL);
84*00b67f09SDavid van Moolenbroek 	}
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek 	if (v2 != NULL) {
87*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db2, &v2, ISC_FALSE);
88*00b67f09SDavid van Moolenbroek 		ATF_REQUIRE_EQ(v2, NULL);
89*00b67f09SDavid van Moolenbroek 	}
90*00b67f09SDavid van Moolenbroek 	if (db2 != NULL) {
91*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db2);
92*00b67f09SDavid van Moolenbroek 		ATF_REQUIRE_EQ(db2, NULL);
93*00b67f09SDavid van Moolenbroek 	}
94*00b67f09SDavid van Moolenbroek }
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek #define VERSION(callback) ((callback == NULL) ? v1 : v2)
97*00b67f09SDavid van Moolenbroek #define VERSIONP(callback) ((callback == NULL) ? &v1 : &v2)
98*00b67f09SDavid van Moolenbroek /*
99*00b67f09SDavid van Moolenbroek  * Individual unit tests
100*00b67f09SDavid van Moolenbroek  */
101*00b67f09SDavid van Moolenbroek static void
attachversion(isc_assertioncallback_t callback)102*00b67f09SDavid van Moolenbroek attachversion(isc_assertioncallback_t callback) {
103*00b67f09SDavid van Moolenbroek 	isc_result_t result;
104*00b67f09SDavid van Moolenbroek 	dns_dbversion_t *v = NULL;
105*00b67f09SDavid van Moolenbroek 
106*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
107*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 	setup_db();
110*00b67f09SDavid van Moolenbroek 
111*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
112*00b67f09SDavid van Moolenbroek 	dns_db_attachversion(db1, VERSION(callback), &v);
113*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
114*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_attachversion did not assert");
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(v, v1);
117*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db1, &v, ISC_FALSE);
118*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(v, NULL);
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek 	close_db();
121*00b67f09SDavid van Moolenbroek 	dns_test_end();
122*00b67f09SDavid van Moolenbroek }
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek ATF_TC(attachversion);
ATF_TC_HEAD(attachversion,tc)125*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(attachversion, tc) {
126*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_attachversion passes with matching db/verison");
127*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(attachversion,tc)128*00b67f09SDavid van Moolenbroek ATF_TC_BODY(attachversion, tc) {
129*00b67f09SDavid van Moolenbroek 
130*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
131*00b67f09SDavid van Moolenbroek 
132*00b67f09SDavid van Moolenbroek 	attachversion(NULL);
133*00b67f09SDavid van Moolenbroek }
134*00b67f09SDavid van Moolenbroek 
135*00b67f09SDavid van Moolenbroek ATF_TC(attachversion_bad);
ATF_TC_HEAD(attachversion_bad,tc)136*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(attachversion_bad, tc) {
137*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_attachversion aborts with mis-matching db/verison");
138*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(attachversion_bad,tc)139*00b67f09SDavid van Moolenbroek ATF_TC_BODY(attachversion_bad, tc) {
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
142*00b67f09SDavid van Moolenbroek 
143*00b67f09SDavid van Moolenbroek 	attachversion(local_callback);
144*00b67f09SDavid van Moolenbroek }
145*00b67f09SDavid van Moolenbroek 
146*00b67f09SDavid van Moolenbroek static void
closeversion(isc_assertioncallback_t callback)147*00b67f09SDavid van Moolenbroek closeversion(isc_assertioncallback_t callback) {
148*00b67f09SDavid van Moolenbroek 	isc_result_t result;
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
151*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
152*00b67f09SDavid van Moolenbroek 
153*00b67f09SDavid van Moolenbroek 	setup_db();
154*00b67f09SDavid van Moolenbroek 
155*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
156*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db1, VERSIONP(callback), ISC_FALSE);
157*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
158*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_closeversion did not assert");
159*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(v1, NULL);
160*00b67f09SDavid van Moolenbroek 
161*00b67f09SDavid van Moolenbroek 	close_db();
162*00b67f09SDavid van Moolenbroek 	dns_test_end();
163*00b67f09SDavid van Moolenbroek }
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek ATF_TC(closeversion);
ATF_TC_HEAD(closeversion,tc)166*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(closeversion, tc) {
167*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_closeversion passes with matching db/verison");
168*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(closeversion,tc)169*00b67f09SDavid van Moolenbroek ATF_TC_BODY(closeversion, tc) {
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek 	closeversion(NULL);
174*00b67f09SDavid van Moolenbroek }
175*00b67f09SDavid van Moolenbroek 
176*00b67f09SDavid van Moolenbroek ATF_TC(closeversion_bad);
ATF_TC_HEAD(closeversion_bad,tc)177*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(closeversion_bad, tc) {
178*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_closeversion asserts with mis-matching db/verison");
179*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(closeversion_bad,tc)180*00b67f09SDavid van Moolenbroek ATF_TC_BODY(closeversion_bad, tc) {
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
183*00b67f09SDavid van Moolenbroek 
184*00b67f09SDavid van Moolenbroek 	closeversion(local_callback);
185*00b67f09SDavid van Moolenbroek }
186*00b67f09SDavid van Moolenbroek 
187*00b67f09SDavid van Moolenbroek static void
find(isc_assertioncallback_t callback)188*00b67f09SDavid van Moolenbroek find(isc_assertioncallback_t callback) {
189*00b67f09SDavid van Moolenbroek 	isc_result_t result;
190*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
191*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed;
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
194*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek 	setup_db();
197*00b67f09SDavid van Moolenbroek 
198*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
199*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
200*00b67f09SDavid van Moolenbroek 
201*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
202*00b67f09SDavid van Moolenbroek 	result = dns_db_find(db1, dns_rootname, VERSION(callback),
203*00b67f09SDavid van Moolenbroek 			     dns_rdatatype_soa, 0, 0, NULL,
204*00b67f09SDavid van Moolenbroek 			     dns_fixedname_name(&fixed), &rdataset, NULL);
205*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
206*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_find did not assert");
207*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_NXDOMAIN);
208*00b67f09SDavid van Moolenbroek 
209*00b67f09SDavid van Moolenbroek 	close_db();
210*00b67f09SDavid van Moolenbroek 
211*00b67f09SDavid van Moolenbroek 	dns_test_end();
212*00b67f09SDavid van Moolenbroek }
213*00b67f09SDavid van Moolenbroek ATF_TC(find);
ATF_TC_HEAD(find,tc)214*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(find, tc) {
215*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_find passes with matching db/version");
216*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(find,tc)217*00b67f09SDavid van Moolenbroek ATF_TC_BODY(find, tc) {
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
220*00b67f09SDavid van Moolenbroek 
221*00b67f09SDavid van Moolenbroek 	find(NULL);
222*00b67f09SDavid van Moolenbroek }
223*00b67f09SDavid van Moolenbroek 
224*00b67f09SDavid van Moolenbroek ATF_TC(find_bad);
ATF_TC_HEAD(find_bad,tc)225*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(find_bad, tc) {
226*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_find asserts with mis-matching db/version");
227*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(find_bad,tc)228*00b67f09SDavid van Moolenbroek ATF_TC_BODY(find_bad, tc) {
229*00b67f09SDavid van Moolenbroek 
230*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
231*00b67f09SDavid van Moolenbroek 
232*00b67f09SDavid van Moolenbroek 	find(local_callback);
233*00b67f09SDavid van Moolenbroek }
234*00b67f09SDavid van Moolenbroek 
235*00b67f09SDavid van Moolenbroek static void
allrdatasets(isc_assertioncallback_t callback)236*00b67f09SDavid van Moolenbroek allrdatasets(isc_assertioncallback_t callback) {
237*00b67f09SDavid van Moolenbroek 	isc_result_t result;
238*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node = NULL;
239*00b67f09SDavid van Moolenbroek 	dns_rdatasetiter_t *iterator = NULL;
240*00b67f09SDavid van Moolenbroek 
241*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
242*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
243*00b67f09SDavid van Moolenbroek 
244*00b67f09SDavid van Moolenbroek 	setup_db();
245*00b67f09SDavid van Moolenbroek 
246*00b67f09SDavid van Moolenbroek 	result = dns_db_findnode(db1, dns_rootname, ISC_FALSE, &node);
247*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
248*00b67f09SDavid van Moolenbroek 
249*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
250*00b67f09SDavid van Moolenbroek 	result = dns_db_allrdatasets(db1, node, VERSION(callback), 0,
251*00b67f09SDavid van Moolenbroek 				     &iterator);
252*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
253*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_allrdatasets did not assert");
254*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
255*00b67f09SDavid van Moolenbroek 
256*00b67f09SDavid van Moolenbroek 	dns_rdatasetiter_destroy(&iterator);
257*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(iterator, NULL);
258*00b67f09SDavid van Moolenbroek 
259*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db1, &node);
260*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(node, NULL);
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	close_db();
263*00b67f09SDavid van Moolenbroek 
264*00b67f09SDavid van Moolenbroek 	dns_test_end();
265*00b67f09SDavid van Moolenbroek }
266*00b67f09SDavid van Moolenbroek 
267*00b67f09SDavid van Moolenbroek ATF_TC(allrdatasets);
ATF_TC_HEAD(allrdatasets,tc)268*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(allrdatasets, tc) {
269*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_allrdatasets passes with matching db/version");
270*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(allrdatasets,tc)271*00b67f09SDavid van Moolenbroek ATF_TC_BODY(allrdatasets, tc) {
272*00b67f09SDavid van Moolenbroek 
273*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek 	allrdatasets(NULL);
276*00b67f09SDavid van Moolenbroek }
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek ATF_TC(allrdatasets_bad);
ATF_TC_HEAD(allrdatasets_bad,tc)279*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(allrdatasets_bad, tc) {
280*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_allrdatasets aborts with mis-matching db/version");
281*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(allrdatasets_bad,tc)282*00b67f09SDavid van Moolenbroek ATF_TC_BODY(allrdatasets_bad, tc) {
283*00b67f09SDavid van Moolenbroek 
284*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek 	allrdatasets(local_callback);
287*00b67f09SDavid van Moolenbroek }
288*00b67f09SDavid van Moolenbroek 
289*00b67f09SDavid van Moolenbroek static void
findrdataset(isc_assertioncallback_t callback)290*00b67f09SDavid van Moolenbroek findrdataset(isc_assertioncallback_t callback) {
291*00b67f09SDavid van Moolenbroek 	isc_result_t result;
292*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
293*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed;
294*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node = NULL;
295*00b67f09SDavid van Moolenbroek 
296*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
297*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
298*00b67f09SDavid van Moolenbroek 
299*00b67f09SDavid van Moolenbroek 	setup_db();
300*00b67f09SDavid van Moolenbroek 
301*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
302*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
303*00b67f09SDavid van Moolenbroek 
304*00b67f09SDavid van Moolenbroek 	result = dns_db_findnode(db1, dns_rootname, ISC_FALSE, &node);
305*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
306*00b67f09SDavid van Moolenbroek 
307*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
308*00b67f09SDavid van Moolenbroek 	result = dns_db_findrdataset(db1, node, VERSION(callback),
309*00b67f09SDavid van Moolenbroek 				     dns_rdatatype_soa, 0, 0, &rdataset, NULL);
310*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
311*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_findrdataset did not assert");
312*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db1, &node);
315*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(node, NULL);
316*00b67f09SDavid van Moolenbroek 
317*00b67f09SDavid van Moolenbroek 	close_db();
318*00b67f09SDavid van Moolenbroek 
319*00b67f09SDavid van Moolenbroek 	dns_test_end();
320*00b67f09SDavid van Moolenbroek }
321*00b67f09SDavid van Moolenbroek 
322*00b67f09SDavid van Moolenbroek ATF_TC(findrdataset);
ATF_TC_HEAD(findrdataset,tc)323*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(findrdataset, tc) {
324*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_findrdataset passes with matching db/version");
325*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(findrdataset,tc)326*00b67f09SDavid van Moolenbroek ATF_TC_BODY(findrdataset, tc) {
327*00b67f09SDavid van Moolenbroek 
328*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
329*00b67f09SDavid van Moolenbroek 
330*00b67f09SDavid van Moolenbroek 	findrdataset(NULL);
331*00b67f09SDavid van Moolenbroek }
332*00b67f09SDavid van Moolenbroek 
333*00b67f09SDavid van Moolenbroek ATF_TC(findrdataset_bad);
ATF_TC_HEAD(findrdataset_bad,tc)334*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(findrdataset_bad, tc) {
335*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_findrdataset aborts with mis-matching db/version");
336*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(findrdataset_bad,tc)337*00b67f09SDavid van Moolenbroek ATF_TC_BODY(findrdataset_bad, tc) {
338*00b67f09SDavid van Moolenbroek 
339*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
340*00b67f09SDavid van Moolenbroek 
341*00b67f09SDavid van Moolenbroek 	findrdataset(local_callback);
342*00b67f09SDavid van Moolenbroek }
343*00b67f09SDavid van Moolenbroek 
344*00b67f09SDavid van Moolenbroek static void
deleterdataset(isc_assertioncallback_t callback)345*00b67f09SDavid van Moolenbroek deleterdataset(isc_assertioncallback_t callback) {
346*00b67f09SDavid van Moolenbroek 	isc_result_t result;
347*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
348*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed;
349*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node = NULL;
350*00b67f09SDavid van Moolenbroek 
351*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
352*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
353*00b67f09SDavid van Moolenbroek 
354*00b67f09SDavid van Moolenbroek 	setup_db();
355*00b67f09SDavid van Moolenbroek 
356*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
357*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
358*00b67f09SDavid van Moolenbroek 
359*00b67f09SDavid van Moolenbroek 	result = dns_db_findnode(db1, dns_rootname, ISC_FALSE, &node);
360*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
361*00b67f09SDavid van Moolenbroek 
362*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
363*00b67f09SDavid van Moolenbroek 	result = dns_db_deleterdataset(db1, node, VERSION(callback),
364*00b67f09SDavid van Moolenbroek 				       dns_rdatatype_soa, 0);
365*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
366*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_deleterdataset did not assert");
367*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_UNCHANGED);
368*00b67f09SDavid van Moolenbroek 
369*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db1, &node);
370*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(node, NULL);
371*00b67f09SDavid van Moolenbroek 
372*00b67f09SDavid van Moolenbroek 	close_db();
373*00b67f09SDavid van Moolenbroek 
374*00b67f09SDavid van Moolenbroek 	dns_test_end();
375*00b67f09SDavid van Moolenbroek }
376*00b67f09SDavid van Moolenbroek 
377*00b67f09SDavid van Moolenbroek ATF_TC(deleterdataset);
ATF_TC_HEAD(deleterdataset,tc)378*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(deleterdataset, tc) {
379*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_deleterdataset passes with matching db/version");
380*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(deleterdataset,tc)381*00b67f09SDavid van Moolenbroek ATF_TC_BODY(deleterdataset, tc) {
382*00b67f09SDavid van Moolenbroek 
383*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
384*00b67f09SDavid van Moolenbroek 
385*00b67f09SDavid van Moolenbroek 	deleterdataset(NULL);
386*00b67f09SDavid van Moolenbroek }
387*00b67f09SDavid van Moolenbroek 
388*00b67f09SDavid van Moolenbroek ATF_TC(deleterdataset_bad);
ATF_TC_HEAD(deleterdataset_bad,tc)389*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(deleterdataset_bad, tc) {
390*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_deleterdataset aborts with mis-matching db/version");
391*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(deleterdataset_bad,tc)392*00b67f09SDavid van Moolenbroek ATF_TC_BODY(deleterdataset_bad, tc) {
393*00b67f09SDavid van Moolenbroek 
394*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
395*00b67f09SDavid van Moolenbroek 
396*00b67f09SDavid van Moolenbroek 	deleterdataset(local_callback);
397*00b67f09SDavid van Moolenbroek }
398*00b67f09SDavid van Moolenbroek 
399*00b67f09SDavid van Moolenbroek static void
subtract(isc_assertioncallback_t callback)400*00b67f09SDavid van Moolenbroek subtract(isc_assertioncallback_t callback) {
401*00b67f09SDavid van Moolenbroek 	isc_result_t result;
402*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
403*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed;
404*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node = NULL;
405*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t rdatalist;
406*00b67f09SDavid van Moolenbroek 
407*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
408*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
409*00b67f09SDavid van Moolenbroek 
410*00b67f09SDavid van Moolenbroek 	setup_db();
411*00b67f09SDavid van Moolenbroek 
412*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
413*00b67f09SDavid van Moolenbroek 	dns_rdatalist_init(&rdatalist);
414*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
415*00b67f09SDavid van Moolenbroek 
416*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = dns_rdataclass_in;
417*00b67f09SDavid van Moolenbroek 
418*00b67f09SDavid van Moolenbroek 	result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
419*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
420*00b67f09SDavid van Moolenbroek 
421*00b67f09SDavid van Moolenbroek 	result = dns_db_findnode(db1, dns_rootname, ISC_FALSE, &node);
422*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
423*00b67f09SDavid van Moolenbroek 
424*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
425*00b67f09SDavid van Moolenbroek 	result = dns_db_subtractrdataset(db1, node, VERSION(callback),
426*00b67f09SDavid van Moolenbroek 					 &rdataset, 0, NULL);
427*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
428*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_dns_db_subtractrdataset did not assert");
429*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, DNS_R_UNCHANGED);
430*00b67f09SDavid van Moolenbroek 
431*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db1, &node);
432*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(node, NULL);
433*00b67f09SDavid van Moolenbroek 
434*00b67f09SDavid van Moolenbroek 	close_db();
435*00b67f09SDavid van Moolenbroek 
436*00b67f09SDavid van Moolenbroek 	dns_test_end();
437*00b67f09SDavid van Moolenbroek }
438*00b67f09SDavid van Moolenbroek 
439*00b67f09SDavid van Moolenbroek ATF_TC(subtractrdataset);
ATF_TC_HEAD(subtractrdataset,tc)440*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(subtractrdataset, tc) {
441*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_subtractrdataset passes with matching db/version");
442*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(subtractrdataset,tc)443*00b67f09SDavid van Moolenbroek ATF_TC_BODY(subtractrdataset, tc) {
444*00b67f09SDavid van Moolenbroek 
445*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
446*00b67f09SDavid van Moolenbroek 
447*00b67f09SDavid van Moolenbroek 	subtract(NULL);
448*00b67f09SDavid van Moolenbroek }
449*00b67f09SDavid van Moolenbroek 
450*00b67f09SDavid van Moolenbroek ATF_TC(subtractrdataset_bad);
ATF_TC_HEAD(subtractrdataset_bad,tc)451*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(subtractrdataset_bad, tc) {
452*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_subtractrdataset aborts with mis-matching db/version");
453*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(subtractrdataset_bad,tc)454*00b67f09SDavid van Moolenbroek ATF_TC_BODY(subtractrdataset_bad, tc) {
455*00b67f09SDavid van Moolenbroek 
456*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
457*00b67f09SDavid van Moolenbroek 
458*00b67f09SDavid van Moolenbroek 	subtract(local_callback);
459*00b67f09SDavid van Moolenbroek }
460*00b67f09SDavid van Moolenbroek 
461*00b67f09SDavid van Moolenbroek static void
dump(isc_assertioncallback_t callback)462*00b67f09SDavid van Moolenbroek dump(isc_assertioncallback_t callback) {
463*00b67f09SDavid van Moolenbroek 	isc_result_t result;
464*00b67f09SDavid van Moolenbroek 	FILE *f = NULL;
465*00b67f09SDavid van Moolenbroek 
466*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
467*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
468*00b67f09SDavid van Moolenbroek 
469*00b67f09SDavid van Moolenbroek 	setup_db();
470*00b67f09SDavid van Moolenbroek 
471*00b67f09SDavid van Moolenbroek 	result = isc_file_openunique(tempname, &f);
472*00b67f09SDavid van Moolenbroek 	fclose(f);
473*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
474*00b67f09SDavid van Moolenbroek 
475*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
476*00b67f09SDavid van Moolenbroek 	result = dns_db_dump(db1, VERSION(callback), tempname);
477*00b67f09SDavid van Moolenbroek 	(void)unlink(tempname);
478*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
479*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_dump did not assert");
480*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
481*00b67f09SDavid van Moolenbroek 
482*00b67f09SDavid van Moolenbroek 	close_db();
483*00b67f09SDavid van Moolenbroek 
484*00b67f09SDavid van Moolenbroek 	dns_test_end();
485*00b67f09SDavid van Moolenbroek }
486*00b67f09SDavid van Moolenbroek 
487*00b67f09SDavid van Moolenbroek ATF_TC(dump);
ATF_TC_HEAD(dump,tc)488*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(dump, tc) {
489*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_dump passes with matching db/version");
490*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(dump,tc)491*00b67f09SDavid van Moolenbroek ATF_TC_BODY(dump, tc) {
492*00b67f09SDavid van Moolenbroek 
493*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
494*00b67f09SDavid van Moolenbroek 
495*00b67f09SDavid van Moolenbroek 	dump(NULL);
496*00b67f09SDavid van Moolenbroek }
497*00b67f09SDavid van Moolenbroek 
498*00b67f09SDavid van Moolenbroek ATF_TC(dump_bad);
ATF_TC_HEAD(dump_bad,tc)499*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(dump_bad, tc) {
500*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_dump aborts with mis-matching db/version");
501*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(dump_bad,tc)502*00b67f09SDavid van Moolenbroek ATF_TC_BODY(dump_bad, tc) {
503*00b67f09SDavid van Moolenbroek 
504*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
505*00b67f09SDavid van Moolenbroek 
506*00b67f09SDavid van Moolenbroek 	dump(local_callback);
507*00b67f09SDavid van Moolenbroek }
508*00b67f09SDavid van Moolenbroek 
509*00b67f09SDavid van Moolenbroek static void
addrdataset(isc_assertioncallback_t callback)510*00b67f09SDavid van Moolenbroek addrdataset(isc_assertioncallback_t callback) {
511*00b67f09SDavid van Moolenbroek 	isc_result_t result;
512*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
513*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed;
514*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node = NULL;
515*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t rdatalist;
516*00b67f09SDavid van Moolenbroek 
517*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
518*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
519*00b67f09SDavid van Moolenbroek 
520*00b67f09SDavid van Moolenbroek 	setup_db();
521*00b67f09SDavid van Moolenbroek 
522*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
523*00b67f09SDavid van Moolenbroek 	dns_rdatalist_init(&rdatalist);
524*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
525*00b67f09SDavid van Moolenbroek 
526*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = dns_rdataclass_in;
527*00b67f09SDavid van Moolenbroek 
528*00b67f09SDavid van Moolenbroek 	result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
529*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
530*00b67f09SDavid van Moolenbroek 
531*00b67f09SDavid van Moolenbroek 	result = dns_db_findnode(db1, dns_rootname, ISC_FALSE, &node);
532*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
533*00b67f09SDavid van Moolenbroek 
534*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
535*00b67f09SDavid van Moolenbroek 	result = dns_db_addrdataset(db1, node, VERSION(callback), 0, &rdataset,
536*00b67f09SDavid van Moolenbroek 				    0, NULL);
537*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
538*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_adddataset did not assert");
539*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
540*00b67f09SDavid van Moolenbroek 
541*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db1, &node);
542*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(node, NULL);
543*00b67f09SDavid van Moolenbroek 
544*00b67f09SDavid van Moolenbroek 	close_db();
545*00b67f09SDavid van Moolenbroek 
546*00b67f09SDavid van Moolenbroek 	dns_test_end();
547*00b67f09SDavid van Moolenbroek }
548*00b67f09SDavid van Moolenbroek 
549*00b67f09SDavid van Moolenbroek ATF_TC(addrdataset);
ATF_TC_HEAD(addrdataset,tc)550*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(addrdataset, tc) {
551*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_addrdataset passes with matching db/version");
552*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(addrdataset,tc)553*00b67f09SDavid van Moolenbroek ATF_TC_BODY(addrdataset, tc) {
554*00b67f09SDavid van Moolenbroek 
555*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
556*00b67f09SDavid van Moolenbroek 
557*00b67f09SDavid van Moolenbroek 	addrdataset(NULL);
558*00b67f09SDavid van Moolenbroek }
559*00b67f09SDavid van Moolenbroek 
560*00b67f09SDavid van Moolenbroek ATF_TC(addrdataset_bad);
ATF_TC_HEAD(addrdataset_bad,tc)561*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(addrdataset_bad, tc) {
562*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_addrdataset aborts with mis-matching db/version");
563*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(addrdataset_bad,tc)564*00b67f09SDavid van Moolenbroek ATF_TC_BODY(addrdataset_bad, tc) {
565*00b67f09SDavid van Moolenbroek 
566*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
567*00b67f09SDavid van Moolenbroek 
568*00b67f09SDavid van Moolenbroek 	addrdataset(local_callback);
569*00b67f09SDavid van Moolenbroek }
570*00b67f09SDavid van Moolenbroek 
571*00b67f09SDavid van Moolenbroek static void
getnsec3parameters(isc_assertioncallback_t callback)572*00b67f09SDavid van Moolenbroek getnsec3parameters(isc_assertioncallback_t callback) {
573*00b67f09SDavid van Moolenbroek 	isc_result_t result;
574*00b67f09SDavid van Moolenbroek 	dns_hash_t hash;
575*00b67f09SDavid van Moolenbroek 	isc_uint8_t flags;
576*00b67f09SDavid van Moolenbroek 	isc_uint16_t iterations;
577*00b67f09SDavid van Moolenbroek 	unsigned char salt[DNS_NSEC3_SALTSIZE];
578*00b67f09SDavid van Moolenbroek 	size_t salt_length = sizeof(salt);
579*00b67f09SDavid van Moolenbroek 
580*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
581*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
582*00b67f09SDavid van Moolenbroek 
583*00b67f09SDavid van Moolenbroek 	setup_db();
584*00b67f09SDavid van Moolenbroek 
585*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
586*00b67f09SDavid van Moolenbroek 	result = dns_db_getnsec3parameters(db1, VERSION(callback), &hash,
587*00b67f09SDavid van Moolenbroek 					   &flags, &iterations, salt,
588*00b67f09SDavid van Moolenbroek 					   &salt_length);
589*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
590*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_dump did not assert");
591*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
592*00b67f09SDavid van Moolenbroek 
593*00b67f09SDavid van Moolenbroek 	close_db();
594*00b67f09SDavid van Moolenbroek 
595*00b67f09SDavid van Moolenbroek 	dns_test_end();
596*00b67f09SDavid van Moolenbroek }
597*00b67f09SDavid van Moolenbroek 
598*00b67f09SDavid van Moolenbroek ATF_TC(getnsec3parameters);
ATF_TC_HEAD(getnsec3parameters,tc)599*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(getnsec3parameters, tc) {
600*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_getnsec3parameters passes with matching db/version");
601*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(getnsec3parameters,tc)602*00b67f09SDavid van Moolenbroek ATF_TC_BODY(getnsec3parameters, tc) {
603*00b67f09SDavid van Moolenbroek 
604*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
605*00b67f09SDavid van Moolenbroek 
606*00b67f09SDavid van Moolenbroek 	getnsec3parameters(NULL);
607*00b67f09SDavid van Moolenbroek }
608*00b67f09SDavid van Moolenbroek 
609*00b67f09SDavid van Moolenbroek ATF_TC(getnsec3parameters_bad);
ATF_TC_HEAD(getnsec3parameters_bad,tc)610*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(getnsec3parameters_bad, tc) {
611*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_db_getnsec3parameters aborts with mis-matching db/version");
612*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(getnsec3parameters_bad,tc)613*00b67f09SDavid van Moolenbroek ATF_TC_BODY(getnsec3parameters_bad, tc) {
614*00b67f09SDavid van Moolenbroek 
615*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
616*00b67f09SDavid van Moolenbroek 
617*00b67f09SDavid van Moolenbroek 	getnsec3parameters(local_callback);
618*00b67f09SDavid van Moolenbroek }
619*00b67f09SDavid van Moolenbroek 
620*00b67f09SDavid van Moolenbroek static void
resigned(isc_assertioncallback_t callback)621*00b67f09SDavid van Moolenbroek resigned(isc_assertioncallback_t callback) {
622*00b67f09SDavid van Moolenbroek 	isc_result_t result;
623*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset, added;
624*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node = NULL;
625*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t rdatalist;
626*00b67f09SDavid van Moolenbroek 	dns_rdata_rrsig_t rrsig;
627*00b67f09SDavid van Moolenbroek 	dns_rdata_t rdata = DNS_RDATA_INIT;
628*00b67f09SDavid van Moolenbroek 	isc_buffer_t b;
629*00b67f09SDavid van Moolenbroek 	unsigned char buf[1024];
630*00b67f09SDavid van Moolenbroek 
631*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
632*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
633*00b67f09SDavid van Moolenbroek 
634*00b67f09SDavid van Moolenbroek 	setup_db();
635*00b67f09SDavid van Moolenbroek 
636*00b67f09SDavid van Moolenbroek 	/*
637*00b67f09SDavid van Moolenbroek 	 * Create a dummy RRSIG record and set a resigning time.
638*00b67f09SDavid van Moolenbroek 	 */
639*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&added);
640*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
641*00b67f09SDavid van Moolenbroek 	dns_rdatalist_init(&rdatalist);
642*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b, buf, sizeof(buf));
643*00b67f09SDavid van Moolenbroek 
644*00b67f09SDavid van Moolenbroek 	DNS_RDATACOMMON_INIT(&rrsig, dns_rdatatype_rrsig, dns_rdataclass_in);
645*00b67f09SDavid van Moolenbroek 	rrsig.covered = dns_rdatatype_a;
646*00b67f09SDavid van Moolenbroek 	rrsig.algorithm = 100;
647*00b67f09SDavid van Moolenbroek 	rrsig.labels = 0;
648*00b67f09SDavid van Moolenbroek 	rrsig.originalttl = 0;
649*00b67f09SDavid van Moolenbroek 	rrsig.timeexpire = 3600;
650*00b67f09SDavid van Moolenbroek 	rrsig.timesigned = 0;
651*00b67f09SDavid van Moolenbroek 	rrsig.keyid = 0;
652*00b67f09SDavid van Moolenbroek 	dns_name_init(&rrsig.signer, NULL);
653*00b67f09SDavid van Moolenbroek 	dns_name_clone(dns_rootname, &rrsig.signer);
654*00b67f09SDavid van Moolenbroek 	rrsig.siglen = 0;
655*00b67f09SDavid van Moolenbroek 	rrsig.signature = NULL;
656*00b67f09SDavid van Moolenbroek 
657*00b67f09SDavid van Moolenbroek 	result = dns_rdata_fromstruct(&rdata, dns_rdataclass_in,
658*00b67f09SDavid van Moolenbroek 				      dns_rdatatype_rrsig, &rrsig, &b);
659*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
660*00b67f09SDavid van Moolenbroek 
661*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = dns_rdataclass_in;
662*00b67f09SDavid van Moolenbroek 	rdatalist.type = dns_rdatatype_rrsig;
663*00b67f09SDavid van Moolenbroek 	ISC_LIST_APPEND(rdatalist.rdata, &rdata, link);
664*00b67f09SDavid van Moolenbroek 
665*00b67f09SDavid van Moolenbroek 	result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
666*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
667*00b67f09SDavid van Moolenbroek 
668*00b67f09SDavid van Moolenbroek 	rdataset.attributes |= DNS_RDATASETATTR_RESIGN;
669*00b67f09SDavid van Moolenbroek 	rdataset.resign = 7200;
670*00b67f09SDavid van Moolenbroek 
671*00b67f09SDavid van Moolenbroek 	result = dns_db_findnode(db1, dns_rootname, ISC_FALSE, &node);
672*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
673*00b67f09SDavid van Moolenbroek 
674*00b67f09SDavid van Moolenbroek 	result = dns_db_addrdataset(db1, node, v1, 0, &rdataset, 0, &added);
675*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
676*00b67f09SDavid van Moolenbroek 
677*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db1, &node);
678*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(node, NULL);
679*00b67f09SDavid van Moolenbroek 
680*00b67f09SDavid van Moolenbroek 	isc_assertion_setcallback(callback);
681*00b67f09SDavid van Moolenbroek 	dns_db_resigned(db1, &added, VERSION(callback));
682*00b67f09SDavid van Moolenbroek 	if (callback != NULL)
683*00b67f09SDavid van Moolenbroek 		atf_tc_fail("dns_db_resigned did not assert");
684*00b67f09SDavid van Moolenbroek 
685*00b67f09SDavid van Moolenbroek 	dns_rdataset_disassociate(&added);
686*00b67f09SDavid van Moolenbroek 
687*00b67f09SDavid van Moolenbroek 	close_db();
688*00b67f09SDavid van Moolenbroek 
689*00b67f09SDavid van Moolenbroek 	dns_test_end();
690*00b67f09SDavid van Moolenbroek }
691*00b67f09SDavid van Moolenbroek 
692*00b67f09SDavid van Moolenbroek ATF_TC(resigned);
ATF_TC_HEAD(resigned,tc)693*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(resigned, tc) {
694*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_rdataset_resigned passes with matching db/version");
695*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(resigned,tc)696*00b67f09SDavid van Moolenbroek ATF_TC_BODY(resigned, tc) {
697*00b67f09SDavid van Moolenbroek 
698*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
699*00b67f09SDavid van Moolenbroek 
700*00b67f09SDavid van Moolenbroek 	resigned(NULL);
701*00b67f09SDavid van Moolenbroek }
702*00b67f09SDavid van Moolenbroek 
703*00b67f09SDavid van Moolenbroek ATF_TC(resigned_bad);
ATF_TC_HEAD(resigned_bad,tc)704*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(resigned_bad, tc) {
705*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "check dns_rdataset_resigned aborts with mis-matching db/version");
706*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(resigned_bad,tc)707*00b67f09SDavid van Moolenbroek ATF_TC_BODY(resigned_bad, tc) {
708*00b67f09SDavid van Moolenbroek 
709*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
710*00b67f09SDavid van Moolenbroek 
711*00b67f09SDavid van Moolenbroek 	resigned(local_callback);
712*00b67f09SDavid van Moolenbroek }
713*00b67f09SDavid van Moolenbroek 
714*00b67f09SDavid van Moolenbroek /*
715*00b67f09SDavid van Moolenbroek  * Main
716*00b67f09SDavid van Moolenbroek  */
ATF_TP_ADD_TCS(tp)717*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
718*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, dump);
719*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, dump_bad);
720*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, find);
721*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, find_bad);
722*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, allrdatasets);
723*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, allrdatasets_bad);
724*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, findrdataset);
725*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, findrdataset_bad);
726*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, addrdataset);
727*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, addrdataset_bad);
728*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, deleterdataset);
729*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, deleterdataset_bad);
730*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, subtractrdataset);
731*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, subtractrdataset_bad);
732*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, attachversion);
733*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, attachversion_bad);
734*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, closeversion);
735*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, closeversion_bad);
736*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, getnsec3parameters);
737*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, getnsec3parameters_bad);
738*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, resigned);
739*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, resigned_bad);
740*00b67f09SDavid van Moolenbroek 
741*00b67f09SDavid van Moolenbroek 	return (atf_no_error());
742*00b67f09SDavid van Moolenbroek }
743