intel_pmu plugin: implement core groups option
[collectd.git] / src / utils_config_cores_test.c
1 /**
2  * collectd - src/utils_config_cores_test.c
3  *
4  * Copyright(c) 2017 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[] = {
32   { {"0"}, OCONFIG_TYPE_STRING },
33   { {"1-2"}, OCONFIG_TYPE_STRING },
34   { {"[3-4]"}, OCONFIG_TYPE_STRING }};
35
36 oconfig_item_t test_cfg = {
37   "Cores",
38   test_cfg_values,
39   STATIC_ARRAY_SIZE(test_cfg_values),
40   NULL,
41   NULL,
42   0 };
43
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)
59     return 0;
60
61   return -1;
62 }
63
64 DEF_TEST(string_to_uint) {
65   int ret = 0;
66   char *s = "13", *s1 = "0xd", *s2 = "g";
67   unsigned n = 0;
68
69   ret = str_to_uint(s, &n);
70   EXPECT_EQ_INT(0, ret);
71   EXPECT_EQ_INT(13, n);
72
73   ret = str_to_uint(s1, &n);
74   EXPECT_EQ_INT(0, ret);
75   EXPECT_EQ_INT(13, n);
76
77   ret = str_to_uint(s2, &n);
78   OK(ret < 0);
79
80   ret = str_to_uint(NULL, &n);
81   OK(ret < 0);
82   return 0;
83 }
84
85 DEF_TEST(cores_list_to_numbers) {
86   size_t n = 0;
87   unsigned nums[MAX_CORES];
88   char str[64] = "";
89
90   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
91   EXPECT_EQ_INT(0, n);
92
93   strncpy(str, "1", STATIC_ARRAY_SIZE(str));
94   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
95   EXPECT_EQ_INT(1, n);
96   EXPECT_EQ_INT(1, nums[0]);
97
98   strncpy(str, "0,2-3", STATIC_ARRAY_SIZE(str));
99   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
100   EXPECT_EQ_INT(3, n);
101   EXPECT_EQ_INT(0, nums[0]);
102   EXPECT_EQ_INT(2, nums[1]);
103   EXPECT_EQ_INT(3, nums[2]);
104
105   strncpy(str, "11-0xa", STATIC_ARRAY_SIZE(str));
106   n = str_list_to_nums(str, nums, STATIC_ARRAY_SIZE(nums));
107   EXPECT_EQ_INT(2, n);
108   EXPECT_EQ_INT(10, nums[0]);
109   EXPECT_EQ_INT(11, nums[1]);
110
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]);
116
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));
120   EXPECT_EQ_INT(0, n);
121   return 0;
122 }
123
124 DEF_TEST(check_grouped_cores) {
125   int ret = 0;
126   _Bool grouped;
127   char src[64] = "[5-15]";
128   char dest[64];
129
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);
134
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);
140   return 0;
141 }
142
143 DEF_TEST(cores_option_parse) {
144   int ret = 0;
145   core_groups_list_t cgl = {0};
146
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));
151
152   config_cores_cleanup(&cgl);
153   return 0;
154 }
155
156 DEF_TEST(cores_option_parse_fail) {
157   int ret = 0;
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 };
162
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);
167   return 0;
168 }
169
170 DEF_TEST(cores_default_list) {
171   int ret = 0;
172   core_groups_list_t cgl = {0};
173
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);
178
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]);
184
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]);
190
191   config_cores_cleanup(&cgl);
192   return 0;
193 }
194
195 DEF_TEST(cores_default_list_fail) {
196   int ret = 0;
197   core_groups_list_t cgl = {0};
198
199   ret = config_cores_default(-1, &cgl);
200   OK(ret < 0);
201   ret = config_cores_default(MAX_CORES+1, &cgl);
202   OK(ret < 0);
203   ret = config_cores_default(1, NULL);
204   OK(ret < 0);
205   return 0;
206 }
207
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);
212   cgl.num_cgroups = 1;
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;
218
219   config_cores_cleanup(&cgl);
220   OK(NULL == cgl.cgroups);
221   EXPECT_EQ_INT(0, cgl.num_cgroups);
222   return 0;
223 }
224
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 };
230
231   int ret = config_cores_cmp_cgroups(&group_mock, &group_mock);
232   EXPECT_EQ_INT(1, ret);
233
234   ret = config_cores_cmp_cgroups(&group_mock, &group_mock_2);
235   EXPECT_EQ_INT(-1, ret);
236
237   cores_mock_2[0] = 4;
238   ret = config_cores_cmp_cgroups(&group_mock, &group_mock_2);
239   EXPECT_EQ_INT(0, ret);
240   return 0;
241 }
242
243 int main(void) {
244   RUN_TEST(string_to_uint);
245   RUN_TEST(cores_list_to_numbers);
246   RUN_TEST(check_grouped_cores);
247
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);
253
254   RUN_TEST(cores_group_cmp);
255
256   END_TEST;
257 }