xref: /f-stack/dpdk/app/test/test_fbarray.c (revision 4418919f)
1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
3*4418919fSjohnjiang  */
4*4418919fSjohnjiang 
5*4418919fSjohnjiang #include <stdbool.h>
6*4418919fSjohnjiang #include <stdio.h>
7*4418919fSjohnjiang #include <stdint.h>
8*4418919fSjohnjiang #include <limits.h>
9*4418919fSjohnjiang 
10*4418919fSjohnjiang #include <rte_common.h>
11*4418919fSjohnjiang #include <rte_debug.h>
12*4418919fSjohnjiang #include <rte_errno.h>
13*4418919fSjohnjiang #include <rte_fbarray.h>
14*4418919fSjohnjiang 
15*4418919fSjohnjiang #include "test.h"
16*4418919fSjohnjiang 
17*4418919fSjohnjiang struct fbarray_testsuite_params {
18*4418919fSjohnjiang 	struct rte_fbarray arr;
19*4418919fSjohnjiang 	int start;
20*4418919fSjohnjiang 	int end;
21*4418919fSjohnjiang };
22*4418919fSjohnjiang 
23*4418919fSjohnjiang static struct fbarray_testsuite_params param;
24*4418919fSjohnjiang 
25*4418919fSjohnjiang #define FBARRAY_TEST_ARR_NAME "fbarray_autotest"
26*4418919fSjohnjiang #define FBARRAY_TEST_LEN 256
27*4418919fSjohnjiang #define FBARRAY_TEST_ELT_SZ (sizeof(int))
28*4418919fSjohnjiang 
autotest_setup(void)29*4418919fSjohnjiang static int autotest_setup(void)
30*4418919fSjohnjiang {
31*4418919fSjohnjiang 	return rte_fbarray_init(&param.arr, FBARRAY_TEST_ARR_NAME,
32*4418919fSjohnjiang 			FBARRAY_TEST_LEN, FBARRAY_TEST_ELT_SZ);
33*4418919fSjohnjiang }
34*4418919fSjohnjiang 
autotest_teardown(void)35*4418919fSjohnjiang static void autotest_teardown(void)
36*4418919fSjohnjiang {
37*4418919fSjohnjiang 	rte_fbarray_destroy(&param.arr);
38*4418919fSjohnjiang }
39*4418919fSjohnjiang 
init_array(void)40*4418919fSjohnjiang static int init_array(void)
41*4418919fSjohnjiang {
42*4418919fSjohnjiang 	int i;
43*4418919fSjohnjiang 	for (i = param.start; i <= param.end; i++) {
44*4418919fSjohnjiang 		if (rte_fbarray_set_used(&param.arr, i))
45*4418919fSjohnjiang 			return -1;
46*4418919fSjohnjiang 	}
47*4418919fSjohnjiang 	return 0;
48*4418919fSjohnjiang }
49*4418919fSjohnjiang 
reset_array(void)50*4418919fSjohnjiang static void reset_array(void)
51*4418919fSjohnjiang {
52*4418919fSjohnjiang 	int i;
53*4418919fSjohnjiang 	for (i = 0; i < FBARRAY_TEST_LEN; i++)
54*4418919fSjohnjiang 		rte_fbarray_set_free(&param.arr, i);
55*4418919fSjohnjiang }
56*4418919fSjohnjiang 
first_msk_test_setup(void)57*4418919fSjohnjiang static int first_msk_test_setup(void)
58*4418919fSjohnjiang {
59*4418919fSjohnjiang 	/* put all within first mask */
60*4418919fSjohnjiang 	param.start = 3;
61*4418919fSjohnjiang 	param.end = 10;
62*4418919fSjohnjiang 	return init_array();
63*4418919fSjohnjiang }
64*4418919fSjohnjiang 
cross_msk_test_setup(void)65*4418919fSjohnjiang static int cross_msk_test_setup(void)
66*4418919fSjohnjiang {
67*4418919fSjohnjiang 	/* put all within second and third mask */
68*4418919fSjohnjiang 	param.start = 70;
69*4418919fSjohnjiang 	param.end = 160;
70*4418919fSjohnjiang 	return init_array();
71*4418919fSjohnjiang }
72*4418919fSjohnjiang 
multi_msk_test_setup(void)73*4418919fSjohnjiang static int multi_msk_test_setup(void)
74*4418919fSjohnjiang {
75*4418919fSjohnjiang 	/* put all within first and last mask */
76*4418919fSjohnjiang 	param.start = 3;
77*4418919fSjohnjiang 	param.end = FBARRAY_TEST_LEN - 20;
78*4418919fSjohnjiang 	return init_array();
79*4418919fSjohnjiang }
80*4418919fSjohnjiang 
last_msk_test_setup(void)81*4418919fSjohnjiang static int last_msk_test_setup(void)
82*4418919fSjohnjiang {
83*4418919fSjohnjiang 	/* put all within last mask */
84*4418919fSjohnjiang 	param.start = FBARRAY_TEST_LEN - 20;
85*4418919fSjohnjiang 	param.end = FBARRAY_TEST_LEN - 1;
86*4418919fSjohnjiang 	return init_array();
87*4418919fSjohnjiang }
88*4418919fSjohnjiang 
full_msk_test_setup(void)89*4418919fSjohnjiang static int full_msk_test_setup(void)
90*4418919fSjohnjiang {
91*4418919fSjohnjiang 	/* fill entire mask */
92*4418919fSjohnjiang 	param.start = 0;
93*4418919fSjohnjiang 	param.end = FBARRAY_TEST_LEN - 1;
94*4418919fSjohnjiang 	return init_array();
95*4418919fSjohnjiang }
96*4418919fSjohnjiang 
empty_msk_test_setup(void)97*4418919fSjohnjiang static int empty_msk_test_setup(void)
98*4418919fSjohnjiang {
99*4418919fSjohnjiang 	/* do not fill anything in */
100*4418919fSjohnjiang 	reset_array();
101*4418919fSjohnjiang 	param.start = -1;
102*4418919fSjohnjiang 	param.end = -1;
103*4418919fSjohnjiang 	return 0;
104*4418919fSjohnjiang }
105*4418919fSjohnjiang 
test_invalid(void)106*4418919fSjohnjiang static int test_invalid(void)
107*4418919fSjohnjiang {
108*4418919fSjohnjiang 	struct rte_fbarray dummy;
109*4418919fSjohnjiang 
110*4418919fSjohnjiang 	/* invalid parameters */
111*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_attach(NULL),
112*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
113*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
114*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_detach(NULL),
115*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
116*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
117*4418919fSjohnjiang 
118*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_destroy(NULL),
119*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
120*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno valuey\n");
121*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_init(NULL, "fail", 16, 16),
122*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
123*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
124*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, NULL, 16, 16),
125*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
126*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
127*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, "fail", 0, 16),
128*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
129*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
130*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, "fail", 16, 0),
131*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
132*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
133*4418919fSjohnjiang 	/* len must not be greater than INT_MAX */
134*4418919fSjohnjiang 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, "fail", INT_MAX + 1U, 16),
135*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
136*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
137*4418919fSjohnjiang 
138*4418919fSjohnjiang 	TEST_ASSERT_NULL(rte_fbarray_get(NULL, 0),
139*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
140*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
141*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_idx(NULL, 0) < 0,
142*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
143*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
144*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_set_free(NULL, 0),
145*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
146*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
147*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_set_used(NULL, 0),
148*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
149*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
150*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_contig_free(NULL, 0) < 0,
151*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
152*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
153*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_contig_used(NULL, 0) < 0,
154*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
155*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
156*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_rev_contig_free(NULL, 0) < 0,
157*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
158*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
159*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_rev_contig_used(NULL, 0) < 0,
160*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
161*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
162*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_free(NULL, 0) < 0,
163*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
164*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
165*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_used(NULL, 0) < 0,
166*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
167*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
168*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_free(NULL, 0) < 0,
169*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
170*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
171*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_used(NULL, 0) < 0,
172*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
173*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
174*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_free(NULL, 0, 0) < 0,
175*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
176*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
177*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_used(NULL, 0, 0) < 0,
178*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
179*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
180*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_free(NULL, 0, 0) < 0,
181*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
182*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
183*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_used(NULL, 0, 0) < 0,
184*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
185*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
186*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_is_used(NULL, 0) < 0,
187*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
188*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
189*4418919fSjohnjiang 
190*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_fbarray_init(&dummy, "success",
191*4418919fSjohnjiang 			FBARRAY_TEST_LEN, 8),
192*4418919fSjohnjiang 			"Failed to initialize valid fbarray\n");
193*4418919fSjohnjiang 
194*4418919fSjohnjiang 	/* test API for handling invalid parameters with a valid fbarray */
195*4418919fSjohnjiang 	TEST_ASSERT_NULL(rte_fbarray_get(&dummy, FBARRAY_TEST_LEN),
196*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
197*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
198*4418919fSjohnjiang 
199*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_idx(&dummy, NULL) < 0,
200*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
201*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
202*4418919fSjohnjiang 
203*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_set_free(&dummy, FBARRAY_TEST_LEN),
204*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
205*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
206*4418919fSjohnjiang 
207*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_set_used(&dummy, FBARRAY_TEST_LEN),
208*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
209*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
210*4418919fSjohnjiang 
211*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_contig_free(&dummy, FBARRAY_TEST_LEN) < 0,
212*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
213*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
214*4418919fSjohnjiang 
215*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_contig_used(&dummy, FBARRAY_TEST_LEN) < 0,
216*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
217*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
218*4418919fSjohnjiang 
219*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_rev_contig_free(&dummy,
220*4418919fSjohnjiang 			FBARRAY_TEST_LEN) < 0,
221*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
222*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
223*4418919fSjohnjiang 
224*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_rev_contig_used(&dummy,
225*4418919fSjohnjiang 			FBARRAY_TEST_LEN) < 0,
226*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
227*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
228*4418919fSjohnjiang 
229*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_free(&dummy, FBARRAY_TEST_LEN) < 0,
230*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
231*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
232*4418919fSjohnjiang 
233*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_used(&dummy, FBARRAY_TEST_LEN) < 0,
234*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
235*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
236*4418919fSjohnjiang 
237*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_free(&dummy, FBARRAY_TEST_LEN) < 0,
238*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
239*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
240*4418919fSjohnjiang 
241*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_used(&dummy, FBARRAY_TEST_LEN) < 0,
242*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
243*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
244*4418919fSjohnjiang 
245*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_free(&dummy,
246*4418919fSjohnjiang 			FBARRAY_TEST_LEN, 1) < 0,
247*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
248*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
249*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_free(&dummy, 0,
250*4418919fSjohnjiang 			FBARRAY_TEST_LEN + 1) < 0,
251*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
252*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
253*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_free(&dummy, 0, 0) < 0,
254*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
255*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
256*4418919fSjohnjiang 
257*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_used(&dummy,
258*4418919fSjohnjiang 			FBARRAY_TEST_LEN, 1) < 0,
259*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
260*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
261*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_used(&dummy, 0,
262*4418919fSjohnjiang 			FBARRAY_TEST_LEN + 1) < 0,
263*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
264*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
265*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_used(&dummy, 0, 0) < 0,
266*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
267*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
268*4418919fSjohnjiang 
269*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_free(&dummy,
270*4418919fSjohnjiang 			FBARRAY_TEST_LEN, 1) < 0,
271*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
272*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
273*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_free(&dummy, 0,
274*4418919fSjohnjiang 			FBARRAY_TEST_LEN + 1) < 0,
275*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
276*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
277*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_free(&dummy, 0, 0) < 0,
278*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
279*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
280*4418919fSjohnjiang 
281*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&dummy,
282*4418919fSjohnjiang 			FBARRAY_TEST_LEN, 1) < 0,
283*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
284*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
285*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&dummy, 0,
286*4418919fSjohnjiang 			FBARRAY_TEST_LEN + 1) < 0,
287*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
288*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
289*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&dummy, 0, 0) < 0,
290*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
291*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
292*4418919fSjohnjiang 
293*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_is_used(&dummy, FBARRAY_TEST_LEN) < 0,
294*4418919fSjohnjiang 			"Call succeeded with invalid parameters\n");
295*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
296*4418919fSjohnjiang 
297*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_fbarray_destroy(&dummy),
298*4418919fSjohnjiang 			"Failed to destroy valid fbarray\n");
299*4418919fSjohnjiang 
300*4418919fSjohnjiang 	return TEST_SUCCESS;
301*4418919fSjohnjiang }
302*4418919fSjohnjiang 
check_free(void)303*4418919fSjohnjiang static int check_free(void)
304*4418919fSjohnjiang {
305*4418919fSjohnjiang 	const int idx = 0;
306*4418919fSjohnjiang 	const int last_idx = FBARRAY_TEST_LEN - 1;
307*4418919fSjohnjiang 
308*4418919fSjohnjiang 	/* ensure we can find a free spot */
309*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_free(&param.arr, idx), idx,
310*4418919fSjohnjiang 			"Free space not found where expected\n");
311*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_free(&param.arr, idx, 1), idx,
312*4418919fSjohnjiang 			"Free space not found where expected\n");
313*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(&param.arr, idx),
314*4418919fSjohnjiang 			FBARRAY_TEST_LEN,
315*4418919fSjohnjiang 			"Free space not found where expected\n");
316*4418919fSjohnjiang 
317*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_free(&param.arr, idx), idx,
318*4418919fSjohnjiang 			"Free space not found where expected\n");
319*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_free(&param.arr, idx, 1), idx,
320*4418919fSjohnjiang 			"Free space not found where expected\n");
321*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(&param.arr, idx), 1,
322*4418919fSjohnjiang 			"Free space not found where expected\n");
323*4418919fSjohnjiang 
324*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_free(&param.arr, last_idx),
325*4418919fSjohnjiang 			last_idx, "Free space not found where expected\n");
326*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_free(&param.arr, last_idx, 1),
327*4418919fSjohnjiang 			last_idx, "Free space not found where expected\n");
328*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(&param.arr,
329*4418919fSjohnjiang 			last_idx), FBARRAY_TEST_LEN,
330*4418919fSjohnjiang 			"Free space not found where expected\n");
331*4418919fSjohnjiang 
332*4418919fSjohnjiang 	/* ensure we can't find any used spots */
333*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_used(&param.arr, idx) < 0,
334*4418919fSjohnjiang 			"Used space found where none was expected\n");
335*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
336*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_used(&param.arr, idx, 1) < 0,
337*4418919fSjohnjiang 			"Used space found where none was expected\n");
338*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
339*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(&param.arr, idx), 0,
340*4418919fSjohnjiang 			"Used space found where none was expected\n");
341*4418919fSjohnjiang 
342*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_used(&param.arr, last_idx) < 0,
343*4418919fSjohnjiang 			"Used space found where none was expected\n");
344*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
345*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&param.arr, last_idx, 1) < 0,
346*4418919fSjohnjiang 			"Used space found where none was expected\n");
347*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
348*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr,
349*4418919fSjohnjiang 			last_idx), 0,
350*4418919fSjohnjiang 			"Used space found where none was expected\n");
351*4418919fSjohnjiang 
352*4418919fSjohnjiang 	return 0;
353*4418919fSjohnjiang }
354*4418919fSjohnjiang 
check_used_one(void)355*4418919fSjohnjiang static int check_used_one(void)
356*4418919fSjohnjiang {
357*4418919fSjohnjiang 	const int idx = 0;
358*4418919fSjohnjiang 	const int last_idx = FBARRAY_TEST_LEN - 1;
359*4418919fSjohnjiang 
360*4418919fSjohnjiang 	/* check that we can find used spots now */
361*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_used(&param.arr, idx), idx,
362*4418919fSjohnjiang 			"Used space not found where expected\n");
363*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_used(&param.arr, idx, 1), idx,
364*4418919fSjohnjiang 			"Used space not found where expected\n");
365*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(&param.arr, idx), 1,
366*4418919fSjohnjiang 			"Used space not found where expected\n");
367*4418919fSjohnjiang 
368*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_used(&param.arr, last_idx), idx,
369*4418919fSjohnjiang 			"Used space not found where expected\n");
370*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_used(&param.arr, last_idx, 1),
371*4418919fSjohnjiang 			idx, "Used space not found where expected\n");
372*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr, idx), 1,
373*4418919fSjohnjiang 			"Used space not found where expected\n");
374*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr,
375*4418919fSjohnjiang 			last_idx), idx,
376*4418919fSjohnjiang 			"Used space not found where expected\n");
377*4418919fSjohnjiang 
378*4418919fSjohnjiang 	/* check if further indices are still free */
379*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_used(&param.arr, idx + 1) < 0,
380*4418919fSjohnjiang 			"Used space not found where none was expected\n");
381*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
382*4418919fSjohnjiang 	TEST_ASSERT(rte_fbarray_find_next_n_used(&param.arr, idx + 1, 1) < 0,
383*4418919fSjohnjiang 			"Used space not found where none was expected\n");
384*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
385*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(&param.arr, idx + 1), 0,
386*4418919fSjohnjiang 			"Used space not found where none was expected\n");
387*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(&param.arr, idx + 1),
388*4418919fSjohnjiang 			FBARRAY_TEST_LEN - 1,
389*4418919fSjohnjiang 			"Used space not found where none was expected\n");
390*4418919fSjohnjiang 
391*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_used(&param.arr, last_idx), 0,
392*4418919fSjohnjiang 			"Used space not found where none was expected\n");
393*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_used(&param.arr, last_idx, 1),
394*4418919fSjohnjiang 			0, "Used space not found where none was expected\n");
395*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr,
396*4418919fSjohnjiang 			last_idx), 0,
397*4418919fSjohnjiang 			"Used space not found where none was expected\n");
398*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(&param.arr,
399*4418919fSjohnjiang 			last_idx), FBARRAY_TEST_LEN - 1,
400*4418919fSjohnjiang 			"Used space not found where none was expected\n");
401*4418919fSjohnjiang 
402*4418919fSjohnjiang 	return 0;
403*4418919fSjohnjiang }
404*4418919fSjohnjiang 
test_basic(void)405*4418919fSjohnjiang static int test_basic(void)
406*4418919fSjohnjiang {
407*4418919fSjohnjiang 	const int idx = 0;
408*4418919fSjohnjiang 	int i;
409*4418919fSjohnjiang 
410*4418919fSjohnjiang 	/* check array count */
411*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(param.arr.count, 0, "Wrong element count\n");
412*4418919fSjohnjiang 
413*4418919fSjohnjiang 	/* ensure we can find a free spot */
414*4418919fSjohnjiang 	if (check_free())
415*4418919fSjohnjiang 		return TEST_FAILED;
416*4418919fSjohnjiang 
417*4418919fSjohnjiang 	/* check if used */
418*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_is_used(&param.arr, idx), 0,
419*4418919fSjohnjiang 			"Used space found where not expected\n");
420*4418919fSjohnjiang 
421*4418919fSjohnjiang 	/* mark as used */
422*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_fbarray_set_used(&param.arr, idx),
423*4418919fSjohnjiang 			"Failed to set as used\n");
424*4418919fSjohnjiang 
425*4418919fSjohnjiang 	/* check if used again */
426*4418919fSjohnjiang 	TEST_ASSERT_NOT_EQUAL(rte_fbarray_is_used(&param.arr, idx), 0,
427*4418919fSjohnjiang 			"Used space not found where expected\n");
428*4418919fSjohnjiang 
429*4418919fSjohnjiang 	if (check_used_one())
430*4418919fSjohnjiang 		return TEST_FAILED;
431*4418919fSjohnjiang 
432*4418919fSjohnjiang 	/* check array count */
433*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(param.arr.count, 1, "Wrong element count\n");
434*4418919fSjohnjiang 
435*4418919fSjohnjiang 	/* check if getting pointers works for every element */
436*4418919fSjohnjiang 	for (i = 0; i < FBARRAY_TEST_LEN; i++) {
437*4418919fSjohnjiang 		void *td = rte_fbarray_get(&param.arr, i);
438*4418919fSjohnjiang 		TEST_ASSERT_NOT_NULL(td, "Invalid pointer returned\n");
439*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_idx(&param.arr, td), i,
440*4418919fSjohnjiang 				"Wrong index returned\n");
441*4418919fSjohnjiang 	}
442*4418919fSjohnjiang 
443*4418919fSjohnjiang 	/* mark as free */
444*4418919fSjohnjiang 	TEST_ASSERT_SUCCESS(rte_fbarray_set_free(&param.arr, idx),
445*4418919fSjohnjiang 			"Failed to set as free\n");
446*4418919fSjohnjiang 
447*4418919fSjohnjiang 	/* check array count */
448*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(param.arr.count, 0, "Wrong element count\n");
449*4418919fSjohnjiang 
450*4418919fSjohnjiang 	/* check if used */
451*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_is_used(&param.arr, idx), 0,
452*4418919fSjohnjiang 			"Used space found where not expected\n");
453*4418919fSjohnjiang 
454*4418919fSjohnjiang 	if (check_free())
455*4418919fSjohnjiang 		return TEST_FAILED;
456*4418919fSjohnjiang 
457*4418919fSjohnjiang 	reset_array();
458*4418919fSjohnjiang 
459*4418919fSjohnjiang 	return TEST_SUCCESS;
460*4418919fSjohnjiang }
461*4418919fSjohnjiang 
test_biggest(struct rte_fbarray * arr,int first,int last)462*4418919fSjohnjiang static int test_biggest(struct rte_fbarray *arr, int first, int last)
463*4418919fSjohnjiang {
464*4418919fSjohnjiang 	int lo_free_space_first, lo_free_space_last, lo_free_space_len;
465*4418919fSjohnjiang 	int hi_free_space_first, hi_free_space_last, hi_free_space_len;
466*4418919fSjohnjiang 	int max_free_space_first, max_free_space_last, max_free_space_len;
467*4418919fSjohnjiang 	int len = last - first + 1;
468*4418919fSjohnjiang 
469*4418919fSjohnjiang 	/* first and last must either be both -1, or both not -1 */
470*4418919fSjohnjiang 	TEST_ASSERT((first == -1) == (last == -1),
471*4418919fSjohnjiang 			"Invalid arguments provided\n");
472*4418919fSjohnjiang 
473*4418919fSjohnjiang 	/* figure out what we expect from the low chunk of free space */
474*4418919fSjohnjiang 	if (first == -1) {
475*4418919fSjohnjiang 		/* special case: if there are no occupied elements at all,
476*4418919fSjohnjiang 		 * consider both free spaces to consume the entire array.
477*4418919fSjohnjiang 		 */
478*4418919fSjohnjiang 		lo_free_space_first = 0;
479*4418919fSjohnjiang 		lo_free_space_last = arr->len - 1;
480*4418919fSjohnjiang 		lo_free_space_len = arr->len;
481*4418919fSjohnjiang 		/* if there's no used space, length should be invalid */
482*4418919fSjohnjiang 		len = -1;
483*4418919fSjohnjiang 	} else if (first == 0) {
484*4418919fSjohnjiang 		/* if occupied items start at 0, there's no free space */
485*4418919fSjohnjiang 		lo_free_space_first = -1;
486*4418919fSjohnjiang 		lo_free_space_last = -1;
487*4418919fSjohnjiang 		lo_free_space_len = 0;
488*4418919fSjohnjiang 	} else {
489*4418919fSjohnjiang 		lo_free_space_first = 0;
490*4418919fSjohnjiang 		lo_free_space_last = first - 1;
491*4418919fSjohnjiang 		lo_free_space_len = lo_free_space_last -
492*4418919fSjohnjiang 				lo_free_space_first + 1;
493*4418919fSjohnjiang 	}
494*4418919fSjohnjiang 
495*4418919fSjohnjiang 	/* figure out what we expect from the high chunk of free space */
496*4418919fSjohnjiang 	if (last == -1) {
497*4418919fSjohnjiang 		/* special case: if there are no occupied elements at all,
498*4418919fSjohnjiang 		 * consider both free spaces to consume the entire array.
499*4418919fSjohnjiang 		 */
500*4418919fSjohnjiang 		hi_free_space_first = 0;
501*4418919fSjohnjiang 		hi_free_space_last = arr->len - 1;
502*4418919fSjohnjiang 		hi_free_space_len = arr->len;
503*4418919fSjohnjiang 		/* if there's no used space, length should be invalid */
504*4418919fSjohnjiang 		len = -1;
505*4418919fSjohnjiang 	} else if (last == ((int)arr->len - 1)) {
506*4418919fSjohnjiang 		/* if occupied items end at array len, there's no free space */
507*4418919fSjohnjiang 		hi_free_space_first = -1;
508*4418919fSjohnjiang 		hi_free_space_last = -1;
509*4418919fSjohnjiang 		hi_free_space_len = 0;
510*4418919fSjohnjiang 	} else {
511*4418919fSjohnjiang 		hi_free_space_first = last + 1;
512*4418919fSjohnjiang 		hi_free_space_last = arr->len - 1;
513*4418919fSjohnjiang 		hi_free_space_len = hi_free_space_last -
514*4418919fSjohnjiang 				hi_free_space_first + 1;
515*4418919fSjohnjiang 	}
516*4418919fSjohnjiang 
517*4418919fSjohnjiang 	/* find which one will be biggest */
518*4418919fSjohnjiang 	if (lo_free_space_len > hi_free_space_len) {
519*4418919fSjohnjiang 		max_free_space_first = lo_free_space_first;
520*4418919fSjohnjiang 		max_free_space_last = lo_free_space_last;
521*4418919fSjohnjiang 		max_free_space_len = lo_free_space_len;
522*4418919fSjohnjiang 	} else {
523*4418919fSjohnjiang 		/* if they are equal, we'll just use the high chunk */
524*4418919fSjohnjiang 		max_free_space_first = hi_free_space_first;
525*4418919fSjohnjiang 		max_free_space_last = hi_free_space_last;
526*4418919fSjohnjiang 		max_free_space_len = hi_free_space_len;
527*4418919fSjohnjiang 	}
528*4418919fSjohnjiang 
529*4418919fSjohnjiang 	/* check used regions - these should produce identical results */
530*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_biggest_used(arr, 0), first,
531*4418919fSjohnjiang 			"Used space index is wrong\n");
532*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_biggest_used(arr, arr->len - 1),
533*4418919fSjohnjiang 			first,
534*4418919fSjohnjiang 			"Used space index is wrong\n");
535*4418919fSjohnjiang 	/* len may be -1, but function will return error anyway */
536*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(arr, first), len,
537*4418919fSjohnjiang 			"Used space length is wrong\n");
538*4418919fSjohnjiang 
539*4418919fSjohnjiang 	/* check if biggest free region is the one we expect to find. It can be
540*4418919fSjohnjiang 	 * -1 if there's no free space - we've made sure we use one or the
541*4418919fSjohnjiang 	 * other, even if both are invalid.
542*4418919fSjohnjiang 	 */
543*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_biggest_free(arr, 0),
544*4418919fSjohnjiang 			max_free_space_first,
545*4418919fSjohnjiang 			"Biggest free space index is wrong\n");
546*4418919fSjohnjiang 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_biggest_free(arr, arr->len - 1),
547*4418919fSjohnjiang 			max_free_space_first,
548*4418919fSjohnjiang 			"Biggest free space index is wrong\n");
549*4418919fSjohnjiang 
550*4418919fSjohnjiang 	/* if biggest region exists, check its length */
551*4418919fSjohnjiang 	if (max_free_space_first != -1) {
552*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(arr,
553*4418919fSjohnjiang 					max_free_space_first),
554*4418919fSjohnjiang 				max_free_space_len,
555*4418919fSjohnjiang 				"Biggest free space length is wrong\n");
556*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
557*4418919fSjohnjiang 					max_free_space_last),
558*4418919fSjohnjiang 				max_free_space_len,
559*4418919fSjohnjiang 				"Biggest free space length is wrong\n");
560*4418919fSjohnjiang 	}
561*4418919fSjohnjiang 
562*4418919fSjohnjiang 	/* find if we see what we expect to see in the low region. if there is
563*4418919fSjohnjiang 	 * no free space, the function should still match expected value, as
564*4418919fSjohnjiang 	 * we've set it to -1. we're scanning backwards to avoid accidentally
565*4418919fSjohnjiang 	 * hitting the high free space region. if there is no occupied space,
566*4418919fSjohnjiang 	 * there's nothing to do.
567*4418919fSjohnjiang 	 */
568*4418919fSjohnjiang 	if (last != -1) {
569*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_rev_biggest_free(arr, last),
570*4418919fSjohnjiang 				lo_free_space_first,
571*4418919fSjohnjiang 				"Low free space index is wrong\n");
572*4418919fSjohnjiang 	}
573*4418919fSjohnjiang 
574*4418919fSjohnjiang 	if (lo_free_space_first != -1) {
575*4418919fSjohnjiang 		/* if low free region exists, check its length */
576*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(arr,
577*4418919fSjohnjiang 					lo_free_space_first),
578*4418919fSjohnjiang 				lo_free_space_len,
579*4418919fSjohnjiang 				"Low free space length is wrong\n");
580*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
581*4418919fSjohnjiang 					lo_free_space_last),
582*4418919fSjohnjiang 				lo_free_space_len,
583*4418919fSjohnjiang 				"Low free space length is wrong\n");
584*4418919fSjohnjiang 	}
585*4418919fSjohnjiang 
586*4418919fSjohnjiang 	/* find if we see what we expect to see in the high region. if there is
587*4418919fSjohnjiang 	 * no free space, the function should still match expected value, as
588*4418919fSjohnjiang 	 * we've set it to -1. we're scanning forwards to avoid accidentally
589*4418919fSjohnjiang 	 * hitting the low free space region. if there is no occupied space,
590*4418919fSjohnjiang 	 * there's nothing to do.
591*4418919fSjohnjiang 	 */
592*4418919fSjohnjiang 	if (first != -1) {
593*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_biggest_free(arr, first),
594*4418919fSjohnjiang 				hi_free_space_first,
595*4418919fSjohnjiang 				"High free space index is wrong\n");
596*4418919fSjohnjiang 	}
597*4418919fSjohnjiang 
598*4418919fSjohnjiang 	/* if high free region exists, check its length */
599*4418919fSjohnjiang 	if (hi_free_space_first != -1) {
600*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(arr,
601*4418919fSjohnjiang 					hi_free_space_first),
602*4418919fSjohnjiang 				hi_free_space_len,
603*4418919fSjohnjiang 				"High free space length is wrong\n");
604*4418919fSjohnjiang 		TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
605*4418919fSjohnjiang 					hi_free_space_last),
606*4418919fSjohnjiang 				hi_free_space_len,
607*4418919fSjohnjiang 				"High free space length is wrong\n");
608*4418919fSjohnjiang 	}
609*4418919fSjohnjiang 
610*4418919fSjohnjiang 	return 0;
611*4418919fSjohnjiang }
612*4418919fSjohnjiang 
ensure_correct(struct rte_fbarray * arr,int first,int last,bool used)613*4418919fSjohnjiang static int ensure_correct(struct rte_fbarray *arr, int first, int last,
614*4418919fSjohnjiang 		bool used)
615*4418919fSjohnjiang {
616*4418919fSjohnjiang 	int i, len = last - first + 1;
617*4418919fSjohnjiang 	for (i = 0; i < len; i++) {
618*4418919fSjohnjiang 		int cur = first + i;
619*4418919fSjohnjiang 		int cur_len = len - i;
620*4418919fSjohnjiang 
621*4418919fSjohnjiang 		if (used) {
622*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(arr,
623*4418919fSjohnjiang 					cur), cur_len,
624*4418919fSjohnjiang 					"Used space length is wrong\n");
625*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(arr,
626*4418919fSjohnjiang 					last), len,
627*4418919fSjohnjiang 					"Used space length is wrong\n");
628*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(arr,
629*4418919fSjohnjiang 					cur), i + 1,
630*4418919fSjohnjiang 					"Used space length is wrong\n");
631*4418919fSjohnjiang 
632*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_used(arr, cur),
633*4418919fSjohnjiang 					cur,
634*4418919fSjohnjiang 					"Used space not found where expected\n");
635*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_used(arr,
636*4418919fSjohnjiang 					cur, 1), cur,
637*4418919fSjohnjiang 					"Used space not found where expected\n");
638*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_used(arr, cur,
639*4418919fSjohnjiang 					cur_len), cur,
640*4418919fSjohnjiang 					"Used space not found where expected\n");
641*4418919fSjohnjiang 
642*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_used(arr, cur),
643*4418919fSjohnjiang 					cur,
644*4418919fSjohnjiang 					"Used space not found where expected\n");
645*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_used(arr,
646*4418919fSjohnjiang 					last, cur_len), cur,
647*4418919fSjohnjiang 					"Used space not found where expected\n");
648*4418919fSjohnjiang 		} else {
649*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(arr,
650*4418919fSjohnjiang 					cur), cur_len,
651*4418919fSjohnjiang 					"Free space length is wrong\n");
652*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
653*4418919fSjohnjiang 					last), len,
654*4418919fSjohnjiang 					"Free space length is wrong\n");
655*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
656*4418919fSjohnjiang 					cur), i + 1,
657*4418919fSjohnjiang 					"Free space length is wrong\n");
658*4418919fSjohnjiang 
659*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_free(arr, cur),
660*4418919fSjohnjiang 					cur,
661*4418919fSjohnjiang 					"Free space not found where expected\n");
662*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_free(arr, cur,
663*4418919fSjohnjiang 					1), cur,
664*4418919fSjohnjiang 					"Free space not found where expected\n");
665*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_free(arr, cur,
666*4418919fSjohnjiang 					cur_len), cur,
667*4418919fSjohnjiang 					"Free space not found where expected\n");
668*4418919fSjohnjiang 
669*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_free(arr, cur),
670*4418919fSjohnjiang 					cur,
671*4418919fSjohnjiang 					"Free space not found where expected\n");
672*4418919fSjohnjiang 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_free(arr,
673*4418919fSjohnjiang 					last, cur_len), cur,
674*4418919fSjohnjiang 					"Free space not found where expected\n");
675*4418919fSjohnjiang 		}
676*4418919fSjohnjiang 	}
677*4418919fSjohnjiang 	return 0;
678*4418919fSjohnjiang }
679*4418919fSjohnjiang 
test_find(void)680*4418919fSjohnjiang static int test_find(void)
681*4418919fSjohnjiang {
682*4418919fSjohnjiang 	TEST_ASSERT_EQUAL((int)param.arr.count, param.end - param.start + 1,
683*4418919fSjohnjiang 			"Wrong element count\n");
684*4418919fSjohnjiang 	/* ensure space is free before start */
685*4418919fSjohnjiang 	if (ensure_correct(&param.arr, 0, param.start - 1, false))
686*4418919fSjohnjiang 		return TEST_FAILED;
687*4418919fSjohnjiang 	/* ensure space is occupied where it's supposed to be */
688*4418919fSjohnjiang 	if (ensure_correct(&param.arr, param.start, param.end, true))
689*4418919fSjohnjiang 		return TEST_FAILED;
690*4418919fSjohnjiang 	/* ensure space after end is free as well */
691*4418919fSjohnjiang 	if (ensure_correct(&param.arr, param.end + 1, FBARRAY_TEST_LEN - 1,
692*4418919fSjohnjiang 			false))
693*4418919fSjohnjiang 		return TEST_FAILED;
694*4418919fSjohnjiang 	/* test if find_biggest API's work correctly */
695*4418919fSjohnjiang 	if (test_biggest(&param.arr, param.start, param.end))
696*4418919fSjohnjiang 		return TEST_FAILED;
697*4418919fSjohnjiang 	return TEST_SUCCESS;
698*4418919fSjohnjiang }
699*4418919fSjohnjiang 
test_empty(void)700*4418919fSjohnjiang static int test_empty(void)
701*4418919fSjohnjiang {
702*4418919fSjohnjiang 	TEST_ASSERT_EQUAL((int)param.arr.count, 0, "Wrong element count\n");
703*4418919fSjohnjiang 	/* ensure space is free */
704*4418919fSjohnjiang 	if (ensure_correct(&param.arr, 0, FBARRAY_TEST_LEN - 1, false))
705*4418919fSjohnjiang 		return TEST_FAILED;
706*4418919fSjohnjiang 	/* test if find_biggest API's work correctly */
707*4418919fSjohnjiang 	if (test_biggest(&param.arr, param.start, param.end))
708*4418919fSjohnjiang 		return TEST_FAILED;
709*4418919fSjohnjiang 	return TEST_SUCCESS;
710*4418919fSjohnjiang }
711*4418919fSjohnjiang 
712*4418919fSjohnjiang 
713*4418919fSjohnjiang static struct unit_test_suite fbarray_test_suite = {
714*4418919fSjohnjiang 	.suite_name = "fbarray autotest",
715*4418919fSjohnjiang 	.setup = autotest_setup,
716*4418919fSjohnjiang 	.teardown = autotest_teardown,
717*4418919fSjohnjiang 	.unit_test_cases = {
718*4418919fSjohnjiang 		TEST_CASE(test_invalid),
719*4418919fSjohnjiang 		TEST_CASE(test_basic),
720*4418919fSjohnjiang 		TEST_CASE_ST(first_msk_test_setup, reset_array, test_find),
721*4418919fSjohnjiang 		TEST_CASE_ST(cross_msk_test_setup, reset_array, test_find),
722*4418919fSjohnjiang 		TEST_CASE_ST(multi_msk_test_setup, reset_array, test_find),
723*4418919fSjohnjiang 		TEST_CASE_ST(last_msk_test_setup, reset_array, test_find),
724*4418919fSjohnjiang 		TEST_CASE_ST(full_msk_test_setup, reset_array, test_find),
725*4418919fSjohnjiang 		TEST_CASE_ST(empty_msk_test_setup, reset_array, test_empty),
726*4418919fSjohnjiang 		TEST_CASES_END()
727*4418919fSjohnjiang 	}
728*4418919fSjohnjiang };
729*4418919fSjohnjiang 
730*4418919fSjohnjiang static int
test_fbarray(void)731*4418919fSjohnjiang test_fbarray(void)
732*4418919fSjohnjiang {
733*4418919fSjohnjiang 	return unit_test_suite_runner(&fbarray_test_suite);
734*4418919fSjohnjiang }
735*4418919fSjohnjiang 
736*4418919fSjohnjiang REGISTER_TEST_COMMAND(fbarray_autotest, test_fbarray);
737