1b35df4ddSVladimir Medvedkin /* SPDX-License-Identifier: BSD-3-Clause
2b35df4ddSVladimir Medvedkin * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>
3b35df4ddSVladimir Medvedkin * Copyright(c) 2019 Intel Corporation
4b35df4ddSVladimir Medvedkin */
5b35df4ddSVladimir Medvedkin
63c60274cSJie Zhou #include "test.h"
73c60274cSJie Zhou
8b35df4ddSVladimir Medvedkin #include <stdio.h>
9b35df4ddSVladimir Medvedkin #include <stdint.h>
10b35df4ddSVladimir Medvedkin #include <stdlib.h>
11b35df4ddSVladimir Medvedkin
12b35df4ddSVladimir Medvedkin #include <rte_ip.h>
133c60274cSJie Zhou #include <rte_rib.h>
14b35df4ddSVladimir Medvedkin
15b35df4ddSVladimir Medvedkin typedef int32_t (*rte_rib_test)(void);
16b35df4ddSVladimir Medvedkin
17b35df4ddSVladimir Medvedkin static int32_t test_create_invalid(void);
18b35df4ddSVladimir Medvedkin static int32_t test_multiple_create(void);
19b35df4ddSVladimir Medvedkin static int32_t test_free_null(void);
20b35df4ddSVladimir Medvedkin static int32_t test_insert_invalid(void);
21b35df4ddSVladimir Medvedkin static int32_t test_get_fn(void);
22b35df4ddSVladimir Medvedkin static int32_t test_basic(void);
23b35df4ddSVladimir Medvedkin static int32_t test_tree_traversal(void);
24b35df4ddSVladimir Medvedkin
25b35df4ddSVladimir Medvedkin #define MAX_DEPTH 32
26b35df4ddSVladimir Medvedkin #define MAX_RULES (1 << 22)
27b35df4ddSVladimir Medvedkin
28b35df4ddSVladimir Medvedkin /*
29b35df4ddSVladimir Medvedkin * Check that rte_rib_create fails gracefully for incorrect user input
30b35df4ddSVladimir Medvedkin * arguments
31b35df4ddSVladimir Medvedkin */
32b35df4ddSVladimir Medvedkin int32_t
test_create_invalid(void)33b35df4ddSVladimir Medvedkin test_create_invalid(void)
34b35df4ddSVladimir Medvedkin {
35b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
36b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
37b35df4ddSVladimir Medvedkin
38b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
39b35df4ddSVladimir Medvedkin config.ext_sz = 0;
40b35df4ddSVladimir Medvedkin
41b35df4ddSVladimir Medvedkin /* rte_rib_create: rib name == NULL */
42b35df4ddSVladimir Medvedkin rib = rte_rib_create(NULL, SOCKET_ID_ANY, &config);
43b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib == NULL,
44b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
45b35df4ddSVladimir Medvedkin
46b35df4ddSVladimir Medvedkin /* rte_rib_create: config == NULL */
47b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, NULL);
48b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib == NULL,
49b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
50b35df4ddSVladimir Medvedkin
51b35df4ddSVladimir Medvedkin /* socket_id < -1 is invalid */
52b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, -2, &config);
53b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib == NULL,
54b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
55b35df4ddSVladimir Medvedkin
56b35df4ddSVladimir Medvedkin /* rte_rib_create: max_nodes = 0 */
57b35df4ddSVladimir Medvedkin config.max_nodes = 0;
58b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
59b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib == NULL,
60b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
61b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
62b35df4ddSVladimir Medvedkin
63b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
64b35df4ddSVladimir Medvedkin }
65b35df4ddSVladimir Medvedkin
66b35df4ddSVladimir Medvedkin /*
67b35df4ddSVladimir Medvedkin * Create rib table then delete rib table 10 times
68b35df4ddSVladimir Medvedkin * Use a slightly different rules size each time
69b35df4ddSVladimir Medvedkin */
70b35df4ddSVladimir Medvedkin int32_t
test_multiple_create(void)71b35df4ddSVladimir Medvedkin test_multiple_create(void)
72b35df4ddSVladimir Medvedkin {
73b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
74b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
75b35df4ddSVladimir Medvedkin int32_t i;
76b35df4ddSVladimir Medvedkin
77b35df4ddSVladimir Medvedkin config.ext_sz = 0;
78b35df4ddSVladimir Medvedkin
7923f5fb66SVladimir Medvedkin for (i = 0; i < 100; i++) {
80b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES - i;
81b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
82b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
83b35df4ddSVladimir Medvedkin rte_rib_free(rib);
84b35df4ddSVladimir Medvedkin }
85b35df4ddSVladimir Medvedkin /* Can not test free so return success */
86b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
87b35df4ddSVladimir Medvedkin }
88b35df4ddSVladimir Medvedkin
89b35df4ddSVladimir Medvedkin /*
90b35df4ddSVladimir Medvedkin * Call rte_rib_free for NULL pointer user input. Note: free has no return and
91b35df4ddSVladimir Medvedkin * therefore it is impossible to check for failure but this test is added to
92b35df4ddSVladimir Medvedkin * increase function coverage metrics and to validate that freeing null does
93b35df4ddSVladimir Medvedkin * not crash.
94b35df4ddSVladimir Medvedkin */
95b35df4ddSVladimir Medvedkin int32_t
test_free_null(void)96b35df4ddSVladimir Medvedkin test_free_null(void)
97b35df4ddSVladimir Medvedkin {
98b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
99b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
100b35df4ddSVladimir Medvedkin
101b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
102b35df4ddSVladimir Medvedkin config.ext_sz = 0;
103b35df4ddSVladimir Medvedkin
104b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
105b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
106b35df4ddSVladimir Medvedkin
107b35df4ddSVladimir Medvedkin rte_rib_free(rib);
108b35df4ddSVladimir Medvedkin rte_rib_free(NULL);
109b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
110b35df4ddSVladimir Medvedkin }
111b35df4ddSVladimir Medvedkin
112b35df4ddSVladimir Medvedkin /*
113b35df4ddSVladimir Medvedkin * Check that rte_rib_insert fails gracefully for incorrect user input arguments
114b35df4ddSVladimir Medvedkin */
115b35df4ddSVladimir Medvedkin int32_t
test_insert_invalid(void)116b35df4ddSVladimir Medvedkin test_insert_invalid(void)
117b35df4ddSVladimir Medvedkin {
118b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
119b35df4ddSVladimir Medvedkin struct rte_rib_node *node, *node1;
120b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
121b35df4ddSVladimir Medvedkin uint32_t ip = RTE_IPV4(0, 0, 0, 0);
122b35df4ddSVladimir Medvedkin uint8_t depth = 24;
123b35df4ddSVladimir Medvedkin
124b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
125b35df4ddSVladimir Medvedkin config.ext_sz = 0;
126b35df4ddSVladimir Medvedkin
127b35df4ddSVladimir Medvedkin /* rte_rib_insert: rib == NULL */
128b35df4ddSVladimir Medvedkin node = rte_rib_insert(NULL, ip, depth);
129b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node == NULL,
130b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
131b35df4ddSVladimir Medvedkin
132b35df4ddSVladimir Medvedkin /*Create valid rib to use in rest of test. */
133b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
134b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
135b35df4ddSVladimir Medvedkin
136b35df4ddSVladimir Medvedkin /* rte_rib_insert: depth > MAX_DEPTH */
137b35df4ddSVladimir Medvedkin node = rte_rib_insert(rib, ip, MAX_DEPTH + 1);
138b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node == NULL,
139b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
140b35df4ddSVladimir Medvedkin
141b35df4ddSVladimir Medvedkin /* insert the same ip/depth twice*/
142b35df4ddSVladimir Medvedkin node = rte_rib_insert(rib, ip, depth);
143b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
144b35df4ddSVladimir Medvedkin node1 = rte_rib_insert(rib, ip, depth);
145b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node1 == NULL,
146b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
147b35df4ddSVladimir Medvedkin
148b35df4ddSVladimir Medvedkin rte_rib_free(rib);
149b35df4ddSVladimir Medvedkin
150b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
151b35df4ddSVladimir Medvedkin }
152b35df4ddSVladimir Medvedkin
153b35df4ddSVladimir Medvedkin /*
154b35df4ddSVladimir Medvedkin * Call rte_rib_node access functions with incorrect input.
155b35df4ddSVladimir Medvedkin * After call rte_rib_node access functions with correct args
156b35df4ddSVladimir Medvedkin * and check the return values for correctness
157b35df4ddSVladimir Medvedkin */
158b35df4ddSVladimir Medvedkin int32_t
test_get_fn(void)159b35df4ddSVladimir Medvedkin test_get_fn(void)
160b35df4ddSVladimir Medvedkin {
161b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
162b35df4ddSVladimir Medvedkin struct rte_rib_node *node;
163b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
164b35df4ddSVladimir Medvedkin void *ext;
165b35df4ddSVladimir Medvedkin uint32_t ip = RTE_IPV4(192, 0, 2, 0);
166b35df4ddSVladimir Medvedkin uint32_t ip_ret;
167b35df4ddSVladimir Medvedkin uint64_t nh_set = 10;
168b35df4ddSVladimir Medvedkin uint64_t nh_ret;
169b35df4ddSVladimir Medvedkin uint8_t depth = 24;
170b35df4ddSVladimir Medvedkin uint8_t depth_ret;
171b35df4ddSVladimir Medvedkin int ret;
172b35df4ddSVladimir Medvedkin
173b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
174b35df4ddSVladimir Medvedkin config.ext_sz = 0;
175b35df4ddSVladimir Medvedkin
176b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
177b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
178b35df4ddSVladimir Medvedkin
179b35df4ddSVladimir Medvedkin node = rte_rib_insert(rib, ip, depth);
180b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
181b35df4ddSVladimir Medvedkin
182b35df4ddSVladimir Medvedkin /* test rte_rib_get_ip() with incorrect args */
183b35df4ddSVladimir Medvedkin ret = rte_rib_get_ip(NULL, &ip_ret);
184b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
185b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
186b35df4ddSVladimir Medvedkin ret = rte_rib_get_ip(node, NULL);
187b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
188b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
189b35df4ddSVladimir Medvedkin
190b35df4ddSVladimir Medvedkin /* test rte_rib_get_depth() with incorrect args */
191b35df4ddSVladimir Medvedkin ret = rte_rib_get_depth(NULL, &depth_ret);
192b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
193b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
194b35df4ddSVladimir Medvedkin ret = rte_rib_get_depth(node, NULL);
195b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
196b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
197b35df4ddSVladimir Medvedkin
198b35df4ddSVladimir Medvedkin /* test rte_rib_set_nh() with incorrect args */
199b35df4ddSVladimir Medvedkin ret = rte_rib_set_nh(NULL, nh_set);
200b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
201b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
202b35df4ddSVladimir Medvedkin
203b35df4ddSVladimir Medvedkin /* test rte_rib_get_nh() with incorrect args */
204b35df4ddSVladimir Medvedkin ret = rte_rib_get_nh(NULL, &nh_ret);
205b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
206b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
207b35df4ddSVladimir Medvedkin ret = rte_rib_get_nh(node, NULL);
208b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret < 0,
209b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
210b35df4ddSVladimir Medvedkin
211b35df4ddSVladimir Medvedkin /* test rte_rib_get_ext() with incorrect args */
212b35df4ddSVladimir Medvedkin ext = rte_rib_get_ext(NULL);
213b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ext == NULL,
214b35df4ddSVladimir Medvedkin "Call succeeded with invalid parameters\n");
215b35df4ddSVladimir Medvedkin
216b35df4ddSVladimir Medvedkin /* check the return values */
217b35df4ddSVladimir Medvedkin ret = rte_rib_get_ip(node, &ip_ret);
218b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (ip_ret == ip),
219b35df4ddSVladimir Medvedkin "Failed to get proper node ip\n");
220b35df4ddSVladimir Medvedkin ret = rte_rib_get_depth(node, &depth_ret);
221b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (depth_ret == depth),
222b35df4ddSVladimir Medvedkin "Failed to get proper node depth\n");
223b35df4ddSVladimir Medvedkin ret = rte_rib_set_nh(node, nh_set);
224b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0,
225b35df4ddSVladimir Medvedkin "Failed to set rte_rib_node nexthop\n");
226b35df4ddSVladimir Medvedkin ret = rte_rib_get_nh(node, &nh_ret);
227b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (nh_ret == nh_set),
228b35df4ddSVladimir Medvedkin "Failed to get proper nexthop\n");
229b35df4ddSVladimir Medvedkin
230b35df4ddSVladimir Medvedkin rte_rib_free(rib);
231b35df4ddSVladimir Medvedkin
232b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
233b35df4ddSVladimir Medvedkin }
234b35df4ddSVladimir Medvedkin
235b35df4ddSVladimir Medvedkin /*
236b35df4ddSVladimir Medvedkin * Call insert, lookup/lookup_exact and delete for a single rule
237b35df4ddSVladimir Medvedkin */
238b35df4ddSVladimir Medvedkin int32_t
test_basic(void)239b35df4ddSVladimir Medvedkin test_basic(void)
240b35df4ddSVladimir Medvedkin {
241b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
242b35df4ddSVladimir Medvedkin struct rte_rib_node *node;
243b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
244b35df4ddSVladimir Medvedkin
245b35df4ddSVladimir Medvedkin uint32_t ip = RTE_IPV4(192, 0, 2, 0);
246b35df4ddSVladimir Medvedkin uint64_t next_hop_add = 10;
247b35df4ddSVladimir Medvedkin uint64_t next_hop_return;
248b35df4ddSVladimir Medvedkin uint8_t depth = 24;
249b35df4ddSVladimir Medvedkin int ret;
250b35df4ddSVladimir Medvedkin
251b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
252b35df4ddSVladimir Medvedkin config.ext_sz = 0;
253b35df4ddSVladimir Medvedkin
254b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
255b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
256b35df4ddSVladimir Medvedkin
257b35df4ddSVladimir Medvedkin node = rte_rib_insert(rib, ip, depth);
258b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
259b35df4ddSVladimir Medvedkin
260b35df4ddSVladimir Medvedkin ret = rte_rib_set_nh(node, next_hop_add);
261b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(ret == 0,
262b35df4ddSVladimir Medvedkin "Failed to set rte_rib_node field\n");
263b35df4ddSVladimir Medvedkin
264b35df4ddSVladimir Medvedkin node = rte_rib_lookup(rib, ip);
265b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to lookup\n");
266b35df4ddSVladimir Medvedkin
267b35df4ddSVladimir Medvedkin ret = rte_rib_get_nh(node, &next_hop_return);
268b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (next_hop_add == next_hop_return),
269b35df4ddSVladimir Medvedkin "Failed to get proper nexthop\n");
270b35df4ddSVladimir Medvedkin
271b35df4ddSVladimir Medvedkin node = rte_rib_lookup_exact(rib, ip, depth);
272b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL,
273b35df4ddSVladimir Medvedkin "Failed to lookup\n");
274b35df4ddSVladimir Medvedkin
275b35df4ddSVladimir Medvedkin ret = rte_rib_get_nh(node, &next_hop_return);
276b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT((ret == 0) && (next_hop_add == next_hop_return),
277b35df4ddSVladimir Medvedkin "Failed to get proper nexthop\n");
278b35df4ddSVladimir Medvedkin
279b35df4ddSVladimir Medvedkin rte_rib_remove(rib, ip, depth);
280b35df4ddSVladimir Medvedkin
281b35df4ddSVladimir Medvedkin node = rte_rib_lookup(rib, ip);
282b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node == NULL,
283b35df4ddSVladimir Medvedkin "Lookup returns non existent rule\n");
284b35df4ddSVladimir Medvedkin node = rte_rib_lookup_exact(rib, ip, depth);
285b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node == NULL,
286b35df4ddSVladimir Medvedkin "Lookup returns non existent rule\n");
287b35df4ddSVladimir Medvedkin
288b35df4ddSVladimir Medvedkin rte_rib_free(rib);
289b35df4ddSVladimir Medvedkin
290b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
291b35df4ddSVladimir Medvedkin }
292b35df4ddSVladimir Medvedkin
293b35df4ddSVladimir Medvedkin int32_t
test_tree_traversal(void)294b35df4ddSVladimir Medvedkin test_tree_traversal(void)
295b35df4ddSVladimir Medvedkin {
296b35df4ddSVladimir Medvedkin struct rte_rib *rib = NULL;
297b35df4ddSVladimir Medvedkin struct rte_rib_node *node;
298b35df4ddSVladimir Medvedkin struct rte_rib_conf config;
299b35df4ddSVladimir Medvedkin
300b35df4ddSVladimir Medvedkin uint32_t ip1 = RTE_IPV4(10, 10, 10, 0);
301b35df4ddSVladimir Medvedkin uint32_t ip2 = RTE_IPV4(10, 10, 130, 80);
302b35df4ddSVladimir Medvedkin uint8_t depth = 30;
303b35df4ddSVladimir Medvedkin
304b35df4ddSVladimir Medvedkin config.max_nodes = MAX_RULES;
305b35df4ddSVladimir Medvedkin config.ext_sz = 0;
306b35df4ddSVladimir Medvedkin
307b35df4ddSVladimir Medvedkin rib = rte_rib_create(__func__, SOCKET_ID_ANY, &config);
308b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n");
309b35df4ddSVladimir Medvedkin
310b35df4ddSVladimir Medvedkin node = rte_rib_insert(rib, ip1, depth);
311b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
312b35df4ddSVladimir Medvedkin
313b35df4ddSVladimir Medvedkin node = rte_rib_insert(rib, ip2, depth);
314b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n");
315b35df4ddSVladimir Medvedkin
316b35df4ddSVladimir Medvedkin node = NULL;
317b35df4ddSVladimir Medvedkin node = rte_rib_get_nxt(rib, RTE_IPV4(10, 10, 130, 0), 24, node,
318b35df4ddSVladimir Medvedkin RTE_RIB_GET_NXT_ALL);
319b35df4ddSVladimir Medvedkin RTE_TEST_ASSERT(node != NULL, "Failed to get rib_node\n");
320b35df4ddSVladimir Medvedkin
321b35df4ddSVladimir Medvedkin rte_rib_free(rib);
322b35df4ddSVladimir Medvedkin
323b35df4ddSVladimir Medvedkin return TEST_SUCCESS;
324b35df4ddSVladimir Medvedkin }
325b35df4ddSVladimir Medvedkin
326b35df4ddSVladimir Medvedkin static struct unit_test_suite rib_tests = {
327b35df4ddSVladimir Medvedkin .suite_name = "rib autotest",
328b35df4ddSVladimir Medvedkin .setup = NULL,
329b35df4ddSVladimir Medvedkin .teardown = NULL,
330b35df4ddSVladimir Medvedkin .unit_test_cases = {
331b35df4ddSVladimir Medvedkin TEST_CASE(test_create_invalid),
332b35df4ddSVladimir Medvedkin TEST_CASE(test_free_null),
333b35df4ddSVladimir Medvedkin TEST_CASE(test_insert_invalid),
334b35df4ddSVladimir Medvedkin TEST_CASE(test_get_fn),
335b35df4ddSVladimir Medvedkin TEST_CASE(test_basic),
336b35df4ddSVladimir Medvedkin TEST_CASE(test_tree_traversal),
337b35df4ddSVladimir Medvedkin TEST_CASES_END()
338b35df4ddSVladimir Medvedkin }
339b35df4ddSVladimir Medvedkin };
340b35df4ddSVladimir Medvedkin
34123f5fb66SVladimir Medvedkin static struct unit_test_suite rib_slow_tests = {
34223f5fb66SVladimir Medvedkin .suite_name = "rib slow autotest",
34323f5fb66SVladimir Medvedkin .setup = NULL,
34423f5fb66SVladimir Medvedkin .teardown = NULL,
34523f5fb66SVladimir Medvedkin .unit_test_cases = {
34623f5fb66SVladimir Medvedkin TEST_CASE(test_multiple_create),
34723f5fb66SVladimir Medvedkin TEST_CASES_END()
34823f5fb66SVladimir Medvedkin }
34923f5fb66SVladimir Medvedkin };
35023f5fb66SVladimir Medvedkin
351b35df4ddSVladimir Medvedkin /*
352b35df4ddSVladimir Medvedkin * Do all unit tests.
353b35df4ddSVladimir Medvedkin */
354b35df4ddSVladimir Medvedkin static int
test_rib(void)355b35df4ddSVladimir Medvedkin test_rib(void)
356b35df4ddSVladimir Medvedkin {
357b35df4ddSVladimir Medvedkin return unit_test_suite_runner(&rib_tests);
358b35df4ddSVladimir Medvedkin }
359b35df4ddSVladimir Medvedkin
36023f5fb66SVladimir Medvedkin static int
test_slow_rib(void)36123f5fb66SVladimir Medvedkin test_slow_rib(void)
36223f5fb66SVladimir Medvedkin {
36323f5fb66SVladimir Medvedkin return unit_test_suite_runner(&rib_slow_tests);
36423f5fb66SVladimir Medvedkin }
36523f5fb66SVladimir Medvedkin
366*e0a8442cSBruce Richardson REGISTER_FAST_TEST(rib_autotest, true, true, test_rib);
367*e0a8442cSBruce Richardson REGISTER_PERF_TEST(rib_slow_autotest, test_slow_rib);
368