Merge pull request #3329 from efuss/fix-3311
[collectd.git] / src / intel_rdt_test.c
1 #include "intel_rdt.c" /* sic */
2 #include "testing.h"
3
4 /***************************************************************************
5  * PQOS mocks
6  */
7 int pqos_mon_reset(void) { return 0; }
8 int pqos_mon_assoc_get(const unsigned lcore, pqos_rmid_t *rmid) { return 0; }
9 int pqos_mon_start(const unsigned num_cores, const unsigned *cores,
10                    const enum pqos_mon_event event, void *context,
11                    struct pqos_mon_data *group) {
12   return 0;
13 }
14 #if PQOS_VERSION >= 30000
15 int pqos_mon_start_pids(const unsigned num_pids, const pid_t *pids,
16                         const enum pqos_mon_event event, void *context,
17                         struct pqos_mon_data *group) {
18   return 0;
19 }
20 int pqos_mon_add_pids(const unsigned num_pids, const pid_t *pids,
21                       struct pqos_mon_data *group) {
22   return 0;
23 }
24 int pqos_mon_remove_pids(const unsigned num_pids, const pid_t *pids,
25                          struct pqos_mon_data *group) {
26   return 0;
27 }
28
29 #else
30 int pqos_mon_start_pid(const pid_t pids, const enum pqos_mon_event event,
31                        void *context, struct pqos_mon_data *group) {
32   return 0;
33 }
34 #endif
35 int pqos_mon_stop(struct pqos_mon_data *group) { return 0; }
36 int pqos_mon_poll(struct pqos_mon_data **groups, const unsigned num_groups) {
37   return 0;
38 }
39
40 #if PQOS_VERSION >= 30000
41 int pqos_alloc_reset(const enum pqos_cdp_config l3_cdp_cfg,
42                      const enum pqos_cdp_config l2_cdp_cfg,
43                      const enum pqos_mba_config mba_cfg) {
44   return 0;
45 }
46 #elif PQOS_VERSION >= 20000
47 int pqos_alloc_reset(const enum pqos_cdp_config l3_cdp_cfg,
48                      const enum pqos_cdp_config l2_cdp_cfg) {
49   return 0;
50 }
51 #else
52 int pqos_alloc_reset(const enum pqos_cdp_config l3_cdp_cfg) { return 0; }
53 #endif
54 int pqos_alloc_assoc_set(const unsigned lcore, const unsigned class_id) {
55   return 0;
56 }
57 int pqos_alloc_assoc_get(const unsigned lcore, unsigned *class_id) { return 0; }
58 int pqos_alloc_assoc_set_pid(const pid_t task, const unsigned class_id) {
59   return 0;
60 }
61 int pqos_alloc_assoc_get_pid(const pid_t task, unsigned *class_id) { return 0; }
62 int pqos_alloc_assign(const unsigned technology, const unsigned *core_array,
63                       const unsigned core_num, unsigned *class_id) {
64   return 0;
65 }
66 int pqos_alloc_release(const unsigned *core_array, const unsigned core_num) {
67   return 0;
68 }
69 int pqos_alloc_assign_pid(const unsigned technology, const pid_t *task_array,
70                           const unsigned task_num, unsigned *class_id) {
71   return 0;
72 }
73 int pqos_alloc_release_pid(const pid_t *task_array, const unsigned task_num) {
74   return 0;
75 }
76 int pqos_init(const struct pqos_config *config) { return 0; }
77 int pqos_fini(void) { return 0; }
78 int pqos_cap_get_type(const struct pqos_cap *cap, const enum pqos_cap_type type,
79                       const struct pqos_capability **cap_item) {
80   return 0;
81 }
82 int pqos_cap_get(const struct pqos_cap **cap, const struct pqos_cpuinfo **cpu) {
83   return 0;
84 }
85
86 #ifdef LIBPQOS2
87 /***************************************************************************
88  * helper functions
89  */
90 rdt_ctx_t *stub_rdt_setup() {
91
92   rdt_ctx_t *rdt = calloc(1, sizeof(*rdt));
93   struct pqos_cpuinfo *pqos_cpu = calloc(1, sizeof(*pqos_cpu));
94   struct pqos_cap *pqos_cap = calloc(1, sizeof(*pqos_cap));
95   struct pqos_cap_mon *mon = calloc(1, sizeof(*mon));
96   struct pqos_capability *cap_mon = calloc(1, sizeof(*cap_mon));
97
98   cap_mon->u.mon = mon;
99   rdt->pqos_cap = pqos_cap;
100   rdt->pqos_cpu = pqos_cpu;
101   rdt->cap_mon = cap_mon;
102
103   return rdt;
104 }
105
106 void stub_rdt_teardown(rdt_ctx_t *rdt) {
107   free(rdt->cap_mon->u.mon);
108   free((void *)rdt->cap_mon);
109   free((void *)rdt->pqos_cpu);
110   free((void *)rdt->pqos_cap);
111   free(rdt);
112 }
113
114 /***************************************************************************
115  * tests
116  */
117 DEF_TEST(rdt_config_ngroups__one_process) {
118   /* setup */
119   rdt_ctx_t *rdt = stub_rdt_setup();
120
121   oconfig_value_t values[] = {
122       {.value.string = "proc1", .type = OCONFIG_TYPE_STRING},
123   };
124   oconfig_item_t config_item = {
125       .values = values,
126       .values_num = STATIC_ARRAY_SIZE(values),
127   };
128
129   /* check */
130   int result = rdt_config_ngroups(rdt, &config_item);
131   EXPECT_EQ_INT(0, result);
132   EXPECT_EQ_STR(values[0].value.string, rdt->ngroups[0].desc);
133   EXPECT_EQ_INT(1, rdt->num_ngroups);
134
135   /* cleanup */
136   rdt_free_ngroups(rdt);
137   stub_rdt_teardown(rdt);
138
139   return 0;
140 }
141
142 DEF_TEST(rdt_config_ngroups__two_groups) {
143   /* setup */
144   rdt_ctx_t *rdt = stub_rdt_setup();
145
146   oconfig_value_t values[] = {
147       {.value.string = "proc11,proc12,proc13", .type = OCONFIG_TYPE_STRING},
148       {.value.string = "proc21,proc22,proc23", .type = OCONFIG_TYPE_STRING},
149   };
150   oconfig_item_t config_item = {
151       .values = values,
152       .values_num = STATIC_ARRAY_SIZE(values),
153   };
154
155   /* check */
156   int result = rdt_config_ngroups(rdt, &config_item);
157   EXPECT_EQ_INT(0, result);
158   EXPECT_EQ_INT(2, rdt->num_ngroups);
159   EXPECT_EQ_STR("proc11,proc12,proc13", rdt->ngroups[0].desc);
160   EXPECT_EQ_STR("proc21,proc22,proc23", rdt->ngroups[1].desc);
161   EXPECT_EQ_STR("proc11", rdt->ngroups[0].names[0]);
162   EXPECT_EQ_STR("proc12", rdt->ngroups[0].names[1]);
163   EXPECT_EQ_STR("proc13", rdt->ngroups[0].names[2]);
164   EXPECT_EQ_STR("proc21", rdt->ngroups[1].names[0]);
165   EXPECT_EQ_STR("proc22", rdt->ngroups[1].names[1]);
166   EXPECT_EQ_STR("proc23", rdt->ngroups[1].names[2]);
167
168   /* cleanup */
169   rdt_free_ngroups(rdt);
170   stub_rdt_teardown(rdt);
171
172   return 0;
173 }
174
175 DEF_TEST(rdt_config_ngroups__too_long_proc_name) {
176   /* setup */
177   rdt_ctx_t *rdt = stub_rdt_setup();
178
179   oconfig_value_t values[] = {
180       {.value.string = "_seventeen_chars_", .type = OCONFIG_TYPE_STRING},
181   };
182   oconfig_item_t config_item = {
183       .values = values,
184       .values_num = STATIC_ARRAY_SIZE(values),
185   };
186
187   /* check */
188   int result = rdt_config_ngroups(rdt, &config_item);
189   EXPECT_EQ_INT(-EINVAL, result);
190
191   /* cleanup */
192   stub_rdt_teardown(rdt);
193
194   return 0;
195 }
196
197 DEF_TEST(rdt_config_ngroups__duplicate_proc_name_between_groups) {
198   /* setup */
199   rdt_ctx_t *rdt = stub_rdt_setup();
200
201   oconfig_value_t values[] = {
202       {.value.string = "proc11,proc12,proc", .type = OCONFIG_TYPE_STRING},
203       {.value.string = "proc21,proc,proc23", .type = OCONFIG_TYPE_STRING},
204   };
205   oconfig_item_t config_item = {
206       .values = values,
207       .values_num = STATIC_ARRAY_SIZE(values),
208   };
209
210   /* check */
211   int result = rdt_config_ngroups(rdt, &config_item);
212   EXPECT_EQ_INT(-EINVAL, result);
213
214   /* cleanup */
215   stub_rdt_teardown(rdt);
216
217   return 0;
218 }
219
220 DEF_TEST(rdt_config_ngroups__duplicate_proc_name_in_group) {
221   /* setup */
222   rdt_ctx_t *rdt = stub_rdt_setup();
223
224   oconfig_value_t values[] = {
225       {.value.string = "proc11,proc,proc,proc14", .type = OCONFIG_TYPE_STRING},
226   };
227   oconfig_item_t config_item = {
228       .values = values,
229       .values_num = STATIC_ARRAY_SIZE(values),
230   };
231
232   /* check */
233   int result = rdt_config_ngroups(rdt, &config_item);
234   EXPECT_EQ_INT(-EINVAL, result);
235
236   /* cleanup */
237   stub_rdt_teardown(rdt);
238
239   return 0;
240 }
241
242 DEF_TEST(rdt_config_ngroups__empty_group) {
243   /* setup */
244   rdt_ctx_t *rdt = stub_rdt_setup();
245
246   oconfig_value_t values[] = {
247       {.value.string = "proc11,proc12,proc13", .type = OCONFIG_TYPE_STRING},
248       {.value.string = "", .type = OCONFIG_TYPE_STRING},
249
250   };
251   oconfig_item_t config_item = {
252       .values = values,
253       .values_num = STATIC_ARRAY_SIZE(values),
254   };
255
256   /* check */
257   int result = rdt_config_ngroups(rdt, &config_item);
258   EXPECT_EQ_INT(-EINVAL, result);
259
260   /* cleanup */
261   stub_rdt_teardown(rdt);
262
263   return 0;
264 }
265
266 DEF_TEST(rdt_config_ngroups__empty_proc_name) {
267   /* setup */
268   rdt_ctx_t *rdt = stub_rdt_setup();
269
270   oconfig_value_t values[] = {
271       {.value.string = "proc11,,proc13", .type = OCONFIG_TYPE_STRING},
272   };
273   oconfig_item_t config_item = {
274       .values = values,
275       .values_num = STATIC_ARRAY_SIZE(values),
276   };
277
278   /* check */
279   int result = rdt_config_ngroups(rdt, &config_item);
280   EXPECT_EQ_INT(-EINVAL, result);
281
282   /* cleanup */
283   stub_rdt_teardown(rdt);
284
285   return 0;
286 }
287
288 int main(void) {
289   RUN_TEST(rdt_config_ngroups__one_process);
290   RUN_TEST(rdt_config_ngroups__two_groups);
291   RUN_TEST(rdt_config_ngroups__too_long_proc_name);
292   RUN_TEST(rdt_config_ngroups__duplicate_proc_name_between_groups);
293   RUN_TEST(rdt_config_ngroups__duplicate_proc_name_in_group);
294   RUN_TEST(rdt_config_ngroups__empty_group);
295   RUN_TEST(rdt_config_ngroups__empty_proc_name);
296   END_TEST;
297 }
298
299 #else
300 DEF_TEST(pqos12_test_stub) {
301   EXPECT_EQ_INT(0, 0);
302   return 0;
303 }
304
305 int main(void) {
306   RUN_TEST(pqos12_test_stub);
307   END_TEST;
308 }
309 #endif