xref: /linux/tools/tracing/rtla/tests/unit/utils.c (revision e5d8f22758c5904ed006a525ef34dec1c381f2b6)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #define _GNU_SOURCE
4 #include <check.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <sched.h>
8 #include <limits.h>
9 #include <unistd.h>
10 #include <sys/sysinfo.h>
11 
12 #include "../../src/utils.h"
13 
14 extern int nr_cpus;
15 
16 START_TEST(test_strtoi)
17 {
18 	int result;
19 	char buf[64];
20 
21 	ck_assert_int_eq(strtoi("123", &result), 0);
22 	ck_assert_int_eq(result, 123);
23 	ck_assert_int_eq(strtoi(" -456", &result), 0);
24 	ck_assert_int_eq(result, -456);
25 
26 	snprintf(buf, sizeof(buf), "%d", INT_MAX);
27 	ck_assert_int_eq(strtoi(buf, &result), 0);
28 	snprintf(buf, sizeof(buf), "%ld", (long)INT_MAX + 1);
29 	ck_assert_int_eq(strtoi(buf, &result), -1);
30 
31 	ck_assert_int_eq(strtoi("", &result), -1);
32 	ck_assert_int_eq(strtoi("123abc", &result), -1);
33 	ck_assert_int_eq(strtoi("123 ", &result), -1);
34 }
35 END_TEST
36 
37 START_TEST(test_parse_cpu_set)
38 {
39 	cpu_set_t set;
40 
41 	nr_cpus = 8;
42 	ck_assert_int_eq(parse_cpu_set("0", &set), 0);
43 	ck_assert(CPU_ISSET(0, &set));
44 	ck_assert(!CPU_ISSET(1, &set));
45 
46 	ck_assert_int_eq(parse_cpu_set("0,2", &set), 0);
47 	ck_assert(CPU_ISSET(0, &set));
48 	ck_assert(CPU_ISSET(2, &set));
49 
50 	ck_assert_int_eq(parse_cpu_set("0-3", &set), 0);
51 	ck_assert(CPU_ISSET(0, &set));
52 	ck_assert(CPU_ISSET(1, &set));
53 	ck_assert(CPU_ISSET(2, &set));
54 	ck_assert(CPU_ISSET(3, &set));
55 
56 	ck_assert_int_eq(parse_cpu_set("1-3,5", &set), 0);
57 	ck_assert(!CPU_ISSET(0, &set));
58 	ck_assert(CPU_ISSET(1, &set));
59 	ck_assert(CPU_ISSET(2, &set));
60 	ck_assert(CPU_ISSET(3, &set));
61 	ck_assert(!CPU_ISSET(4, &set));
62 	ck_assert(CPU_ISSET(5, &set));
63 
64 	ck_assert_int_eq(parse_cpu_set("-1", &set), 1);
65 	ck_assert_int_eq(parse_cpu_set("abc", &set), 1);
66 	ck_assert_int_eq(parse_cpu_set("9999", &set), 1);
67 }
68 END_TEST
69 
70 START_TEST(test_parse_prio)
71 {
72 	struct sched_attr attr;
73 
74 	ck_assert_int_eq(parse_prio("f:50", &attr), 0);
75 	ck_assert_uint_eq(attr.sched_policy, SCHED_FIFO);
76 	ck_assert_uint_eq(attr.sched_priority, 50U);
77 
78 	ck_assert_int_eq(parse_prio("r:30", &attr), 0);
79 	ck_assert_uint_eq(attr.sched_policy, SCHED_RR);
80 
81 	ck_assert_int_eq(parse_prio("o:0", &attr), 0);
82 	ck_assert_uint_eq(attr.sched_policy, SCHED_OTHER);
83 	ck_assert_int_eq(attr.sched_nice, 0);
84 
85 	ck_assert_int_eq(parse_prio("d:10ms:100ms", &attr), 0);
86 	ck_assert_uint_eq(attr.sched_policy, 6U);
87 
88 	ck_assert_int_eq(parse_prio("f:999", &attr), -1);
89 	ck_assert_int_eq(parse_prio("o:-20", &attr), -1);
90 	ck_assert_int_eq(parse_prio("d:100ms:10ms", &attr), -1);
91 	ck_assert_int_eq(parse_prio("x:50", &attr), -1);
92 }
93 END_TEST
94 
95 Suite *utils_suite(void)
96 {
97 	Suite *s = suite_create("utils");
98 	TCase *tc = tcase_create("core");
99 
100 	tcase_add_test(tc, test_strtoi);
101 	tcase_add_test(tc, test_parse_cpu_set);
102 	tcase_add_test(tc, test_parse_prio);
103 
104 	suite_add_tcase(s, tc);
105 	return s;
106 }
107