xref: /netbsd-src/external/mpl/bind/dist/tests/dns/zonemgr_test.c (revision f8cf1a9151c7af1cb0bd8b09c13c66bca599c027)
1 /*	$NetBSD: zonemgr_test.c,v 1.2 2024/02/21 22:52:50 christos Exp $	*/
2 
3 /*
4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5  *
6  * SPDX-License-Identifier: MPL-2.0
7  *
8  * This Source Code Form is subject to the terms of the Mozilla Public
9  * License, v. 2.0. If a copy of the MPL was not distributed with this
10  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11  *
12  * See the COPYRIGHT file distributed with this work for additional
13  * information regarding copyright ownership.
14  */
15 
16 #include <inttypes.h>
17 #include <sched.h> /* IWYU pragma: keep */
18 #include <setjmp.h>
19 #include <stdarg.h>
20 #include <stddef.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <unistd.h>
24 
25 #define UNIT_TESTING
26 #include <cmocka.h>
27 
28 #include <isc/buffer.h>
29 #include <isc/task.h>
30 #include <isc/timer.h>
31 #include <isc/util.h>
32 
33 #include <dns/name.h>
34 #include <dns/view.h>
35 #include <dns/zone.h>
36 
37 #include <tests/dns.h>
38 
39 /* create zone manager */
40 ISC_RUN_TEST_IMPL(dns_zonemgr_create) {
41 	dns_zonemgr_t *myzonemgr = NULL;
42 	isc_result_t result;
43 
44 	UNUSED(state);
45 
46 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, netmgr,
47 				    &myzonemgr);
48 	assert_int_equal(result, ISC_R_SUCCESS);
49 
50 	dns_zonemgr_shutdown(myzonemgr);
51 	dns_zonemgr_detach(&myzonemgr);
52 	assert_null(myzonemgr);
53 }
54 
55 /* manage and release a zone */
56 ISC_RUN_TEST_IMPL(dns_zonemgr_managezone) {
57 	dns_zonemgr_t *myzonemgr = NULL;
58 	dns_zone_t *zone = NULL;
59 	isc_result_t result;
60 
61 	UNUSED(state);
62 
63 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, netmgr,
64 				    &myzonemgr);
65 	assert_int_equal(result, ISC_R_SUCCESS);
66 
67 	result = dns_test_makezone("foo", &zone, NULL, false);
68 	assert_int_equal(result, ISC_R_SUCCESS);
69 
70 	/* This should not succeed until the dns_zonemgr_setsize() is run */
71 	result = dns_zonemgr_managezone(myzonemgr, zone);
72 	assert_int_equal(result, ISC_R_FAILURE);
73 
74 	assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
75 
76 	result = dns_zonemgr_setsize(myzonemgr, 1);
77 	assert_int_equal(result, ISC_R_SUCCESS);
78 
79 	/* Now it should succeed */
80 	result = dns_zonemgr_managezone(myzonemgr, zone);
81 	assert_int_equal(result, ISC_R_SUCCESS);
82 
83 	assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 1);
84 
85 	dns_zonemgr_releasezone(myzonemgr, zone);
86 	dns_zone_detach(&zone);
87 
88 	assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
89 
90 	dns_zonemgr_shutdown(myzonemgr);
91 	dns_zonemgr_detach(&myzonemgr);
92 	assert_null(myzonemgr);
93 }
94 
95 /* create and release a zone */
96 ISC_RUN_TEST_IMPL(dns_zonemgr_createzone) {
97 	dns_zonemgr_t *myzonemgr = NULL;
98 	dns_zone_t *zone = NULL;
99 	isc_result_t result;
100 
101 	UNUSED(state);
102 
103 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, netmgr,
104 				    &myzonemgr);
105 	assert_int_equal(result, ISC_R_SUCCESS);
106 
107 	/* This should not succeed until the dns_zonemgr_setsize() is run */
108 	result = dns_zonemgr_createzone(myzonemgr, &zone);
109 	assert_int_equal(result, ISC_R_FAILURE);
110 
111 	result = dns_zonemgr_setsize(myzonemgr, 1);
112 	assert_int_equal(result, ISC_R_SUCCESS);
113 
114 	/* Now it should succeed */
115 	result = dns_zonemgr_createzone(myzonemgr, &zone);
116 	assert_int_equal(result, ISC_R_SUCCESS);
117 	assert_non_null(zone);
118 
119 	result = dns_zonemgr_managezone(myzonemgr, zone);
120 	assert_int_equal(result, ISC_R_SUCCESS);
121 
122 	dns_zone_detach(&zone);
123 
124 	dns_zonemgr_shutdown(myzonemgr);
125 	dns_zonemgr_detach(&myzonemgr);
126 	assert_null(myzonemgr);
127 }
128 
129 /* manage and release a zone */
130 ISC_RUN_TEST_IMPL(dns_zonemgr_unreachable) {
131 	dns_zonemgr_t *myzonemgr = NULL;
132 	dns_zone_t *zone = NULL;
133 	isc_sockaddr_t addr1, addr2;
134 	struct in_addr in;
135 	isc_result_t result;
136 	isc_time_t now;
137 
138 	UNUSED(state);
139 
140 	TIME_NOW(&now);
141 
142 	result = dns_zonemgr_create(mctx, taskmgr, timermgr, netmgr,
143 				    &myzonemgr);
144 	assert_int_equal(result, ISC_R_SUCCESS);
145 
146 	result = dns_test_makezone("foo", &zone, NULL, false);
147 	assert_int_equal(result, ISC_R_SUCCESS);
148 
149 	result = dns_zonemgr_setsize(myzonemgr, 1);
150 	assert_int_equal(result, ISC_R_SUCCESS);
151 
152 	result = dns_zonemgr_managezone(myzonemgr, zone);
153 	assert_int_equal(result, ISC_R_SUCCESS);
154 
155 	in.s_addr = inet_addr("10.53.0.1");
156 	isc_sockaddr_fromin(&addr1, &in, 2112);
157 	in.s_addr = inet_addr("10.53.0.2");
158 	isc_sockaddr_fromin(&addr2, &in, 5150);
159 	assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
160 	/*
161 	 * We require multiple unreachableadd calls to mark a server as
162 	 * unreachable.
163 	 */
164 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
165 	assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
166 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
167 	assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
168 
169 	in.s_addr = inet_addr("10.53.0.3");
170 	isc_sockaddr_fromin(&addr2, &in, 5150);
171 	assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
172 	/*
173 	 * We require multiple unreachableadd calls to mark a server as
174 	 * unreachable.
175 	 */
176 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
177 	dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
178 	assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
179 
180 	dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
181 	assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
182 
183 	in.s_addr = inet_addr("10.53.0.2");
184 	isc_sockaddr_fromin(&addr2, &in, 5150);
185 	assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
186 	dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
187 	assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
188 
189 	dns_zonemgr_releasezone(myzonemgr, zone);
190 	dns_zone_detach(&zone);
191 	dns_zonemgr_shutdown(myzonemgr);
192 	dns_zonemgr_detach(&myzonemgr);
193 	assert_null(myzonemgr);
194 }
195 
196 /*
197  * XXX:
198  * dns_zonemgr API calls that are not yet part of this unit test:
199  *
200  * 	- dns_zonemgr_attach
201  * 	- dns_zonemgr_forcemaint
202  * 	- dns_zonemgr_resumexfrs
203  * 	- dns_zonemgr_shutdown
204  * 	- dns_zonemgr_setsize
205  * 	- dns_zonemgr_settransfersin
206  * 	- dns_zonemgr_getttransfersin
207  * 	- dns_zonemgr_settransfersperns
208  * 	- dns_zonemgr_getttransfersperns
209  * 	- dns_zonemgr_setiolimit
210  * 	- dns_zonemgr_getiolimit
211  * 	- dns_zonemgr_dbdestroyed
212  * 	- dns_zonemgr_setserialqueryrate
213  * 	- dns_zonemgr_getserialqueryrate
214  */
215 
216 ISC_TEST_LIST_START
217 
218 ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_create, setup_managers, teardown_managers)
219 ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_managezone, setup_managers, teardown_managers)
220 ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_createzone, setup_managers, teardown_managers)
221 ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_unreachable, setup_managers,
222 		      teardown_managers)
223 
224 ISC_TEST_LIST_END
225 
226 ISC_TEST_MAIN
227