xref: /minix3/external/bsd/bind/dist/lib/dns/tests/zonemgr_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: zonemgr_test.c,v 1.4 2015/07/08 17:28:59 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011-2013, 2015  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*! \file */
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <atf-c.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <unistd.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
30*00b67f09SDavid van Moolenbroek #include <isc/task.h>
31*00b67f09SDavid van Moolenbroek #include <isc/timer.h>
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include <dns/name.h>
34*00b67f09SDavid van Moolenbroek #include <dns/view.h>
35*00b67f09SDavid van Moolenbroek #include <dns/zone.h>
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek #include "dnstest.h"
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek /*
40*00b67f09SDavid van Moolenbroek  * Individual unit tests
41*00b67f09SDavid van Moolenbroek  */
42*00b67f09SDavid van Moolenbroek ATF_TC(zonemgr_create);
ATF_TC_HEAD(zonemgr_create,tc)43*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(zonemgr_create, tc) {
44*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "create zone manager");
45*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(zonemgr_create,tc)46*00b67f09SDavid van Moolenbroek ATF_TC_BODY(zonemgr_create, tc) {
47*00b67f09SDavid van Moolenbroek 	dns_zonemgr_t *myzonemgr = NULL;
48*00b67f09SDavid van Moolenbroek 	isc_result_t result;
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
51*00b67f09SDavid van Moolenbroek 
52*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
53*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
54*00b67f09SDavid van Moolenbroek 
55*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr,
56*00b67f09SDavid van Moolenbroek 				    &myzonemgr);
57*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek 	dns_zonemgr_shutdown(myzonemgr);
60*00b67f09SDavid van Moolenbroek 	dns_zonemgr_detach(&myzonemgr);
61*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(myzonemgr, NULL);
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek 	dns_test_end();
64*00b67f09SDavid van Moolenbroek }
65*00b67f09SDavid van Moolenbroek 
66*00b67f09SDavid van Moolenbroek 
67*00b67f09SDavid van Moolenbroek ATF_TC(zonemgr_managezone);
ATF_TC_HEAD(zonemgr_managezone,tc)68*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(zonemgr_managezone, tc) {
69*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "manage and release a zone");
70*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(zonemgr_managezone,tc)71*00b67f09SDavid van Moolenbroek ATF_TC_BODY(zonemgr_managezone, tc) {
72*00b67f09SDavid van Moolenbroek 	dns_zonemgr_t *myzonemgr = NULL;
73*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone = NULL;
74*00b67f09SDavid van Moolenbroek 	isc_result_t result;
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
77*00b67f09SDavid van Moolenbroek 
78*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
79*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
80*00b67f09SDavid van Moolenbroek 
81*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr,
82*00b67f09SDavid van Moolenbroek 				    &myzonemgr);
83*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("foo", &zone, NULL, ISC_FALSE);
86*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
87*00b67f09SDavid van Moolenbroek 
88*00b67f09SDavid van Moolenbroek 	/* This should not succeed until the dns_zonemgr_setsize() is run */
89*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_managezone(myzonemgr, zone);
90*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_FAILURE);
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_setsize(myzonemgr, 1);
95*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek 	/* Now it should succeed */
98*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_managezone(myzonemgr, zone);
99*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
100*00b67f09SDavid van Moolenbroek 
101*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 1);
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	dns_zonemgr_releasezone(myzonemgr, zone);
104*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone);
105*00b67f09SDavid van Moolenbroek 
106*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
107*00b67f09SDavid van Moolenbroek 
108*00b67f09SDavid van Moolenbroek 	dns_zonemgr_shutdown(myzonemgr);
109*00b67f09SDavid van Moolenbroek 	dns_zonemgr_detach(&myzonemgr);
110*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(myzonemgr, NULL);
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek 	dns_test_end();
113*00b67f09SDavid van Moolenbroek }
114*00b67f09SDavid van Moolenbroek 
115*00b67f09SDavid van Moolenbroek ATF_TC(zonemgr_createzone);
ATF_TC_HEAD(zonemgr_createzone,tc)116*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(zonemgr_createzone, tc) {
117*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "create and release a zone");
118*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(zonemgr_createzone,tc)119*00b67f09SDavid van Moolenbroek ATF_TC_BODY(zonemgr_createzone, tc) {
120*00b67f09SDavid van Moolenbroek 	dns_zonemgr_t *myzonemgr = NULL;
121*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone = NULL;
122*00b67f09SDavid van Moolenbroek 	isc_result_t result;
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
125*00b67f09SDavid van Moolenbroek 
126*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
127*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr,
130*00b67f09SDavid van Moolenbroek 				    &myzonemgr);
131*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek 	/* This should not succeed until the dns_zonemgr_setsize() is run */
134*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_createzone(myzonemgr, &zone);
135*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_FAILURE);
136*00b67f09SDavid van Moolenbroek 
137*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_setsize(myzonemgr, 1);
138*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
139*00b67f09SDavid van Moolenbroek 
140*00b67f09SDavid van Moolenbroek 	/* Now it should succeed */
141*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_createzone(myzonemgr, &zone);
142*00b67f09SDavid van Moolenbroek 	ATF_CHECK_EQ(result, ISC_R_SUCCESS);
143*00b67f09SDavid van Moolenbroek 	ATF_CHECK(zone != NULL);
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek 	if (zone != NULL)
146*00b67f09SDavid van Moolenbroek 		dns_zone_detach(&zone);
147*00b67f09SDavid van Moolenbroek 
148*00b67f09SDavid van Moolenbroek 	dns_zonemgr_shutdown(myzonemgr);
149*00b67f09SDavid van Moolenbroek 	dns_zonemgr_detach(&myzonemgr);
150*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(myzonemgr, NULL);
151*00b67f09SDavid van Moolenbroek 
152*00b67f09SDavid van Moolenbroek 	dns_test_end();
153*00b67f09SDavid van Moolenbroek }
154*00b67f09SDavid van Moolenbroek 
155*00b67f09SDavid van Moolenbroek ATF_TC(zonemgr_unreachable);
ATF_TC_HEAD(zonemgr_unreachable,tc)156*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(zonemgr_unreachable, tc) {
157*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "manage and release a zone");
158*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(zonemgr_unreachable,tc)159*00b67f09SDavid van Moolenbroek ATF_TC_BODY(zonemgr_unreachable, tc) {
160*00b67f09SDavid van Moolenbroek 	dns_zonemgr_t *myzonemgr = NULL;
161*00b67f09SDavid van Moolenbroek 	dns_zone_t *zone = NULL;
162*00b67f09SDavid van Moolenbroek 	isc_sockaddr_t addr1, addr2;
163*00b67f09SDavid van Moolenbroek 	struct in_addr in;
164*00b67f09SDavid van Moolenbroek 	isc_result_t result;
165*00b67f09SDavid van Moolenbroek 	isc_time_t now;
166*00b67f09SDavid van Moolenbroek 
167*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
168*00b67f09SDavid van Moolenbroek 
169*00b67f09SDavid van Moolenbroek 	TIME_NOW(&now);
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_TRUE);
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr,
176*00b67f09SDavid van Moolenbroek 				    &myzonemgr);
177*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
178*00b67f09SDavid van Moolenbroek 
179*00b67f09SDavid van Moolenbroek 	result = dns_test_makezone("foo", &zone, NULL, ISC_FALSE);
180*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_setsize(myzonemgr, 1);
183*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
184*00b67f09SDavid van Moolenbroek 
185*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_managezone(myzonemgr, zone);
186*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	in.s_addr = inet_addr("10.53.0.1");
189*00b67f09SDavid van Moolenbroek 	isc_sockaddr_fromin(&addr1, &in, 2112);
190*00b67f09SDavid van Moolenbroek 	in.s_addr = inet_addr("10.53.0.2");
191*00b67f09SDavid van Moolenbroek 	isc_sockaddr_fromin(&addr2, &in, 5150);
192*00b67f09SDavid van Moolenbroek 	ATF_CHECK(! dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
193*00b67f09SDavid van Moolenbroek 	/*
194*00b67f09SDavid van Moolenbroek 	 * We require multiple unreachableadd calls to mark a server as
195*00b67f09SDavid van Moolenbroek 	 * unreachable.
196*00b67f09SDavid van Moolenbroek 	 */
197*00b67f09SDavid van Moolenbroek 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
198*00b67f09SDavid van Moolenbroek 	ATF_CHECK(! dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
199*00b67f09SDavid van Moolenbroek 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
200*00b67f09SDavid van Moolenbroek 	ATF_CHECK(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	in.s_addr = inet_addr("10.53.0.3");
203*00b67f09SDavid van Moolenbroek 	isc_sockaddr_fromin(&addr2, &in, 5150);
204*00b67f09SDavid van Moolenbroek 	ATF_CHECK(! dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
205*00b67f09SDavid van Moolenbroek 	/*
206*00b67f09SDavid van Moolenbroek 	 * We require multiple unreachableadd calls to mark a server as
207*00b67f09SDavid van Moolenbroek 	 * unreachable.
208*00b67f09SDavid van Moolenbroek 	 */
209*00b67f09SDavid van Moolenbroek 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
210*00b67f09SDavid van Moolenbroek 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
211*00b67f09SDavid van Moolenbroek 	ATF_CHECK(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
212*00b67f09SDavid van Moolenbroek 
213*00b67f09SDavid van Moolenbroek 	dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
214*00b67f09SDavid van Moolenbroek 	ATF_CHECK(! dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
215*00b67f09SDavid van Moolenbroek 
216*00b67f09SDavid van Moolenbroek 	in.s_addr = inet_addr("10.53.0.2");
217*00b67f09SDavid van Moolenbroek 	isc_sockaddr_fromin(&addr2, &in, 5150);
218*00b67f09SDavid van Moolenbroek 	ATF_CHECK(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
219*00b67f09SDavid van Moolenbroek 	dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
220*00b67f09SDavid van Moolenbroek 	ATF_CHECK(! dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 	dns_zonemgr_releasezone(myzonemgr, zone);
223*00b67f09SDavid van Moolenbroek 	dns_zone_detach(&zone);
224*00b67f09SDavid van Moolenbroek 	dns_zonemgr_shutdown(myzonemgr);
225*00b67f09SDavid van Moolenbroek 	dns_zonemgr_detach(&myzonemgr);
226*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE_EQ(myzonemgr, NULL);
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek 	dns_test_end();
229*00b67f09SDavid van Moolenbroek }
230*00b67f09SDavid van Moolenbroek 
231*00b67f09SDavid van Moolenbroek 
232*00b67f09SDavid van Moolenbroek /*
233*00b67f09SDavid van Moolenbroek  * Main
234*00b67f09SDavid van Moolenbroek  */
ATF_TP_ADD_TCS(tp)235*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
236*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, zonemgr_create);
237*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, zonemgr_managezone);
238*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, zonemgr_createzone);
239*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, zonemgr_unreachable);
240*00b67f09SDavid van Moolenbroek 	return (atf_no_error());
241*00b67f09SDavid van Moolenbroek }
242*00b67f09SDavid van Moolenbroek 
243*00b67f09SDavid van Moolenbroek /*
244*00b67f09SDavid van Moolenbroek  * XXX:
245*00b67f09SDavid van Moolenbroek  * dns_zonemgr API calls that are not yet part of this unit test:
246*00b67f09SDavid van Moolenbroek  *
247*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_attach
248*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_forcemaint
249*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_resumexfrs
250*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_shutdown
251*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_setsize
252*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_settransfersin
253*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_getttransfersin
254*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_settransfersperns
255*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_getttransfersperns
256*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_setiolimit
257*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_getiolimit
258*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_dbdestroyed
259*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_setserialqueryrate
260*00b67f09SDavid van Moolenbroek  * 	- dns_zonemgr_getserialqueryrate
261*00b67f09SDavid van Moolenbroek  */
262