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