Home | History | Annotate | Line # | Download | only in dns
zonemgr_test.c revision 1.2.6.1
      1  1.2.6.1  perseant /*	$NetBSD: zonemgr_test.c,v 1.2.6.1 2025/08/02 05:54:13 perseant 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.2.6.1  perseant static int
     39  1.2.6.1  perseant setup_test(void **state) {
     40  1.2.6.1  perseant 	setup_loopmgr(state);
     41  1.2.6.1  perseant 	setup_netmgr(state);
     42  1.2.6.1  perseant 
     43  1.2.6.1  perseant 	return 0;
     44  1.2.6.1  perseant }
     45  1.2.6.1  perseant 
     46  1.2.6.1  perseant static int
     47  1.2.6.1  perseant teardown_test(void **state) {
     48  1.2.6.1  perseant 	teardown_netmgr(state);
     49  1.2.6.1  perseant 	teardown_loopmgr(state);
     50  1.2.6.1  perseant 
     51  1.2.6.1  perseant 	return 0;
     52  1.2.6.1  perseant }
     53  1.2.6.1  perseant 
     54      1.1  christos /* create zone manager */
     55  1.2.6.1  perseant ISC_LOOP_TEST_IMPL(zonemgr_create) {
     56      1.1  christos 	dns_zonemgr_t *myzonemgr = NULL;
     57      1.1  christos 
     58  1.2.6.1  perseant 	UNUSED(arg);
     59      1.1  christos 
     60  1.2.6.1  perseant 	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.2.6.1  perseant 
     66  1.2.6.1  perseant 	isc_loopmgr_shutdown(loopmgr);
     67      1.1  christos }
     68      1.1  christos 
     69      1.1  christos /* manage and release a zone */
     70  1.2.6.1  perseant 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.2.6.1  perseant 	UNUSED(arg);
     76      1.1  christos 
     77  1.2.6.1  perseant 	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.2.6.1  perseant 
     99  1.2.6.1  perseant 	isc_loopmgr_shutdown(loopmgr);
    100      1.1  christos }
    101      1.1  christos 
    102      1.1  christos /* create and release a zone */
    103  1.2.6.1  perseant 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.2.6.1  perseant 	UNUSED(arg);
    109      1.1  christos 
    110  1.2.6.1  perseant 	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.2.6.1  perseant 
    125  1.2.6.1  perseant 	isc_loopmgr_shutdown(loopmgr);
    126      1.1  christos }
    127      1.1  christos 
    128      1.1  christos /* manage and release a zone */
    129  1.2.6.1  perseant 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.2.6.1  perseant 	UNUSED(arg);
    138      1.1  christos 
    139  1.2.6.1  perseant 	now = isc_time_now();
    140      1.1  christos 
    141  1.2.6.1  perseant 	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.1  christos 
    189  1.2.6.1  perseant 	isc_loopmgr_shutdown(loopmgr);
    190  1.2.6.1  perseant }
    191      1.1  christos 
    192      1.1  christos ISC_TEST_LIST_START
    193  1.2.6.1  perseant ISC_TEST_ENTRY_CUSTOM(zonemgr_create, setup_test, teardown_test)
    194  1.2.6.1  perseant ISC_TEST_ENTRY_CUSTOM(zonemgr_managezone, setup_test, teardown_test)
    195  1.2.6.1  perseant ISC_TEST_ENTRY_CUSTOM(zonemgr_createzone, setup_test, teardown_test)
    196  1.2.6.1  perseant 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