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