zonemgr_test.c revision 1.1.1.1 1 /* $NetBSD: zonemgr_test.c,v 1.1.1.1 2024/02/21 21:54:55 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