xref: /minix/external/bsd/bind/dist/lib/dns/tests/zt_test.c (revision 00b67f09)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: zt_test.c,v 1.1.1.4 2014/12/10 03:34:43 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*! \file */
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <atf-c.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <unistd.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #include <isc/app.h>
30*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
31*00b67f09SDavid van Moolenbroek #include <isc/task.h>
32*00b67f09SDavid van Moolenbroek #include <isc/timer.h>
33*00b67f09SDavid van Moolenbroek 
34*00b67f09SDavid van Moolenbroek #include <dns/db.h>
35*00b67f09SDavid van Moolenbroek #include <dns/name.h>
36*00b67f09SDavid van Moolenbroek #include <dns/view.h>
37*00b67f09SDavid van Moolenbroek #include <dns/zone.h>
38*00b67f09SDavid van Moolenbroek #include <dns/zt.h>
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek #include "dnstest.h"
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek struct args {
43*00b67f09SDavid van Moolenbroek 	void *arg1;
44*00b67f09SDavid van Moolenbroek 	void *arg2;
45*00b67f09SDavid van Moolenbroek };
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek /*
48*00b67f09SDavid van Moolenbroek  * Helper functions
49*00b67f09SDavid van Moolenbroek  */
50*00b67f09SDavid van Moolenbroek static isc_result_t
count_zone(dns_zone_t * zone,void * uap)51*00b67f09SDavid van Moolenbroek count_zone(dns_zone_t *zone, void *uap) {
52*00b67f09SDavid van Moolenbroek 	int *nzones = (int *)uap;
53*00b67f09SDavid van Moolenbroek 
54*00b67f09SDavid van Moolenbroek 	UNUSED(zone);
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek 	*nzones += 1;
57*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
58*00b67f09SDavid van Moolenbroek }
59*00b67f09SDavid van Moolenbroek 
60*00b67f09SDavid van Moolenbroek static isc_result_t
load_done(dns_zt_t * zt,dns_zone_t * zone,isc_task_t * task)61*00b67f09SDavid van Moolenbroek load_done(dns_zt_t *zt, dns_zone_t *zone, isc_task_t *task) {
62*00b67f09SDavid van Moolenbroek 	/* We treat zt as a pointer to a boolean for testing purposes */
63*00b67f09SDavid van Moolenbroek 	isc_boolean_t *done = (isc_boolean_t *) zt;
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek 	UNUSED(zone);
66*00b67f09SDavid van Moolenbroek 	UNUSED(task);
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek 	*done = ISC_TRUE;
69*00b67f09SDavid van Moolenbroek 	isc_app_shutdown();
70*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
71*00b67f09SDavid van Moolenbroek }
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek static isc_result_t
all_done(void * arg)74*00b67f09SDavid van Moolenbroek all_done(void *arg) {
75*00b67f09SDavid van Moolenbroek 	isc_boolean_t *done = (isc_boolean_t *) arg;
76*00b67f09SDavid van Moolenbroek 
77*00b67f09SDavid van Moolenbroek 	*done = ISC_TRUE;
78*00b67f09SDavid van Moolenbroek 	isc_app_shutdown();
79*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek static void
start_zt_asyncload(isc_task_t * task,isc_event_t * event)83*00b67f09SDavid van Moolenbroek start_zt_asyncload(isc_task_t *task, isc_event_t *event) {
84*00b67f09SDavid van Moolenbroek 	struct args *args = (struct args *)(event->ev_arg);
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek 	UNUSED(task);
87*00b67f09SDavid van Moolenbroek 
88*00b67f09SDavid van Moolenbroek 	dns_zt_asyncload(args->arg1, all_done, args->arg2);
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek 	isc_event_free(&event);
91*00b67f09SDavid van Moolenbroek }
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek static void
start_zone_asyncload(isc_task_t * task,isc_event_t * event)94*00b67f09SDavid van Moolenbroek start_zone_asyncload(isc_task_t *task, isc_event_t *event) {
95*00b67f09SDavid van Moolenbroek 	struct args *args = (struct args *)(event->ev_arg);
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek 	UNUSED(task);
98*00b67f09SDavid van Moolenbroek 
99*00b67f09SDavid van Moolenbroek 	dns_zone_asyncload(args->arg1, load_done, args->arg2);
100*00b67f09SDavid van Moolenbroek 	isc_event_free(&event);
101*00b67f09SDavid van Moolenbroek }
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek /*
104*00b67f09SDavid van Moolenbroek  * Individual unit tests
105*00b67f09SDavid van Moolenbroek  */
106*00b67f09SDavid van Moolenbroek ATF_TC(apply);
ATF_TC_HEAD(apply,tc)107*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(apply, tc) {
108*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "apply a function to a zone table");
109*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(apply,tc)110*00b67f09SDavid van Moolenbroek ATF_TC_BODY(apply, tc) {
111*00b67f09SDavid van Moolenbroek 	isc_result_t result;
112*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone = NULL;
113*00b67f09SDavid van Moolenbroek 	dns_view_t *view = NULL;
114*00b67f09SDavid van Moolenbroek 	int nzones = 0;
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
117*00b67f09SDavid van Moolenbroek 
118*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
119*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
120*00b67f09SDavid van Moolenbroek 
121*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("foo", &zone, NULL, ISC_TRUE);
122*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek 	view = dns_zone_getview(zone);
125*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(view->zonetable != NULL);
126*00b67f09SDavid van Moolenbroek 
127*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(0, nzones);
128*00b67f09SDavid van Moolenbroek 	result = dns_zt_apply(view->zonetable, ISC_FALSE, count_zone, &nzones);
129*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
130*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(1, nzones);
131*00b67f09SDavid van Moolenbroek 
132*00b67f09SDavid van Moolenbroek 	/* These steps are necessary so the zone can be detached properly */
133*00b67f09SDavid van Moolenbroek 	result = dns_test_setupzonemgr();
134*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
135*00b67f09SDavid van Moolenbroek 	result = dns_test_managezone(zone);
136*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
137*00b67f09SDavid van Moolenbroek 	dns_test_releasezone(zone);
138*00b67f09SDavid van Moolenbroek 	dns_test_closezonemgr();
139*00b67f09SDavid van Moolenbroek 
140*00b67f09SDavid van Moolenbroek 	/* The view was left attached in dns_test_makezone() */
141*00b67f09SDavid van Moolenbroek 	dns_view_detach(&view);
142*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone);
143*00b67f09SDavid van Moolenbroek 
144*00b67f09SDavid van Moolenbroek 	dns_test_end();
145*00b67f09SDavid van Moolenbroek }
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek ATF_TC(asyncload_zone);
ATF_TC_HEAD(asyncload_zone,tc)148*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(asyncload_zone, tc) {
149*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "asynchronous zone load");
150*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(asyncload_zone,tc)151*00b67f09SDavid van Moolenbroek ATF_TC_BODY(asyncload_zone, tc) {
152*00b67f09SDavid van Moolenbroek 	isc_result_t result;
153*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone = NULL;
154*00b67f09SDavid van Moolenbroek 	dns_view_t *view = NULL;
155*00b67f09SDavid van Moolenbroek 	dns_db_t *db = NULL;
156*00b67f09SDavid van Moolenbroek 	isc_boolean_t done = ISC_FALSE;
157*00b67f09SDavid van Moolenbroek 	int i = 0;
158*00b67f09SDavid van Moolenbroek 	struct args args;
159*00b67f09SDavid van Moolenbroek 
160*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
161*00b67f09SDavid van Moolenbroek 
162*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
163*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("foo", &zone, NULL, ISC_TRUE);
166*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 	result = dns_test_setupzonemgr();
169*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
170*00b67f09SDavid van Moolenbroek 	result = dns_test_managezone(zone);
171*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek 	view = dns_zone_getview(zone);
174*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(view->zonetable != NULL);
175*00b67f09SDavid van Moolenbroek 
176*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!dns__zone_loadpending(zone));
177*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!done);
178*00b67f09SDavid van Moolenbroek 	dns_zone_setfile(zone, "testdata/zt/zone1.db");
179*00b67f09SDavid van Moolenbroek 
180*00b67f09SDavid van Moolenbroek 	args.arg1 = zone;
181*00b67f09SDavid van Moolenbroek 	args.arg2 = &done;
182*00b67f09SDavid van Moolenbroek 	isc_app_onrun(mctx, maintask, start_zone_asyncload, &args);
183*00b67f09SDavid van Moolenbroek 
184*00b67f09SDavid van Moolenbroek 	isc_app_run();
185*00b67f09SDavid van Moolenbroek 	while (dns__zone_loadpending(zone) && i++ < 5000)
186*00b67f09SDavid van Moolenbroek 		dns_test_nap(1000);
187*00b67f09SDavid van Moolenbroek 	ATF_CHECK(done);
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek 	/* The zone should now be loaded; test it */
190*00b67f09SDavid van Moolenbroek 	result = dns_zone_getdb(zone, &db);
191*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
192*00b67f09SDavid van Moolenbroek 	ATF_CHECK(db != NULL);
193*00b67f09SDavid van Moolenbroek 	if (db != NULL)
194*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek 	dns_test_releasezone(zone);
197*00b67f09SDavid van Moolenbroek 	dns_test_closezonemgr();
198*00b67f09SDavid van Moolenbroek 
199*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone);
200*00b67f09SDavid van Moolenbroek 	dns_view_detach(&view);
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	dns_test_end();
203*00b67f09SDavid van Moolenbroek }
204*00b67f09SDavid van Moolenbroek 
205*00b67f09SDavid van Moolenbroek ATF_TC(asyncload_zt);
ATF_TC_HEAD(asyncload_zt,tc)206*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(asyncload_zt, tc) {
207*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "asynchronous zone table load");
208*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(asyncload_zt,tc)209*00b67f09SDavid van Moolenbroek ATF_TC_BODY(asyncload_zt, tc) {
210*00b67f09SDavid van Moolenbroek 	isc_result_t result;
211*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone1 = NULL, *zone2 = NULL, *zone3 = NULL;
212*00b67f09SDavid van Moolenbroek 	dns_view_t *view;
213*00b67f09SDavid van Moolenbroek 	dns_zt_t *zt;
214*00b67f09SDavid van Moolenbroek 	dns_db_t *db = NULL;
215*00b67f09SDavid van Moolenbroek 	isc_boolean_t done = ISC_FALSE;
216*00b67f09SDavid van Moolenbroek 	int i = 0;
217*00b67f09SDavid van Moolenbroek 	struct args args;
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
220*00b67f09SDavid van Moolenbroek 
221*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
222*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
223*00b67f09SDavid van Moolenbroek 
224*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("foo", &zone1, NULL, ISC_TRUE);
225*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
226*00b67f09SDavid van Moolenbroek 	dns_zone_setfile(zone1, "testdata/zt/zone1.db");
227*00b67f09SDavid van Moolenbroek 	view = dns_zone_getview(zone1);
228*00b67f09SDavid van Moolenbroek 
229*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("bar", &zone2, view, ISC_TRUE);
230*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
231*00b67f09SDavid van Moolenbroek 	dns_zone_setfile(zone2, "testdata/zt/zone1.db");
232*00b67f09SDavid van Moolenbroek 
233*00b67f09SDavid van Moolenbroek 	/* This one will fail to load */
234*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("fake", &zone3, view, ISC_TRUE);
235*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
236*00b67f09SDavid van Moolenbroek 	dns_zone_setfile(zone3, "testdata/zt/nonexistent.db");
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek 	zt = view->zonetable;
239*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(zt != NULL);
240*00b67f09SDavid van Moolenbroek 
241*00b67f09SDavid van Moolenbroek 	result = dns_test_setupzonemgr();
242*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
243*00b67f09SDavid van Moolenbroek 	result = dns_test_managezone(zone1);
244*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
245*00b67f09SDavid van Moolenbroek 	result = dns_test_managezone(zone2);
246*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
247*00b67f09SDavid van Moolenbroek 	result = dns_test_managezone(zone3);
248*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
249*00b67f09SDavid van Moolenbroek 
250*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!dns__zone_loadpending(zone1));
251*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!dns__zone_loadpending(zone2));
252*00b67f09SDavid van Moolenbroek 	ATF_CHECK(!done);
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek 	args.arg1 = zt;
255*00b67f09SDavid van Moolenbroek 	args.arg2 = &done;
256*00b67f09SDavid van Moolenbroek 	isc_app_onrun(mctx, maintask, start_zt_asyncload, &args);
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek 	isc_app_run();
259*00b67f09SDavid van Moolenbroek 	while (!done && i++ < 5000)
260*00b67f09SDavid van Moolenbroek 		dns_test_nap(1000);
261*00b67f09SDavid van Moolenbroek 	ATF_CHECK(done);
262*00b67f09SDavid van Moolenbroek 
263*00b67f09SDavid van Moolenbroek 	/* Both zones should now be loaded; test them */
264*00b67f09SDavid van Moolenbroek 	result = dns_zone_getdb(zone1, &db);
265*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
266*00b67f09SDavid van Moolenbroek 	ATF_CHECK(db != NULL);
267*00b67f09SDavid van Moolenbroek 	if (db != NULL)
268*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
269*00b67f09SDavid van Moolenbroek 
270*00b67f09SDavid van Moolenbroek 	result = dns_zone_getdb(zone2, &db);
271*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
272*00b67f09SDavid van Moolenbroek 	ATF_CHECK(db != NULL);
273*00b67f09SDavid van Moolenbroek 	if (db != NULL)
274*00b67f09SDavid van Moolenbroek 		dns_db_detach(&db);
275*00b67f09SDavid van Moolenbroek 
276*00b67f09SDavid van Moolenbroek 	dns_test_releasezone(zone3);
277*00b67f09SDavid van Moolenbroek 	dns_test_releasezone(zone2);
278*00b67f09SDavid van Moolenbroek 	dns_test_releasezone(zone1);
279*00b67f09SDavid van Moolenbroek 	dns_test_closezonemgr();
280*00b67f09SDavid van Moolenbroek 
281*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone1);
282*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone2);
283*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone3);
284*00b67f09SDavid van Moolenbroek 	dns_view_detach(&view);
285*00b67f09SDavid van Moolenbroek 
286*00b67f09SDavid van Moolenbroek 	dns_test_end();
287*00b67f09SDavid van Moolenbroek }
288*00b67f09SDavid van Moolenbroek 
289*00b67f09SDavid van Moolenbroek /*
290*00b67f09SDavid van Moolenbroek  * Main
291*00b67f09SDavid van Moolenbroek  */
ATF_TP_ADD_TCS(tp)292*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
293*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, apply);
294*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, asyncload_zone);
295*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, asyncload_zt);
296*00b67f09SDavid van Moolenbroek 	return (atf_no_error());
297*00b67f09SDavid van Moolenbroek }
298