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