xref: /linux/tools/tracing/rtla/tests/unit/unit_tests.c (revision ef59e454156eb068ba3f2d9e14b397fd7953f65a)
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 
11 #include "../../src/utils.h"
12 
13 START_TEST(test_strtoi)
14 {
15 	int result;
16 	char buf[64];
17 
18 	ck_assert_int_eq(strtoi("123", &result), 0);
19 	ck_assert_int_eq(result, 123);
20 	ck_assert_int_eq(strtoi(" -456", &result), 0);
21 	ck_assert_int_eq(result, -456);
22 
23 	snprintf(buf, sizeof(buf), "%d", INT_MAX);
24 	ck_assert_int_eq(strtoi(buf, &result), 0);
25 	snprintf(buf, sizeof(buf), "%ld", (long)INT_MAX + 1);
26 	ck_assert_int_eq(strtoi(buf, &result), -1);
27 
28 	ck_assert_int_eq(strtoi("", &result), -1);
29 	ck_assert_int_eq(strtoi("123abc", &result), -1);
30 	ck_assert_int_eq(strtoi("123 ", &result), -1);
31 }
32 END_TEST
33 
34 START_TEST(test_parse_cpu_set)
35 {
36 	cpu_set_t set;
37 	int nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
38 
39 	ck_assert_int_eq(parse_cpu_set("0", &set), 0);
40 	ck_assert(CPU_ISSET(0, &set));
41 	ck_assert(!CPU_ISSET(1, &set));
42 
43 	if (nr_cpus > 2) {
44 		ck_assert_int_eq(parse_cpu_set("0,2", &set), 0);
45 		ck_assert(CPU_ISSET(0, &set));
46 		ck_assert(CPU_ISSET(2, &set));
47 	}
48 
49 	if (nr_cpus > 3) {
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 
57 	if (nr_cpus > 5) {
58 		ck_assert_int_eq(parse_cpu_set("1-3,5", &set), 0);
59 		ck_assert(!CPU_ISSET(0, &set));
60 		ck_assert(CPU_ISSET(1, &set));
61 		ck_assert(CPU_ISSET(2, &set));
62 		ck_assert(CPU_ISSET(3, &set));
63 		ck_assert(!CPU_ISSET(4, &set));
64 		ck_assert(CPU_ISSET(5, &set));
65 	}
66 
67 	ck_assert_int_eq(parse_cpu_set("-1", &set), 1);
68 	ck_assert_int_eq(parse_cpu_set("abc", &set), 1);
69 	ck_assert_int_eq(parse_cpu_set("9999", &set), 1);
70 }
71 END_TEST
72 
73 START_TEST(test_parse_prio)
74 {
75 	struct sched_attr attr;
76 
77 	ck_assert_int_eq(parse_prio("f:50", &attr), 0);
78 	ck_assert_uint_eq(attr.sched_policy, SCHED_FIFO);
79 	ck_assert_uint_eq(attr.sched_priority, 50U);
80 
81 	ck_assert_int_eq(parse_prio("r:30", &attr), 0);
82 	ck_assert_uint_eq(attr.sched_policy, SCHED_RR);
83 
84 	ck_assert_int_eq(parse_prio("o:0", &attr), 0);
85 	ck_assert_uint_eq(attr.sched_policy, SCHED_OTHER);
86 	ck_assert_int_eq(attr.sched_nice, 0);
87 
88 	ck_assert_int_eq(parse_prio("d:10ms:100ms", &attr), 0);
89 	ck_assert_uint_eq(attr.sched_policy, 6U);
90 
91 	ck_assert_int_eq(parse_prio("f:999", &attr), -1);
92 	ck_assert_int_eq(parse_prio("o:-20", &attr), -1);
93 	ck_assert_int_eq(parse_prio("d:100ms:10ms", &attr), -1);
94 	ck_assert_int_eq(parse_prio("x:50", &attr), -1);
95 }
96 END_TEST
97 
98 Suite *utils_suite(void)
99 {
100 	Suite *s = suite_create("utils");
101 	TCase *tc = tcase_create("core");
102 
103 	tcase_add_test(tc, test_strtoi);
104 	tcase_add_test(tc, test_parse_cpu_set);
105 	tcase_add_test(tc, test_parse_prio);
106 
107 	suite_add_tcase(s, tc);
108 	return s;
109 }
110 
111 int main(void)
112 {
113 	int num_failed;
114 	SRunner *sr;
115 
116 	sr = srunner_create(utils_suite());
117 	srunner_run_all(sr, CK_NORMAL);
118 	num_failed = srunner_ntests_failed(sr);
119 
120 	srunner_free(sr);
121 
122 	return (num_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
123 }
124