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