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