Skip to content

Commit 65bc4c4

Browse files
anakryikoAlexei Starovoitov
authored andcommitted
selftests/bpf: Add CPU mask parsing tests
Add a bunch of test validating CPU mask parsing logic and error handling. Signed-off-by: Andrii Nakryiko <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent 6803ee2 commit 65bc4c4

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <test_progs.h>
3+
#include <bpf/btf.h>
4+
#include "libbpf_internal.h"
5+
6+
static int duration = 0;
7+
8+
static void validate_mask(int case_nr, const char *exp, bool *mask, int n)
9+
{
10+
int i;
11+
12+
for (i = 0; exp[i]; i++) {
13+
if (exp[i] == '1') {
14+
if (CHECK(i + 1 > n, "mask_short",
15+
"case #%d: mask too short, got n=%d, need at least %d\n",
16+
case_nr, n, i + 1))
17+
return;
18+
CHECK(!mask[i], "cpu_not_set",
19+
"case #%d: mask differs, expected cpu#%d SET\n",
20+
case_nr, i);
21+
} else {
22+
CHECK(i < n && mask[i], "cpu_set",
23+
"case #%d: mask differs, expected cpu#%d UNSET\n",
24+
case_nr, i);
25+
}
26+
}
27+
CHECK(i < n, "mask_long",
28+
"case #%d: mask too long, got n=%d, expected at most %d\n",
29+
case_nr, n, i);
30+
}
31+
32+
static struct {
33+
const char *cpu_mask;
34+
const char *expect;
35+
bool fails;
36+
} test_cases[] = {
37+
{ "0\n", "1", false },
38+
{ "0,2\n", "101", false },
39+
{ "0-2\n", "111", false },
40+
{ "0-2,3-4\n", "11111", false },
41+
{ "0", "1", false },
42+
{ "0-2", "111", false },
43+
{ "0,2", "101", false },
44+
{ "0,1-3", "1111", false },
45+
{ "0,1,2,3", "1111", false },
46+
{ "0,2-3,5", "101101", false },
47+
{ "3-3", "0001", false },
48+
{ "2-4,6,9-10", "00111010011", false },
49+
/* failure cases */
50+
{ "", "", true },
51+
{ "0-", "", true },
52+
{ "0 ", "", true },
53+
{ "0_1", "", true },
54+
{ "1-0", "", true },
55+
{ "-1", "", true },
56+
};
57+
58+
void test_cpu_mask()
59+
{
60+
int i, err, n;
61+
bool *mask;
62+
63+
for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
64+
mask = NULL;
65+
err = parse_cpu_mask_str(test_cases[i].cpu_mask, &mask, &n);
66+
if (test_cases[i].fails) {
67+
CHECK(!err, "should_fail",
68+
"case #%d: parsing should fail!\n", i + 1);
69+
} else {
70+
if (CHECK(err, "parse_err",
71+
"case #%d: cpu mask parsing failed: %d\n",
72+
i + 1, err))
73+
continue;
74+
validate_mask(i + 1, test_cases[i].expect, mask, n);
75+
}
76+
free(mask);
77+
}
78+
}

0 commit comments

Comments
 (0)