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