xref: /minix3/external/bsd/bind/dist/bin/tests/db/t_db.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: t_db.c,v 1.7 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007, 2009, 2011-2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1999-2001  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: t_db.c,v 1.41 2011/03/12 04:59:46 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <ctype.h>
25*00b67f09SDavid van Moolenbroek #include <stdlib.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
28*00b67f09SDavid van Moolenbroek #include <isc/hash.h>
29*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
30*00b67f09SDavid van Moolenbroek #include <isc/string.h>
31*00b67f09SDavid van Moolenbroek #include <isc/util.h>
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include <dns/db.h>
34*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
35*00b67f09SDavid van Moolenbroek #include <dns/rdata.h>
36*00b67f09SDavid van Moolenbroek #include <dns/rdataclass.h>
37*00b67f09SDavid van Moolenbroek #include <dns/rdatatype.h>
38*00b67f09SDavid van Moolenbroek #include <dns/rdatalist.h>
39*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
40*00b67f09SDavid van Moolenbroek #include <dns/result.h>
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek static isc_result_t
t_create(const char * db_type,const char * origin,const char * class,const char * model,isc_mem_t * mctx,dns_db_t ** db)45*00b67f09SDavid van Moolenbroek t_create(const char *db_type, const char *origin, const char *class,
46*00b67f09SDavid van Moolenbroek 	 const char *model, isc_mem_t *mctx, dns_db_t **db)
47*00b67f09SDavid van Moolenbroek {
48*00b67f09SDavid van Moolenbroek 	int			len;
49*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
50*00b67f09SDavid van Moolenbroek 	dns_dbtype_t		dbtype;
51*00b67f09SDavid van Moolenbroek 	isc_textregion_t	region;
52*00b67f09SDavid van Moolenbroek 	isc_buffer_t		origin_buffer;
53*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_origin;
54*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdataclass;
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek 	dbtype = dns_dbtype_zone;
58*00b67f09SDavid van Moolenbroek 	if (strcasecmp(model, "cache") == 0)
59*00b67f09SDavid van Moolenbroek 		dbtype = dns_dbtype_cache;
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_origin);
62*00b67f09SDavid van Moolenbroek 	len = strlen(origin);
63*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&origin_buffer, origin, len);
64*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&origin_buffer, len);
65*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
66*00b67f09SDavid van Moolenbroek 				       &origin_buffer, NULL, 0, NULL);
67*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
68*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
69*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
70*00b67f09SDavid van Moolenbroek 		return(dns_result);
71*00b67f09SDavid van Moolenbroek 	}
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek 	DE_CONST(class, region.base);
74*00b67f09SDavid van Moolenbroek 	region.length = strlen(class);
75*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataclass_fromtext(&rdataclass, &region);
76*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
77*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataclass_fromtext failed %s\n",
78*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
79*00b67f09SDavid van Moolenbroek 		return(dns_result);
80*00b67f09SDavid van Moolenbroek 	}
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_create(mctx, db_type,
83*00b67f09SDavid van Moolenbroek 				   dns_fixedname_name(&dns_origin),
84*00b67f09SDavid van Moolenbroek 				   dbtype, rdataclass, 0, NULL, db);
85*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS)
86*00b67f09SDavid van Moolenbroek 		t_info("dns_db_create failed %s\n",
87*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek 	return(dns_result);
90*00b67f09SDavid van Moolenbroek 
91*00b67f09SDavid van Moolenbroek }
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek static int
t_dns_db_load(char ** av)94*00b67f09SDavid van Moolenbroek t_dns_db_load(char **av) {
95*00b67f09SDavid van Moolenbroek 	char			*filename;
96*00b67f09SDavid van Moolenbroek 	char			*db_type;
97*00b67f09SDavid van Moolenbroek 	char			*origin;
98*00b67f09SDavid van Moolenbroek 	char			*model;
99*00b67f09SDavid van Moolenbroek 	char			*class;
100*00b67f09SDavid van Moolenbroek 	char			*expected_load_result;
101*00b67f09SDavid van Moolenbroek 	char			*findname;
102*00b67f09SDavid van Moolenbroek 	char			*find_type;
103*00b67f09SDavid van Moolenbroek 	char			*expected_find_result;
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	int			result;
106*00b67f09SDavid van Moolenbroek 	int			len;
107*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
108*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
109*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
110*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
111*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
112*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
113*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
114*00b67f09SDavid van Moolenbroek 	isc_buffer_t		findname_buffer;
115*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_findname;
116*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
117*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		rdataset;
118*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		rdatatype;
119*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*versionp;
120*00b67f09SDavid van Moolenbroek 	isc_result_t		exp_load_result;
121*00b67f09SDavid van Moolenbroek 	isc_result_t		exp_find_result;
122*00b67f09SDavid van Moolenbroek 
123*00b67f09SDavid van Moolenbroek 	db = NULL;
124*00b67f09SDavid van Moolenbroek 	mctx = NULL;
125*00b67f09SDavid van Moolenbroek 	ectx = NULL;
126*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
127*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
128*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
129*00b67f09SDavid van Moolenbroek 	model = T_ARG(3);
130*00b67f09SDavid van Moolenbroek 	class = T_ARG(4);
131*00b67f09SDavid van Moolenbroek 	expected_load_result = T_ARG(5);
132*00b67f09SDavid van Moolenbroek 	findname = T_ARG(6);
133*00b67f09SDavid van Moolenbroek 	find_type = T_ARG(7);
134*00b67f09SDavid van Moolenbroek 	expected_find_result = T_ARG(8);
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, findname);
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek 	exp_load_result = t_dns_result_fromtext(expected_load_result);
139*00b67f09SDavid van Moolenbroek 	exp_find_result = t_dns_result_fromtext(expected_find_result);
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
142*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
143*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
144*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
145*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
146*00b67f09SDavid van Moolenbroek 	}
147*00b67f09SDavid van Moolenbroek 
148*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
149*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
150*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
151*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
152*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
153*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
154*00b67f09SDavid van Moolenbroek 	}
155*00b67f09SDavid van Moolenbroek 
156*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
157*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
158*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
159*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
160*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
161*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
162*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
163*00b67f09SDavid van Moolenbroek 	}
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
166*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
167*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
168*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
169*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
170*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
171*00b67f09SDavid van Moolenbroek 	}
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
174*00b67f09SDavid van Moolenbroek 	if (dns_result != exp_load_result) {
175*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s, expected %s\n",
176*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result),
177*00b67f09SDavid van Moolenbroek 				dns_result_totext(exp_load_result));
178*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
179*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
180*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
181*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
182*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
183*00b67f09SDavid van Moolenbroek 	}
184*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
185*00b67f09SDavid van Moolenbroek 		result = T_PASS;
186*00b67f09SDavid van Moolenbroek 		goto cleanup_db;
187*00b67f09SDavid van Moolenbroek 	}
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_findname);
190*00b67f09SDavid van Moolenbroek 	len = strlen(findname);
191*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&findname_buffer, findname, len);
192*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&findname_buffer, len);
193*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
194*00b67f09SDavid van Moolenbroek 				&findname_buffer, NULL, 0, NULL);
195*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
196*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
197*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
198*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
199*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
200*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
201*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
202*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
203*00b67f09SDavid van Moolenbroek 	}
204*00b67f09SDavid van Moolenbroek 
205*00b67f09SDavid van Moolenbroek 	textregion.base = find_type;
206*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(find_type);
207*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
208*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
209*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
210*00b67f09SDavid van Moolenbroek 				find_type,
211*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
212*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
213*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
214*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
215*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
216*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
217*00b67f09SDavid van Moolenbroek 	}
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek 	versionp = NULL;
220*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
221*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
222*00b67f09SDavid van Moolenbroek 	if (dns_db_iszone(db))
223*00b67f09SDavid van Moolenbroek 		dns_db_currentversion(db, &versionp);
224*00b67f09SDavid van Moolenbroek 	nodep = NULL;
225*00b67f09SDavid van Moolenbroek 
226*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
227*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_findname),
228*00b67f09SDavid van Moolenbroek 			versionp,
229*00b67f09SDavid van Moolenbroek 			rdatatype,
230*00b67f09SDavid van Moolenbroek 			DNS_DBFIND_GLUEOK,
231*00b67f09SDavid van Moolenbroek 			0,
232*00b67f09SDavid van Moolenbroek 			&nodep,
233*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
234*00b67f09SDavid van Moolenbroek 			&rdataset, NULL);
235*00b67f09SDavid van Moolenbroek 
236*00b67f09SDavid van Moolenbroek 	if (dns_result != exp_find_result) {
237*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find returned %s, expected %s\n",
238*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result),
239*00b67f09SDavid van Moolenbroek 				dns_result_totext(exp_find_result));
240*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
241*00b67f09SDavid van Moolenbroek 	} else {
242*00b67f09SDavid van Moolenbroek 		result = T_PASS;
243*00b67f09SDavid van Moolenbroek 	}
244*00b67f09SDavid van Moolenbroek 
245*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_NOTFOUND) {
246*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
247*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&rdataset))
248*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&rdataset);
249*00b67f09SDavid van Moolenbroek 	}
250*00b67f09SDavid van Moolenbroek 
251*00b67f09SDavid van Moolenbroek 	if (dns_db_iszone(db))
252*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &versionp, ISC_FALSE);
253*00b67f09SDavid van Moolenbroek  cleanup_db:
254*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
255*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
256*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
257*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
258*00b67f09SDavid van Moolenbroek 	return(result);
259*00b67f09SDavid van Moolenbroek }
260*00b67f09SDavid van Moolenbroek 
261*00b67f09SDavid van Moolenbroek static const char *a1 =
262*00b67f09SDavid van Moolenbroek 	"A call to dns_db_load(db, filename) loads the contents of "
263*00b67f09SDavid van Moolenbroek 	"the database in filename into db.";
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek static void
t1(void)266*00b67f09SDavid van Moolenbroek t1(void) {
267*00b67f09SDavid van Moolenbroek 	int	result;
268*00b67f09SDavid van Moolenbroek 
269*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_load", 1, T_REQUIRED, "%s", a1);
270*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_load_data", t_dns_db_load, 9);
271*00b67f09SDavid van Moolenbroek 	t_result(result);
272*00b67f09SDavid van Moolenbroek }
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek static const char *a2 =
276*00b67f09SDavid van Moolenbroek 	"When the database db has cache semantics, a call to "
277*00b67f09SDavid van Moolenbroek 	"dns_db_iscache(db) returns ISC_TRUE.";
278*00b67f09SDavid van Moolenbroek 
279*00b67f09SDavid van Moolenbroek static int
t_dns_db_zc_x(char * filename,char * db_type,char * origin,char * class,dns_dbtype_t dbtype,isc_boolean_t (* cf)(dns_db_t *),isc_boolean_t exp_result)280*00b67f09SDavid van Moolenbroek t_dns_db_zc_x(char *filename, char *db_type, char *origin, char *class,
281*00b67f09SDavid van Moolenbroek 	      dns_dbtype_t dbtype, isc_boolean_t(*cf)(dns_db_t *),
282*00b67f09SDavid van Moolenbroek 	      isc_boolean_t exp_result)
283*00b67f09SDavid van Moolenbroek {
284*00b67f09SDavid van Moolenbroek 	int			result;
285*00b67f09SDavid van Moolenbroek 	int			len;
286*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
287*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
288*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
289*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
290*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
291*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdataclass;
292*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
293*00b67f09SDavid van Moolenbroek 	isc_buffer_t		origin_buffer;
294*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_origin;
295*00b67f09SDavid van Moolenbroek 
296*00b67f09SDavid van Moolenbroek 	db = NULL;
297*00b67f09SDavid van Moolenbroek 	mctx = NULL;
298*00b67f09SDavid van Moolenbroek 	ectx = NULL;
299*00b67f09SDavid van Moolenbroek 
300*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s\n", filename);
301*00b67f09SDavid van Moolenbroek 
302*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_origin);
303*00b67f09SDavid van Moolenbroek 	len = strlen(origin);
304*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&origin_buffer, origin, len);
305*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&origin_buffer, len);
306*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
307*00b67f09SDavid van Moolenbroek 				       &origin_buffer, NULL, 0, NULL);
308*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
309*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
310*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
311*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
312*00b67f09SDavid van Moolenbroek 	}
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek 	textregion.base = class;
315*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(class);
316*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
317*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
318*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataclass_fromtext failed %s\n",
319*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
320*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
321*00b67f09SDavid van Moolenbroek 	}
322*00b67f09SDavid van Moolenbroek 
323*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
324*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
325*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
326*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
327*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
328*00b67f09SDavid van Moolenbroek 	}
329*00b67f09SDavid van Moolenbroek 
330*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
331*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
332*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
333*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
334*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
335*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
336*00b67f09SDavid van Moolenbroek 	}
337*00b67f09SDavid van Moolenbroek 
338*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
339*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
340*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
341*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
342*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
343*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
344*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
345*00b67f09SDavid van Moolenbroek 	}
346*00b67f09SDavid van Moolenbroek 
347*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_create(mctx, db_type,
348*00b67f09SDavid van Moolenbroek 				   dns_fixedname_name(&dns_origin),
349*00b67f09SDavid van Moolenbroek 				   dbtype, rdataclass, 0, NULL, &db);
350*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
351*00b67f09SDavid van Moolenbroek 		t_info("dns_db_create failed %s\n",
352*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
353*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
354*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
355*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
356*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
357*00b67f09SDavid van Moolenbroek 	}
358*00b67f09SDavid van Moolenbroek 
359*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
360*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
361*00b67f09SDavid van Moolenbroek 		if ((*cf)(db) == exp_result)
362*00b67f09SDavid van Moolenbroek 			result = T_PASS;
363*00b67f09SDavid van Moolenbroek 		else
364*00b67f09SDavid van Moolenbroek 			result = T_FAIL;
365*00b67f09SDavid van Moolenbroek 	} else {
366*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load failed %s\n",
367*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
368*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
369*00b67f09SDavid van Moolenbroek 	}
370*00b67f09SDavid van Moolenbroek 
371*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
372*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
373*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
374*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
375*00b67f09SDavid van Moolenbroek 	return(result);
376*00b67f09SDavid van Moolenbroek }
377*00b67f09SDavid van Moolenbroek 
378*00b67f09SDavid van Moolenbroek static int
test_dns_db_zc_x(const char * filename,dns_dbtype_t dbtype,isc_boolean_t (* cf)(dns_db_t *),isc_boolean_t exp_result)379*00b67f09SDavid van Moolenbroek test_dns_db_zc_x(const char *filename, dns_dbtype_t dbtype,
380*00b67f09SDavid van Moolenbroek 		 isc_boolean_t(*cf)(dns_db_t *), isc_boolean_t exp_result)
381*00b67f09SDavid van Moolenbroek {
382*00b67f09SDavid van Moolenbroek 
383*00b67f09SDavid van Moolenbroek 	FILE		*fp;
384*00b67f09SDavid van Moolenbroek 	char		*p;
385*00b67f09SDavid van Moolenbroek 	int		line;
386*00b67f09SDavid van Moolenbroek 	int		cnt;
387*00b67f09SDavid van Moolenbroek 	int		result;
388*00b67f09SDavid van Moolenbroek 	int		nfails;
389*00b67f09SDavid van Moolenbroek 	int		nprobs;
390*00b67f09SDavid van Moolenbroek 	char		*tokens[T_MAXTOKS];
391*00b67f09SDavid van Moolenbroek 
392*00b67f09SDavid van Moolenbroek 	nfails = 0;
393*00b67f09SDavid van Moolenbroek 	nprobs = 0;
394*00b67f09SDavid van Moolenbroek 
395*00b67f09SDavid van Moolenbroek 	fp = fopen(filename, "r");
396*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
397*00b67f09SDavid van Moolenbroek 		line = 0;
398*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
399*00b67f09SDavid van Moolenbroek 
400*00b67f09SDavid van Moolenbroek 			++line;
401*00b67f09SDavid van Moolenbroek 
402*00b67f09SDavid van Moolenbroek 			/*
403*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
404*00b67f09SDavid van Moolenbroek 			 */
405*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
406*00b67f09SDavid van Moolenbroek 				(void)free(p);
407*00b67f09SDavid van Moolenbroek 				continue;
408*00b67f09SDavid van Moolenbroek 			}
409*00b67f09SDavid van Moolenbroek 
410*00b67f09SDavid van Moolenbroek 			cnt = t_bustline(p, tokens);
411*00b67f09SDavid van Moolenbroek 			if (cnt == 4) {
412*00b67f09SDavid van Moolenbroek 				result = t_dns_db_zc_x(tokens[0], /* file */
413*00b67f09SDavid van Moolenbroek 						       tokens[1], /* type */
414*00b67f09SDavid van Moolenbroek 						       tokens[2], /* origin */
415*00b67f09SDavid van Moolenbroek 						       tokens[3], /* class */
416*00b67f09SDavid van Moolenbroek 						       dbtype,     /* cache */
417*00b67f09SDavid van Moolenbroek 						       cf,     /* check func */
418*00b67f09SDavid van Moolenbroek 						       exp_result);/* expect */
419*00b67f09SDavid van Moolenbroek 				if (result != T_PASS) {
420*00b67f09SDavid van Moolenbroek 					if (result == T_FAIL)
421*00b67f09SDavid van Moolenbroek 						++nfails;
422*00b67f09SDavid van Moolenbroek 					else
423*00b67f09SDavid van Moolenbroek 						++nprobs;
424*00b67f09SDavid van Moolenbroek 				}
425*00b67f09SDavid van Moolenbroek 			} else {
426*00b67f09SDavid van Moolenbroek 				t_info("bad format in %s at line %d\n",
427*00b67f09SDavid van Moolenbroek 				       filename, line);
428*00b67f09SDavid van Moolenbroek 				++nprobs;
429*00b67f09SDavid van Moolenbroek 			}
430*00b67f09SDavid van Moolenbroek 
431*00b67f09SDavid van Moolenbroek 			(void)free(p);
432*00b67f09SDavid van Moolenbroek 		}
433*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
434*00b67f09SDavid van Moolenbroek 	} else {
435*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile %s\n", filename);
436*00b67f09SDavid van Moolenbroek 		++nprobs;
437*00b67f09SDavid van Moolenbroek 	}
438*00b67f09SDavid van Moolenbroek 
439*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
440*00b67f09SDavid van Moolenbroek 
441*00b67f09SDavid van Moolenbroek 	if (nfails == 0 && nprobs == 0)
442*00b67f09SDavid van Moolenbroek 		result = T_PASS;
443*00b67f09SDavid van Moolenbroek 	else if (nfails)
444*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
445*00b67f09SDavid van Moolenbroek 
446*00b67f09SDavid van Moolenbroek 	return(result);
447*00b67f09SDavid van Moolenbroek }
448*00b67f09SDavid van Moolenbroek 
449*00b67f09SDavid van Moolenbroek static void
t2(void)450*00b67f09SDavid van Moolenbroek t2(void) {
451*00b67f09SDavid van Moolenbroek 	int	result;
452*00b67f09SDavid van Moolenbroek 
453*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_iscache", 2, T_REQUIRED, "%s", a2);
454*00b67f09SDavid van Moolenbroek 	result = test_dns_db_zc_x("dns_db_iscache_1_data",
455*00b67f09SDavid van Moolenbroek 				  dns_dbtype_cache, dns_db_iscache, ISC_TRUE);
456*00b67f09SDavid van Moolenbroek 	t_result(result);
457*00b67f09SDavid van Moolenbroek }
458*00b67f09SDavid van Moolenbroek 
459*00b67f09SDavid van Moolenbroek 
460*00b67f09SDavid van Moolenbroek static const char *a3 =
461*00b67f09SDavid van Moolenbroek 	"When the database db has zone semantics, a call to "
462*00b67f09SDavid van Moolenbroek 	"dns_db_iscache(db) returns ISC_FALSE.";
463*00b67f09SDavid van Moolenbroek 
464*00b67f09SDavid van Moolenbroek 
465*00b67f09SDavid van Moolenbroek static void
t3(void)466*00b67f09SDavid van Moolenbroek t3(void) {
467*00b67f09SDavid van Moolenbroek 	int	result;
468*00b67f09SDavid van Moolenbroek 
469*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_iscache", 3, T_REQUIRED, "%s", a3);
470*00b67f09SDavid van Moolenbroek 	result = test_dns_db_zc_x("dns_db_iscache_2_data",
471*00b67f09SDavid van Moolenbroek 				  dns_dbtype_zone, dns_db_iscache, ISC_FALSE);
472*00b67f09SDavid van Moolenbroek 	t_result(result);
473*00b67f09SDavid van Moolenbroek }
474*00b67f09SDavid van Moolenbroek 
475*00b67f09SDavid van Moolenbroek 
476*00b67f09SDavid van Moolenbroek static const char *a4 =
477*00b67f09SDavid van Moolenbroek 	"When the database db has zone semantics, a call to "
478*00b67f09SDavid van Moolenbroek 	"dns_db_iszone(db) returns ISC_TRUE.";
479*00b67f09SDavid van Moolenbroek 
480*00b67f09SDavid van Moolenbroek 
481*00b67f09SDavid van Moolenbroek static void
t4(void)482*00b67f09SDavid van Moolenbroek t4(void) {
483*00b67f09SDavid van Moolenbroek 	int	result;
484*00b67f09SDavid van Moolenbroek 
485*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_iszone", 4, T_REQUIRED, "%s", a4);
486*00b67f09SDavid van Moolenbroek 	result = test_dns_db_zc_x("dns_db_iszone_1_data",
487*00b67f09SDavid van Moolenbroek 				  dns_dbtype_zone, dns_db_iszone, ISC_TRUE);
488*00b67f09SDavid van Moolenbroek 	t_result(result);
489*00b67f09SDavid van Moolenbroek }
490*00b67f09SDavid van Moolenbroek 
491*00b67f09SDavid van Moolenbroek 
492*00b67f09SDavid van Moolenbroek static const char *a5 =
493*00b67f09SDavid van Moolenbroek 	"When the database db has cache semantics, a call to "
494*00b67f09SDavid van Moolenbroek 	"dns_db_iszone(db) returns ISC_FALSE.";
495*00b67f09SDavid van Moolenbroek 
496*00b67f09SDavid van Moolenbroek static void
t5(void)497*00b67f09SDavid van Moolenbroek t5(void) {
498*00b67f09SDavid van Moolenbroek 	int	result;
499*00b67f09SDavid van Moolenbroek 
500*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_iszone", 5, T_REQUIRED, "%s", a5);
501*00b67f09SDavid van Moolenbroek 	result = test_dns_db_zc_x("dns_db_iszone_2_data",
502*00b67f09SDavid van Moolenbroek 				  dns_dbtype_cache, dns_db_iszone, ISC_FALSE);
503*00b67f09SDavid van Moolenbroek 	t_result(result);
504*00b67f09SDavid van Moolenbroek }
505*00b67f09SDavid van Moolenbroek 
506*00b67f09SDavid van Moolenbroek static int
t_dns_db_origin(char ** av)507*00b67f09SDavid van Moolenbroek t_dns_db_origin(char **av) {
508*00b67f09SDavid van Moolenbroek 
509*00b67f09SDavid van Moolenbroek 	char			*filename;
510*00b67f09SDavid van Moolenbroek 	char			*origin;
511*00b67f09SDavid van Moolenbroek 
512*00b67f09SDavid van Moolenbroek 	int			result;
513*00b67f09SDavid van Moolenbroek 	int			len;
514*00b67f09SDavid van Moolenbroek 	int			order;
515*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
516*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
517*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
518*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
519*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
520*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_origin;
521*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_dborigin;
522*00b67f09SDavid van Moolenbroek 	isc_buffer_t		origin_buffer;
523*00b67f09SDavid van Moolenbroek 
524*00b67f09SDavid van Moolenbroek 	db = NULL;
525*00b67f09SDavid van Moolenbroek 	mctx = NULL;
526*00b67f09SDavid van Moolenbroek 	ectx = NULL;
527*00b67f09SDavid van Moolenbroek 
528*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
529*00b67f09SDavid van Moolenbroek 	origin = T_ARG(1);
530*00b67f09SDavid van Moolenbroek 
531*00b67f09SDavid van Moolenbroek 	t_info("testing with database %s and origin %s\n",
532*00b67f09SDavid van Moolenbroek 			filename, origin);
533*00b67f09SDavid van Moolenbroek 
534*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
535*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
536*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
537*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result));
538*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
539*00b67f09SDavid van Moolenbroek 	}
540*00b67f09SDavid van Moolenbroek 
541*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
542*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
543*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
544*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
545*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
546*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
547*00b67f09SDavid van Moolenbroek 	}
548*00b67f09SDavid van Moolenbroek 
549*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
550*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
551*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
552*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
553*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
554*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
555*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
556*00b67f09SDavid van Moolenbroek 	}
557*00b67f09SDavid van Moolenbroek 
558*00b67f09SDavid van Moolenbroek 	dns_result = t_create("rbt", origin, "in", "isc_true", mctx, &db);
559*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
560*00b67f09SDavid van Moolenbroek 		t_info("t_create failed %s\n",
561*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
562*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
563*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
564*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
565*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
566*00b67f09SDavid van Moolenbroek 	}
567*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_origin);
568*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_dborigin);
569*00b67f09SDavid van Moolenbroek 
570*00b67f09SDavid van Moolenbroek 	len = strlen(origin);
571*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&origin_buffer, origin, len);
572*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&origin_buffer, len);
573*00b67f09SDavid van Moolenbroek 
574*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
575*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
576*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load failed %s\n",
577*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
578*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
579*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
580*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
581*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
582*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
583*00b67f09SDavid van Moolenbroek 	}
584*00b67f09SDavid van Moolenbroek 
585*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
586*00b67f09SDavid van Moolenbroek 				&origin_buffer, NULL, 0, NULL);
587*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
588*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
589*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
590*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
591*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
592*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
593*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
594*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
595*00b67f09SDavid van Moolenbroek 	}
596*00b67f09SDavid van Moolenbroek 	order = dns_name_compare(dns_fixedname_name(&dns_origin),
597*00b67f09SDavid van Moolenbroek 				 dns_db_origin(db));
598*00b67f09SDavid van Moolenbroek 	if (order == 0) {
599*00b67f09SDavid van Moolenbroek 		result = T_PASS;
600*00b67f09SDavid van Moolenbroek 	} else {
601*00b67f09SDavid van Moolenbroek 		t_info("dns_name_compare returned %d\n", order);
602*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
603*00b67f09SDavid van Moolenbroek 	}
604*00b67f09SDavid van Moolenbroek 
605*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
606*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
607*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
608*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
609*00b67f09SDavid van Moolenbroek 	return(result);
610*00b67f09SDavid van Moolenbroek 
611*00b67f09SDavid van Moolenbroek }
612*00b67f09SDavid van Moolenbroek 
613*00b67f09SDavid van Moolenbroek static const char *a6 =
614*00b67f09SDavid van Moolenbroek 	"A call to dns_db_origin(db) returns the origin of the database.";
615*00b67f09SDavid van Moolenbroek 
616*00b67f09SDavid van Moolenbroek static void
t6(void)617*00b67f09SDavid van Moolenbroek t6(void) {
618*00b67f09SDavid van Moolenbroek 	int	result;
619*00b67f09SDavid van Moolenbroek 
620*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_origin", 6, T_REQUIRED, "%s", a6);
621*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_origin_data", t_dns_db_origin, 2);
622*00b67f09SDavid van Moolenbroek 	t_result(result);
623*00b67f09SDavid van Moolenbroek }
624*00b67f09SDavid van Moolenbroek 
625*00b67f09SDavid van Moolenbroek 
626*00b67f09SDavid van Moolenbroek static const char *a7 =
627*00b67f09SDavid van Moolenbroek 	"A call to dns_db_class(db) returns the class of the database.";
628*00b67f09SDavid van Moolenbroek 
629*00b67f09SDavid van Moolenbroek 
630*00b67f09SDavid van Moolenbroek #define	CLASSBUFLEN	256
631*00b67f09SDavid van Moolenbroek 
632*00b67f09SDavid van Moolenbroek static int
t_dns_db_class(char ** av)633*00b67f09SDavid van Moolenbroek t_dns_db_class(char **av) {
634*00b67f09SDavid van Moolenbroek 
635*00b67f09SDavid van Moolenbroek 	char			*filename;
636*00b67f09SDavid van Moolenbroek 	char			*class;
637*00b67f09SDavid van Moolenbroek 
638*00b67f09SDavid van Moolenbroek 	int			result;
639*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
640*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
641*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
642*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
643*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
644*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdataclass;
645*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	db_rdataclass;
646*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
647*00b67f09SDavid van Moolenbroek 
648*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
649*00b67f09SDavid van Moolenbroek 	class = T_ARG(1);
650*00b67f09SDavid van Moolenbroek 	db = NULL;
651*00b67f09SDavid van Moolenbroek 	mctx = NULL;
652*00b67f09SDavid van Moolenbroek 	ectx = NULL;
653*00b67f09SDavid van Moolenbroek 
654*00b67f09SDavid van Moolenbroek 	t_info("testing with database %s and class %s\n",
655*00b67f09SDavid van Moolenbroek 			filename, class);
656*00b67f09SDavid van Moolenbroek 
657*00b67f09SDavid van Moolenbroek 	textregion.base = class;
658*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(class);
659*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
660*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
661*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataclass_fromtext failed %s\n",
662*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
663*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
664*00b67f09SDavid van Moolenbroek 	}
665*00b67f09SDavid van Moolenbroek 
666*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
667*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
668*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
669*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result));
670*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
671*00b67f09SDavid van Moolenbroek 	}
672*00b67f09SDavid van Moolenbroek 
673*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
674*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
675*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
676*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
677*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
678*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
679*00b67f09SDavid van Moolenbroek 	}
680*00b67f09SDavid van Moolenbroek 
681*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
682*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
683*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
684*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
685*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
686*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
687*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
688*00b67f09SDavid van Moolenbroek 	}
689*00b67f09SDavid van Moolenbroek 
690*00b67f09SDavid van Moolenbroek 	dns_result = t_create("rbt", ".", class, "isc_true", mctx, &db);
691*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
692*00b67f09SDavid van Moolenbroek 		t_info("t_create failed %s\n",
693*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
694*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
695*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
696*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
697*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
698*00b67f09SDavid van Moolenbroek 	}
699*00b67f09SDavid van Moolenbroek 
700*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
701*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
702*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load failed %s\n",
703*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
704*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
705*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
706*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
707*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
708*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
709*00b67f09SDavid van Moolenbroek 	}
710*00b67f09SDavid van Moolenbroek 
711*00b67f09SDavid van Moolenbroek 	db_rdataclass = dns_db_class(db);
712*00b67f09SDavid van Moolenbroek 	if (db_rdataclass == rdataclass)
713*00b67f09SDavid van Moolenbroek 		result = T_PASS;
714*00b67f09SDavid van Moolenbroek 	else {
715*00b67f09SDavid van Moolenbroek 		char classbuf[DNS_RDATACLASS_FORMATSIZE];
716*00b67f09SDavid van Moolenbroek 		dns_rdataclass_format(db_rdataclass,
717*00b67f09SDavid van Moolenbroek 				      classbuf, sizeof(classbuf));
718*00b67f09SDavid van Moolenbroek 		t_info("dns_db_class returned %s, expected %s\n",
719*00b67f09SDavid van Moolenbroek 		       classbuf, class);
720*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
721*00b67f09SDavid van Moolenbroek 	}
722*00b67f09SDavid van Moolenbroek 
723*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
724*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
725*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
726*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
727*00b67f09SDavid van Moolenbroek 	return(result);
728*00b67f09SDavid van Moolenbroek 
729*00b67f09SDavid van Moolenbroek }
730*00b67f09SDavid van Moolenbroek static void
t7(void)731*00b67f09SDavid van Moolenbroek t7(void) {
732*00b67f09SDavid van Moolenbroek 	int	result;
733*00b67f09SDavid van Moolenbroek 
734*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_class", 7, T_REQUIRED, "%s", a7);
735*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_class_data", t_dns_db_class, 2);
736*00b67f09SDavid van Moolenbroek 	t_result(result);
737*00b67f09SDavid van Moolenbroek }
738*00b67f09SDavid van Moolenbroek 
739*00b67f09SDavid van Moolenbroek 
740*00b67f09SDavid van Moolenbroek static const char *a8 =
741*00b67f09SDavid van Moolenbroek 	"A call to dns_db_currentversion() opens the current "
742*00b67f09SDavid van Moolenbroek 	"version for reading.";
743*00b67f09SDavid van Moolenbroek 
744*00b67f09SDavid van Moolenbroek static int
t_dns_db_currentversion(char ** av)745*00b67f09SDavid van Moolenbroek t_dns_db_currentversion(char **av) {
746*00b67f09SDavid van Moolenbroek 	char			*filename;
747*00b67f09SDavid van Moolenbroek 	char			*db_type;
748*00b67f09SDavid van Moolenbroek 	char			*origin;
749*00b67f09SDavid van Moolenbroek 	char			*class;
750*00b67f09SDavid van Moolenbroek 	char			*model;
751*00b67f09SDavid van Moolenbroek 	char			*findname;
752*00b67f09SDavid van Moolenbroek 	char			*findtype;
753*00b67f09SDavid van Moolenbroek 
754*00b67f09SDavid van Moolenbroek 	int			result;
755*00b67f09SDavid van Moolenbroek 	int			len;
756*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
757*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
758*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
759*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
760*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
761*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
762*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
763*00b67f09SDavid van Moolenbroek 	isc_buffer_t		findname_buffer;
764*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_findname;
765*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
766*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		rdataset;
767*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		rdatatype;
768*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*cversionp;
769*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*nversionp;
770*00b67f09SDavid van Moolenbroek 
771*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
772*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
773*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
774*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
775*00b67f09SDavid van Moolenbroek 	model = T_ARG(4);
776*00b67f09SDavid van Moolenbroek 	findname = T_ARG(5);
777*00b67f09SDavid van Moolenbroek 	findtype = T_ARG(6);
778*00b67f09SDavid van Moolenbroek 	db = NULL;
779*00b67f09SDavid van Moolenbroek 	mctx = NULL;
780*00b67f09SDavid van Moolenbroek 	ectx = NULL;
781*00b67f09SDavid van Moolenbroek 
782*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, findname);
783*00b67f09SDavid van Moolenbroek 
784*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
785*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
786*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
787*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
788*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
789*00b67f09SDavid van Moolenbroek 	}
790*00b67f09SDavid van Moolenbroek 
791*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
792*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
793*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
794*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
795*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
796*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
797*00b67f09SDavid van Moolenbroek 	}
798*00b67f09SDavid van Moolenbroek 
799*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
800*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
801*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
802*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
803*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
804*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
805*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
806*00b67f09SDavid van Moolenbroek 	}
807*00b67f09SDavid van Moolenbroek 
808*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
809*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
810*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
811*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
812*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
813*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
814*00b67f09SDavid van Moolenbroek 	}
815*00b67f09SDavid van Moolenbroek 
816*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
817*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
818*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
819*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
820*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
821*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
822*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
823*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
824*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
825*00b67f09SDavid van Moolenbroek 	}
826*00b67f09SDavid van Moolenbroek 
827*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_findname);
828*00b67f09SDavid van Moolenbroek 	len = strlen(findname);
829*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&findname_buffer, findname, len);
830*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&findname_buffer, len);
831*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
832*00b67f09SDavid van Moolenbroek 				&findname_buffer, NULL, 0, NULL);
833*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
834*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
835*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
836*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
837*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
838*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
839*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
840*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
841*00b67f09SDavid van Moolenbroek 	}
842*00b67f09SDavid van Moolenbroek 
843*00b67f09SDavid van Moolenbroek 	textregion.base = findtype;
844*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(findtype);
845*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
846*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
847*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
848*00b67f09SDavid van Moolenbroek 				findtype,
849*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
850*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
851*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
852*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
853*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
854*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
855*00b67f09SDavid van Moolenbroek 	}
856*00b67f09SDavid van Moolenbroek 
857*00b67f09SDavid van Moolenbroek 	/*
858*00b67f09SDavid van Moolenbroek 	 * find a name we know is there
859*00b67f09SDavid van Moolenbroek 	 */
860*00b67f09SDavid van Moolenbroek 
861*00b67f09SDavid van Moolenbroek 	cversionp = NULL;
862*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
863*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
864*00b67f09SDavid van Moolenbroek 	dns_db_currentversion(db, &cversionp);
865*00b67f09SDavid van Moolenbroek 	nodep = NULL;
866*00b67f09SDavid van Moolenbroek 
867*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
868*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_findname),
869*00b67f09SDavid van Moolenbroek 			cversionp,
870*00b67f09SDavid van Moolenbroek 			rdatatype,
871*00b67f09SDavid van Moolenbroek 			0,
872*00b67f09SDavid van Moolenbroek 			0,
873*00b67f09SDavid van Moolenbroek 			&nodep,
874*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
875*00b67f09SDavid van Moolenbroek 			&rdataset, NULL);
876*00b67f09SDavid van Moolenbroek 
877*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
878*00b67f09SDavid van Moolenbroek 		t_info("unable to find %s using current version\n", findname);
879*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
880*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
881*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
882*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
883*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
884*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
885*00b67f09SDavid van Moolenbroek 	}
886*00b67f09SDavid van Moolenbroek 
887*00b67f09SDavid van Moolenbroek 	/*
888*00b67f09SDavid van Moolenbroek 	 * create a new version
889*00b67f09SDavid van Moolenbroek 	 * delete the found rdataset in the new version
890*00b67f09SDavid van Moolenbroek 	 * attempt to find the rdataset again and expect the find to fail
891*00b67f09SDavid van Moolenbroek 	 * close/commit the new version
892*00b67f09SDavid van Moolenbroek 	 * attempt to find the rdataset in the current version and
893*00b67f09SDavid van Moolenbroek 	 * expect the find to succeed
894*00b67f09SDavid van Moolenbroek 	 */
895*00b67f09SDavid van Moolenbroek 
896*00b67f09SDavid van Moolenbroek 	nversionp = NULL;
897*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_newversion(db, &nversionp);
898*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
899*00b67f09SDavid van Moolenbroek 		t_info("dns_db_newversion failed %s\n",
900*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
901*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
902*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&rdataset);
903*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
904*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
905*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
906*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
907*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
908*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
909*00b67f09SDavid van Moolenbroek 	}
910*00b67f09SDavid van Moolenbroek 
911*00b67f09SDavid van Moolenbroek 	/*
912*00b67f09SDavid van Moolenbroek 	 * Delete the found rdataset in the new version.
913*00b67f09SDavid van Moolenbroek 	 */
914*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_deleterdataset(db, nodep, nversionp, rdatatype, 0);
915*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
916*00b67f09SDavid van Moolenbroek 		t_info("dns_db_deleterdataset failed %s\n",
917*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
918*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&rdataset);
919*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
920*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
921*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
922*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
923*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
924*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
925*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
926*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
927*00b67f09SDavid van Moolenbroek 	}
928*00b67f09SDavid van Moolenbroek 
929*00b67f09SDavid van Moolenbroek 	/*
930*00b67f09SDavid van Moolenbroek 	 * Don't need these now.
931*00b67f09SDavid van Moolenbroek 	 */
932*00b67f09SDavid van Moolenbroek 	dns_rdataset_disassociate(&rdataset);
933*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
934*00b67f09SDavid van Moolenbroek 	nodep = NULL;
935*00b67f09SDavid van Moolenbroek 
936*00b67f09SDavid van Moolenbroek 	/*
937*00b67f09SDavid van Moolenbroek 	 * Find the deleted rdataset and expect it to fail.
938*00b67f09SDavid van Moolenbroek 	 */
939*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
940*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_findname),
941*00b67f09SDavid van Moolenbroek 			nversionp,
942*00b67f09SDavid van Moolenbroek 			rdatatype,
943*00b67f09SDavid van Moolenbroek 			0,
944*00b67f09SDavid van Moolenbroek 			0,
945*00b67f09SDavid van Moolenbroek 			&nodep,
946*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
947*00b67f09SDavid van Moolenbroek 			&rdataset, NULL);
948*00b67f09SDavid van Moolenbroek 
949*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
950*00b67f09SDavid van Moolenbroek 		t_info("unexpectedly found %s using current version\n",
951*00b67f09SDavid van Moolenbroek 		       findname);
952*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
953*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
954*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
955*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
956*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
957*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
958*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
959*00b67f09SDavid van Moolenbroek 	}
960*00b67f09SDavid van Moolenbroek 
961*00b67f09SDavid van Moolenbroek 	/*
962*00b67f09SDavid van Moolenbroek 	 * Close/commit the new version.
963*00b67f09SDavid van Moolenbroek 	 */
964*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &nversionp, ISC_TRUE);
965*00b67f09SDavid van Moolenbroek 
966*00b67f09SDavid van Moolenbroek 	/*
967*00b67f09SDavid van Moolenbroek 	 * Find the deleted rdata in the current version.
968*00b67f09SDavid van Moolenbroek 	 */
969*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db, dns_fixedname_name(&dns_findname),
970*00b67f09SDavid van Moolenbroek 				 cversionp, rdatatype, DNS_DBFIND_GLUEOK,
971*00b67f09SDavid van Moolenbroek 				 0, &nodep, dns_fixedname_name(&dns_foundname),
972*00b67f09SDavid van Moolenbroek 				 &rdataset, NULL);
973*00b67f09SDavid van Moolenbroek 
974*00b67f09SDavid van Moolenbroek 	/*
975*00b67f09SDavid van Moolenbroek 	 * And expect it to succeed.
976*00b67f09SDavid van Moolenbroek 	 */
977*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
978*00b67f09SDavid van Moolenbroek 		result = T_PASS;
979*00b67f09SDavid van Moolenbroek 	} else {
980*00b67f09SDavid van Moolenbroek 		t_info("cound not find %s using current version\n", findname);
981*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
982*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
983*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
984*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
985*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
986*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
987*00b67f09SDavid van Moolenbroek 	}
988*00b67f09SDavid van Moolenbroek 
989*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
990*00b67f09SDavid van Moolenbroek 	dns_rdataset_disassociate(&rdataset);
991*00b67f09SDavid van Moolenbroek 
992*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &cversionp, ISC_FALSE);
993*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
994*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
995*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
996*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
997*00b67f09SDavid van Moolenbroek 
998*00b67f09SDavid van Moolenbroek 	return(result);
999*00b67f09SDavid van Moolenbroek }
1000*00b67f09SDavid van Moolenbroek 
1001*00b67f09SDavid van Moolenbroek static void
t8(void)1002*00b67f09SDavid van Moolenbroek t8(void) {
1003*00b67f09SDavid van Moolenbroek 	int	result;
1004*00b67f09SDavid van Moolenbroek 
1005*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_currentversion", 8, T_REQUIRED, "%s", a8);
1006*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_currentversion_data",
1007*00b67f09SDavid van Moolenbroek 			t_dns_db_currentversion, 7);
1008*00b67f09SDavid van Moolenbroek 	t_result(result);
1009*00b67f09SDavid van Moolenbroek }
1010*00b67f09SDavid van Moolenbroek 
1011*00b67f09SDavid van Moolenbroek static const char *a9 =
1012*00b67f09SDavid van Moolenbroek 	"A call to dns_db_newversion() opens a new version for "
1013*00b67f09SDavid van Moolenbroek 	"reading and writing.";
1014*00b67f09SDavid van Moolenbroek 
1015*00b67f09SDavid van Moolenbroek static int
t_dns_db_newversion(char ** av)1016*00b67f09SDavid van Moolenbroek t_dns_db_newversion(char **av) {
1017*00b67f09SDavid van Moolenbroek 
1018*00b67f09SDavid van Moolenbroek 	char			*filename;
1019*00b67f09SDavid van Moolenbroek 	char			*db_type;
1020*00b67f09SDavid van Moolenbroek 	char			*origin;
1021*00b67f09SDavid van Moolenbroek 	char			*class;
1022*00b67f09SDavid van Moolenbroek 	char			*model;
1023*00b67f09SDavid van Moolenbroek 	char			*newname;
1024*00b67f09SDavid van Moolenbroek 	char			*newtype;
1025*00b67f09SDavid van Moolenbroek 
1026*00b67f09SDavid van Moolenbroek 	int			result;
1027*00b67f09SDavid van Moolenbroek 	int			len;
1028*00b67f09SDavid van Moolenbroek 	int			rval;
1029*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
1030*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
1031*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
1032*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
1033*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
1034*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
1035*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*found_nodep;
1036*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
1037*00b67f09SDavid van Moolenbroek 	isc_buffer_t		newname_buffer;
1038*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_newname;
1039*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
1040*00b67f09SDavid van Moolenbroek 	dns_rdata_t		added_rdata = DNS_RDATA_INIT;
1041*00b67f09SDavid van Moolenbroek 	const char *		added_rdata_data;
1042*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		added_rdataset;
1043*00b67f09SDavid van Moolenbroek 	dns_rdata_t		found_rdata = DNS_RDATA_INIT;
1044*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		found_rdataset;
1045*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		rdatatype;
1046*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdataclass;
1047*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*nversionp;
1048*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t		rdatalist;
1049*00b67f09SDavid van Moolenbroek 
1050*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
1051*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
1052*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
1053*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
1054*00b67f09SDavid van Moolenbroek 	model = T_ARG(4);
1055*00b67f09SDavid van Moolenbroek 	newname = T_ARG(5);
1056*00b67f09SDavid van Moolenbroek 	newtype = T_ARG(6);
1057*00b67f09SDavid van Moolenbroek 	db = NULL;
1058*00b67f09SDavid van Moolenbroek 	mctx = NULL;
1059*00b67f09SDavid van Moolenbroek 	ectx = NULL;
1060*00b67f09SDavid van Moolenbroek 
1061*00b67f09SDavid van Moolenbroek 	/*
1062*00b67f09SDavid van Moolenbroek 	 * Open a new version, add some data, commit it,
1063*00b67f09SDavid van Moolenbroek 	 * close it, open a new version, and check that changes
1064*00b67f09SDavid van Moolenbroek 	 * are present.
1065*00b67f09SDavid van Moolenbroek 	 */
1066*00b67f09SDavid van Moolenbroek 
1067*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, newname);
1068*00b67f09SDavid van Moolenbroek 
1069*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
1070*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1071*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
1072*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1073*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1074*00b67f09SDavid van Moolenbroek 	}
1075*00b67f09SDavid van Moolenbroek 
1076*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
1077*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1078*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
1079*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1080*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1081*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1082*00b67f09SDavid van Moolenbroek 	}
1083*00b67f09SDavid van Moolenbroek 
1084*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1085*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1086*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
1087*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1088*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1089*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1090*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1091*00b67f09SDavid van Moolenbroek 	}
1092*00b67f09SDavid van Moolenbroek 
1093*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
1094*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1095*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1096*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1097*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1098*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1099*00b67f09SDavid van Moolenbroek 	}
1100*00b67f09SDavid van Moolenbroek 
1101*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
1102*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1103*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
1104*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1105*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1106*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1107*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1108*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1109*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1110*00b67f09SDavid van Moolenbroek 	}
1111*00b67f09SDavid van Moolenbroek 
1112*00b67f09SDavid van Moolenbroek 	/*
1113*00b67f09SDavid van Moolenbroek 	 * Add a new name.
1114*00b67f09SDavid van Moolenbroek 	 */
1115*00b67f09SDavid van Moolenbroek 
1116*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_newname);
1117*00b67f09SDavid van Moolenbroek 	len = strlen(newname);
1118*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&newname_buffer, newname, len);
1119*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&newname_buffer, len);
1120*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1121*00b67f09SDavid van Moolenbroek 				&newname_buffer, NULL, 0, NULL);
1122*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1123*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
1124*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
1125*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1126*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1127*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1128*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1129*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1130*00b67f09SDavid van Moolenbroek 	}
1131*00b67f09SDavid van Moolenbroek 
1132*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1133*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1134*00b67f09SDavid van Moolenbroek 				ISC_TRUE, &nodep);
1135*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1136*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode failed %s\n",
1137*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1138*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1139*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1140*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1141*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1142*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1143*00b67f09SDavid van Moolenbroek 	}
1144*00b67f09SDavid van Moolenbroek 
1145*00b67f09SDavid van Moolenbroek 	/*
1146*00b67f09SDavid van Moolenbroek 	 * Open a new version and associate some rdata with the new name.
1147*00b67f09SDavid van Moolenbroek 	 */
1148*00b67f09SDavid van Moolenbroek 
1149*00b67f09SDavid van Moolenbroek 	textregion.base = newtype;
1150*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(newtype);
1151*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
1152*00b67f09SDavid van Moolenbroek 
1153*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1154*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
1155*00b67f09SDavid van Moolenbroek 				newtype,
1156*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1157*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1158*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1159*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1160*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1161*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1162*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1163*00b67f09SDavid van Moolenbroek 	}
1164*00b67f09SDavid van Moolenbroek 
1165*00b67f09SDavid van Moolenbroek 	textregion.base = class;
1166*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(class);
1167*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1168*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1169*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataclass_fromtext failed %s\n",
1170*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1171*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1172*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1173*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1174*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1175*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1176*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1177*00b67f09SDavid van Moolenbroek 	}
1178*00b67f09SDavid van Moolenbroek 
1179*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&added_rdata);
1180*00b67f09SDavid van Moolenbroek 	added_rdata_data = "\x10\x00\x00\x01";
1181*00b67f09SDavid van Moolenbroek 	DE_CONST(added_rdata_data, added_rdata.data);
1182*00b67f09SDavid van Moolenbroek 	added_rdata.length = 4;
1183*00b67f09SDavid van Moolenbroek 	added_rdata.rdclass = rdataclass;
1184*00b67f09SDavid van Moolenbroek 	added_rdata.type = rdatatype;
1185*00b67f09SDavid van Moolenbroek 
1186*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&added_rdataset);
1187*00b67f09SDavid van Moolenbroek 	rdatalist.type = rdatatype;
1188*00b67f09SDavid van Moolenbroek 	rdatalist.covers = 0;
1189*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = rdataclass;
1190*00b67f09SDavid van Moolenbroek 	rdatalist.ttl = 0;
1191*00b67f09SDavid van Moolenbroek 	ISC_LIST_INIT(rdatalist.rdata);
1192*00b67f09SDavid van Moolenbroek 	ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
1193*00b67f09SDavid van Moolenbroek 
1194*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
1195*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1196*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatalist_tordataset failed %s\n",
1197*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1198*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1199*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1200*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1201*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1202*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1203*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1204*00b67f09SDavid van Moolenbroek 	}
1205*00b67f09SDavid van Moolenbroek 
1206*00b67f09SDavid van Moolenbroek 	nversionp = NULL;
1207*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_newversion(db, &nversionp);
1208*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1209*00b67f09SDavid van Moolenbroek 		t_info("dns_db_newversion failed %s\n",
1210*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1211*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1212*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1213*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1214*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1215*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1216*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1217*00b67f09SDavid van Moolenbroek 	}
1218*00b67f09SDavid van Moolenbroek 
1219*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
1220*00b67f09SDavid van Moolenbroek 				&added_rdataset, 0, NULL);
1221*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1222*00b67f09SDavid van Moolenbroek 		t_info("dns_db_addrdataset failed %s\n",
1223*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1224*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1225*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1226*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1227*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1228*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1229*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1230*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1231*00b67f09SDavid van Moolenbroek 	}
1232*00b67f09SDavid van Moolenbroek 
1233*00b67f09SDavid van Moolenbroek 	/*
1234*00b67f09SDavid van Moolenbroek 	 * Close and commit the version.
1235*00b67f09SDavid van Moolenbroek 	 */
1236*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &nversionp, ISC_TRUE);
1237*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
1238*00b67f09SDavid van Moolenbroek 	if (dns_rdataset_isassociated(&added_rdataset))
1239*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&added_rdataset);
1240*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1241*00b67f09SDavid van Moolenbroek 
1242*00b67f09SDavid van Moolenbroek 	/*
1243*00b67f09SDavid van Moolenbroek 	 * Open a new version and find the data we added.
1244*00b67f09SDavid van Moolenbroek 	 */
1245*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
1246*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
1247*00b67f09SDavid van Moolenbroek 	nversionp = NULL;
1248*00b67f09SDavid van Moolenbroek 	found_nodep = NULL;
1249*00b67f09SDavid van Moolenbroek 	dns_db_newversion(db, &nversionp);
1250*00b67f09SDavid van Moolenbroek 
1251*00b67f09SDavid van Moolenbroek 	/*
1252*00b67f09SDavid van Moolenbroek 	 * Find the recently added name and rdata.
1253*00b67f09SDavid van Moolenbroek 	 */
1254*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname),
1255*00b67f09SDavid van Moolenbroek 				 nversionp, rdatatype, 0, 0, &found_nodep,
1256*00b67f09SDavid van Moolenbroek 				 dns_fixedname_name(&dns_foundname),
1257*00b67f09SDavid van Moolenbroek 				 &found_rdataset, NULL);
1258*00b67f09SDavid van Moolenbroek 
1259*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1260*00b67f09SDavid van Moolenbroek 		/* XXXWPK - NXRRSET ???  reference counts ??? */
1261*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find failed %s\n",
1262*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1263*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1264*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &found_nodep);
1265*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
1266*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
1267*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1268*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1269*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1270*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1271*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
1272*00b67f09SDavid van Moolenbroek 	}
1273*00b67f09SDavid van Moolenbroek 
1274*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataset_first(&found_rdataset);
1275*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1276*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataset_first failed %s\n",
1277*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1278*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1279*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
1280*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
1281*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1282*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1283*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1284*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1285*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1286*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
1287*00b67f09SDavid van Moolenbroek 	}
1288*00b67f09SDavid van Moolenbroek 
1289*00b67f09SDavid van Moolenbroek 	/*
1290*00b67f09SDavid van Moolenbroek 	 * Now make sure its what we expect.
1291*00b67f09SDavid van Moolenbroek 	 */
1292*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&found_rdata);
1293*00b67f09SDavid van Moolenbroek 	dns_rdataset_current(&found_rdataset, &found_rdata);
1294*00b67f09SDavid van Moolenbroek 	rval = dns_rdata_compare(&added_rdata, &found_rdata);
1295*00b67f09SDavid van Moolenbroek 	if (rval == 0) {
1296*00b67f09SDavid van Moolenbroek 		result = T_PASS;
1297*00b67f09SDavid van Moolenbroek 	} else {
1298*00b67f09SDavid van Moolenbroek 		t_info("dns_rdata_compare returned %d\n", rval);
1299*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
1300*00b67f09SDavid van Moolenbroek 	}
1301*00b67f09SDavid van Moolenbroek 
1302*00b67f09SDavid van Moolenbroek 	/*
1303*00b67f09SDavid van Moolenbroek 	 * Don't need these now.
1304*00b67f09SDavid van Moolenbroek 	 */
1305*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &nversionp, ISC_FALSE);
1306*00b67f09SDavid van Moolenbroek 	if (dns_rdataset_isassociated(&found_rdataset))
1307*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&found_rdataset);
1308*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &found_nodep);
1309*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
1310*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
1311*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
1312*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
1313*00b67f09SDavid van Moolenbroek 
1314*00b67f09SDavid van Moolenbroek 	return(result);
1315*00b67f09SDavid van Moolenbroek }
1316*00b67f09SDavid van Moolenbroek 
1317*00b67f09SDavid van Moolenbroek static void
t9(void)1318*00b67f09SDavid van Moolenbroek t9(void) {
1319*00b67f09SDavid van Moolenbroek 	int	result;
1320*00b67f09SDavid van Moolenbroek 
1321*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_newversion", 9, T_REQUIRED, "%s", a9);
1322*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_newversion_data", t_dns_db_newversion, 7);
1323*00b67f09SDavid van Moolenbroek 	t_result(result);
1324*00b67f09SDavid van Moolenbroek }
1325*00b67f09SDavid van Moolenbroek 
1326*00b67f09SDavid van Moolenbroek static const char *a10 =
1327*00b67f09SDavid van Moolenbroek 	"When versionp points to a read-write version and commit is "
1328*00b67f09SDavid van Moolenbroek 	"ISC_TRUE, a call to dns_db_closeversion(db, versionp, commit) "
1329*00b67f09SDavid van Moolenbroek 	"causes all changes made in the version to take effect, "
1330*00b67f09SDavid van Moolenbroek 	"and returns ISC_R_SUCCESS.";
1331*00b67f09SDavid van Moolenbroek 
1332*00b67f09SDavid van Moolenbroek static int
t_dns_db_closeversion_1(char ** av)1333*00b67f09SDavid van Moolenbroek t_dns_db_closeversion_1(char **av) {
1334*00b67f09SDavid van Moolenbroek 	char			*filename;
1335*00b67f09SDavid van Moolenbroek 	char			*db_type;
1336*00b67f09SDavid van Moolenbroek 	char			*origin;
1337*00b67f09SDavid van Moolenbroek 	char			*class;
1338*00b67f09SDavid van Moolenbroek 	char			*model;
1339*00b67f09SDavid van Moolenbroek 	char			*new_name;
1340*00b67f09SDavid van Moolenbroek 	char			*new_type;
1341*00b67f09SDavid van Moolenbroek 	char			*existing_name;
1342*00b67f09SDavid van Moolenbroek 	char			*existing_type;
1343*00b67f09SDavid van Moolenbroek 
1344*00b67f09SDavid van Moolenbroek 	int			result;
1345*00b67f09SDavid van Moolenbroek 	int			len;
1346*00b67f09SDavid van Moolenbroek 	int			rval;
1347*00b67f09SDavid van Moolenbroek 	int			nfails;
1348*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
1349*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
1350*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
1351*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
1352*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
1353*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
1354*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
1355*00b67f09SDavid van Moolenbroek 	isc_buffer_t		name_buffer;
1356*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_newname;
1357*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
1358*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_existingname;
1359*00b67f09SDavid van Moolenbroek 	dns_rdata_t		added_rdata = DNS_RDATA_INIT;
1360*00b67f09SDavid van Moolenbroek 	const char *		added_rdata_data;
1361*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		added_rdataset;
1362*00b67f09SDavid van Moolenbroek 	dns_rdata_t		found_rdata = DNS_RDATA_INIT;
1363*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		found_rdataset;
1364*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		new_rdatatype;
1365*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		existing_rdatatype;
1366*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdataclass;
1367*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*nversionp;
1368*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*cversionp;
1369*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t		rdatalist;
1370*00b67f09SDavid van Moolenbroek 
1371*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
1372*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
1373*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
1374*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
1375*00b67f09SDavid van Moolenbroek 	model = T_ARG(4);
1376*00b67f09SDavid van Moolenbroek 	new_name = T_ARG(5);
1377*00b67f09SDavid van Moolenbroek 	new_type = T_ARG(6);
1378*00b67f09SDavid van Moolenbroek 	existing_name = T_ARG(7);
1379*00b67f09SDavid van Moolenbroek 	existing_type = T_ARG(8);
1380*00b67f09SDavid van Moolenbroek 
1381*00b67f09SDavid van Moolenbroek 	nfails = 0;
1382*00b67f09SDavid van Moolenbroek 	db = NULL;
1383*00b67f09SDavid van Moolenbroek 	mctx = NULL;
1384*00b67f09SDavid van Moolenbroek 	ectx = NULL;
1385*00b67f09SDavid van Moolenbroek 
1386*00b67f09SDavid van Moolenbroek 	/*
1387*00b67f09SDavid van Moolenbroek 	 * Open a new version, add some data,
1388*00b67f09SDavid van Moolenbroek 	 * remove some data, close with commit, open the current
1389*00b67f09SDavid van Moolenbroek 	 * version and check that changes are present.
1390*00b67f09SDavid van Moolenbroek 	 */
1391*00b67f09SDavid van Moolenbroek 
1392*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, new_name);
1393*00b67f09SDavid van Moolenbroek 
1394*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
1395*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1396*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
1397*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1398*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1399*00b67f09SDavid van Moolenbroek 	}
1400*00b67f09SDavid van Moolenbroek 
1401*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
1402*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1403*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
1404*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1405*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1406*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1407*00b67f09SDavid van Moolenbroek 	}
1408*00b67f09SDavid van Moolenbroek 
1409*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1410*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1411*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
1412*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1413*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1414*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1415*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1416*00b67f09SDavid van Moolenbroek 	}
1417*00b67f09SDavid van Moolenbroek 
1418*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
1419*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1420*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1421*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1422*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1423*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1424*00b67f09SDavid van Moolenbroek 	}
1425*00b67f09SDavid van Moolenbroek 
1426*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
1427*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1428*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
1429*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1430*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1431*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1432*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1433*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1434*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1435*00b67f09SDavid van Moolenbroek 	}
1436*00b67f09SDavid van Moolenbroek 
1437*00b67f09SDavid van Moolenbroek 	/*
1438*00b67f09SDavid van Moolenbroek 	 * Remove all rdata for an existing name.
1439*00b67f09SDavid van Moolenbroek 	 */
1440*00b67f09SDavid van Moolenbroek 
1441*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_existingname);
1442*00b67f09SDavid van Moolenbroek 	len = strlen(existing_name);
1443*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, existing_name, len);
1444*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
1445*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
1446*00b67f09SDavid van Moolenbroek 			&name_buffer, NULL, 0, NULL);
1447*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1448*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
1449*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
1450*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1451*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1452*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1453*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1454*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1455*00b67f09SDavid van Moolenbroek 	}
1456*00b67f09SDavid van Moolenbroek 
1457*00b67f09SDavid van Moolenbroek 	textregion.base = existing_type;
1458*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(existing_type);
1459*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion);
1460*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1461*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
1462*00b67f09SDavid van Moolenbroek 				existing_type,
1463*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1464*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1465*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1466*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1467*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1468*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1469*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1470*00b67f09SDavid van Moolenbroek 	}
1471*00b67f09SDavid van Moolenbroek 
1472*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1473*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
1474*00b67f09SDavid van Moolenbroek 				ISC_FALSE, &nodep);
1475*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1476*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode %s\n",
1477*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1478*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1479*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1480*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1481*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1482*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1483*00b67f09SDavid van Moolenbroek 	}
1484*00b67f09SDavid van Moolenbroek 
1485*00b67f09SDavid van Moolenbroek 	/* open a new version */
1486*00b67f09SDavid van Moolenbroek 	nversionp = NULL;
1487*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_newversion(db, &nversionp);
1488*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1489*00b67f09SDavid van Moolenbroek 		t_info("dns_db_newversion failed %s\n",
1490*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1491*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1492*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1493*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1494*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1495*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1496*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1497*00b67f09SDavid van Moolenbroek 	}
1498*00b67f09SDavid van Moolenbroek 
1499*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_deleterdataset(db, nodep, nversionp,
1500*00b67f09SDavid van Moolenbroek 					   existing_rdatatype, 0);
1501*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1502*00b67f09SDavid van Moolenbroek 		t_info("dns_db_deleterdataset failed %s\n",
1503*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1504*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1505*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1506*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1507*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1508*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1509*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1510*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1511*00b67f09SDavid van Moolenbroek 	}
1512*00b67f09SDavid van Moolenbroek 
1513*00b67f09SDavid van Moolenbroek 	/*
1514*00b67f09SDavid van Moolenbroek 	 * add a new name and associate some rdata with it
1515*00b67f09SDavid van Moolenbroek 	 */
1516*00b67f09SDavid van Moolenbroek 
1517*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
1518*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1519*00b67f09SDavid van Moolenbroek 
1520*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_newname);
1521*00b67f09SDavid van Moolenbroek 	len = strlen(new_name);
1522*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, new_name, len);
1523*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
1524*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1525*00b67f09SDavid van Moolenbroek 				&name_buffer, NULL, 0, NULL);
1526*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1527*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
1528*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
1529*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1530*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1531*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1532*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1533*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1534*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1535*00b67f09SDavid van Moolenbroek 	}
1536*00b67f09SDavid van Moolenbroek 
1537*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1538*00b67f09SDavid van Moolenbroek 				ISC_TRUE, &nodep);
1539*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1540*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode failed %s\n",
1541*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1542*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1543*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1544*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1545*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1546*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1547*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1548*00b67f09SDavid van Moolenbroek 	}
1549*00b67f09SDavid van Moolenbroek 
1550*00b67f09SDavid van Moolenbroek 	/*
1551*00b67f09SDavid van Moolenbroek 	 * associate some rdata with the new name
1552*00b67f09SDavid van Moolenbroek 	 */
1553*00b67f09SDavid van Moolenbroek 
1554*00b67f09SDavid van Moolenbroek 	textregion.base = new_type;
1555*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(new_type);
1556*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion);
1557*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1558*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
1559*00b67f09SDavid van Moolenbroek 				new_type,
1560*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1561*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1562*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1563*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1564*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1565*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1566*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1567*00b67f09SDavid van Moolenbroek 	}
1568*00b67f09SDavid van Moolenbroek 
1569*00b67f09SDavid van Moolenbroek 	textregion.base = class;
1570*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(class);
1571*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1572*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1573*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataclass_fromtext failed %s\n",
1574*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1575*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1576*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1577*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1578*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1579*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1580*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1581*00b67f09SDavid van Moolenbroek 	}
1582*00b67f09SDavid van Moolenbroek 
1583*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&added_rdata);
1584*00b67f09SDavid van Moolenbroek 	added_rdata_data = "\x10\x00\x00\x01";
1585*00b67f09SDavid van Moolenbroek 	DE_CONST(added_rdata_data, added_rdata.data);
1586*00b67f09SDavid van Moolenbroek 	added_rdata.length = 4;
1587*00b67f09SDavid van Moolenbroek 	added_rdata.rdclass = rdataclass;
1588*00b67f09SDavid van Moolenbroek 	added_rdata.type = new_rdatatype;
1589*00b67f09SDavid van Moolenbroek 
1590*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&added_rdataset);
1591*00b67f09SDavid van Moolenbroek 	rdatalist.type = new_rdatatype;
1592*00b67f09SDavid van Moolenbroek 	rdatalist.covers = 0;
1593*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = rdataclass;
1594*00b67f09SDavid van Moolenbroek 	rdatalist.ttl = 0;
1595*00b67f09SDavid van Moolenbroek 	ISC_LIST_INIT(rdatalist.rdata);
1596*00b67f09SDavid van Moolenbroek 	ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
1597*00b67f09SDavid van Moolenbroek 
1598*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
1599*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1600*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatalist_tordataset failed %s\n",
1601*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1602*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1603*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1604*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1605*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1606*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1607*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1608*00b67f09SDavid van Moolenbroek 	}
1609*00b67f09SDavid van Moolenbroek 
1610*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
1611*00b67f09SDavid van Moolenbroek 				&added_rdataset, 0, NULL);
1612*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1613*00b67f09SDavid van Moolenbroek 		t_info("dns_db_addrdataset failed %s\n",
1614*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1615*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1616*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1617*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1618*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1619*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1620*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1621*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1622*00b67f09SDavid van Moolenbroek 	}
1623*00b67f09SDavid van Moolenbroek 
1624*00b67f09SDavid van Moolenbroek 	/* close and commit the version */
1625*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &nversionp, ISC_TRUE);
1626*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
1627*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1628*00b67f09SDavid van Moolenbroek 
1629*00b67f09SDavid van Moolenbroek 	/* open the current version and check changes */
1630*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
1631*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
1632*00b67f09SDavid van Moolenbroek 	cversionp = NULL;
1633*00b67f09SDavid van Moolenbroek 	dns_db_currentversion(db, &cversionp);
1634*00b67f09SDavid van Moolenbroek 
1635*00b67f09SDavid van Moolenbroek 	/* find the recently added name and rdata */
1636*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
1637*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_newname),
1638*00b67f09SDavid van Moolenbroek 			cversionp,
1639*00b67f09SDavid van Moolenbroek 			new_rdatatype,
1640*00b67f09SDavid van Moolenbroek 			0,
1641*00b67f09SDavid van Moolenbroek 			0,
1642*00b67f09SDavid van Moolenbroek 			&nodep,
1643*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
1644*00b67f09SDavid van Moolenbroek 			&found_rdataset, NULL);
1645*00b67f09SDavid van Moolenbroek 
1646*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1647*00b67f09SDavid van Moolenbroek 		/* XXXWPK NXRRSET ??? reference counting ??? */
1648*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find failed %s\n",
1649*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1650*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
1651*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1652*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
1653*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
1654*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1655*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1656*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1657*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1658*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
1659*00b67f09SDavid van Moolenbroek 	}
1660*00b67f09SDavid van Moolenbroek 
1661*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataset_first(&found_rdataset);
1662*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1663*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataset_first failed %s\n",
1664*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1665*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1666*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
1667*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
1668*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
1669*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1670*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1671*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1672*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1673*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
1674*00b67f09SDavid van Moolenbroek 	}
1675*00b67f09SDavid van Moolenbroek 
1676*00b67f09SDavid van Moolenbroek 	/*
1677*00b67f09SDavid van Moolenbroek 	 * Now make sure its what we expect.
1678*00b67f09SDavid van Moolenbroek 	 */
1679*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&found_rdata);
1680*00b67f09SDavid van Moolenbroek 	dns_rdataset_current(&found_rdataset, &found_rdata);
1681*00b67f09SDavid van Moolenbroek 	rval = dns_rdata_compare(&added_rdata, &found_rdata);
1682*00b67f09SDavid van Moolenbroek 	if (rval != 0) {
1683*00b67f09SDavid van Moolenbroek 		t_info("dns_rdata_compare returned %d\n", rval);
1684*00b67f09SDavid van Moolenbroek 		++nfails;
1685*00b67f09SDavid van Moolenbroek 	}
1686*00b67f09SDavid van Moolenbroek 
1687*00b67f09SDavid van Moolenbroek 	/*
1688*00b67f09SDavid van Moolenbroek 	 * Now check the rdata deletion.
1689*00b67f09SDavid van Moolenbroek 	 */
1690*00b67f09SDavid van Moolenbroek 
1691*00b67f09SDavid van Moolenbroek 	if (dns_rdataset_isassociated(&found_rdataset))
1692*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&found_rdataset);
1693*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
1694*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
1695*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1696*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
1697*00b67f09SDavid van Moolenbroek 
1698*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname),
1699*00b67f09SDavid van Moolenbroek 				 cversionp, existing_rdatatype,
1700*00b67f09SDavid van Moolenbroek 				 0, 0, &nodep,
1701*00b67f09SDavid van Moolenbroek 				 dns_fixedname_name(&dns_foundname),
1702*00b67f09SDavid van Moolenbroek 				 &found_rdataset, NULL);
1703*00b67f09SDavid van Moolenbroek 
1704*00b67f09SDavid van Moolenbroek 
1705*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
1706*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&found_rdataset);
1707*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1708*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s returned %s\n", existing_name,
1709*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1710*00b67f09SDavid van Moolenbroek 		++nfails;
1711*00b67f09SDavid van Moolenbroek 	}
1712*00b67f09SDavid van Moolenbroek 
1713*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &cversionp, ISC_FALSE);
1714*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
1715*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
1716*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
1717*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
1718*00b67f09SDavid van Moolenbroek 
1719*00b67f09SDavid van Moolenbroek 	if (nfails == 0)
1720*00b67f09SDavid van Moolenbroek 		result = T_PASS;
1721*00b67f09SDavid van Moolenbroek 	else
1722*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
1723*00b67f09SDavid van Moolenbroek 
1724*00b67f09SDavid van Moolenbroek 	return(result);
1725*00b67f09SDavid van Moolenbroek }
1726*00b67f09SDavid van Moolenbroek 
1727*00b67f09SDavid van Moolenbroek static void
t10(void)1728*00b67f09SDavid van Moolenbroek t10(void) {
1729*00b67f09SDavid van Moolenbroek 	int	result;
1730*00b67f09SDavid van Moolenbroek 
1731*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_closeversion", 10, T_REQUIRED, "%s", a10);
1732*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_closeversion_1_data",
1733*00b67f09SDavid van Moolenbroek 			t_dns_db_closeversion_1, 9);
1734*00b67f09SDavid van Moolenbroek 	t_result(result);
1735*00b67f09SDavid van Moolenbroek }
1736*00b67f09SDavid van Moolenbroek 
1737*00b67f09SDavid van Moolenbroek static const char *a11 =
1738*00b67f09SDavid van Moolenbroek 	"When versionp points to a read-write version and commit is "
1739*00b67f09SDavid van Moolenbroek 	"ISC_FALSE, a call to dns_db_closeversion(db, versionp, commit) "
1740*00b67f09SDavid van Moolenbroek 	"causes all changes made in the version to to be rolled back, "
1741*00b67f09SDavid van Moolenbroek 	"and returns ISC_R_SUCCESS.";
1742*00b67f09SDavid van Moolenbroek 
1743*00b67f09SDavid van Moolenbroek static int
t_dns_db_closeversion_2(char ** av)1744*00b67f09SDavid van Moolenbroek t_dns_db_closeversion_2(char **av) {
1745*00b67f09SDavid van Moolenbroek 	char			*filename;
1746*00b67f09SDavid van Moolenbroek 	char			*db_type;
1747*00b67f09SDavid van Moolenbroek 	char			*origin;
1748*00b67f09SDavid van Moolenbroek 	char			*class;
1749*00b67f09SDavid van Moolenbroek 	char			*model;
1750*00b67f09SDavid van Moolenbroek 	char			*new_name;
1751*00b67f09SDavid van Moolenbroek 	char			*new_type;
1752*00b67f09SDavid van Moolenbroek 	char			*existing_name;
1753*00b67f09SDavid van Moolenbroek 	char			*existing_type;
1754*00b67f09SDavid van Moolenbroek 
1755*00b67f09SDavid van Moolenbroek 	int			result;
1756*00b67f09SDavid van Moolenbroek 	int			len;
1757*00b67f09SDavid van Moolenbroek 	int			rval;
1758*00b67f09SDavid van Moolenbroek 	int			nfails;
1759*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
1760*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
1761*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
1762*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
1763*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
1764*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
1765*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
1766*00b67f09SDavid van Moolenbroek 	isc_buffer_t		name_buffer;
1767*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_newname;
1768*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
1769*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_existingname;
1770*00b67f09SDavid van Moolenbroek 	dns_rdata_t		added_rdata = DNS_RDATA_INIT;
1771*00b67f09SDavid van Moolenbroek 	const char *		added_rdata_data;
1772*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		added_rdataset;
1773*00b67f09SDavid van Moolenbroek 	dns_rdata_t		found_rdata = DNS_RDATA_INIT;
1774*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		found_rdataset;
1775*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		new_rdatatype;
1776*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		existing_rdatatype;
1777*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdataclass;
1778*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*nversionp;
1779*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*cversionp;
1780*00b67f09SDavid van Moolenbroek 	dns_rdatalist_t		rdatalist;
1781*00b67f09SDavid van Moolenbroek 
1782*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
1783*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
1784*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
1785*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
1786*00b67f09SDavid van Moolenbroek 	model = T_ARG(4);
1787*00b67f09SDavid van Moolenbroek 	new_name = T_ARG(5);
1788*00b67f09SDavid van Moolenbroek 	new_type = T_ARG(6);
1789*00b67f09SDavid van Moolenbroek 	existing_name = T_ARG(7);
1790*00b67f09SDavid van Moolenbroek 	existing_type = T_ARG(8);
1791*00b67f09SDavid van Moolenbroek 
1792*00b67f09SDavid van Moolenbroek 	nfails = 0;
1793*00b67f09SDavid van Moolenbroek 	db = NULL;
1794*00b67f09SDavid van Moolenbroek 	mctx = NULL;
1795*00b67f09SDavid van Moolenbroek 	ectx = NULL;
1796*00b67f09SDavid van Moolenbroek 
1797*00b67f09SDavid van Moolenbroek 	/*
1798*00b67f09SDavid van Moolenbroek 	 * Open a new version, add some data,
1799*00b67f09SDavid van Moolenbroek 	 * remove some data, close with commit, open the current
1800*00b67f09SDavid van Moolenbroek 	 * version and check that changes are present.
1801*00b67f09SDavid van Moolenbroek 	 */
1802*00b67f09SDavid van Moolenbroek 
1803*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, new_name);
1804*00b67f09SDavid van Moolenbroek 
1805*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
1806*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1807*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
1808*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1809*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1810*00b67f09SDavid van Moolenbroek 	}
1811*00b67f09SDavid van Moolenbroek 
1812*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
1813*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1814*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
1815*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1816*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1817*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1818*00b67f09SDavid van Moolenbroek 	}
1819*00b67f09SDavid van Moolenbroek 
1820*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1821*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
1822*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
1823*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
1824*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1825*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1826*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1827*00b67f09SDavid van Moolenbroek 	}
1828*00b67f09SDavid van Moolenbroek 
1829*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
1830*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1831*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1832*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1833*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1834*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1835*00b67f09SDavid van Moolenbroek 	}
1836*00b67f09SDavid van Moolenbroek 
1837*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
1838*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1839*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
1840*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1841*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1842*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1843*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1844*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1845*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1846*00b67f09SDavid van Moolenbroek 	}
1847*00b67f09SDavid van Moolenbroek 
1848*00b67f09SDavid van Moolenbroek 	/*
1849*00b67f09SDavid van Moolenbroek 	 * Remove all rdata for an existing name.
1850*00b67f09SDavid van Moolenbroek 	 */
1851*00b67f09SDavid van Moolenbroek 
1852*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_existingname);
1853*00b67f09SDavid van Moolenbroek 	len = strlen(existing_name);
1854*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, existing_name, len);
1855*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
1856*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
1857*00b67f09SDavid van Moolenbroek 			&name_buffer, NULL, 0, NULL);
1858*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1859*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
1860*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
1861*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1862*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1863*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1864*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1865*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1866*00b67f09SDavid van Moolenbroek 	}
1867*00b67f09SDavid van Moolenbroek 
1868*00b67f09SDavid van Moolenbroek 	textregion.base = existing_type;
1869*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(existing_type);
1870*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion);
1871*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1872*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
1873*00b67f09SDavid van Moolenbroek 				existing_type,
1874*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1875*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1876*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1877*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1878*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1879*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1880*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1881*00b67f09SDavid van Moolenbroek 	}
1882*00b67f09SDavid van Moolenbroek 
1883*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1884*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
1885*00b67f09SDavid van Moolenbroek 				ISC_FALSE, &nodep);
1886*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1887*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode %s\n",
1888*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1889*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1890*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1891*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1892*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1893*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1894*00b67f09SDavid van Moolenbroek 	}
1895*00b67f09SDavid van Moolenbroek 
1896*00b67f09SDavid van Moolenbroek 	/*
1897*00b67f09SDavid van Moolenbroek 	 * Open a new version.
1898*00b67f09SDavid van Moolenbroek 	 */
1899*00b67f09SDavid van Moolenbroek 	nversionp = NULL;
1900*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_newversion(db, &nversionp);
1901*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1902*00b67f09SDavid van Moolenbroek 		t_info("dns_db_newversion failed %s\n",
1903*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1904*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1905*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1906*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1907*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1908*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1909*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1910*00b67f09SDavid van Moolenbroek 	}
1911*00b67f09SDavid van Moolenbroek 
1912*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_deleterdataset(db, nodep, nversionp,
1913*00b67f09SDavid van Moolenbroek 					   existing_rdatatype, 0);
1914*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1915*00b67f09SDavid van Moolenbroek 		t_info("dns_db_deleterdataset failed %s\n",
1916*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
1917*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1918*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1919*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1920*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1921*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1922*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1923*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1924*00b67f09SDavid van Moolenbroek 	}
1925*00b67f09SDavid van Moolenbroek 
1926*00b67f09SDavid van Moolenbroek 	/*
1927*00b67f09SDavid van Moolenbroek 	 * add a new name and associate some rdata with it
1928*00b67f09SDavid van Moolenbroek 	 */
1929*00b67f09SDavid van Moolenbroek 
1930*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
1931*00b67f09SDavid van Moolenbroek 	nodep = NULL;
1932*00b67f09SDavid van Moolenbroek 
1933*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_newname);
1934*00b67f09SDavid van Moolenbroek 	len = strlen(new_name);
1935*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, new_name, len);
1936*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
1937*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1938*00b67f09SDavid van Moolenbroek 				       &name_buffer, NULL, 0, NULL);
1939*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1940*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
1941*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1942*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1943*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1944*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1945*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1946*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1947*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1948*00b67f09SDavid van Moolenbroek 	}
1949*00b67f09SDavid van Moolenbroek 
1950*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1951*00b67f09SDavid van Moolenbroek 				     ISC_TRUE, &nodep);
1952*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1953*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode failed %s\n",
1954*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1955*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
1956*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1957*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1958*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1959*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1960*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1961*00b67f09SDavid van Moolenbroek 	}
1962*00b67f09SDavid van Moolenbroek 
1963*00b67f09SDavid van Moolenbroek 	textregion.base = new_type;
1964*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(new_type);
1965*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion);
1966*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1967*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
1968*00b67f09SDavid van Moolenbroek 		       new_type, dns_result_totext(dns_result));
1969*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1970*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1971*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1972*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1973*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1974*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1975*00b67f09SDavid van Moolenbroek 	}
1976*00b67f09SDavid van Moolenbroek 
1977*00b67f09SDavid van Moolenbroek 	textregion.base = class;
1978*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(class);
1979*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1980*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1981*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataclass_fromtext failed %s\n",
1982*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1983*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
1984*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
1985*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
1986*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
1987*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
1988*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
1989*00b67f09SDavid van Moolenbroek 	}
1990*00b67f09SDavid van Moolenbroek 
1991*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&added_rdata);
1992*00b67f09SDavid van Moolenbroek 	added_rdata_data = "\x10\x00\x00\x01";
1993*00b67f09SDavid van Moolenbroek 	DE_CONST(added_rdata_data, added_rdata.data);
1994*00b67f09SDavid van Moolenbroek 	added_rdata.length = 4;
1995*00b67f09SDavid van Moolenbroek 	added_rdata.rdclass = rdataclass;
1996*00b67f09SDavid van Moolenbroek 	added_rdata.type = new_rdatatype;
1997*00b67f09SDavid van Moolenbroek 
1998*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&added_rdataset);
1999*00b67f09SDavid van Moolenbroek 	rdatalist.type = new_rdatatype;
2000*00b67f09SDavid van Moolenbroek 	rdatalist.covers = 0;
2001*00b67f09SDavid van Moolenbroek 	rdatalist.rdclass = rdataclass;
2002*00b67f09SDavid van Moolenbroek 	rdatalist.ttl = 0;
2003*00b67f09SDavid van Moolenbroek 	ISC_LIST_INIT(rdatalist.rdata);
2004*00b67f09SDavid van Moolenbroek 	ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
2005*00b67f09SDavid van Moolenbroek 
2006*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
2007*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2008*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatalist_tordataset failed %s\n",
2009*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2010*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2011*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2012*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2013*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2014*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2015*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2016*00b67f09SDavid van Moolenbroek 	}
2017*00b67f09SDavid van Moolenbroek 
2018*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
2019*00b67f09SDavid van Moolenbroek 				&added_rdataset, 0, NULL);
2020*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2021*00b67f09SDavid van Moolenbroek 		t_info("dns_db_addrdataset failed %s\n",
2022*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2023*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
2024*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2025*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2026*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2027*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2028*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2029*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2030*00b67f09SDavid van Moolenbroek 	}
2031*00b67f09SDavid van Moolenbroek 
2032*00b67f09SDavid van Moolenbroek 	/*
2033*00b67f09SDavid van Moolenbroek 	 * Check that our changes took.
2034*00b67f09SDavid van Moolenbroek 	 */
2035*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
2036*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2037*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2038*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
2039*00b67f09SDavid van Moolenbroek 
2040*00b67f09SDavid van Moolenbroek 	/*
2041*00b67f09SDavid van Moolenbroek 	 * Find the recently added name and rdata.
2042*00b67f09SDavid van Moolenbroek 	 */
2043*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname),
2044*00b67f09SDavid van Moolenbroek 				 nversionp, new_rdatatype, 0, 0, &nodep,
2045*00b67f09SDavid van Moolenbroek 				 dns_fixedname_name(&dns_foundname),
2046*00b67f09SDavid van Moolenbroek 				 &found_rdataset, NULL);
2047*00b67f09SDavid van Moolenbroek 
2048*00b67f09SDavid van Moolenbroek 	if ((dns_result == ISC_R_NOTFOUND) ||
2049*00b67f09SDavid van Moolenbroek 	    (dns_result == DNS_R_NXDOMAIN) ||
2050*00b67f09SDavid van Moolenbroek 	    (dns_result == DNS_R_NXRRSET)) {
2051*00b67f09SDavid van Moolenbroek 
2052*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find failed %s\n",
2053*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2054*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
2055*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2056*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
2057*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
2058*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2059*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2060*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2061*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2062*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
2063*00b67f09SDavid van Moolenbroek 	}
2064*00b67f09SDavid van Moolenbroek 
2065*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdataset_first(&found_rdataset);
2066*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2067*00b67f09SDavid van Moolenbroek 		t_info("dns_rdataset_first failed %s\n",
2068*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2069*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2070*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
2071*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
2072*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &nversionp, ISC_FALSE);
2073*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2074*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2075*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2076*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2077*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
2078*00b67f09SDavid van Moolenbroek 	}
2079*00b67f09SDavid van Moolenbroek 
2080*00b67f09SDavid van Moolenbroek 	/*
2081*00b67f09SDavid van Moolenbroek 	 * Now make sure its what we expect.
2082*00b67f09SDavid van Moolenbroek 	 */
2083*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&found_rdata);
2084*00b67f09SDavid van Moolenbroek 	dns_rdataset_current(&found_rdataset, &found_rdata);
2085*00b67f09SDavid van Moolenbroek 	rval = dns_rdata_compare(&added_rdata, &found_rdata);
2086*00b67f09SDavid van Moolenbroek 	if (rval != 0) {
2087*00b67f09SDavid van Moolenbroek 		t_info("dns_rdata_compare returned %d\n", rval);
2088*00b67f09SDavid van Moolenbroek 		++nfails;
2089*00b67f09SDavid van Moolenbroek 	}
2090*00b67f09SDavid van Moolenbroek 
2091*00b67f09SDavid van Moolenbroek 	/*
2092*00b67f09SDavid van Moolenbroek 	 * Now check the rdata deletion.
2093*00b67f09SDavid van Moolenbroek 	 */
2094*00b67f09SDavid van Moolenbroek 	if (dns_rdataset_isassociated(&found_rdataset))
2095*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&found_rdataset);
2096*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
2097*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
2098*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2099*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2100*00b67f09SDavid van Moolenbroek 
2101*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
2102*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_existingname),
2103*00b67f09SDavid van Moolenbroek 			nversionp,
2104*00b67f09SDavid van Moolenbroek 			existing_rdatatype,
2105*00b67f09SDavid van Moolenbroek 			0,
2106*00b67f09SDavid van Moolenbroek 			0,
2107*00b67f09SDavid van Moolenbroek 			&nodep,
2108*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
2109*00b67f09SDavid van Moolenbroek 			&found_rdataset, NULL);
2110*00b67f09SDavid van Moolenbroek 
2111*00b67f09SDavid van Moolenbroek 
2112*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2113*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s returned %s\n", existing_name,
2114*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2115*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&found_rdataset))
2116*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&found_rdataset);
2117*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2118*00b67f09SDavid van Moolenbroek 		++nfails;
2119*00b67f09SDavid van Moolenbroek 	}
2120*00b67f09SDavid van Moolenbroek 
2121*00b67f09SDavid van Moolenbroek 
2122*00b67f09SDavid van Moolenbroek 	/*
2123*00b67f09SDavid van Moolenbroek 	 * Close the version without a commit.
2124*00b67f09SDavid van Moolenbroek 	 */
2125*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &nversionp, ISC_FALSE);
2126*00b67f09SDavid van Moolenbroek 
2127*00b67f09SDavid van Moolenbroek 	/*
2128*00b67f09SDavid van Moolenbroek 	 * Open the current version and check changes.
2129*00b67f09SDavid van Moolenbroek 	 */
2130*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2131*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
2132*00b67f09SDavid van Moolenbroek 	cversionp = NULL;
2133*00b67f09SDavid van Moolenbroek 	dns_db_currentversion(db, &cversionp);
2134*00b67f09SDavid van Moolenbroek 
2135*00b67f09SDavid van Moolenbroek 	/*
2136*00b67f09SDavid van Moolenbroek 	 * Find the recently added name and rdata.
2137*00b67f09SDavid van Moolenbroek 	 */
2138*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
2139*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_newname),
2140*00b67f09SDavid van Moolenbroek 			cversionp,
2141*00b67f09SDavid van Moolenbroek 			new_rdatatype,
2142*00b67f09SDavid van Moolenbroek 			0,
2143*00b67f09SDavid van Moolenbroek 			0,
2144*00b67f09SDavid van Moolenbroek 			&nodep,
2145*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
2146*00b67f09SDavid van Moolenbroek 			&found_rdataset, NULL);
2147*00b67f09SDavid van Moolenbroek 
2148*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2149*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s returned %s\n", new_name,
2150*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2151*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&found_rdataset);
2152*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2153*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
2154*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2155*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2156*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2157*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2158*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
2159*00b67f09SDavid van Moolenbroek 	}
2160*00b67f09SDavid van Moolenbroek 
2161*00b67f09SDavid van Moolenbroek 	/*
2162*00b67f09SDavid van Moolenbroek 	 * Now check the rdata deletion.
2163*00b67f09SDavid van Moolenbroek 	 */
2164*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2165*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&found_rdataset);
2166*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2167*00b67f09SDavid van Moolenbroek 
2168*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname),
2169*00b67f09SDavid van Moolenbroek 				 cversionp, existing_rdatatype, 0, 0,
2170*00b67f09SDavid van Moolenbroek 				 &nodep, dns_fixedname_name(&dns_foundname),
2171*00b67f09SDavid van Moolenbroek 				 &found_rdataset, NULL);
2172*00b67f09SDavid van Moolenbroek 
2173*00b67f09SDavid van Moolenbroek 
2174*00b67f09SDavid van Moolenbroek 	if ((dns_result == ISC_R_NOTFOUND) ||
2175*00b67f09SDavid van Moolenbroek 	    (dns_result == DNS_R_NXDOMAIN) ||
2176*00b67f09SDavid van Moolenbroek 	    (dns_result == DNS_R_NXRRSET)) {
2177*00b67f09SDavid van Moolenbroek 
2178*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s returned %s\n", existing_name,
2179*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2180*00b67f09SDavid van Moolenbroek 		dns_rdataset_disassociate(&found_rdataset);
2181*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2182*00b67f09SDavid van Moolenbroek 		++nfails;
2183*00b67f09SDavid van Moolenbroek 	}
2184*00b67f09SDavid van Moolenbroek 
2185*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
2186*00b67f09SDavid van Moolenbroek 	dns_rdataset_disassociate(&found_rdataset);
2187*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &cversionp, ISC_FALSE);
2188*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
2189*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
2190*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
2191*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
2192*00b67f09SDavid van Moolenbroek 
2193*00b67f09SDavid van Moolenbroek 	if (nfails == 0)
2194*00b67f09SDavid van Moolenbroek 		result = T_PASS;
2195*00b67f09SDavid van Moolenbroek 	else
2196*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
2197*00b67f09SDavid van Moolenbroek 
2198*00b67f09SDavid van Moolenbroek 	return(result);
2199*00b67f09SDavid van Moolenbroek }
2200*00b67f09SDavid van Moolenbroek 
2201*00b67f09SDavid van Moolenbroek static void
t11(void)2202*00b67f09SDavid van Moolenbroek t11(void) {
2203*00b67f09SDavid van Moolenbroek 	int	result;
2204*00b67f09SDavid van Moolenbroek 
2205*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_closeversion", 11, T_REQUIRED, "%s", a11);
2206*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_closeversion_2_data",
2207*00b67f09SDavid van Moolenbroek 			t_dns_db_closeversion_2, 9);
2208*00b67f09SDavid van Moolenbroek 	t_result(result);
2209*00b67f09SDavid van Moolenbroek }
2210*00b67f09SDavid van Moolenbroek 
2211*00b67f09SDavid van Moolenbroek static const char *a12 =
2212*00b67f09SDavid van Moolenbroek 	"A call to dns_db_expirenode() marks as stale all records at node  "
2213*00b67f09SDavid van Moolenbroek 	"which expire at or before 'now'. If 'now' is zero, then the current  "
2214*00b67f09SDavid van Moolenbroek 	"time will be used.";
2215*00b67f09SDavid van Moolenbroek 
2216*00b67f09SDavid van Moolenbroek static int
t_dns_db_expirenode(char ** av)2217*00b67f09SDavid van Moolenbroek t_dns_db_expirenode(char **av) {
2218*00b67f09SDavid van Moolenbroek 	char			*filename;
2219*00b67f09SDavid van Moolenbroek 	char			*db_type;
2220*00b67f09SDavid van Moolenbroek 	char			*origin;
2221*00b67f09SDavid van Moolenbroek 	char			*class;
2222*00b67f09SDavid van Moolenbroek 	char			*existing_name;
2223*00b67f09SDavid van Moolenbroek 	char			*node_xtime;
2224*00b67f09SDavid van Moolenbroek 	char			*find_xtime;
2225*00b67f09SDavid van Moolenbroek 	char			*exp_find_result;
2226*00b67f09SDavid van Moolenbroek 
2227*00b67f09SDavid van Moolenbroek 	int			result;
2228*00b67f09SDavid van Moolenbroek 	int			len;
2229*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
2230*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
2231*00b67f09SDavid van Moolenbroek 	isc_result_t		exp_result;
2232*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
2233*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
2234*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
2235*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
2236*00b67f09SDavid van Moolenbroek 	isc_buffer_t		name_buffer;
2237*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
2238*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_existingname;
2239*00b67f09SDavid van Moolenbroek 	isc_stdtime_t		node_expire_time;
2240*00b67f09SDavid van Moolenbroek 	isc_stdtime_t		find_expire_time;
2241*00b67f09SDavid van Moolenbroek 	isc_stdtime_t		now;
2242*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		rdataset;
2243*00b67f09SDavid van Moolenbroek 
2244*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
2245*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
2246*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
2247*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
2248*00b67f09SDavid van Moolenbroek 	existing_name = T_ARG(4);
2249*00b67f09SDavid van Moolenbroek 	node_xtime = T_ARG(5);
2250*00b67f09SDavid van Moolenbroek 	find_xtime = T_ARG(6);
2251*00b67f09SDavid van Moolenbroek 	exp_find_result = T_ARG(7);
2252*00b67f09SDavid van Moolenbroek 	mctx = NULL;
2253*00b67f09SDavid van Moolenbroek 	ectx = NULL;
2254*00b67f09SDavid van Moolenbroek 
2255*00b67f09SDavid van Moolenbroek 	/*
2256*00b67f09SDavid van Moolenbroek 	 * Find a node, mark it as stale, do a dns_db_find on the name and
2257*00b67f09SDavid van Moolenbroek 	 * expect it to fail.
2258*00b67f09SDavid van Moolenbroek 	 */
2259*00b67f09SDavid van Moolenbroek 
2260*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, existing_name);
2261*00b67f09SDavid van Moolenbroek 
2262*00b67f09SDavid van Moolenbroek 	node_expire_time = (isc_stdtime_t) strtol(node_xtime, NULL, 10);
2263*00b67f09SDavid van Moolenbroek 	find_expire_time = (isc_stdtime_t) strtol(find_xtime, NULL, 10);
2264*00b67f09SDavid van Moolenbroek 	exp_result = t_dns_result_fromtext(exp_find_result);
2265*00b67f09SDavid van Moolenbroek 
2266*00b67f09SDavid van Moolenbroek 	isc_stdtime_get(&now);
2267*00b67f09SDavid van Moolenbroek 
2268*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_existingname);
2269*00b67f09SDavid van Moolenbroek 	len = strlen(existing_name);
2270*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, existing_name, len);
2271*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
2272*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
2273*00b67f09SDavid van Moolenbroek 				       &name_buffer, NULL, 0, NULL);
2274*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2275*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
2276*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2277*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2278*00b67f09SDavid van Moolenbroek 	}
2279*00b67f09SDavid van Moolenbroek 
2280*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
2281*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2282*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
2283*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
2284*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2285*00b67f09SDavid van Moolenbroek 	}
2286*00b67f09SDavid van Moolenbroek 
2287*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
2288*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2289*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
2290*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2291*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2292*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2293*00b67f09SDavid van Moolenbroek 	}
2294*00b67f09SDavid van Moolenbroek 
2295*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2296*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2297*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
2298*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2299*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2300*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2301*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2302*00b67f09SDavid van Moolenbroek 	}
2303*00b67f09SDavid van Moolenbroek 
2304*00b67f09SDavid van Moolenbroek 	db = NULL;
2305*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, "cache", mctx, &db);
2306*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2307*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2308*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2309*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2310*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2311*00b67f09SDavid van Moolenbroek 	}
2312*00b67f09SDavid van Moolenbroek 
2313*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
2314*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2315*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
2316*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2317*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2318*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2319*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2320*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2321*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2322*00b67f09SDavid van Moolenbroek 	}
2323*00b67f09SDavid van Moolenbroek 
2324*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2325*00b67f09SDavid van Moolenbroek 
2326*00b67f09SDavid van Moolenbroek 	/*
2327*00b67f09SDavid van Moolenbroek 	 * Check that the node is there.
2328*00b67f09SDavid van Moolenbroek 	 */
2329*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
2330*00b67f09SDavid van Moolenbroek 				     ISC_FALSE, &nodep);
2331*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2332*00b67f09SDavid van Moolenbroek 		t_info("unable to find %s\n", existing_name);
2333*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2334*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2335*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2336*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2337*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2338*00b67f09SDavid van Moolenbroek 	}
2339*00b67f09SDavid van Moolenbroek 
2340*00b67f09SDavid van Moolenbroek 	/*
2341*00b67f09SDavid van Moolenbroek 	 * Expire it.
2342*00b67f09SDavid van Moolenbroek 	 */
2343*00b67f09SDavid van Moolenbroek 	if (node_expire_time != 0)
2344*00b67f09SDavid van Moolenbroek 		node_expire_time += now;
2345*00b67f09SDavid van Moolenbroek 
2346*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_expirenode(db, nodep, node_expire_time);
2347*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2348*00b67f09SDavid van Moolenbroek 		t_info("dns_db_expirenode failed %s\n",
2349*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2350*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2351*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2352*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2353*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2354*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2355*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
2356*00b67f09SDavid van Moolenbroek 	}
2357*00b67f09SDavid van Moolenbroek 
2358*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2359*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
2360*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
2361*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2362*00b67f09SDavid van Moolenbroek 
2363*00b67f09SDavid van Moolenbroek 	if (find_expire_time != 0)
2364*00b67f09SDavid van Moolenbroek 		find_expire_time += now;
2365*00b67f09SDavid van Moolenbroek 
2366*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
2367*00b67f09SDavid van Moolenbroek 				 dns_fixedname_name(&dns_existingname),
2368*00b67f09SDavid van Moolenbroek 				 NULL,
2369*00b67f09SDavid van Moolenbroek 				 dns_rdatatype_any,
2370*00b67f09SDavid van Moolenbroek 				 0,
2371*00b67f09SDavid van Moolenbroek 				 find_expire_time,
2372*00b67f09SDavid van Moolenbroek 				 &nodep,
2373*00b67f09SDavid van Moolenbroek 				 dns_fixedname_name(&dns_foundname),
2374*00b67f09SDavid van Moolenbroek 				 &rdataset, NULL);
2375*00b67f09SDavid van Moolenbroek 
2376*00b67f09SDavid van Moolenbroek 	if (dns_result == exp_result) {
2377*00b67f09SDavid van Moolenbroek 		result = T_PASS;
2378*00b67f09SDavid van Moolenbroek 	} else {
2379*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s returned %s\n", existing_name,
2380*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2381*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
2382*00b67f09SDavid van Moolenbroek 	}
2383*00b67f09SDavid van Moolenbroek 
2384*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) &&
2385*00b67f09SDavid van Moolenbroek 	    (dns_result != DNS_R_NXDOMAIN) &&
2386*00b67f09SDavid van Moolenbroek 	    (dns_result != DNS_R_NXRRSET)) {
2387*00b67f09SDavid van Moolenbroek 
2388*00b67f09SDavid van Moolenbroek 		/*
2389*00b67f09SDavid van Moolenbroek 		 * Don't need to disassociate the rdataset because
2390*00b67f09SDavid van Moolenbroek 		 * we're searching with dns_rdatatype_any.
2391*00b67f09SDavid van Moolenbroek 		 */
2392*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2393*00b67f09SDavid van Moolenbroek 	}
2394*00b67f09SDavid van Moolenbroek 
2395*00b67f09SDavid van Moolenbroek 
2396*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
2397*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
2398*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
2399*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
2400*00b67f09SDavid van Moolenbroek 
2401*00b67f09SDavid van Moolenbroek 	return(result);
2402*00b67f09SDavid van Moolenbroek }
2403*00b67f09SDavid van Moolenbroek 
2404*00b67f09SDavid van Moolenbroek static void
t12(void)2405*00b67f09SDavid van Moolenbroek t12(void) {
2406*00b67f09SDavid van Moolenbroek 	int	result;
2407*00b67f09SDavid van Moolenbroek 
2408*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_expirenode", 12, T_REQUIRED, "%s", a12);
2409*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_expirenode_data", t_dns_db_expirenode, 8);
2410*00b67f09SDavid van Moolenbroek 	t_result(result);
2411*00b67f09SDavid van Moolenbroek }
2412*00b67f09SDavid van Moolenbroek 
2413*00b67f09SDavid van Moolenbroek static const char *a13 =
2414*00b67f09SDavid van Moolenbroek 	"If the node name exists, then a call to "
2415*00b67f09SDavid van Moolenbroek 	"dns_db_findnode(db, name, ISC_FALSE, nodep) initializes nodep "
2416*00b67f09SDavid van Moolenbroek 	"to point to the node and returns ISC_R_SUCCESS, otherwise "
2417*00b67f09SDavid van Moolenbroek 	"it returns ISC_R_NOTFOUND.";
2418*00b67f09SDavid van Moolenbroek 
2419*00b67f09SDavid van Moolenbroek static int
t_dns_db_findnode_1(char ** av)2420*00b67f09SDavid van Moolenbroek t_dns_db_findnode_1(char **av) {
2421*00b67f09SDavid van Moolenbroek 	char		*filename;
2422*00b67f09SDavid van Moolenbroek 	char		*db_type;
2423*00b67f09SDavid van Moolenbroek 	char		*origin;
2424*00b67f09SDavid van Moolenbroek 	char		*class;
2425*00b67f09SDavid van Moolenbroek 	char		*model;
2426*00b67f09SDavid van Moolenbroek 	char		*find_name;
2427*00b67f09SDavid van Moolenbroek 	char		*find_type;
2428*00b67f09SDavid van Moolenbroek 	char		*expected_result;
2429*00b67f09SDavid van Moolenbroek 
2430*00b67f09SDavid van Moolenbroek 	int			result;
2431*00b67f09SDavid van Moolenbroek 	int			len;
2432*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
2433*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
2434*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
2435*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
2436*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
2437*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
2438*00b67f09SDavid van Moolenbroek 	isc_buffer_t		name_buffer;
2439*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		rdataset;
2440*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		rdatatype;
2441*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
2442*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_name;
2443*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*cversionp;
2444*00b67f09SDavid van Moolenbroek 	isc_result_t		exp_result;
2445*00b67f09SDavid van Moolenbroek 
2446*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
2447*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
2448*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
2449*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
2450*00b67f09SDavid van Moolenbroek 	model = T_ARG(4);
2451*00b67f09SDavid van Moolenbroek 	find_name = T_ARG(5);
2452*00b67f09SDavid van Moolenbroek 	find_type = T_ARG(6);
2453*00b67f09SDavid van Moolenbroek 	expected_result = T_ARG(7);
2454*00b67f09SDavid van Moolenbroek 
2455*00b67f09SDavid van Moolenbroek 	db = NULL;
2456*00b67f09SDavid van Moolenbroek 	mctx = NULL;
2457*00b67f09SDavid van Moolenbroek 	ectx = NULL;
2458*00b67f09SDavid van Moolenbroek 
2459*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, find_name);
2460*00b67f09SDavid van Moolenbroek 
2461*00b67f09SDavid van Moolenbroek 	exp_result = t_dns_result_fromtext(expected_result);
2462*00b67f09SDavid van Moolenbroek 
2463*00b67f09SDavid van Moolenbroek 	textregion.base = find_type;
2464*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(find_type);
2465*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
2466*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2467*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
2468*00b67f09SDavid van Moolenbroek 				find_type,
2469*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2470*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2471*00b67f09SDavid van Moolenbroek 	}
2472*00b67f09SDavid van Moolenbroek 
2473*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
2474*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2475*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
2476*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2477*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2478*00b67f09SDavid van Moolenbroek 	}
2479*00b67f09SDavid van Moolenbroek 
2480*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
2481*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2482*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
2483*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2484*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2485*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2486*00b67f09SDavid van Moolenbroek 	}
2487*00b67f09SDavid van Moolenbroek 
2488*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2489*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2490*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
2491*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2492*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2493*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2494*00b67f09SDavid van Moolenbroek 	}
2495*00b67f09SDavid van Moolenbroek 
2496*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
2497*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2498*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2499*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2500*00b67f09SDavid van Moolenbroek 	}
2501*00b67f09SDavid van Moolenbroek 
2502*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
2503*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2504*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
2505*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2506*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2507*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2508*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2509*00b67f09SDavid van Moolenbroek 	}
2510*00b67f09SDavid van Moolenbroek 
2511*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2512*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_name);
2513*00b67f09SDavid van Moolenbroek 
2514*00b67f09SDavid van Moolenbroek 	len = strlen(find_name);
2515*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, find_name, len);
2516*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
2517*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_name),
2518*00b67f09SDavid van Moolenbroek 				&name_buffer, NULL, 0, NULL);
2519*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2520*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
2521*00b67f09SDavid van Moolenbroek 			       dns_result_totext(dns_result));
2522*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2523*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2524*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2525*00b67f09SDavid van Moolenbroek 	}
2526*00b67f09SDavid van Moolenbroek 
2527*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2528*00b67f09SDavid van Moolenbroek 				ISC_FALSE, &nodep);
2529*00b67f09SDavid van Moolenbroek 	if (dns_result != exp_result) {
2530*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode failed %s\n",
2531*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2532*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS)
2533*00b67f09SDavid van Moolenbroek 			dns_db_detachnode(db, &nodep);
2534*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2535*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2536*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
2537*00b67f09SDavid van Moolenbroek 	}
2538*00b67f09SDavid van Moolenbroek 
2539*00b67f09SDavid van Moolenbroek 	/*
2540*00b67f09SDavid van Moolenbroek 	 * if we're expecting the find to succeed and it did,
2541*00b67f09SDavid van Moolenbroek 	 * check that the node has been initialized
2542*00b67f09SDavid van Moolenbroek 	 * by checking for the specified type of rdata
2543*00b67f09SDavid van Moolenbroek 	 * and expecting the search to succeed
2544*00b67f09SDavid van Moolenbroek 	 */
2545*00b67f09SDavid van Moolenbroek 
2546*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
2547*00b67f09SDavid van Moolenbroek 		cversionp = NULL;
2548*00b67f09SDavid van Moolenbroek 		dns_db_currentversion(db, &cversionp);
2549*00b67f09SDavid van Moolenbroek 		dns_rdataset_init(&rdataset);
2550*00b67f09SDavid van Moolenbroek 
2551*00b67f09SDavid van Moolenbroek 		dns_result = dns_db_findrdataset(db, nodep, cversionp,
2552*00b67f09SDavid van Moolenbroek 						 rdatatype, 0,
2553*00b67f09SDavid van Moolenbroek 						 0, &rdataset, NULL);
2554*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
2555*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&rdataset);
2556*00b67f09SDavid van Moolenbroek 			result = T_PASS;
2557*00b67f09SDavid van Moolenbroek 		} else {
2558*00b67f09SDavid van Moolenbroek 			t_info("dns_db_findrdataset failed %s\n",
2559*00b67f09SDavid van Moolenbroek 					dns_result_totext(dns_result));
2560*00b67f09SDavid van Moolenbroek 			result = T_FAIL;
2561*00b67f09SDavid van Moolenbroek 		}
2562*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
2563*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2564*00b67f09SDavid van Moolenbroek 	} else {
2565*00b67f09SDavid van Moolenbroek 		result = T_PASS;
2566*00b67f09SDavid van Moolenbroek 	}
2567*00b67f09SDavid van Moolenbroek 
2568*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
2569*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
2570*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
2571*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
2572*00b67f09SDavid van Moolenbroek 
2573*00b67f09SDavid van Moolenbroek 	return(result);
2574*00b67f09SDavid van Moolenbroek }
2575*00b67f09SDavid van Moolenbroek 
2576*00b67f09SDavid van Moolenbroek static void
t13(void)2577*00b67f09SDavid van Moolenbroek t13(void) {
2578*00b67f09SDavid van Moolenbroek 	int	result;
2579*00b67f09SDavid van Moolenbroek 
2580*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_findnode", 13, T_REQUIRED, "%s", a13);
2581*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_findnode_1_data", t_dns_db_findnode_1, 8);
2582*00b67f09SDavid van Moolenbroek 	t_result(result);
2583*00b67f09SDavid van Moolenbroek }
2584*00b67f09SDavid van Moolenbroek 
2585*00b67f09SDavid van Moolenbroek static const char *a14 =
2586*00b67f09SDavid van Moolenbroek 	"If the node name does not exist and create is ISC_TRUE, "
2587*00b67f09SDavid van Moolenbroek 	"then a call to dns_db_findnode(db, name, create, nodep) "
2588*00b67f09SDavid van Moolenbroek 	"creates the node, initializes nodep to point to the node, "
2589*00b67f09SDavid van Moolenbroek 	"and returns ISC_R_SUCCESS.";
2590*00b67f09SDavid van Moolenbroek 
2591*00b67f09SDavid van Moolenbroek static int
t_dns_db_findnode_2(char ** av)2592*00b67f09SDavid van Moolenbroek t_dns_db_findnode_2(char **av) {
2593*00b67f09SDavid van Moolenbroek 	char			*filename;
2594*00b67f09SDavid van Moolenbroek 	char			*db_type;
2595*00b67f09SDavid van Moolenbroek 	char			*origin;
2596*00b67f09SDavid van Moolenbroek 	char			*class;
2597*00b67f09SDavid van Moolenbroek 	char			*model;
2598*00b67f09SDavid van Moolenbroek 	char			*newname;
2599*00b67f09SDavid van Moolenbroek 
2600*00b67f09SDavid van Moolenbroek 	int			nfails;
2601*00b67f09SDavid van Moolenbroek 	int			result;
2602*00b67f09SDavid van Moolenbroek 	int			len;
2603*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
2604*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
2605*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
2606*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
2607*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
2608*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
2609*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*newnodep;
2610*00b67f09SDavid van Moolenbroek 	isc_buffer_t		name_buffer;
2611*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		rdataset;
2612*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_name;
2613*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
2614*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*cversionp;
2615*00b67f09SDavid van Moolenbroek 
2616*00b67f09SDavid van Moolenbroek 	filename = T_ARG(0);
2617*00b67f09SDavid van Moolenbroek 	db_type = T_ARG(1);
2618*00b67f09SDavid van Moolenbroek 	origin = T_ARG(2);
2619*00b67f09SDavid van Moolenbroek 	class = T_ARG(3);
2620*00b67f09SDavid van Moolenbroek 	model = T_ARG(4);
2621*00b67f09SDavid van Moolenbroek 	newname = T_ARG(5);
2622*00b67f09SDavid van Moolenbroek 
2623*00b67f09SDavid van Moolenbroek 	db = NULL;
2624*00b67f09SDavid van Moolenbroek 	mctx = NULL;
2625*00b67f09SDavid van Moolenbroek 	ectx = NULL;
2626*00b67f09SDavid van Moolenbroek 	nfails = 0;
2627*00b67f09SDavid van Moolenbroek 
2628*00b67f09SDavid van Moolenbroek 	t_info("testing using file %s and name %s\n", filename, newname);
2629*00b67f09SDavid van Moolenbroek 
2630*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
2631*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2632*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
2633*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2634*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2635*00b67f09SDavid van Moolenbroek 	}
2636*00b67f09SDavid van Moolenbroek 
2637*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
2638*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2639*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
2640*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2641*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2642*00b67f09SDavid van Moolenbroek 	}
2643*00b67f09SDavid van Moolenbroek 
2644*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2645*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2646*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
2647*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2648*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2649*00b67f09SDavid van Moolenbroek 	}
2650*00b67f09SDavid van Moolenbroek 
2651*00b67f09SDavid van Moolenbroek 	dns_result = t_create(db_type, origin, class, model, mctx, &db);
2652*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2653*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2654*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2655*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2656*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2657*00b67f09SDavid van Moolenbroek 	}
2658*00b67f09SDavid van Moolenbroek 
2659*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, filename);
2660*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2661*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
2662*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2663*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2664*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2665*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2666*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2667*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2668*00b67f09SDavid van Moolenbroek 	}
2669*00b67f09SDavid van Moolenbroek 
2670*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2671*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_name);
2672*00b67f09SDavid van Moolenbroek 
2673*00b67f09SDavid van Moolenbroek 	/*
2674*00b67f09SDavid van Moolenbroek 	 * Make sure the name isn't there
2675*00b67f09SDavid van Moolenbroek 	 */
2676*00b67f09SDavid van Moolenbroek 	len = strlen(newname);
2677*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&name_buffer, newname, len);
2678*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&name_buffer, len);
2679*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_name),
2680*00b67f09SDavid van Moolenbroek 				       &name_buffer, NULL, 0, NULL);
2681*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2682*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext returned %s\n",
2683*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2684*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2685*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2686*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2687*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2688*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2689*00b67f09SDavid van Moolenbroek 	}
2690*00b67f09SDavid van Moolenbroek 
2691*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2692*00b67f09SDavid van Moolenbroek 				     ISC_FALSE, &nodep);
2693*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) &&
2694*00b67f09SDavid van Moolenbroek 	    (dns_result != DNS_R_NXDOMAIN) &&
2695*00b67f09SDavid van Moolenbroek 	    (dns_result != DNS_R_NXRRSET)) {
2696*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode %s\n",
2697*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2698*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2699*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2700*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2701*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2702*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2703*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2704*00b67f09SDavid van Moolenbroek 	}
2705*00b67f09SDavid van Moolenbroek 
2706*00b67f09SDavid van Moolenbroek 	/*
2707*00b67f09SDavid van Moolenbroek 	 * Add it.
2708*00b67f09SDavid van Moolenbroek 	 */
2709*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2710*00b67f09SDavid van Moolenbroek 				ISC_TRUE, &nodep);
2711*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2712*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode %s\n",
2713*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2714*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2715*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2716*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2717*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2718*00b67f09SDavid van Moolenbroek 		return(T_FAIL);
2719*00b67f09SDavid van Moolenbroek 	}
2720*00b67f09SDavid van Moolenbroek 
2721*00b67f09SDavid van Moolenbroek 	/*
2722*00b67f09SDavid van Moolenbroek 	 * Check it.
2723*00b67f09SDavid van Moolenbroek 	 */
2724*00b67f09SDavid van Moolenbroek 	newnodep = NULL;
2725*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
2726*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2727*00b67f09SDavid van Moolenbroek 	cversionp = NULL;
2728*00b67f09SDavid van Moolenbroek 	dns_db_currentversion(db, &cversionp);
2729*00b67f09SDavid van Moolenbroek 
2730*00b67f09SDavid van Moolenbroek 	/*
2731*00b67f09SDavid van Moolenbroek 	 * First try dns_db_find DNS_R_NXDOMAIN.
2732*00b67f09SDavid van Moolenbroek 	 */
2733*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
2734*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_name),
2735*00b67f09SDavid van Moolenbroek 			cversionp,
2736*00b67f09SDavid van Moolenbroek 			dns_rdatatype_any,
2737*00b67f09SDavid van Moolenbroek 			0,
2738*00b67f09SDavid van Moolenbroek 			0,
2739*00b67f09SDavid van Moolenbroek 			&newnodep,
2740*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
2741*00b67f09SDavid van Moolenbroek 			&rdataset, NULL);
2742*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2743*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &newnodep);
2744*00b67f09SDavid van Moolenbroek 	}
2745*00b67f09SDavid van Moolenbroek 
2746*00b67f09SDavid van Moolenbroek 	if (dns_result != DNS_R_NXDOMAIN) {
2747*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s\n",
2748*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2749*00b67f09SDavid van Moolenbroek 		++nfails;
2750*00b67f09SDavid van Moolenbroek 	}
2751*00b67f09SDavid van Moolenbroek 
2752*00b67f09SDavid van Moolenbroek 	/*
2753*00b67f09SDavid van Moolenbroek 	 * Then try dns_db_findnode ISC_R_SUCCESS.
2754*00b67f09SDavid van Moolenbroek 	 */
2755*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2756*00b67f09SDavid van Moolenbroek 				     ISC_FALSE, &newnodep);
2757*00b67f09SDavid van Moolenbroek 	t_info("dns_db_findnode %s\n", dns_result_totext(dns_result));
2758*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
2759*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &newnodep);
2760*00b67f09SDavid van Moolenbroek 	} else {
2761*00b67f09SDavid van Moolenbroek 		t_info("dns_db_findnode %s failed %s\n", newname,
2762*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2763*00b67f09SDavid van Moolenbroek 		++nfails;
2764*00b67f09SDavid van Moolenbroek 	}
2765*00b67f09SDavid van Moolenbroek 
2766*00b67f09SDavid van Moolenbroek 
2767*00b67f09SDavid van Moolenbroek 	dns_db_detachnode(db, &nodep);
2768*00b67f09SDavid van Moolenbroek 	dns_db_closeversion(db, &cversionp, ISC_FALSE);
2769*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
2770*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
2771*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
2772*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
2773*00b67f09SDavid van Moolenbroek 
2774*00b67f09SDavid van Moolenbroek 	if (nfails == 0)
2775*00b67f09SDavid van Moolenbroek 		result = T_PASS;
2776*00b67f09SDavid van Moolenbroek 	else
2777*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
2778*00b67f09SDavid van Moolenbroek 
2779*00b67f09SDavid van Moolenbroek 	return(result);
2780*00b67f09SDavid van Moolenbroek }
2781*00b67f09SDavid van Moolenbroek 
2782*00b67f09SDavid van Moolenbroek static void
t14(void)2783*00b67f09SDavid van Moolenbroek t14(void) {
2784*00b67f09SDavid van Moolenbroek 	int	result;
2785*00b67f09SDavid van Moolenbroek 
2786*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_findnode", 14, T_REQUIRED, "%s", a14);
2787*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_findnode_2_data", t_dns_db_findnode_2, 6);
2788*00b67f09SDavid van Moolenbroek 	t_result(result);
2789*00b67f09SDavid van Moolenbroek }
2790*00b67f09SDavid van Moolenbroek 
2791*00b67f09SDavid van Moolenbroek static int
t_dns_db_find_x(char ** av)2792*00b67f09SDavid van Moolenbroek t_dns_db_find_x(char **av) {
2793*00b67f09SDavid van Moolenbroek 	char			*dbfile;
2794*00b67f09SDavid van Moolenbroek 	char			*dbtype;
2795*00b67f09SDavid van Moolenbroek 	char			*dborigin;
2796*00b67f09SDavid van Moolenbroek 	char			*dbclass;
2797*00b67f09SDavid van Moolenbroek 	char			*dbmodel;
2798*00b67f09SDavid van Moolenbroek 	char			*findname;
2799*00b67f09SDavid van Moolenbroek 	char			*findtype;
2800*00b67f09SDavid van Moolenbroek 	char			*findopts;
2801*00b67f09SDavid van Moolenbroek 	char			*findtime;
2802*00b67f09SDavid van Moolenbroek 	char			*expected_result;
2803*00b67f09SDavid van Moolenbroek 
2804*00b67f09SDavid van Moolenbroek 	int			result;
2805*00b67f09SDavid van Moolenbroek 	int			len;
2806*00b67f09SDavid van Moolenbroek 	int			opts;
2807*00b67f09SDavid van Moolenbroek 	dns_db_t		*db;
2808*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
2809*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
2810*00b67f09SDavid van Moolenbroek 	isc_stdtime_t		ftime;
2811*00b67f09SDavid van Moolenbroek 	isc_stdtime_t		now;
2812*00b67f09SDavid van Moolenbroek 	isc_result_t		exp_result;
2813*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
2814*00b67f09SDavid van Moolenbroek 	isc_entropy_t		*ectx;
2815*00b67f09SDavid van Moolenbroek 	dns_dbnode_t		*nodep;
2816*00b67f09SDavid van Moolenbroek 	isc_textregion_t	textregion;
2817*00b67f09SDavid van Moolenbroek 	isc_buffer_t		findname_buffer;
2818*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_findname;
2819*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		dns_foundname;
2820*00b67f09SDavid van Moolenbroek 	dns_rdataset_t		rdataset;
2821*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t		rdatatype;
2822*00b67f09SDavid van Moolenbroek 	dns_dbversion_t		*cversionp;
2823*00b67f09SDavid van Moolenbroek 
2824*00b67f09SDavid van Moolenbroek 	dbfile = T_ARG(0);
2825*00b67f09SDavid van Moolenbroek 	dbtype = T_ARG(1);
2826*00b67f09SDavid van Moolenbroek 	dborigin = T_ARG(2);
2827*00b67f09SDavid van Moolenbroek 	dbclass = T_ARG(3);
2828*00b67f09SDavid van Moolenbroek 	dbmodel = T_ARG(4);
2829*00b67f09SDavid van Moolenbroek 	findname = T_ARG(5);
2830*00b67f09SDavid van Moolenbroek 	findtype = T_ARG(6);
2831*00b67f09SDavid van Moolenbroek 	findopts = T_ARG(7);
2832*00b67f09SDavid van Moolenbroek 	findtime = T_ARG(8);
2833*00b67f09SDavid van Moolenbroek 	expected_result = T_ARG(9);
2834*00b67f09SDavid van Moolenbroek 	db = NULL;
2835*00b67f09SDavid van Moolenbroek 	mctx = NULL;
2836*00b67f09SDavid van Moolenbroek 	ectx = NULL;
2837*00b67f09SDavid van Moolenbroek 	opts = 0;
2838*00b67f09SDavid van Moolenbroek 
2839*00b67f09SDavid van Moolenbroek 	t_info("testing using %s, name %s, type %s\n", dbfile, findname,
2840*00b67f09SDavid van Moolenbroek 	       findtype);
2841*00b67f09SDavid van Moolenbroek 
2842*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
2843*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2844*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
2845*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2846*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2847*00b67f09SDavid van Moolenbroek 	}
2848*00b67f09SDavid van Moolenbroek 
2849*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
2850*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2851*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
2852*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2853*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2854*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2855*00b67f09SDavid van Moolenbroek 	}
2856*00b67f09SDavid van Moolenbroek 
2857*00b67f09SDavid van Moolenbroek 	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2858*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2859*00b67f09SDavid van Moolenbroek 		t_info("isc_hash_create failed %s\n",
2860*00b67f09SDavid van Moolenbroek 				isc_result_totext(isc_result));
2861*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2862*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2863*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2864*00b67f09SDavid van Moolenbroek 	}
2865*00b67f09SDavid van Moolenbroek 
2866*00b67f09SDavid van Moolenbroek 	dns_result = t_create(dbtype, dborigin, dbclass, dbmodel, mctx, &db);
2867*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2868*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2869*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2870*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2871*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2872*00b67f09SDavid van Moolenbroek 	}
2873*00b67f09SDavid van Moolenbroek 
2874*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_load(db, dbfile);
2875*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2876*00b67f09SDavid van Moolenbroek 		t_info("dns_db_load returned %s\n",
2877*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2878*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2879*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2880*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2881*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2882*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2883*00b67f09SDavid van Moolenbroek 	}
2884*00b67f09SDavid van Moolenbroek 
2885*00b67f09SDavid van Moolenbroek 	exp_result = t_dns_result_fromtext(expected_result);
2886*00b67f09SDavid van Moolenbroek 
2887*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_findname);
2888*00b67f09SDavid van Moolenbroek 	len = strlen(findname);
2889*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&findname_buffer, findname, len);
2890*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&findname_buffer, len);
2891*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
2892*00b67f09SDavid van Moolenbroek 				&findname_buffer, NULL, 0, NULL);
2893*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2894*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
2895*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
2896*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2897*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2898*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2899*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2900*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2901*00b67f09SDavid van Moolenbroek 	}
2902*00b67f09SDavid van Moolenbroek 
2903*00b67f09SDavid van Moolenbroek 	textregion.base = findtype;
2904*00b67f09SDavid van Moolenbroek 	textregion.length = strlen(findtype);
2905*00b67f09SDavid van Moolenbroek 	dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
2906*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
2907*00b67f09SDavid van Moolenbroek 		t_info("dns_rdatatype_fromtext %s failed %s\n",
2908*00b67f09SDavid van Moolenbroek 				findtype,
2909*00b67f09SDavid van Moolenbroek 				dns_result_totext(dns_result));
2910*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
2911*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
2912*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
2913*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
2914*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
2915*00b67f09SDavid van Moolenbroek 	}
2916*00b67f09SDavid van Moolenbroek 
2917*00b67f09SDavid van Moolenbroek 	if (strstr(findopts, "DNS_DBFIND_GLUEOK"))
2918*00b67f09SDavid van Moolenbroek 		opts |= DNS_DBFIND_GLUEOK;
2919*00b67f09SDavid van Moolenbroek 	if (strstr(findopts, "DNS_DBFIND_VALIDATEGLUE"))
2920*00b67f09SDavid van Moolenbroek 		opts |= DNS_DBFIND_VALIDATEGLUE;
2921*00b67f09SDavid van Moolenbroek 
2922*00b67f09SDavid van Moolenbroek 	isc_stdtime_get(&now);
2923*00b67f09SDavid van Moolenbroek 
2924*00b67f09SDavid van Moolenbroek 	ftime = strtol(findtime, NULL, 10);
2925*00b67f09SDavid van Moolenbroek 	if (ftime != 0)
2926*00b67f09SDavid van Moolenbroek 		ftime += now;
2927*00b67f09SDavid van Moolenbroek 
2928*00b67f09SDavid van Moolenbroek 	cversionp = NULL;
2929*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&dns_foundname);
2930*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
2931*00b67f09SDavid van Moolenbroek 	if (dns_db_iszone(db))
2932*00b67f09SDavid van Moolenbroek 		dns_db_currentversion(db, &cversionp);
2933*00b67f09SDavid van Moolenbroek 	nodep = NULL;
2934*00b67f09SDavid van Moolenbroek 
2935*00b67f09SDavid van Moolenbroek 	dns_result = dns_db_find(db,
2936*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_findname),
2937*00b67f09SDavid van Moolenbroek 			cversionp,
2938*00b67f09SDavid van Moolenbroek 			rdatatype,
2939*00b67f09SDavid van Moolenbroek 			opts,
2940*00b67f09SDavid van Moolenbroek 			ftime,
2941*00b67f09SDavid van Moolenbroek 			&nodep,
2942*00b67f09SDavid van Moolenbroek 			dns_fixedname_name(&dns_foundname),
2943*00b67f09SDavid van Moolenbroek 			&rdataset, NULL);
2944*00b67f09SDavid van Moolenbroek 
2945*00b67f09SDavid van Moolenbroek 	if (dns_result != exp_result) {
2946*00b67f09SDavid van Moolenbroek 		t_info("dns_db_find %s %s unexpectedly returned %s, "
2947*00b67f09SDavid van Moolenbroek 		       "expected %s\n",
2948*00b67f09SDavid van Moolenbroek 		       findname, findtype, dns_result_totext(dns_result),
2949*00b67f09SDavid van Moolenbroek 		       dns_result_totext(exp_result));
2950*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
2951*00b67f09SDavid van Moolenbroek 	} else {
2952*00b67f09SDavid van Moolenbroek 		result = T_PASS;
2953*00b67f09SDavid van Moolenbroek 	}
2954*00b67f09SDavid van Moolenbroek 
2955*00b67f09SDavid van Moolenbroek 	if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2956*00b67f09SDavid van Moolenbroek 
2957*00b67f09SDavid van Moolenbroek 		if ((dns_result != DNS_R_NXRRSET) &&
2958*00b67f09SDavid van Moolenbroek 		    (dns_result != DNS_R_ZONECUT))
2959*00b67f09SDavid van Moolenbroek 			if (dns_rdataset_isassociated(&rdataset))
2960*00b67f09SDavid van Moolenbroek 				dns_rdataset_disassociate(&rdataset);
2961*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &nodep);
2962*00b67f09SDavid van Moolenbroek 	}
2963*00b67f09SDavid van Moolenbroek 
2964*00b67f09SDavid van Moolenbroek 	if (dns_db_iszone(db))
2965*00b67f09SDavid van Moolenbroek 		dns_db_closeversion(db, &cversionp, ISC_FALSE);
2966*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
2967*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
2968*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
2969*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
2970*00b67f09SDavid van Moolenbroek 
2971*00b67f09SDavid van Moolenbroek 	return(result);
2972*00b67f09SDavid van Moolenbroek }
2973*00b67f09SDavid van Moolenbroek 
2974*00b67f09SDavid van Moolenbroek static const char *a15 =
2975*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find(db, name, version, type, options, now, ...)  "
2976*00b67f09SDavid van Moolenbroek 	"finds the best match for 'name' and 'type' in version 'version' "
2977*00b67f09SDavid van Moolenbroek 	"of 'db'.";
2978*00b67f09SDavid van Moolenbroek 
2979*00b67f09SDavid van Moolenbroek static void
t15(void)2980*00b67f09SDavid van Moolenbroek t15(void) {
2981*00b67f09SDavid van Moolenbroek 	int	result;
2982*00b67f09SDavid van Moolenbroek 
2983*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 15, T_REQUIRED, "%s", a15);
2984*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_1_data", t_dns_db_find_x, 10);
2985*00b67f09SDavid van Moolenbroek 	t_result(result);
2986*00b67f09SDavid van Moolenbroek }
2987*00b67f09SDavid van Moolenbroek 
2988*00b67f09SDavid van Moolenbroek 
2989*00b67f09SDavid van Moolenbroek static const char *a16 =
2990*00b67f09SDavid van Moolenbroek 	"When the desired node and type were found, but are glue, "
2991*00b67f09SDavid van Moolenbroek 	"and the DNS_DBFIND_GLUEOK option is set, a call to "
2992*00b67f09SDavid van Moolenbroek 	"dns_db_find(db, name, version, type, options, now, ...)  "
2993*00b67f09SDavid van Moolenbroek 	"returns DNS_R_GLUE.";
2994*00b67f09SDavid van Moolenbroek 
2995*00b67f09SDavid van Moolenbroek static void
t16(void)2996*00b67f09SDavid van Moolenbroek t16(void) {
2997*00b67f09SDavid van Moolenbroek 	int	result;
2998*00b67f09SDavid van Moolenbroek 
2999*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 16, T_REQUIRED, "%s", a16);
3000*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_2_data", t_dns_db_find_x, 10);
3001*00b67f09SDavid van Moolenbroek 	t_result(result);
3002*00b67f09SDavid van Moolenbroek }
3003*00b67f09SDavid van Moolenbroek 
3004*00b67f09SDavid van Moolenbroek static const char *a17 =
3005*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find() returns DNS_R_DELEGATION when the data "
3006*00b67f09SDavid van Moolenbroek 	"requested is beneath a zone cut.";
3007*00b67f09SDavid van Moolenbroek 
3008*00b67f09SDavid van Moolenbroek static void
t17(void)3009*00b67f09SDavid van Moolenbroek t17(void) {
3010*00b67f09SDavid van Moolenbroek 	int	result;
3011*00b67f09SDavid van Moolenbroek 
3012*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 17, T_REQUIRED, "%s", a17);
3013*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_3_data", t_dns_db_find_x, 10);
3014*00b67f09SDavid van Moolenbroek 	t_result(result);
3015*00b67f09SDavid van Moolenbroek }
3016*00b67f09SDavid van Moolenbroek 
3017*00b67f09SDavid van Moolenbroek static const char *a18 =
3018*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find() returns DNS_R_DELEGATION when type is "
3019*00b67f09SDavid van Moolenbroek 	"dns_rdatatype_any and the desired node is a zone cut.";
3020*00b67f09SDavid van Moolenbroek 
3021*00b67f09SDavid van Moolenbroek static void
t18(void)3022*00b67f09SDavid van Moolenbroek t18(void) {
3023*00b67f09SDavid van Moolenbroek 	int	result;
3024*00b67f09SDavid van Moolenbroek 
3025*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 18, T_REQUIRED, "%s", a18);
3026*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_4_data", t_dns_db_find_x, 10);
3027*00b67f09SDavid van Moolenbroek 	t_result(result);
3028*00b67f09SDavid van Moolenbroek }
3029*00b67f09SDavid van Moolenbroek 
3030*00b67f09SDavid van Moolenbroek static const char *a19 =
3031*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find() returns DNS_R_DNAME when the data "
3032*00b67f09SDavid van Moolenbroek 	"requested is beneath a DNAME.";
3033*00b67f09SDavid van Moolenbroek 
3034*00b67f09SDavid van Moolenbroek static void
t19(void)3035*00b67f09SDavid van Moolenbroek t19(void) {
3036*00b67f09SDavid van Moolenbroek 	int	result;
3037*00b67f09SDavid van Moolenbroek 
3038*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 19, T_REQUIRED, "%s", a19);
3039*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_5_data", t_dns_db_find_x, 10);
3040*00b67f09SDavid van Moolenbroek 	t_result(result);
3041*00b67f09SDavid van Moolenbroek }
3042*00b67f09SDavid van Moolenbroek 
3043*00b67f09SDavid van Moolenbroek static const char *a20 =
3044*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find() returns DNS_R_CNAME when the requested "
3045*00b67f09SDavid van Moolenbroek 	"rdataset was not found but there is a CNAME at the desired name.";
3046*00b67f09SDavid van Moolenbroek 
3047*00b67f09SDavid van Moolenbroek static void
t20(void)3048*00b67f09SDavid van Moolenbroek t20(void) {
3049*00b67f09SDavid van Moolenbroek 	int	result;
3050*00b67f09SDavid van Moolenbroek 
3051*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 20, T_REQUIRED, "%s", a20);
3052*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_6_data", t_dns_db_find_x, 10);
3053*00b67f09SDavid van Moolenbroek 	t_result(result);
3054*00b67f09SDavid van Moolenbroek }
3055*00b67f09SDavid van Moolenbroek 
3056*00b67f09SDavid van Moolenbroek static const char *a21 =
3057*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find() returns DNS_R_NXDOMAIN when name "
3058*00b67f09SDavid van Moolenbroek 	"does not exist.";
3059*00b67f09SDavid van Moolenbroek 
3060*00b67f09SDavid van Moolenbroek static void
t21(void)3061*00b67f09SDavid van Moolenbroek t21(void) {
3062*00b67f09SDavid van Moolenbroek 	int	result;
3063*00b67f09SDavid van Moolenbroek 
3064*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 21, T_REQUIRED, "%s", a21);
3065*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_7_data", t_dns_db_find_x, 10);
3066*00b67f09SDavid van Moolenbroek 	t_result(result);
3067*00b67f09SDavid van Moolenbroek }
3068*00b67f09SDavid van Moolenbroek 
3069*00b67f09SDavid van Moolenbroek static const char *a22 =
3070*00b67f09SDavid van Moolenbroek 	"A call to dns_db_find() returns DNS_R_NXRRSET when "
3071*00b67f09SDavid van Moolenbroek 	"the desired name exists, but the desired type does not.";
3072*00b67f09SDavid van Moolenbroek 
3073*00b67f09SDavid van Moolenbroek static void
t22(void)3074*00b67f09SDavid van Moolenbroek t22(void) {
3075*00b67f09SDavid van Moolenbroek 	int	result;
3076*00b67f09SDavid van Moolenbroek 
3077*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 22, T_REQUIRED, "%s", a22);
3078*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_8_data", t_dns_db_find_x, 10);
3079*00b67f09SDavid van Moolenbroek 	t_result(result);
3080*00b67f09SDavid van Moolenbroek }
3081*00b67f09SDavid van Moolenbroek 
3082*00b67f09SDavid van Moolenbroek static const char *a23 =
3083*00b67f09SDavid van Moolenbroek 	"When db is a cache database, a call to dns_db_find() "
3084*00b67f09SDavid van Moolenbroek 	"returns ISC_R_NOTFOUND when the desired name does not exist, "
3085*00b67f09SDavid van Moolenbroek 	"and no delegation could be found.";
3086*00b67f09SDavid van Moolenbroek 
3087*00b67f09SDavid van Moolenbroek static void
t23(void)3088*00b67f09SDavid van Moolenbroek t23(void) {
3089*00b67f09SDavid van Moolenbroek 	int	result;
3090*00b67f09SDavid van Moolenbroek 
3091*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 23, T_REQUIRED, "%s", a23);
3092*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_9_data", t_dns_db_find_x, 10);
3093*00b67f09SDavid van Moolenbroek 	t_result(result);
3094*00b67f09SDavid van Moolenbroek }
3095*00b67f09SDavid van Moolenbroek 
3096*00b67f09SDavid van Moolenbroek static const char *a24 =
3097*00b67f09SDavid van Moolenbroek 	"When db is a cache database, an rdataset will be found only "
3098*00b67f09SDavid van Moolenbroek 	"if at least one rdataset at the found node expires after 'now'.";
3099*00b67f09SDavid van Moolenbroek 
3100*00b67f09SDavid van Moolenbroek static void
t24(void)3101*00b67f09SDavid van Moolenbroek t24(void) {
3102*00b67f09SDavid van Moolenbroek 	int	result;
3103*00b67f09SDavid van Moolenbroek 
3104*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_find", 24, T_REQUIRED, "%s", a24);
3105*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_find_10_data", t_dns_db_find_x, 10);
3106*00b67f09SDavid van Moolenbroek 	t_result(result);
3107*00b67f09SDavid van Moolenbroek }
3108*00b67f09SDavid van Moolenbroek 
3109*00b67f09SDavid van Moolenbroek static const char *a25 =
3110*00b67f09SDavid van Moolenbroek 	"A call to dns_db_load(db, filename) returns DNS_R_NOTZONETOP "
3111*00b67f09SDavid van Moolenbroek 	"when the zone data contains a SOA not at the zone apex.";
3112*00b67f09SDavid van Moolenbroek 
3113*00b67f09SDavid van Moolenbroek static void
t25(void)3114*00b67f09SDavid van Moolenbroek t25(void) {
3115*00b67f09SDavid van Moolenbroek 	int	result;
3116*00b67f09SDavid van Moolenbroek 
3117*00b67f09SDavid van Moolenbroek 	t_assert("dns_db_load", 25, T_REQUIRED, "%s", a25);
3118*00b67f09SDavid van Moolenbroek 	result = t_eval("dns_db_load_soa_not_top", t_dns_db_load, 9);
3119*00b67f09SDavid van Moolenbroek 	t_result(result);
3120*00b67f09SDavid van Moolenbroek }
3121*00b67f09SDavid van Moolenbroek 
3122*00b67f09SDavid van Moolenbroek testspec_t	T_testlist[] = {
3123*00b67f09SDavid van Moolenbroek 	{	(PFV) t1,		"dns_db_load"		},
3124*00b67f09SDavid van Moolenbroek 	{	(PFV) t2,		"dns_db_iscache"	},
3125*00b67f09SDavid van Moolenbroek 	{	(PFV) t3,		"dns_db_iscache"	},
3126*00b67f09SDavid van Moolenbroek 	{	(PFV) t4,		"dns_db_iszone"		},
3127*00b67f09SDavid van Moolenbroek 	{	(PFV) t5,		"dns_db_iszone"		},
3128*00b67f09SDavid van Moolenbroek 	{	(PFV) t6,		"dns_db_origin"		},
3129*00b67f09SDavid van Moolenbroek 	{	(PFV) t7,		"dns_db_class"		},
3130*00b67f09SDavid van Moolenbroek 	{	(PFV) t8,		"dns_db_currentversion"	},
3131*00b67f09SDavid van Moolenbroek 	{	(PFV) t9,		"dns_db_newversion"	},
3132*00b67f09SDavid van Moolenbroek 	{	(PFV) t10,		"dns_db_closeversion"	},
3133*00b67f09SDavid van Moolenbroek 	{	(PFV) t11,		"dns_db_closeversion"	},
3134*00b67f09SDavid van Moolenbroek 	{	(PFV) t12,		"dns_db_expirenode"	},
3135*00b67f09SDavid van Moolenbroek 	{	(PFV) t13,		"dns_db_findnode"	},
3136*00b67f09SDavid van Moolenbroek 	{	(PFV) t14,		"dns_db_findnode"	},
3137*00b67f09SDavid van Moolenbroek 	{	(PFV) t15,		"dns_db_find"		},
3138*00b67f09SDavid van Moolenbroek 	{	(PFV) t16,		"dns_db_find"		},
3139*00b67f09SDavid van Moolenbroek 	{	(PFV) t17,		"dns_db_find"		},
3140*00b67f09SDavid van Moolenbroek 	{	(PFV) t18,		"dns_db_find"		},
3141*00b67f09SDavid van Moolenbroek 	{	(PFV) t19,		"dns_db_find"		},
3142*00b67f09SDavid van Moolenbroek 	{	(PFV) t20,		"dns_db_find"		},
3143*00b67f09SDavid van Moolenbroek 	{	(PFV) t21,		"dns_db_find"		},
3144*00b67f09SDavid van Moolenbroek 	{	(PFV) t22,		"dns_db_find"		},
3145*00b67f09SDavid van Moolenbroek 	{	(PFV) t23,		"dns_db_find"		},
3146*00b67f09SDavid van Moolenbroek 	{	(PFV) t24,		"dns_db_find"		},
3147*00b67f09SDavid van Moolenbroek 	{	(PFV) t25,		"dns_db_load"		},
3148*00b67f09SDavid van Moolenbroek 	{	(PFV) 0,		NULL			}
3149*00b67f09SDavid van Moolenbroek };
3150*00b67f09SDavid van Moolenbroek 
3151*00b67f09SDavid van Moolenbroek #ifdef WIN32
3152*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)3153*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
3154*00b67f09SDavid van Moolenbroek 	t_settests(T_testlist);
3155*00b67f09SDavid van Moolenbroek 	return (t_main(argc, argv));
3156*00b67f09SDavid van Moolenbroek }
3157*00b67f09SDavid van Moolenbroek #endif
3158