intel_pmu plugin: fix for minor issues
[collectd.git] / src / utils_config_cores_test.c
1 /**
2  * collectd - src/utils_config_cores_test.c
3  *
4  * Copyright(c) 2018 Intel Corporation. All rights reserved.
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
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
22  * SOFTWARE.
23  *
24  * Authors:
25  *   Kamil Wiatrowski <kamilx.wiatrowski@intel.com>
26  **/
27
28 #include "testing.h"
29 #include "utils_config_cores.c" /* sic */
30
31 oconfig_value_t test_cfg_values[] = {{{"0"}, OCONFIG_TYPE_STRING},
32                                      {{"1-2"}, OCONFIG_TYPE_STRING},
33                                      {{"[3-4]"}, OCONFIG_TYPE_STRING}};
34
35 oconfig_item_t test_cfg = {
36     "Cores", test_cfg_values, STATIC_ARRAY_SIZE(test_cfg_values), NULL, NULL,
37     0};
38
39 static int compare_with_test_config(core_groups_list_t *cgl) {
40   if (cgl->num_cgroups == 4 && cgl->cgroups[0].num_cores == 1 &&
41       strcmp("0", cgl->cgroups[0].desc) == 0 && cgl->cgroups[0].cores[0] == 0 &&
42       cgl->cgroups[1].num_cores == 2 &&
43       strcmp("1-2", cgl->cgroups[1].desc) == 0 &&
44       cgl->cgroups[1].cores[0] == 1 && cgl->cgroups[1].cores[1] == 2 &&
45       cgl->cgroups[2].num_cores == 1 &&
46       strcmp("3", cgl->cgroups[2].desc) == 0 && cgl->cgroups[2].cores[0] == 3 &&
47       cgl->cgroups[3].num_cores == 1 &&
48       strcmp("4", cgl->cgroups[3].desc) == 0 && cgl->cgroups[3].cores[0] == 4)
49     return 0;
50
51   return -1;
52 }
53
54 DEF_TEST(string_to_uint) {
55   int ret = 0;
56   char *s = "13", *s1 = "0xd", *s2 = "g";
57   unsigned n = 0;
58
59   ret = str_to_uint(s, &n);
60   EXPECT_EQ_INT(0, ret);
61   EXPECT_EQ_INT(13, n);
62
63   ret = str_to_uint(s1, &n);
64   EXPECT_EQ_INT(0, ret);
65   EXPECT_EQ_INT(13, n);
66
67   ret = str_to_uint(s2, &n);
68   OK(ret < 0);
69
70   ret = str_to_uint(NULL, &n);
71   OK(ret < 0);
72   return 0;
73 }
74
75 DEF_TEST(cores_list_to_numbers) {
76   size_t n = 0;
77   unsigned nums[MAX_CORES];
78   char str[64] = "";
79
80   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
81   EXPECT_EQ_INT(0, n);
82
83   strncpy(str, "1", STATIC_ARRAY_SIZE(str));
84   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
85   EXPECT_EQ_INT(1, n);
86   EXPECT_EQ_INT(1, nums[0]);
87
88   strncpy(str, "0,2-3", STATIC_ARRAY_SIZE(str));
89   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
90   EXPECT_EQ_INT(3, n);
91   EXPECT_EQ_INT(0, nums[0]);
92   EXPECT_EQ_INT(2, nums[1]);
93   EXPECT_EQ_INT(3, nums[2]);
94
95   strncpy(str, "11-0xa", STATIC_ARRAY_SIZE(str));
96   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
97   EXPECT_EQ_INT(2, n);
98   EXPECT_EQ_INT(10, nums[0]);
99   EXPECT_EQ_INT(11, nums[1]);
100
101   snprintf(str, sizeof(str), "0-%d", (MAX_CORES - 1));
102   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
103   EXPECT_EQ_INT(MAX_CORES, n);
104   EXPECT_EQ_INT(0, nums[0]);
105   EXPECT_EQ_INT(MAX_CORES - 1, nums[MAX_CORES - 1]);
106
107   /* Should return 0 for incorrect syntax. */
108   strncpy(str, "5g", STATIC_ARRAY_SIZE(str));
109   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
110   EXPECT_EQ_INT(0, n);
111   return 0;
112 }
113
114 DEF_TEST(check_grouped_cores) {
115   int ret = 0;
116   _Bool grouped;
117   char src[64] = "[5-15]";
118   char dest[64];
119
120   ret = check_core_grouping(dest, src, sizeof(dest), &grouped);
121   EXPECT_EQ_INT(0, ret);
122   EXPECT_EQ_INT(0, grouped);
123   EXPECT_EQ_STR("5-15", dest);
124
125   strncpy(src, "  5-15", STATIC_ARRAY_SIZE(src));
126   ret = check_core_grouping(dest, src, sizeof(dest), &grouped);
127   EXPECT_EQ_INT(0, ret);
128   EXPECT_EQ_INT(1, grouped);
129   EXPECT_EQ_STR("5-15", dest);
130   return 0;
131 }
132
133 DEF_TEST(cores_option_parse) {
134   int ret = 0;
135   core_groups_list_t cgl = {0};
136
137   ret = config_cores_parse(&test_cfg, &cgl);
138   EXPECT_EQ_INT(0, ret);
139   CHECK_NOT_NULL(cgl.cgroups);
140   EXPECT_EQ_INT(0, compare_with_test_config(&cgl));
141
142   config_cores_cleanup(&cgl);
143   return 0;
144 }
145
146 DEF_TEST(cores_option_parse_fail) {
147   int ret = 0;
148   core_groups_list_t cgl = {0};
149   /* Wrong value, missing closing bracket ] */
150   oconfig_value_t values = {{"[0-15"}, OCONFIG_TYPE_STRING};
151   oconfig_item_t cfg = {"Cores", &values, 1, NULL, NULL, 0};
152
153   ret = config_cores_parse(&cfg, &cgl);
154   EXPECT_EQ_INT(-EINVAL, ret);
155   EXPECT_EQ_INT(0, cgl.num_cgroups);
156   OK(NULL == cgl.cgroups);
157   return 0;
158 }
159
160 DEF_TEST(cores_default_list) {
161   int ret = 0;
162   core_groups_list_t cgl = {0};
163
164   ret = config_cores_default(2, &cgl);
165   EXPECT_EQ_INT(0, ret);
166   EXPECT_EQ_INT(2, cgl.num_cgroups);
167   CHECK_NOT_NULL(cgl.cgroups);
168
169   CHECK_NOT_NULL(cgl.cgroups[0].cores);
170   CHECK_NOT_NULL(cgl.cgroups[0].desc);
171   EXPECT_EQ_STR("0", cgl.cgroups[0].desc);
172   EXPECT_EQ_INT(1, cgl.cgroups[0].num_cores);
173   EXPECT_EQ_INT(0, cgl.cgroups[0].cores[0]);
174
175   CHECK_NOT_NULL(cgl.cgroups[1].cores);
176   CHECK_NOT_NULL(cgl.cgroups[1].desc);
177   EXPECT_EQ_STR("1", cgl.cgroups[1].desc);
178   EXPECT_EQ_INT(1, cgl.cgroups[1].num_cores);
179   EXPECT_EQ_INT(1, cgl.cgroups[1].cores[0]);
180
181   config_cores_cleanup(&cgl);
182   return 0;
183 }
184
185 DEF_TEST(cores_default_list_fail) {
186   int ret = 0;
187   core_groups_list_t cgl = {0};
188
189   ret = config_cores_default(-1, &cgl);
190   OK(ret < 0);
191   ret = config_cores_default(MAX_CORES + 1, &cgl);
192   OK(ret < 0);
193   ret = config_cores_default(1, NULL);
194   OK(ret < 0);
195   return 0;
196 }
197
198 DEF_TEST(cores_group_cleanup) {
199   core_groups_list_t cgl;
200   cgl.cgroups = calloc(1, sizeof(*cgl.cgroups));
201   CHECK_NOT_NULL(cgl.cgroups);
202   cgl.num_cgroups = 1;
203   cgl.cgroups[0].desc = strdup("1");
204   cgl.cgroups[0].cores = calloc(1, sizeof(*cgl.cgroups[0].cores));
205   CHECK_NOT_NULL(cgl.cgroups[0].cores);
206   cgl.cgroups[0].cores[0] = 1;
207   cgl.cgroups[0].num_cores = 1;
208
209   config_cores_cleanup(&cgl);
210   OK(NULL == cgl.cgroups);
211   EXPECT_EQ_INT(0, cgl.num_cgroups);
212   return 0;
213 }
214
215 DEF_TEST(cores_group_cmp) {
216   unsigned cores_mock[] = {0, 1, 2};
217   core_group_t group_mock = {"0,1,2", cores_mock, 3};
218   unsigned cores_mock_2[] = {2, 3};
219   core_group_t group_mock_2 = {"2,3", cores_mock_2, 2};
220
221   int ret = config_cores_cmp_cgroups(&group_mock, &group_mock);
222   EXPECT_EQ_INT(1, ret);
223
224   ret = config_cores_cmp_cgroups(&group_mock, &group_mock_2);
225   EXPECT_EQ_INT(-1, ret);
226
227   cores_mock_2[0] = 4;
228   ret = config_cores_cmp_cgroups(&group_mock, &group_mock_2);
229   EXPECT_EQ_INT(0, ret);
230   return 0;
231 }
232
233 int main(void) {
234   RUN_TEST(string_to_uint);
235   RUN_TEST(cores_list_to_numbers);
236   RUN_TEST(check_grouped_cores);
237
238   RUN_TEST(cores_group_cleanup);
239   RUN_TEST(cores_option_parse);
240   RUN_TEST(cores_option_parse_fail);
241   RUN_TEST(cores_default_list);
242   RUN_TEST(cores_default_list_fail);
243
244   RUN_TEST(cores_group_cmp);
245
246   END_TEST;
247 }