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 */
40ISC_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 */
56ISC_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 */
96ISC_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 */
130ISC_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
216ISC_TEST_LIST_START
217
218ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_create, setup_managers, teardown_managers)
219ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_managezone, setup_managers, teardown_managers)
220ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_createzone, setup_managers, teardown_managers)
221ISC_TEST_ENTRY_CUSTOM(dns_zonemgr_unreachable, setup_managers,
222		      teardown_managers)
223
224ISC_TEST_LIST_END
225
226ISC_TEST_MAIN
227