xref: /minix/external/bsd/bind/dist/lib/dns/tests/dnstest.c (revision 00b67f09)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: dnstest.c,v 1.1.1.6 2014/12/10 03:34:42 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011-2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*! \file */
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <time.h>
26*00b67f09SDavid van Moolenbroek #include <unistd.h>
27*00b67f09SDavid van Moolenbroek 
28*00b67f09SDavid van Moolenbroek #include <isc/app.h>
29*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
30*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
31*00b67f09SDavid van Moolenbroek #include <isc/hash.h>
32*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
33*00b67f09SDavid van Moolenbroek #include <isc/os.h>
34*00b67f09SDavid van Moolenbroek #include <isc/string.h>
35*00b67f09SDavid van Moolenbroek #include <isc/socket.h>
36*00b67f09SDavid van Moolenbroek #include <isc/task.h>
37*00b67f09SDavid van Moolenbroek #include <isc/timer.h>
38*00b67f09SDavid van Moolenbroek #include <isc/util.h>
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek #include <dns/db.h>
41*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
42*00b67f09SDavid van Moolenbroek #include <dns/log.h>
43*00b67f09SDavid van Moolenbroek #include <dns/name.h>
44*00b67f09SDavid van Moolenbroek #include <dns/result.h>
45*00b67f09SDavid van Moolenbroek #include <dns/view.h>
46*00b67f09SDavid van Moolenbroek #include <dns/zone.h>
47*00b67f09SDavid van Moolenbroek 
48*00b67f09SDavid van Moolenbroek #include <dst/dst.h>
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek #include "dnstest.h"
51*00b67f09SDavid van Moolenbroek 
52*00b67f09SDavid van Moolenbroek isc_mem_t *mctx = NULL;
53*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx = NULL;
54*00b67f09SDavid van Moolenbroek isc_log_t *lctx = NULL;
55*00b67f09SDavid van Moolenbroek isc_taskmgr_t *taskmgr = NULL;
56*00b67f09SDavid van Moolenbroek isc_task_t *maintask = NULL;
57*00b67f09SDavid van Moolenbroek isc_timermgr_t *timermgr = NULL;
58*00b67f09SDavid van Moolenbroek isc_socketmgr_t *socketmgr = NULL;
59*00b67f09SDavid van Moolenbroek dns_zonemgr_t *zonemgr = NULL;
60*00b67f09SDavid van Moolenbroek isc_boolean_t app_running = ISC_FALSE;
61*00b67f09SDavid van Moolenbroek int ncpus;
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek static isc_boolean_t hash_active = ISC_FALSE, dst_active = ISC_FALSE;
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek /*
66*00b67f09SDavid van Moolenbroek  * Logging categories: this needs to match the list in bin/named/log.c.
67*00b67f09SDavid van Moolenbroek  */
68*00b67f09SDavid van Moolenbroek static isc_logcategory_t categories[] = {
69*00b67f09SDavid van Moolenbroek 		{ "",                0 },
70*00b67f09SDavid van Moolenbroek 		{ "client",          0 },
71*00b67f09SDavid van Moolenbroek 		{ "network",         0 },
72*00b67f09SDavid van Moolenbroek 		{ "update",          0 },
73*00b67f09SDavid van Moolenbroek 		{ "queries",         0 },
74*00b67f09SDavid van Moolenbroek 		{ "unmatched",       0 },
75*00b67f09SDavid van Moolenbroek 		{ "update-security", 0 },
76*00b67f09SDavid van Moolenbroek 		{ "query-errors",    0 },
77*00b67f09SDavid van Moolenbroek 		{ NULL,              0 }
78*00b67f09SDavid van Moolenbroek };
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek static void
cleanup_managers(void)81*00b67f09SDavid van Moolenbroek cleanup_managers(void) {
82*00b67f09SDavid van Moolenbroek 	if (app_running)
83*00b67f09SDavid van Moolenbroek 		isc_app_finish();
84*00b67f09SDavid van Moolenbroek 	if (socketmgr != NULL)
85*00b67f09SDavid van Moolenbroek 		isc_socketmgr_destroy(&socketmgr);
86*00b67f09SDavid van Moolenbroek 	if (maintask != NULL)
87*00b67f09SDavid van Moolenbroek 		isc_task_destroy(&maintask);
88*00b67f09SDavid van Moolenbroek 	if (taskmgr != NULL)
89*00b67f09SDavid van Moolenbroek 		isc_taskmgr_destroy(&taskmgr);
90*00b67f09SDavid van Moolenbroek 	if (timermgr != NULL)
91*00b67f09SDavid van Moolenbroek 		isc_timermgr_destroy(&timermgr);
92*00b67f09SDavid van Moolenbroek }
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek static isc_result_t
create_managers(void)95*00b67f09SDavid van Moolenbroek create_managers(void) {
96*00b67f09SDavid van Moolenbroek 	isc_result_t result;
97*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_USETHREADS
98*00b67f09SDavid van Moolenbroek 	ncpus = isc_os_ncpus();
99*00b67f09SDavid van Moolenbroek #else
100*00b67f09SDavid van Moolenbroek 	ncpus = 1;
101*00b67f09SDavid van Moolenbroek #endif
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr));
104*00b67f09SDavid van Moolenbroek 	CHECK(isc_timermgr_create(mctx, &timermgr));
105*00b67f09SDavid van Moolenbroek 	CHECK(isc_socketmgr_create(mctx, &socketmgr));
106*00b67f09SDavid van Moolenbroek 	CHECK(isc_task_create(taskmgr, 0, &maintask));
107*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek   cleanup:
110*00b67f09SDavid van Moolenbroek 	cleanup_managers();
111*00b67f09SDavid van Moolenbroek 	return (result);
112*00b67f09SDavid van Moolenbroek }
113*00b67f09SDavid van Moolenbroek 
114*00b67f09SDavid van Moolenbroek isc_result_t
dns_test_begin(FILE * logfile,isc_boolean_t start_managers)115*00b67f09SDavid van Moolenbroek dns_test_begin(FILE *logfile, isc_boolean_t start_managers) {
116*00b67f09SDavid van Moolenbroek 	isc_result_t result;
117*00b67f09SDavid van Moolenbroek 
118*00b67f09SDavid van Moolenbroek 	if (start_managers)
119*00b67f09SDavid van Moolenbroek 		CHECK(isc_app_start());
120*00b67f09SDavid van Moolenbroek 	isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
121*00b67f09SDavid van Moolenbroek 	CHECK(isc_mem_create(0, 0, &mctx));
122*00b67f09SDavid van Moolenbroek 	CHECK(isc_entropy_create(mctx, &ectx));
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek 	CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
125*00b67f09SDavid van Moolenbroek 	hash_active = ISC_TRUE;
126*00b67f09SDavid van Moolenbroek 
127*00b67f09SDavid van Moolenbroek 	CHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_BLOCKING));
128*00b67f09SDavid van Moolenbroek 	dst_active = ISC_TRUE;
129*00b67f09SDavid van Moolenbroek 
130*00b67f09SDavid van Moolenbroek 	if (logfile != NULL) {
131*00b67f09SDavid van Moolenbroek 		isc_logdestination_t destination;
132*00b67f09SDavid van Moolenbroek 		isc_logconfig_t *logconfig = NULL;
133*00b67f09SDavid van Moolenbroek 
134*00b67f09SDavid van Moolenbroek 		CHECK(isc_log_create(mctx, &lctx, &logconfig));
135*00b67f09SDavid van Moolenbroek 		isc_log_registercategories(lctx, categories);
136*00b67f09SDavid van Moolenbroek 		isc_log_setcontext(lctx);
137*00b67f09SDavid van Moolenbroek 		dns_log_init(lctx);
138*00b67f09SDavid van Moolenbroek 		dns_log_setcontext(lctx);
139*00b67f09SDavid van Moolenbroek 
140*00b67f09SDavid van Moolenbroek 		destination.file.stream = logfile;
141*00b67f09SDavid van Moolenbroek 		destination.file.name = NULL;
142*00b67f09SDavid van Moolenbroek 		destination.file.versions = ISC_LOG_ROLLNEVER;
143*00b67f09SDavid van Moolenbroek 		destination.file.maximum_size = 0;
144*00b67f09SDavid van Moolenbroek 		CHECK(isc_log_createchannel(logconfig, "stderr",
145*00b67f09SDavid van Moolenbroek 					    ISC_LOG_TOFILEDESC,
146*00b67f09SDavid van Moolenbroek 					    ISC_LOG_DYNAMIC,
147*00b67f09SDavid van Moolenbroek 					    &destination, 0));
148*00b67f09SDavid van Moolenbroek 		CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL));
149*00b67f09SDavid van Moolenbroek 	}
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek 	dns_result_register();
152*00b67f09SDavid van Moolenbroek 
153*00b67f09SDavid van Moolenbroek 	if (start_managers)
154*00b67f09SDavid van Moolenbroek 		CHECK(create_managers());
155*00b67f09SDavid van Moolenbroek 
156*00b67f09SDavid van Moolenbroek 	/*
157*00b67f09SDavid van Moolenbroek 	 * atf-run changes us to a /tmp directory, so tests
158*00b67f09SDavid van Moolenbroek 	 * that access test data files must first chdir to the proper
159*00b67f09SDavid van Moolenbroek 	 * location.
160*00b67f09SDavid van Moolenbroek 	 */
161*00b67f09SDavid van Moolenbroek 	if (chdir(TESTS) == -1)
162*00b67f09SDavid van Moolenbroek 		CHECK(ISC_R_FAILURE);
163*00b67f09SDavid van Moolenbroek 
164*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
165*00b67f09SDavid van Moolenbroek 
166*00b67f09SDavid van Moolenbroek   cleanup:
167*00b67f09SDavid van Moolenbroek 	dns_test_end();
168*00b67f09SDavid van Moolenbroek 	return (result);
169*00b67f09SDavid van Moolenbroek }
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek void
dns_test_end(void)172*00b67f09SDavid van Moolenbroek dns_test_end(void) {
173*00b67f09SDavid van Moolenbroek 	if (lctx != NULL)
174*00b67f09SDavid van Moolenbroek 		isc_log_destroy(&lctx);
175*00b67f09SDavid van Moolenbroek 	if (dst_active) {
176*00b67f09SDavid van Moolenbroek 		dst_lib_destroy();
177*00b67f09SDavid van Moolenbroek 		dst_active = ISC_FALSE;
178*00b67f09SDavid van Moolenbroek 	}
179*00b67f09SDavid van Moolenbroek 	if (hash_active) {
180*00b67f09SDavid van Moolenbroek 		isc_hash_destroy();
181*00b67f09SDavid van Moolenbroek 		hash_active = ISC_FALSE;
182*00b67f09SDavid van Moolenbroek 	}
183*00b67f09SDavid van Moolenbroek 	if (ectx != NULL)
184*00b67f09SDavid van Moolenbroek 		isc_entropy_detach(&ectx);
185*00b67f09SDavid van Moolenbroek 
186*00b67f09SDavid van Moolenbroek 	cleanup_managers();
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	if (mctx != NULL)
189*00b67f09SDavid van Moolenbroek 		isc_mem_destroy(&mctx);
190*00b67f09SDavid van Moolenbroek }
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek /*
193*00b67f09SDavid van Moolenbroek  * Create a zone with origin 'name', return a pointer to the zone object in
194*00b67f09SDavid van Moolenbroek  * 'zonep'.  If 'view' is set, add the zone to that view; otherwise, create
195*00b67f09SDavid van Moolenbroek  * a new view for the purpose.
196*00b67f09SDavid van Moolenbroek  *
197*00b67f09SDavid van Moolenbroek  * If the created view is going to be needed by the caller subsequently,
198*00b67f09SDavid van Moolenbroek  * then 'keepview' should be set to true; this will prevent the view
199*00b67f09SDavid van Moolenbroek  * from being detached.  In this case, the caller is responsible for
200*00b67f09SDavid van Moolenbroek  * detaching the view.
201*00b67f09SDavid van Moolenbroek  */
202*00b67f09SDavid van Moolenbroek isc_result_t
dns_test_makezone(const char * name,dns_zone_t ** zonep,dns_view_t * view,isc_boolean_t keepview)203*00b67f09SDavid van Moolenbroek dns_test_makezone(const char *name, dns_zone_t **zonep, dns_view_t *view,
204*00b67f09SDavid van Moolenbroek 		  isc_boolean_t keepview)
205*00b67f09SDavid van Moolenbroek {
206*00b67f09SDavid van Moolenbroek 	isc_result_t result;
207*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone = NULL;
208*00b67f09SDavid van Moolenbroek 	isc_buffer_t buffer;
209*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixorigin;
210*00b67f09SDavid van Moolenbroek 	dns_name_t *origin;
211*00b67f09SDavid van Moolenbroek 
212*00b67f09SDavid van Moolenbroek 	if (view == NULL)
213*00b67f09SDavid van Moolenbroek 		CHECK(dns_view_create(mctx, dns_rdataclass_in, "view", &view));
214*00b67f09SDavid van Moolenbroek 	else if (!keepview)
215*00b67f09SDavid van Moolenbroek 		keepview = ISC_TRUE;
216*00b67f09SDavid van Moolenbroek 
217*00b67f09SDavid van Moolenbroek 	zone = *zonep;
218*00b67f09SDavid van Moolenbroek 	if (zone == NULL)
219*00b67f09SDavid van Moolenbroek 		CHECK(dns_zone_create(&zone, mctx));
220*00b67f09SDavid van Moolenbroek 
221*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&buffer, name, strlen(name));
222*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&buffer, strlen(name));
223*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixorigin);
224*00b67f09SDavid van Moolenbroek 	origin = dns_fixedname_name(&fixorigin);
225*00b67f09SDavid van Moolenbroek 	CHECK(dns_name_fromtext(origin, &buffer, dns_rootname, 0, NULL));
226*00b67f09SDavid van Moolenbroek 	CHECK(dns_zone_setorigin(zone, origin));
227*00b67f09SDavid van Moolenbroek 	dns_zone_setview(zone, view);
228*00b67f09SDavid van Moolenbroek 	dns_zone_settype(zone, dns_zone_master);
229*00b67f09SDavid van Moolenbroek 	dns_zone_setclass(zone, view->rdclass);
230*00b67f09SDavid van Moolenbroek 	dns_view_addzone(view, zone);
231*00b67f09SDavid van Moolenbroek 
232*00b67f09SDavid van Moolenbroek 	if (!keepview)
233*00b67f09SDavid van Moolenbroek 		dns_view_detach(&view);
234*00b67f09SDavid van Moolenbroek 
235*00b67f09SDavid van Moolenbroek 	*zonep = zone;
236*00b67f09SDavid van Moolenbroek 
237*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
238*00b67f09SDavid van Moolenbroek 
239*00b67f09SDavid van Moolenbroek   cleanup:
240*00b67f09SDavid van Moolenbroek 	if (zone != NULL)
241*00b67f09SDavid van Moolenbroek 		dns_zone_detach(&zone);
242*00b67f09SDavid van Moolenbroek 	if (view != NULL)
243*00b67f09SDavid van Moolenbroek 		dns_view_detach(&view);
244*00b67f09SDavid van Moolenbroek 	return (result);
245*00b67f09SDavid van Moolenbroek }
246*00b67f09SDavid van Moolenbroek 
247*00b67f09SDavid van Moolenbroek isc_result_t
dns_test_setupzonemgr(void)248*00b67f09SDavid van Moolenbroek dns_test_setupzonemgr(void) {
249*00b67f09SDavid van Moolenbroek 	isc_result_t result;
250*00b67f09SDavid van Moolenbroek 	REQUIRE(zonemgr == NULL);
251*00b67f09SDavid van Moolenbroek 
252*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr,
253*00b67f09SDavid van Moolenbroek 				    &zonemgr);
254*00b67f09SDavid van Moolenbroek 	return (result);
255*00b67f09SDavid van Moolenbroek }
256*00b67f09SDavid van Moolenbroek 
257*00b67f09SDavid van Moolenbroek isc_result_t
dns_test_managezone(dns_zone_t * zone)258*00b67f09SDavid van Moolenbroek dns_test_managezone(dns_zone_t *zone) {
259*00b67f09SDavid van Moolenbroek 	isc_result_t result;
260*00b67f09SDavid van Moolenbroek 	REQUIRE(zonemgr != NULL);
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_setsize(zonemgr, 1);
263*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
264*00b67f09SDavid van Moolenbroek 		return (result);
265*00b67f09SDavid van Moolenbroek 
266*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_managezone(zonemgr, zone);
267*00b67f09SDavid van Moolenbroek 	return (result);
268*00b67f09SDavid van Moolenbroek }
269*00b67f09SDavid van Moolenbroek 
270*00b67f09SDavid van Moolenbroek void
dns_test_releasezone(dns_zone_t * zone)271*00b67f09SDavid van Moolenbroek dns_test_releasezone(dns_zone_t *zone) {
272*00b67f09SDavid van Moolenbroek 	REQUIRE(zonemgr != NULL);
273*00b67f09SDavid van Moolenbroek 	dns_zonemgr_releasezone(zonemgr, zone);
274*00b67f09SDavid van Moolenbroek }
275*00b67f09SDavid van Moolenbroek 
276*00b67f09SDavid van Moolenbroek void
dns_test_closezonemgr(void)277*00b67f09SDavid van Moolenbroek dns_test_closezonemgr(void) {
278*00b67f09SDavid van Moolenbroek 	REQUIRE(zonemgr != NULL);
279*00b67f09SDavid van Moolenbroek 
280*00b67f09SDavid van Moolenbroek 	dns_zonemgr_shutdown(zonemgr);
281*00b67f09SDavid van Moolenbroek 	dns_zonemgr_detach(&zonemgr);
282*00b67f09SDavid van Moolenbroek }
283*00b67f09SDavid van Moolenbroek 
284*00b67f09SDavid van Moolenbroek /*
285*00b67f09SDavid van Moolenbroek  * Sleep for 'usec' microseconds.
286*00b67f09SDavid van Moolenbroek  */
287*00b67f09SDavid van Moolenbroek void
dns_test_nap(isc_uint32_t usec)288*00b67f09SDavid van Moolenbroek dns_test_nap(isc_uint32_t usec) {
289*00b67f09SDavid van Moolenbroek #ifdef HAVE_NANOSLEEP
290*00b67f09SDavid van Moolenbroek 	struct timespec ts;
291*00b67f09SDavid van Moolenbroek 
292*00b67f09SDavid van Moolenbroek 	ts.tv_sec = usec / 1000000;
293*00b67f09SDavid van Moolenbroek 	ts.tv_nsec = (usec % 1000000) * 1000;
294*00b67f09SDavid van Moolenbroek 	nanosleep(&ts, NULL);
295*00b67f09SDavid van Moolenbroek #elif HAVE_USLEEP
296*00b67f09SDavid van Moolenbroek 	usleep(usec);
297*00b67f09SDavid van Moolenbroek #else
298*00b67f09SDavid van Moolenbroek 	/*
299*00b67f09SDavid van Moolenbroek 	 * No fractional-second sleep function is available, so we
300*00b67f09SDavid van Moolenbroek 	 * round up to the nearest second and sleep instead
301*00b67f09SDavid van Moolenbroek 	 */
302*00b67f09SDavid van Moolenbroek 	sleep((usec / 1000000) + 1);
303*00b67f09SDavid van Moolenbroek #endif
304*00b67f09SDavid van Moolenbroek }
305*00b67f09SDavid van Moolenbroek 
306*00b67f09SDavid van Moolenbroek isc_result_t
dns_test_loaddb(dns_db_t ** db,dns_dbtype_t dbtype,const char * origin,const char * testfile)307*00b67f09SDavid van Moolenbroek dns_test_loaddb(dns_db_t **db, dns_dbtype_t dbtype, const char *origin,
308*00b67f09SDavid van Moolenbroek 		const char *testfile)
309*00b67f09SDavid van Moolenbroek {
310*00b67f09SDavid van Moolenbroek 	isc_result_t		result;
311*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		fixed;
312*00b67f09SDavid van Moolenbroek 	dns_name_t		*name;
313*00b67f09SDavid van Moolenbroek 
314*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
315*00b67f09SDavid van Moolenbroek 	name = dns_fixedname_name(&fixed);
316*00b67f09SDavid van Moolenbroek 
317*00b67f09SDavid van Moolenbroek 	result = dns_name_fromstring(name, origin, 0, NULL);
318*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
319*00b67f09SDavid van Moolenbroek 		return(result);
320*00b67f09SDavid van Moolenbroek 
321*00b67f09SDavid van Moolenbroek 	result = dns_db_create(mctx, "rbt", name, dbtype, dns_rdataclass_in,
322*00b67f09SDavid van Moolenbroek 			       0, NULL, db);
323*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
324*00b67f09SDavid van Moolenbroek 		return (result);
325*00b67f09SDavid van Moolenbroek 
326*00b67f09SDavid van Moolenbroek 	result = dns_db_load(*db, testfile);
327*00b67f09SDavid van Moolenbroek 	return (result);
328*00b67f09SDavid van Moolenbroek }
329