2 * collectd - src/utils_config_cores_test.c
4 * Copyright(c) 2017 Intel Corporation. All rights reserved.
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * Kamil Wiatrowski <kamilx.wiatrowski@intel.com>
29 #include "utils_config_cores.c" /* sic */
31 oconfig_value_t test_cfg_values[] = {
32 { {"0"}, OCONFIG_TYPE_STRING },
33 { {"1-2"}, OCONFIG_TYPE_STRING },
34 { {"[3-4]"}, OCONFIG_TYPE_STRING }};
36 oconfig_item_t test_cfg = {
39 STATIC_ARRAY_SIZE(test_cfg_values),
44 static int compare_with_test_config(core_groups_list_t *cgl) {
45 if (cgl->num_cgroups == 4 &&
46 cgl->cgroups[0].num_cores == 1 &&
47 strcmp("0", cgl->cgroups[0].desc) == 0 &&
48 cgl->cgroups[0].cores[0] == 0 &&
49 cgl->cgroups[1].num_cores == 2 &&
50 strcmp("1-2", cgl->cgroups[1].desc) == 0 &&
51 cgl->cgroups[1].cores[0] == 1 &&
52 cgl->cgroups[1].cores[1] == 2 &&
53 cgl->cgroups[2].num_cores == 1 &&
54 strcmp("3", cgl->cgroups[2].desc) == 0 &&
55 cgl->cgroups[2].cores[0] == 3 &&
56 cgl->cgroups[3].num_cores == 1 &&
57 strcmp("4", cgl->cgroups[3].desc) == 0 &&
58 cgl->cgroups[3].cores[0] == 4)
64 DEF_TEST(string_to_uint) {
66 char *s = "13", *s1 = "0xd", *s2 = "g";
69 ret = str_to_uint(s, &n);
70 EXPECT_EQ_INT(0, ret);
73 ret = str_to_uint(s1, &n);
74 EXPECT_EQ_INT(0, ret);
77 ret = str_to_uint(s2, &n);
80 ret = str_to_uint(NULL, &n);
85 DEF_TEST(cores_list_to_numbers) {
87 unsigned nums[MAX_CORES];
90 n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
93 strncpy(str, "1", STATIC_ARRAY_SIZE(str));
94 n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
96 EXPECT_EQ_INT(1, nums[0]);
98 strncpy(str, "0,2-3", STATIC_ARRAY_SIZE(str));
99 n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
101 EXPECT_EQ_INT(0, nums[0]);
102 EXPECT_EQ_INT(2, nums[1]);
103 EXPECT_EQ_INT(3, nums[2]);
105 strncpy(str, "11-0xa", STATIC_ARRAY_SIZE(str));
106 n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
108 EXPECT_EQ_INT(10, nums[0]);
109 EXPECT_EQ_INT(11, nums[1]);
111 snprintf(str, sizeof(str), "0-%d", (MAX_CORES - 1));
112 n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
113 EXPECT_EQ_INT(MAX_CORES, n);
114 EXPECT_EQ_INT(0, nums[0]);
115 EXPECT_EQ_INT(MAX_CORES-1, nums[MAX_CORES-1]);
117 /* Should return 0 for incorrect syntax. */
118 strncpy(str, "5g", STATIC_ARRAY_SIZE(str));
119 n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
124 DEF_TEST(check_grouped_cores) {
127 char src[64] = "[5-15]";
130 ret = check_core_grouping(dest, src, sizeof(dest), &grouped);
131 EXPECT_EQ_INT(0, ret);
132 EXPECT_EQ_INT(0, grouped);
133 EXPECT_EQ_STR("5-15", dest);
135 strncpy(src, " 5-15", STATIC_ARRAY_SIZE(src));
136 ret = check_core_grouping(dest, src, sizeof(dest), &grouped);
137 EXPECT_EQ_INT(0, ret);
138 EXPECT_EQ_INT(1, grouped);
139 EXPECT_EQ_STR("5-15", dest);
143 DEF_TEST(cores_option_parse) {
145 core_groups_list_t cgl = {0};
147 ret = config_cores_parse(&test_cfg, &cgl);
148 EXPECT_EQ_INT(0, ret);
149 CHECK_NOT_NULL(cgl.cgroups);
150 EXPECT_EQ_INT(0, compare_with_test_config(&cgl));
152 config_cores_cleanup(&cgl);
156 DEF_TEST(cores_option_parse_fail) {
158 core_groups_list_t cgl = {0};
159 /* Wrong value, missing closing bracket ] */
160 oconfig_value_t values = { {"[0-15"}, OCONFIG_TYPE_STRING };
161 oconfig_item_t cfg = { "Cores", &values, 1, NULL, NULL, 0 };
163 ret = config_cores_parse(&cfg, &cgl);
164 EXPECT_EQ_INT(-EINVAL, ret);
165 EXPECT_EQ_INT(0, cgl.num_cgroups);
166 OK(NULL == cgl.cgroups);
170 DEF_TEST(cores_default_list) {
172 core_groups_list_t cgl = {0};
174 ret = config_cores_default(2, &cgl);
175 EXPECT_EQ_INT(0, ret);
176 EXPECT_EQ_INT(2, cgl.num_cgroups);
177 CHECK_NOT_NULL(cgl.cgroups);
179 CHECK_NOT_NULL(cgl.cgroups[0].cores);
180 CHECK_NOT_NULL(cgl.cgroups[0].desc);
181 EXPECT_EQ_STR("0", cgl.cgroups[0].desc);
182 EXPECT_EQ_INT(1, cgl.cgroups[0].num_cores);
183 EXPECT_EQ_INT(0, cgl.cgroups[0].cores[0]);
185 CHECK_NOT_NULL(cgl.cgroups[1].cores);
186 CHECK_NOT_NULL(cgl.cgroups[1].desc);
187 EXPECT_EQ_STR("1", cgl.cgroups[1].desc);
188 EXPECT_EQ_INT(1, cgl.cgroups[1].num_cores);
189 EXPECT_EQ_INT(1, cgl.cgroups[1].cores[0]);
191 config_cores_cleanup(&cgl);
195 DEF_TEST(cores_default_list_fail) {
197 core_groups_list_t cgl = {0};
199 ret = config_cores_default(-1, &cgl);
201 ret = config_cores_default(MAX_CORES+1, &cgl);
203 ret = config_cores_default(1, NULL);
208 DEF_TEST(cores_group_cleanup) {
209 core_groups_list_t cgl;
210 cgl.cgroups = calloc(1, sizeof(*cgl.cgroups));
211 CHECK_NOT_NULL(cgl.cgroups);
213 cgl.cgroups[0].desc = strdup("1");
214 cgl.cgroups[0].cores = calloc(1, sizeof(*cgl.cgroups[0].cores));
215 CHECK_NOT_NULL(cgl.cgroups[0].cores);
216 cgl.cgroups[0].cores[0] = 1;
217 cgl.cgroups[0].num_cores = 1;
219 config_cores_cleanup(&cgl);
220 OK(NULL == cgl.cgroups);
221 EXPECT_EQ_INT(0, cgl.num_cgroups);
225 DEF_TEST(cores_group_cmp) {
226 unsigned cores_mock[] = {0,1,2};
227 core_group_t group_mock = { "0,1,2", cores_mock, 3 };
228 unsigned cores_mock_2[] = {2,3};
229 core_group_t group_mock_2 = { "2,3", cores_mock_2, 2 };
231 int ret = config_cores_cmp_cgroups(&group_mock, &group_mock);
232 EXPECT_EQ_INT(1, ret);
234 ret = config_cores_cmp_cgroups(&group_mock, &group_mock_2);
235 EXPECT_EQ_INT(-1, ret);
238 ret = config_cores_cmp_cgroups(&group_mock, &group_mock_2);
239 EXPECT_EQ_INT(0, ret);
244 RUN_TEST(string_to_uint);
245 RUN_TEST(cores_list_to_numbers);
246 RUN_TEST(check_grouped_cores);
248 RUN_TEST(cores_group_cleanup);
249 RUN_TEST(cores_option_parse);
250 RUN_TEST(cores_option_parse_fail);
251 RUN_TEST(cores_default_list);
252 RUN_TEST(cores_default_list_fail);
254 RUN_TEST(cores_group_cmp);