]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-cpu-set-util.c
grypt-util: drop two emacs modelines
[thirdparty/systemd.git] / src / test / test-cpu-set-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 Copyright 2010 Lennart Poettering
4 ***/
5
6 #include "alloc-util.h"
7 #include "cpu-set-util.h"
8 #include "macro.h"
9
10 static void test_parse_cpu_set(void) {
11 cpu_set_t *c = NULL;
12 int ncpus;
13 int cpu;
14
15 /* Simple range (from CPUAffinity example) */
16 ncpus = parse_cpu_set_and_warn("1 2", &c, NULL, "fake", 1, "CPUAffinity");
17 assert_se(ncpus >= 1024);
18 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
19 assert_se(CPU_ISSET_S(2, CPU_ALLOC_SIZE(ncpus), c));
20 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 2);
21 c = cpu_set_mfree(c);
22
23 /* A more interesting range */
24 ncpus = parse_cpu_set_and_warn("0 1 2 3 8 9 10 11", &c, NULL, "fake", 1, "CPUAffinity");
25 assert_se(ncpus >= 1024);
26 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
27 for (cpu = 0; cpu < 4; cpu++)
28 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
29 for (cpu = 8; cpu < 12; cpu++)
30 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
31 c = cpu_set_mfree(c);
32
33 /* Quoted strings */
34 ncpus = parse_cpu_set_and_warn("8 '9' 10 \"11\"", &c, NULL, "fake", 1, "CPUAffinity");
35 assert_se(ncpus >= 1024);
36 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 4);
37 for (cpu = 8; cpu < 12; cpu++)
38 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
39 c = cpu_set_mfree(c);
40
41 /* Use commas as separators */
42 ncpus = parse_cpu_set_and_warn("0,1,2,3 8,9,10,11", &c, NULL, "fake", 1, "CPUAffinity");
43 assert_se(ncpus >= 1024);
44 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
45 for (cpu = 0; cpu < 4; cpu++)
46 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
47 for (cpu = 8; cpu < 12; cpu++)
48 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
49 c = cpu_set_mfree(c);
50
51 /* Commas with spaces (and trailing comma, space) */
52 ncpus = parse_cpu_set_and_warn("0, 1, 2, 3, 4, 5, 6, 7, ", &c, NULL, "fake", 1, "CPUAffinity");
53 assert_se(ncpus >= 1024);
54 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
55 for (cpu = 0; cpu < 8; cpu++)
56 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
57 c = cpu_set_mfree(c);
58
59 /* Ranges */
60 ncpus = parse_cpu_set_and_warn("0-3,8-11", &c, NULL, "fake", 1, "CPUAffinity");
61 assert_se(ncpus >= 1024);
62 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
63 for (cpu = 0; cpu < 4; cpu++)
64 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
65 for (cpu = 8; cpu < 12; cpu++)
66 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
67 c = cpu_set_mfree(c);
68
69 /* Ranges with trailing comma, space */
70 ncpus = parse_cpu_set_and_warn("0-3 8-11, ", &c, NULL, "fake", 1, "CPUAffinity");
71 assert_se(ncpus >= 1024);
72 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 8);
73 for (cpu = 0; cpu < 4; cpu++)
74 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
75 for (cpu = 8; cpu < 12; cpu++)
76 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
77 c = cpu_set_mfree(c);
78
79 /* Negative range (returns empty cpu_set) */
80 ncpus = parse_cpu_set_and_warn("3-0", &c, NULL, "fake", 1, "CPUAffinity");
81 assert_se(ncpus >= 1024);
82 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 0);
83 c = cpu_set_mfree(c);
84
85 /* Overlapping ranges */
86 ncpus = parse_cpu_set_and_warn("0-7 4-11", &c, NULL, "fake", 1, "CPUAffinity");
87 assert_se(ncpus >= 1024);
88 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 12);
89 for (cpu = 0; cpu < 12; cpu++)
90 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
91 c = cpu_set_mfree(c);
92
93 /* Mix ranges and individual CPUs */
94 ncpus = parse_cpu_set_and_warn("0,1 4-11", &c, NULL, "fake", 1, "CPUAffinity");
95 assert_se(ncpus >= 1024);
96 assert_se(CPU_COUNT_S(CPU_ALLOC_SIZE(ncpus), c) == 10);
97 assert_se(CPU_ISSET_S(0, CPU_ALLOC_SIZE(ncpus), c));
98 assert_se(CPU_ISSET_S(1, CPU_ALLOC_SIZE(ncpus), c));
99 for (cpu = 4; cpu < 12; cpu++)
100 assert_se(CPU_ISSET_S(cpu, CPU_ALLOC_SIZE(ncpus), c));
101 c = cpu_set_mfree(c);
102
103 /* Garbage */
104 ncpus = parse_cpu_set_and_warn("0 1 2 3 garbage", &c, NULL, "fake", 1, "CPUAffinity");
105 assert_se(ncpus < 0);
106 assert_se(!c);
107
108 /* Range with garbage */
109 ncpus = parse_cpu_set_and_warn("0-3 8-garbage", &c, NULL, "fake", 1, "CPUAffinity");
110 assert_se(ncpus < 0);
111 assert_se(!c);
112
113 /* Empty string */
114 c = NULL;
115 ncpus = parse_cpu_set_and_warn("", &c, NULL, "fake", 1, "CPUAffinity");
116 assert_se(ncpus == 0); /* empty string returns 0 */
117 assert_se(!c);
118
119 /* Runaway quoted string */
120 ncpus = parse_cpu_set_and_warn("0 1 2 3 \"4 5 6 7 ", &c, NULL, "fake", 1, "CPUAffinity");
121 assert_se(ncpus < 0);
122 assert_se(!c);
123 }
124
125 int main(int argc, char *argv[]) {
126 test_parse_cpu_set();
127
128 return 0;
129 }