zonemgr_test.c revision 1.3 1 1.1 christos /* $NetBSD: zonemgr_test.c,v 1.3 2025/01/26 16:25:48 christos Exp $ */
2 1.1 christos
3 1.1 christos /*
4 1.1 christos * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 1.1 christos *
6 1.1 christos * SPDX-License-Identifier: MPL-2.0
7 1.1 christos *
8 1.1 christos * This Source Code Form is subject to the terms of the Mozilla Public
9 1.1 christos * License, v. 2.0. If a copy of the MPL was not distributed with this
10 1.1 christos * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 1.1 christos *
12 1.1 christos * See the COPYRIGHT file distributed with this work for additional
13 1.1 christos * information regarding copyright ownership.
14 1.1 christos */
15 1.1 christos
16 1.1 christos #include <inttypes.h>
17 1.1 christos #include <sched.h> /* IWYU pragma: keep */
18 1.1 christos #include <setjmp.h>
19 1.1 christos #include <stdarg.h>
20 1.1 christos #include <stddef.h>
21 1.1 christos #include <stdlib.h>
22 1.1 christos #include <string.h>
23 1.1 christos #include <unistd.h>
24 1.1 christos
25 1.1 christos #define UNIT_TESTING
26 1.1 christos #include <cmocka.h>
27 1.1 christos
28 1.1 christos #include <isc/buffer.h>
29 1.1 christos #include <isc/timer.h>
30 1.1 christos #include <isc/util.h>
31 1.1 christos
32 1.1 christos #include <dns/name.h>
33 1.1 christos #include <dns/view.h>
34 1.1 christos #include <dns/zone.h>
35 1.1 christos
36 1.1 christos #include <tests/dns.h>
37 1.1 christos
38 1.3 christos static int
39 1.3 christos setup_test(void **state) {
40 1.3 christos setup_loopmgr(state);
41 1.3 christos setup_netmgr(state);
42 1.3 christos
43 1.3 christos return 0;
44 1.3 christos }
45 1.3 christos
46 1.3 christos static int
47 1.3 christos teardown_test(void **state) {
48 1.3 christos teardown_netmgr(state);
49 1.3 christos teardown_loopmgr(state);
50 1.3 christos
51 1.3 christos return 0;
52 1.3 christos }
53 1.3 christos
54 1.1 christos /* create zone manager */
55 1.3 christos ISC_LOOP_TEST_IMPL(zonemgr_create) {
56 1.1 christos dns_zonemgr_t *myzonemgr = NULL;
57 1.1 christos
58 1.3 christos UNUSED(arg);
59 1.1 christos
60 1.3 christos dns_zonemgr_create(mctx, netmgr, &myzonemgr);
61 1.1 christos
62 1.1 christos dns_zonemgr_shutdown(myzonemgr);
63 1.1 christos dns_zonemgr_detach(&myzonemgr);
64 1.1 christos assert_null(myzonemgr);
65 1.3 christos
66 1.3 christos isc_loopmgr_shutdown(loopmgr);
67 1.1 christos }
68 1.1 christos
69 1.1 christos /* manage and release a zone */
70 1.3 christos ISC_LOOP_TEST_IMPL(zonemgr_managezone) {
71 1.1 christos dns_zonemgr_t *myzonemgr = NULL;
72 1.1 christos dns_zone_t *zone = NULL;
73 1.1 christos isc_result_t result;
74 1.1 christos
75 1.3 christos UNUSED(arg);
76 1.1 christos
77 1.3 christos dns_zonemgr_create(mctx, netmgr, &myzonemgr);
78 1.1 christos
79 1.1 christos result = dns_test_makezone("foo", &zone, NULL, false);
80 1.1 christos assert_int_equal(result, ISC_R_SUCCESS);
81 1.1 christos
82 1.1 christos assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
83 1.1 christos
84 1.1 christos /* Now it should succeed */
85 1.1 christos result = dns_zonemgr_managezone(myzonemgr, zone);
86 1.1 christos assert_int_equal(result, ISC_R_SUCCESS);
87 1.1 christos
88 1.1 christos assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 1);
89 1.1 christos
90 1.1 christos dns_zonemgr_releasezone(myzonemgr, zone);
91 1.1 christos dns_zone_detach(&zone);
92 1.1 christos
93 1.1 christos assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
94 1.1 christos
95 1.1 christos dns_zonemgr_shutdown(myzonemgr);
96 1.1 christos dns_zonemgr_detach(&myzonemgr);
97 1.1 christos assert_null(myzonemgr);
98 1.3 christos
99 1.3 christos isc_loopmgr_shutdown(loopmgr);
100 1.1 christos }
101 1.1 christos
102 1.1 christos /* create and release a zone */
103 1.3 christos ISC_LOOP_TEST_IMPL(zonemgr_createzone) {
104 1.1 christos dns_zonemgr_t *myzonemgr = NULL;
105 1.1 christos dns_zone_t *zone = NULL;
106 1.1 christos isc_result_t result;
107 1.1 christos
108 1.3 christos UNUSED(arg);
109 1.1 christos
110 1.3 christos dns_zonemgr_create(mctx, netmgr, &myzonemgr);
111 1.1 christos
112 1.1 christos result = dns_zonemgr_createzone(myzonemgr, &zone);
113 1.1 christos assert_int_equal(result, ISC_R_SUCCESS);
114 1.1 christos assert_non_null(zone);
115 1.1 christos
116 1.1 christos result = dns_zonemgr_managezone(myzonemgr, zone);
117 1.1 christos assert_int_equal(result, ISC_R_SUCCESS);
118 1.1 christos
119 1.1 christos dns_zone_detach(&zone);
120 1.1 christos
121 1.1 christos dns_zonemgr_shutdown(myzonemgr);
122 1.1 christos dns_zonemgr_detach(&myzonemgr);
123 1.1 christos assert_null(myzonemgr);
124 1.3 christos
125 1.3 christos isc_loopmgr_shutdown(loopmgr);
126 1.1 christos }
127 1.1 christos
128 1.1 christos /* manage and release a zone */
129 1.3 christos ISC_LOOP_TEST_IMPL(zonemgr_unreachable) {
130 1.1 christos dns_zonemgr_t *myzonemgr = NULL;
131 1.1 christos dns_zone_t *zone = NULL;
132 1.1 christos isc_sockaddr_t addr1, addr2;
133 1.1 christos struct in_addr in;
134 1.1 christos isc_result_t result;
135 1.1 christos isc_time_t now;
136 1.1 christos
137 1.3 christos UNUSED(arg);
138 1.1 christos
139 1.3 christos now = isc_time_now();
140 1.1 christos
141 1.3 christos dns_zonemgr_create(mctx, netmgr, &myzonemgr);
142 1.1 christos
143 1.1 christos result = dns_test_makezone("foo", &zone, NULL, false);
144 1.1 christos assert_int_equal(result, ISC_R_SUCCESS);
145 1.1 christos
146 1.1 christos result = dns_zonemgr_managezone(myzonemgr, zone);
147 1.1 christos assert_int_equal(result, ISC_R_SUCCESS);
148 1.1 christos
149 1.1 christos in.s_addr = inet_addr("10.53.0.1");
150 1.1 christos isc_sockaddr_fromin(&addr1, &in, 2112);
151 1.1 christos in.s_addr = inet_addr("10.53.0.2");
152 1.1 christos isc_sockaddr_fromin(&addr2, &in, 5150);
153 1.1 christos assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
154 1.1 christos /*
155 1.1 christos * We require multiple unreachableadd calls to mark a server as
156 1.1 christos * unreachable.
157 1.1 christos */
158 1.1 christos dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
159 1.1 christos assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
160 1.1 christos dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
161 1.1 christos assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
162 1.1 christos
163 1.1 christos in.s_addr = inet_addr("10.53.0.3");
164 1.1 christos isc_sockaddr_fromin(&addr2, &in, 5150);
165 1.1 christos assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
166 1.1 christos /*
167 1.1 christos * We require multiple unreachableadd calls to mark a server as
168 1.1 christos * unreachable.
169 1.1 christos */
170 1.1 christos dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
171 1.1 christos dns_zonemgr_unreachableadd(myzonemgr, &addr1, &addr2, &now);
172 1.1 christos assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
173 1.1 christos
174 1.1 christos dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
175 1.1 christos assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
176 1.1 christos
177 1.1 christos in.s_addr = inet_addr("10.53.0.2");
178 1.1 christos isc_sockaddr_fromin(&addr2, &in, 5150);
179 1.1 christos assert_true(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
180 1.1 christos dns_zonemgr_unreachabledel(myzonemgr, &addr1, &addr2);
181 1.1 christos assert_false(dns_zonemgr_unreachable(myzonemgr, &addr1, &addr2, &now));
182 1.1 christos
183 1.1 christos dns_zonemgr_releasezone(myzonemgr, zone);
184 1.1 christos dns_zone_detach(&zone);
185 1.1 christos dns_zonemgr_shutdown(myzonemgr);
186 1.1 christos dns_zonemgr_detach(&myzonemgr);
187 1.1 christos assert_null(myzonemgr);
188 1.3 christos
189 1.3 christos isc_loopmgr_shutdown(loopmgr);
190 1.1 christos }
191 1.1 christos
192 1.1 christos ISC_TEST_LIST_START
193 1.3 christos ISC_TEST_ENTRY_CUSTOM(zonemgr_create, setup_test, teardown_test)
194 1.3 christos ISC_TEST_ENTRY_CUSTOM(zonemgr_managezone, setup_test, teardown_test)
195 1.3 christos ISC_TEST_ENTRY_CUSTOM(zonemgr_createzone, setup_test, teardown_test)
196 1.3 christos ISC_TEST_ENTRY_CUSTOM(zonemgr_unreachable, setup_test, teardown_test)
197 1.1 christos ISC_TEST_LIST_END
198 1.1 christos
199 1.1 christos ISC_TEST_MAIN
200