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