xref: /dpdk/app/test/test_fbarray.c (revision 742bde12)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 #include <stdint.h>
7 #include <limits.h>
8 
9 #include <rte_common.h>
10 #include <rte_debug.h>
11 #include <rte_errno.h>
12 #include <rte_fbarray.h>
13 
14 #include "test.h"
15 
16 struct fbarray_testsuite_params {
17 	struct rte_fbarray arr;
18 	int start;
19 	int end;
20 };
21 
22 static struct fbarray_testsuite_params param;
23 
24 #define FBARRAY_TEST_ARR_NAME "fbarray_autotest"
25 #define FBARRAY_TEST_LEN 256
26 #define FBARRAY_TEST_ELT_SZ (sizeof(int))
27 
28 static int autotest_setup(void)
29 {
30 	return rte_fbarray_init(&param.arr, FBARRAY_TEST_ARR_NAME,
31 			FBARRAY_TEST_LEN, FBARRAY_TEST_ELT_SZ);
32 }
33 
34 static void autotest_teardown(void)
35 {
36 	rte_fbarray_destroy(&param.arr);
37 }
38 
39 static int init_array(void)
40 {
41 	int i;
42 	for (i = param.start; i <= param.end; i++) {
43 		if (rte_fbarray_set_used(&param.arr, i))
44 			return -1;
45 	}
46 	return 0;
47 }
48 
49 static void reset_array(void)
50 {
51 	int i;
52 	for (i = 0; i < FBARRAY_TEST_LEN; i++)
53 		rte_fbarray_set_free(&param.arr, i);
54 }
55 
56 static int first_msk_test_setup(void)
57 {
58 	/* put all within first mask */
59 	param.start = 3;
60 	param.end = 10;
61 	return init_array();
62 }
63 
64 static int cross_msk_test_setup(void)
65 {
66 	/* put all within second and third mask */
67 	param.start = 70;
68 	param.end = 160;
69 	return init_array();
70 }
71 
72 static int multi_msk_test_setup(void)
73 {
74 	/* put all within first and last mask */
75 	param.start = 3;
76 	param.end = FBARRAY_TEST_LEN - 20;
77 	return init_array();
78 }
79 
80 static int last_msk_test_setup(void)
81 {
82 	/* put all within last mask */
83 	param.start = FBARRAY_TEST_LEN - 20;
84 	param.end = FBARRAY_TEST_LEN - 1;
85 	return init_array();
86 }
87 
88 static int full_msk_test_setup(void)
89 {
90 	/* fill entire mask */
91 	param.start = 0;
92 	param.end = FBARRAY_TEST_LEN - 1;
93 	return init_array();
94 }
95 
96 static int empty_msk_test_setup(void)
97 {
98 	/* do not fill anything in */
99 	reset_array();
100 	return 0;
101 }
102 
103 static int test_invalid(void)
104 {
105 	struct rte_fbarray dummy;
106 
107 	/* invalid parameters */
108 	TEST_ASSERT_FAIL(rte_fbarray_attach(NULL),
109 			"Call succeeded with invalid parameters\n");
110 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
111 	TEST_ASSERT_FAIL(rte_fbarray_detach(NULL),
112 			"Call succeeded with invalid parameters\n");
113 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
114 
115 	TEST_ASSERT_FAIL(rte_fbarray_destroy(NULL),
116 			"Call succeeded with invalid parameters\n");
117 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno valuey\n");
118 	TEST_ASSERT_FAIL(rte_fbarray_init(NULL, "fail", 16, 16),
119 			"Call succeeded with invalid parameters\n");
120 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
121 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, NULL, 16, 16),
122 			"Call succeeded with invalid parameters\n");
123 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
124 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, "fail", 0, 16),
125 			"Call succeeded with invalid parameters\n");
126 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
127 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, "fail", 16, 0),
128 			"Call succeeded with invalid parameters\n");
129 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
130 	/* len must not be greater than INT_MAX */
131 	TEST_ASSERT_FAIL(rte_fbarray_init(&dummy, "fail", INT_MAX + 1U, 16),
132 			"Call succeeded with invalid parameters\n");
133 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
134 
135 	TEST_ASSERT_NULL(rte_fbarray_get(NULL, 0),
136 			"Call succeeded with invalid parameters\n");
137 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
138 	TEST_ASSERT(rte_fbarray_find_idx(NULL, 0) < 0,
139 			"Call succeeded with invalid parameters\n");
140 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
141 	TEST_ASSERT(rte_fbarray_set_free(NULL, 0),
142 			"Call succeeded with invalid parameters\n");
143 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
144 	TEST_ASSERT(rte_fbarray_set_used(NULL, 0),
145 			"Call succeeded with invalid parameters\n");
146 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
147 	TEST_ASSERT(rte_fbarray_find_contig_free(NULL, 0) < 0,
148 			"Call succeeded with invalid parameters\n");
149 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
150 	TEST_ASSERT(rte_fbarray_find_contig_used(NULL, 0) < 0,
151 			"Call succeeded with invalid parameters\n");
152 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
153 	TEST_ASSERT(rte_fbarray_find_rev_contig_free(NULL, 0) < 0,
154 			"Call succeeded with invalid parameters\n");
155 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
156 	TEST_ASSERT(rte_fbarray_find_rev_contig_used(NULL, 0) < 0,
157 			"Call succeeded with invalid parameters\n");
158 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
159 	TEST_ASSERT(rte_fbarray_find_next_free(NULL, 0) < 0,
160 			"Call succeeded with invalid parameters\n");
161 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
162 	TEST_ASSERT(rte_fbarray_find_next_used(NULL, 0) < 0,
163 			"Call succeeded with invalid parameters\n");
164 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
165 	TEST_ASSERT(rte_fbarray_find_prev_free(NULL, 0) < 0,
166 			"Call succeeded with invalid parameters\n");
167 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
168 	TEST_ASSERT(rte_fbarray_find_prev_used(NULL, 0) < 0,
169 			"Call succeeded with invalid parameters\n");
170 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
171 	TEST_ASSERT(rte_fbarray_find_next_n_free(NULL, 0, 0) < 0,
172 			"Call succeeded with invalid parameters\n");
173 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
174 	TEST_ASSERT(rte_fbarray_find_next_n_used(NULL, 0, 0) < 0,
175 			"Call succeeded with invalid parameters\n");
176 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
177 	TEST_ASSERT(rte_fbarray_find_prev_n_free(NULL, 0, 0) < 0,
178 			"Call succeeded with invalid parameters\n");
179 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
180 	TEST_ASSERT(rte_fbarray_find_prev_n_used(NULL, 0, 0) < 0,
181 			"Call succeeded with invalid parameters\n");
182 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
183 	TEST_ASSERT(rte_fbarray_is_used(NULL, 0) < 0,
184 			"Call succeeded with invalid parameters\n");
185 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
186 
187 	TEST_ASSERT_SUCCESS(rte_fbarray_init(&dummy, "success",
188 			FBARRAY_TEST_LEN, 8),
189 			"Failed to initialize valid fbarray\n");
190 
191 	/* test API for handling invalid parameters with a valid fbarray */
192 	TEST_ASSERT_NULL(rte_fbarray_get(&dummy, FBARRAY_TEST_LEN),
193 			"Call succeeded with invalid parameters\n");
194 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
195 
196 	TEST_ASSERT(rte_fbarray_find_idx(&dummy, NULL) < 0,
197 			"Call succeeded with invalid parameters\n");
198 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
199 
200 	TEST_ASSERT(rte_fbarray_set_free(&dummy, FBARRAY_TEST_LEN),
201 			"Call succeeded with invalid parameters\n");
202 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
203 
204 	TEST_ASSERT(rte_fbarray_set_used(&dummy, FBARRAY_TEST_LEN),
205 			"Call succeeded with invalid parameters\n");
206 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
207 
208 	TEST_ASSERT(rte_fbarray_find_contig_free(&dummy, FBARRAY_TEST_LEN) < 0,
209 			"Call succeeded with invalid parameters\n");
210 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
211 
212 	TEST_ASSERT(rte_fbarray_find_contig_used(&dummy, FBARRAY_TEST_LEN) < 0,
213 			"Call succeeded with invalid parameters\n");
214 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
215 
216 	TEST_ASSERT(rte_fbarray_find_rev_contig_free(&dummy,
217 			FBARRAY_TEST_LEN) < 0,
218 			"Call succeeded with invalid parameters\n");
219 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
220 
221 	TEST_ASSERT(rte_fbarray_find_rev_contig_used(&dummy,
222 			FBARRAY_TEST_LEN) < 0,
223 			"Call succeeded with invalid parameters\n");
224 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
225 
226 	TEST_ASSERT(rte_fbarray_find_next_free(&dummy, FBARRAY_TEST_LEN) < 0,
227 			"Call succeeded with invalid parameters\n");
228 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
229 
230 	TEST_ASSERT(rte_fbarray_find_next_used(&dummy, FBARRAY_TEST_LEN) < 0,
231 			"Call succeeded with invalid parameters\n");
232 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
233 
234 	TEST_ASSERT(rte_fbarray_find_prev_free(&dummy, FBARRAY_TEST_LEN) < 0,
235 			"Call succeeded with invalid parameters\n");
236 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
237 
238 	TEST_ASSERT(rte_fbarray_find_prev_used(&dummy, FBARRAY_TEST_LEN) < 0,
239 			"Call succeeded with invalid parameters\n");
240 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
241 
242 	TEST_ASSERT(rte_fbarray_find_next_n_free(&dummy,
243 			FBARRAY_TEST_LEN, 1) < 0,
244 			"Call succeeded with invalid parameters\n");
245 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
246 	TEST_ASSERT(rte_fbarray_find_next_n_free(&dummy, 0,
247 			FBARRAY_TEST_LEN + 1) < 0,
248 			"Call succeeded with invalid parameters\n");
249 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
250 	TEST_ASSERT(rte_fbarray_find_next_n_free(&dummy, 0, 0) < 0,
251 			"Call succeeded with invalid parameters\n");
252 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
253 
254 	TEST_ASSERT(rte_fbarray_find_next_n_used(&dummy,
255 			FBARRAY_TEST_LEN, 1) < 0,
256 			"Call succeeded with invalid parameters\n");
257 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
258 	TEST_ASSERT(rte_fbarray_find_next_n_used(&dummy, 0,
259 			FBARRAY_TEST_LEN + 1) < 0,
260 			"Call succeeded with invalid parameters\n");
261 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
262 	TEST_ASSERT(rte_fbarray_find_next_n_used(&dummy, 0, 0) < 0,
263 			"Call succeeded with invalid parameters\n");
264 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
265 
266 	TEST_ASSERT(rte_fbarray_find_prev_n_free(&dummy,
267 			FBARRAY_TEST_LEN, 1) < 0,
268 			"Call succeeded with invalid parameters\n");
269 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
270 	TEST_ASSERT(rte_fbarray_find_prev_n_free(&dummy, 0,
271 			FBARRAY_TEST_LEN + 1) < 0,
272 			"Call succeeded with invalid parameters\n");
273 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
274 	TEST_ASSERT(rte_fbarray_find_prev_n_free(&dummy, 0, 0) < 0,
275 			"Call succeeded with invalid parameters\n");
276 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
277 
278 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&dummy,
279 			FBARRAY_TEST_LEN, 1) < 0,
280 			"Call succeeded with invalid parameters\n");
281 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
282 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&dummy, 0,
283 			FBARRAY_TEST_LEN + 1) < 0,
284 			"Call succeeded with invalid parameters\n");
285 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
286 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&dummy, 0, 0) < 0,
287 			"Call succeeded with invalid parameters\n");
288 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
289 
290 	TEST_ASSERT(rte_fbarray_is_used(&dummy, FBARRAY_TEST_LEN) < 0,
291 			"Call succeeded with invalid parameters\n");
292 	TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Wrong errno value\n");
293 
294 	TEST_ASSERT_SUCCESS(rte_fbarray_destroy(&dummy),
295 			"Failed to destroy valid fbarray\n");
296 
297 	return TEST_SUCCESS;
298 }
299 
300 static int check_free(void)
301 {
302 	const int idx = 0;
303 	const int last_idx = FBARRAY_TEST_LEN - 1;
304 
305 	/* ensure we can find a free spot */
306 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_free(&param.arr, idx), idx,
307 			"Free space not found where expected\n");
308 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_free(&param.arr, idx, 1), idx,
309 			"Free space not found where expected\n");
310 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(&param.arr, idx),
311 			FBARRAY_TEST_LEN,
312 			"Free space not found where expected\n");
313 
314 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_free(&param.arr, idx), idx,
315 			"Free space not found where expected\n");
316 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_free(&param.arr, idx, 1), idx,
317 			"Free space not found where expected\n");
318 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(&param.arr, idx), 1,
319 			"Free space not found where expected\n");
320 
321 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_free(&param.arr, last_idx),
322 			last_idx, "Free space not found where expected\n");
323 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_free(&param.arr, last_idx, 1),
324 			last_idx, "Free space not found where expected\n");
325 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(&param.arr,
326 			last_idx), FBARRAY_TEST_LEN,
327 			"Free space not found where expected\n");
328 
329 	/* ensure we can't find any used spots */
330 	TEST_ASSERT(rte_fbarray_find_next_used(&param.arr, idx) < 0,
331 			"Used space found where none was expected\n");
332 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
333 	TEST_ASSERT(rte_fbarray_find_next_n_used(&param.arr, idx, 1) < 0,
334 			"Used space found where none was expected\n");
335 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
336 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(&param.arr, idx), 0,
337 			"Used space found where none was expected\n");
338 
339 	TEST_ASSERT(rte_fbarray_find_prev_used(&param.arr, last_idx) < 0,
340 			"Used space found where none was expected\n");
341 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
342 	TEST_ASSERT(rte_fbarray_find_prev_n_used(&param.arr, last_idx, 1) < 0,
343 			"Used space found where none was expected\n");
344 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
345 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr,
346 			last_idx), 0,
347 			"Used space found where none was expected\n");
348 
349 	return 0;
350 }
351 
352 static int check_used_one(void)
353 {
354 	const int idx = 0;
355 	const int last_idx = FBARRAY_TEST_LEN - 1;
356 
357 	/* check that we can find used spots now */
358 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_used(&param.arr, idx), idx,
359 			"Used space not found where expected\n");
360 	TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_used(&param.arr, idx, 1), idx,
361 			"Used space not found where expected\n");
362 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(&param.arr, idx), 1,
363 			"Used space not found where expected\n");
364 
365 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_used(&param.arr, last_idx), idx,
366 			"Used space not found where expected\n");
367 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_used(&param.arr, last_idx, 1),
368 			idx, "Used space not found where expected\n");
369 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr, idx), 1,
370 			"Used space not found where expected\n");
371 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr,
372 			last_idx), idx,
373 			"Used space not found where expected\n");
374 
375 	/* check if further indices are still free */
376 	TEST_ASSERT(rte_fbarray_find_next_used(&param.arr, idx + 1) < 0,
377 			"Used space not found where none was expected\n");
378 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
379 	TEST_ASSERT(rte_fbarray_find_next_n_used(&param.arr, idx + 1, 1) < 0,
380 			"Used space not found where none was expected\n");
381 	TEST_ASSERT_EQUAL(rte_errno, ENOENT, "Wrong errno value\n");
382 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(&param.arr, idx + 1), 0,
383 			"Used space not found where none was expected\n");
384 	TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(&param.arr, idx + 1),
385 			FBARRAY_TEST_LEN - 1,
386 			"Used space not found where none was expected\n");
387 
388 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_used(&param.arr, last_idx), 0,
389 			"Used space not found where none was expected\n");
390 	TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_used(&param.arr, last_idx, 1),
391 			0, "Used space not found where none was expected\n");
392 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(&param.arr,
393 			last_idx), 0,
394 			"Used space not found where none was expected\n");
395 	TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(&param.arr,
396 			last_idx), FBARRAY_TEST_LEN - 1,
397 			"Used space not found where none was expected\n");
398 
399 	return 0;
400 }
401 
402 static int test_basic(void)
403 {
404 	const int idx = 0;
405 	int i;
406 
407 	/* check array count */
408 	TEST_ASSERT_EQUAL(param.arr.count, 0, "Wrong element count\n");
409 
410 	/* ensure we can find a free spot */
411 	if (check_free())
412 		return TEST_FAILED;
413 
414 	/* check if used */
415 	TEST_ASSERT_EQUAL(rte_fbarray_is_used(&param.arr, idx), 0,
416 			"Used space found where not expected\n");
417 
418 	/* mark as used */
419 	TEST_ASSERT_SUCCESS(rte_fbarray_set_used(&param.arr, idx),
420 			"Failed to set as used\n");
421 
422 	/* check if used again */
423 	TEST_ASSERT_NOT_EQUAL(rte_fbarray_is_used(&param.arr, idx), 0,
424 			"Used space not found where expected\n");
425 
426 	if (check_used_one())
427 		return TEST_FAILED;
428 
429 	/* check array count */
430 	TEST_ASSERT_EQUAL(param.arr.count, 1, "Wrong element count\n");
431 
432 	/* check if getting pointers works for every element */
433 	for (i = 0; i < FBARRAY_TEST_LEN; i++) {
434 		void *td = rte_fbarray_get(&param.arr, i);
435 		TEST_ASSERT_NOT_NULL(td, "Invalid pointer returned\n");
436 		TEST_ASSERT_EQUAL(rte_fbarray_find_idx(&param.arr, td), i,
437 				"Wrong index returned\n");
438 	}
439 
440 	/* mark as free */
441 	TEST_ASSERT_SUCCESS(rte_fbarray_set_free(&param.arr, idx),
442 			"Failed to set as free\n");
443 
444 	/* check array count */
445 	TEST_ASSERT_EQUAL(param.arr.count, 0, "Wrong element count\n");
446 
447 	/* check if used */
448 	TEST_ASSERT_EQUAL(rte_fbarray_is_used(&param.arr, idx), 0,
449 			"Used space found where not expected\n");
450 
451 	if (check_free())
452 		return TEST_FAILED;
453 
454 	reset_array();
455 
456 	return TEST_SUCCESS;
457 }
458 
459 static int ensure_correct(struct rte_fbarray *arr, int first, int last,
460 		bool used)
461 {
462 	int i, len = last - first + 1;
463 	for (i = 0; i < len; i++) {
464 		int cur = first + i;
465 		int cur_len = len - i;
466 
467 		if (used) {
468 			TEST_ASSERT_EQUAL(rte_fbarray_find_contig_used(arr,
469 					cur), cur_len,
470 					"Used space length is wrong\n");
471 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(arr,
472 					last), len,
473 					"Used space length is wrong\n");
474 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_used(arr,
475 					cur), i + 1,
476 					"Used space length is wrong\n");
477 
478 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_used(arr, cur),
479 					cur,
480 					"Used space not found where expected\n");
481 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_used(arr,
482 					cur, 1), cur,
483 					"Used space not found where expected\n");
484 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_used(arr, cur,
485 					cur_len), cur,
486 					"Used space not found where expected\n");
487 
488 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_used(arr, cur),
489 					cur,
490 					"Used space not found where expected\n");
491 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_used(arr,
492 					last, cur_len), cur,
493 					"Used space not found where expected\n");
494 		} else {
495 			TEST_ASSERT_EQUAL(rte_fbarray_find_contig_free(arr,
496 					cur), cur_len,
497 					"Free space length is wrong\n");
498 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
499 					last), len,
500 					"Free space length is wrong\n");
501 			TEST_ASSERT_EQUAL(rte_fbarray_find_rev_contig_free(arr,
502 					cur), i + 1,
503 					"Free space length is wrong\n");
504 
505 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_free(arr, cur),
506 					cur,
507 					"Free space not found where expected\n");
508 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_free(arr, cur,
509 					1), cur,
510 					"Free space not found where expected\n");
511 			TEST_ASSERT_EQUAL(rte_fbarray_find_next_n_free(arr, cur,
512 					cur_len), cur,
513 					"Free space not found where expected\n");
514 
515 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_free(arr, cur),
516 					cur,
517 					"Free space not found where expected\n");
518 			TEST_ASSERT_EQUAL(rte_fbarray_find_prev_n_free(arr,
519 					last, cur_len), cur,
520 					"Free space not found where expected\n");
521 		}
522 	}
523 	return 0;
524 }
525 
526 static int test_find(void)
527 {
528 	TEST_ASSERT_EQUAL((int)param.arr.count, param.end - param.start + 1,
529 			"Wrong element count\n");
530 	/* ensure space is free before start */
531 	if (ensure_correct(&param.arr, 0, param.start - 1, false))
532 		return TEST_FAILED;
533 	/* ensure space is occupied where it's supposed to be */
534 	if (ensure_correct(&param.arr, param.start, param.end, true))
535 		return TEST_FAILED;
536 	/* ensure space after end is free as well */
537 	if (ensure_correct(&param.arr, param.end + 1, FBARRAY_TEST_LEN - 1,
538 			false))
539 		return TEST_FAILED;
540 	return TEST_SUCCESS;
541 }
542 
543 static int test_empty(void)
544 {
545 	TEST_ASSERT_EQUAL((int)param.arr.count, 0, "Wrong element count\n");
546 	/* ensure space is free */
547 	if (ensure_correct(&param.arr, 0, FBARRAY_TEST_LEN - 1, false))
548 		return TEST_FAILED;
549 	return TEST_SUCCESS;
550 }
551 
552 
553 static struct unit_test_suite fbarray_test_suite = {
554 	.suite_name = "fbarray autotest",
555 	.setup = autotest_setup,
556 	.teardown = autotest_teardown,
557 	.unit_test_cases = {
558 		TEST_CASE(test_invalid),
559 		TEST_CASE(test_basic),
560 		TEST_CASE_ST(first_msk_test_setup, reset_array, test_find),
561 		TEST_CASE_ST(cross_msk_test_setup, reset_array, test_find),
562 		TEST_CASE_ST(multi_msk_test_setup, reset_array, test_find),
563 		TEST_CASE_ST(last_msk_test_setup, reset_array, test_find),
564 		TEST_CASE_ST(full_msk_test_setup, reset_array, test_find),
565 		TEST_CASE_ST(empty_msk_test_setup, reset_array, test_empty),
566 		TEST_CASES_END()
567 	}
568 };
569 
570 static int
571 test_fbarray(void)
572 {
573 	return unit_test_suite_runner(&fbarray_test_suite);
574 }
575 
576 REGISTER_TEST_COMMAND(fbarray_autotest, test_fbarray);
577