zonemgr_test.c revision 1.3 1 /* $NetBSD: zonemgr_test.c,v 1.3 2025/01/26 16:25:48 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/timer.h>
30 #include <isc/util.h>
31
32 #include <dns/name.h>
33 #include <dns/view.h>
34 #include <dns/zone.h>
35
36 #include <tests/dns.h>
37
38 static int
39 setup_test(void **state) {
40 setup_loopmgr(state);
41 setup_netmgr(state);
42
43 return 0;
44 }
45
46 static int
47 teardown_test(void **state) {
48 teardown_netmgr(state);
49 teardown_loopmgr(state);
50
51 return 0;
52 }
53
54 /* create zone manager */
55 ISC_LOOP_TEST_IMPL(zonemgr_create) {
56 dns_zonemgr_t *myzonemgr = NULL;
57
58 UNUSED(arg);
59
60 dns_zonemgr_create(mctx, netmgr, &myzonemgr);
61
62 dns_zonemgr_shutdown(myzonemgr);
63 dns_zonemgr_detach(&myzonemgr);
64 assert_null(myzonemgr);
65
66 isc_loopmgr_shutdown(loopmgr);
67 }
68
69 /* manage and release a zone */
70 ISC_LOOP_TEST_IMPL(zonemgr_managezone) {
71 dns_zonemgr_t *myzonemgr = NULL;
72 dns_zone_t *zone = NULL;
73 isc_result_t result;
74
75 UNUSED(arg);
76
77 dns_zonemgr_create(mctx, netmgr, &myzonemgr);
78
79 result = dns_test_makezone("foo", &zone, NULL, false);
80 assert_int_equal(result, ISC_R_SUCCESS);
81
82 assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
83
84 /* Now it should succeed */
85 result = dns_zonemgr_managezone(myzonemgr, zone);
86 assert_int_equal(result, ISC_R_SUCCESS);
87
88 assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 1);
89
90 dns_zonemgr_releasezone(myzonemgr, zone);
91 dns_zone_detach(&zone);
92
93 assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
94
95 dns_zonemgr_shutdown(myzonemgr);
96 dns_zonemgr_detach(&myzonemgr);
97 assert_null(myzonemgr);
98
99 isc_loopmgr_shutdown(loopmgr);
100 }
101
102 /* create and release a zone */
103 ISC_LOOP_TEST_IMPL(zonemgr_createzone) {
104 dns_zonemgr_t *myzonemgr = NULL;
105 dns_zone_t *zone = NULL;
106 isc_result_t result;
107
108 UNUSED(arg);
109
110 dns_zonemgr_create(mctx, netmgr, &myzonemgr);
111
112 result = dns_zonemgr_createzone(myzonemgr, &zone);
113 assert_int_equal(result, ISC_R_SUCCESS);
114 assert_non_null(zone);
115
116 result = dns_zonemgr_managezone(myzonemgr, zone);
117 assert_int_equal(result, ISC_R_SUCCESS);
118
119 dns_zone_detach(&zone);
120
121 dns_zonemgr_shutdown(myzonemgr);
122 dns_zonemgr_detach(&myzonemgr);
123 assert_null(myzonemgr);
124
125 isc_loopmgr_shutdown(loopmgr);
126 }
127
128 /* manage and release a zone */
129 ISC_LOOP_TEST_IMPL(zonemgr_unreachable) {
130 dns_zonemgr_t *myzonemgr = NULL;
131 dns_zone_t *zone = NULL;
132 isc_sockaddr_t addr1, addr2;
133 struct in_addr in;
134 isc_result_t result;
135 isc_time_t now;
136
137 UNUSED(arg);
138
139 now = isc_time_now();
140
141 dns_zonemgr_create(mctx, netmgr, &myzonemgr);
142
143 result = dns_test_makezone("foo", &zone, NULL, false);
144 assert_int_equal(result, ISC_R_SUCCESS);
145
146 result = dns_zonemgr_managezone(myzonemgr, zone);
147 assert_int_equal(result, ISC_R_SUCCESS);
148
149 in.s_addr = inet_addr("10.53.0.1");
150 isc_sockaddr_fromin(&addr1, &in, 2112);
151 in.s_addr = inet_addr("10.53.0.2");
152 isc_sockaddr_fromin(&addr2, &in, 5150);
153 assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
154 /*
155 * We require multiple unreachableadd calls to mark a server as
156 * unreachable.
157 */
158 dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
159 assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
160 dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
161 assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
162
163 in.s_addr = inet_addr("10.53.0.3");
164 isc_sockaddr_fromin(&addr2, &in, 5150);
165 assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
166 /*
167 * We require multiple unreachableadd calls to mark a server as
168 * unreachable.
169 */
170 dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
171 dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
172 assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
173
174 dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
175 assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
176
177 in.s_addr = inet_addr("10.53.0.2");
178 isc_sockaddr_fromin(&addr2, &in, 5150);
179 assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
180 dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
181 assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
182
183 dns_zonemgr_releasezone(myzonemgr, zone);
184 dns_zone_detach(&zone);
185 dns_zonemgr_shutdown(myzonemgr);
186 dns_zonemgr_detach(&myzonemgr);
187 assert_null(myzonemgr);
188
189 isc_loopmgr_shutdown(loopmgr);
190 }
191
192 ISC_TEST_LIST_START
193 ISC_TEST_ENTRY_CUSTOM(zonemgr_create, setup_test, teardown_test)
194 ISC_TEST_ENTRY_CUSTOM(zonemgr_managezone, setup_test, teardown_test)
195 ISC_TEST_ENTRY_CUSTOM(zonemgr_createzone, setup_test, teardown_test)
196 ISC_TEST_ENTRY_CUSTOM(zonemgr_unreachable, setup_test, teardown_test)
197 ISC_TEST_LIST_END
198
199 ISC_TEST_MAIN
200