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