1 /* $NetBSD: radix_test.c,v 1.3 2025/01/26 16:25:50 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 24 #define UNIT_TESTING 25 #include <cmocka.h> 26 27 #include <isc/mem.h> 28 #include <isc/netaddr.h> 29 #include <isc/radix.h> 30 #include <isc/result.h> 31 #include <isc/util.h> 32 33 #include <tests/isc.h> 34 35 /* test radix node removal */ 36 ISC_RUN_TEST_IMPL(isc_radix_remove) { 37 isc_radix_tree_t *radix = NULL; 38 isc_radix_node_t *node; 39 isc_prefix_t prefix; 40 isc_result_t result; 41 struct in_addr in_addr; 42 isc_netaddr_t netaddr; 43 44 UNUSED(state); 45 46 isc_radix_create(mctx, &radix, 32); 47 48 in_addr.s_addr = inet_addr("1.1.1.1"); 49 isc_netaddr_fromin(&netaddr, &in_addr); 50 NETADDR_TO_PREFIX_T(&netaddr, prefix, 32); 51 52 node = NULL; 53 result = isc_radix_insert(radix, &node, NULL, &prefix); 54 assert_int_equal(result, ISC_R_SUCCESS); 55 node->data[0] = (void *)32; 56 isc_refcount_destroy(&prefix.refcount); 57 58 in_addr.s_addr = inet_addr("1.0.0.0"); 59 isc_netaddr_fromin(&netaddr, &in_addr); 60 NETADDR_TO_PREFIX_T(&netaddr, prefix, 8); 61 62 node = NULL; 63 result = isc_radix_insert(radix, &node, NULL, &prefix); 64 assert_int_equal(result, ISC_R_SUCCESS); 65 node->data[0] = (void *)8; 66 isc_refcount_destroy(&prefix.refcount); 67 68 in_addr.s_addr = inet_addr("1.1.1.0"); 69 isc_netaddr_fromin(&netaddr, &in_addr); 70 NETADDR_TO_PREFIX_T(&netaddr, prefix, 24); 71 72 node = NULL; 73 result = isc_radix_insert(radix, &node, NULL, &prefix); 74 assert_int_equal(result, ISC_R_SUCCESS); 75 node->data[0] = (void *)24; 76 isc_refcount_destroy(&prefix.refcount); 77 78 isc_radix_remove(radix, node); 79 80 isc_radix_destroy(radix, NULL); 81 } 82 83 /* test radix searching */ 84 ISC_RUN_TEST_IMPL(isc_radix_search) { 85 isc_radix_tree_t *radix = NULL; 86 isc_radix_node_t *node; 87 isc_prefix_t prefix; 88 isc_result_t result; 89 struct in_addr in_addr; 90 isc_netaddr_t netaddr; 91 92 UNUSED(state); 93 94 isc_radix_create(mctx, &radix, 32); 95 96 in_addr.s_addr = inet_addr("3.3.3.0"); 97 isc_netaddr_fromin(&netaddr, &in_addr); 98 NETADDR_TO_PREFIX_T(&netaddr, prefix, 24); 99 100 node = NULL; 101 result = isc_radix_insert(radix, &node, NULL, &prefix); 102 assert_int_equal(result, ISC_R_SUCCESS); 103 node->data[0] = (void *)1; 104 isc_refcount_destroy(&prefix.refcount); 105 106 in_addr.s_addr = inet_addr("3.3.0.0"); 107 isc_netaddr_fromin(&netaddr, &in_addr); 108 NETADDR_TO_PREFIX_T(&netaddr, prefix, 16); 109 110 node = NULL; 111 result = isc_radix_insert(radix, &node, NULL, &prefix); 112 assert_int_equal(result, ISC_R_SUCCESS); 113 node->data[0] = (void *)2; 114 isc_refcount_destroy(&prefix.refcount); 115 116 in_addr.s_addr = inet_addr("3.3.3.3"); 117 isc_netaddr_fromin(&netaddr, &in_addr); 118 NETADDR_TO_PREFIX_T(&netaddr, prefix, 22); 119 120 node = NULL; 121 result = isc_radix_search(radix, &node, &prefix); 122 assert_int_equal(result, ISC_R_SUCCESS); 123 assert_ptr_equal(node->data[0], (void *)2); 124 125 isc_refcount_destroy(&prefix.refcount); 126 127 isc_radix_destroy(radix, NULL); 128 } 129 130 ISC_TEST_LIST_START 131 132 ISC_TEST_ENTRY(isc_radix_remove) 133 ISC_TEST_ENTRY(isc_radix_search) 134 135 ISC_TEST_LIST_END 136 ISC_TEST_MAIN 137