Home | History | Annotate | Line # | Download | only in dns
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