af5672b94e98087cfbce9951f0bfa4b72a0c255f
[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, .values_num = STATIC_ARRAY_SIZE(values),
126   };
127
128   /* check */
129   int result = rdt_config_ngroups(rdt, &config_item);
130   EXPECT_EQ_INT(0, result);
131   EXPECT_EQ_STR(values[0].value.string, rdt->ngroups[0].desc);
132   EXPECT_EQ_INT(1, rdt->num_ngroups);
133
134   /* cleanup */
135   rdt_free_ngroups(rdt);
136   stub_rdt_teardown(rdt);
137
138   return 0;
139 }
140
141 DEF_TEST(rdt_config_ngroups__two_groups) {
142   /* setup */
143   rdt_ctx_t *rdt = stub_rdt_setup();
144
145   oconfig_value_t values[] = {
146       {.value.string = "proc11,proc12,proc13", .type = OCONFIG_TYPE_STRING},
147       {.value.string = "proc21,proc22,proc23", .type = OCONFIG_TYPE_STRING},
148   };
149   oconfig_item_t config_item = {
150       .values = values, .values_num = STATIC_ARRAY_SIZE(values),
151   };
152
153   /* check */
154   int result = rdt_config_ngroups(rdt, &config_item);
155   EXPECT_EQ_INT(0, result);
156   EXPECT_EQ_INT(2, rdt->num_ngroups);
157   EXPECT_EQ_STR("proc11,proc12,proc13", rdt->ngroups[0].desc);
158   EXPECT_EQ_STR("proc21,proc22,proc23", rdt->ngroups[1].desc);
159   EXPECT_EQ_STR("proc11", rdt->ngroups[0].names[0]);
160   EXPECT_EQ_STR("proc12", rdt->ngroups[0].names[1]);
161   EXPECT_EQ_STR("proc13", rdt->ngroups[0].names[2]);
162   EXPECT_EQ_STR("proc21", rdt->ngroups[1].names[0]);
163   EXPECT_EQ_STR("proc22", rdt->ngroups[1].names[1]);
164   EXPECT_EQ_STR("proc23", rdt->ngroups[1].names[2]);
165
166   /* cleanup */
167   rdt_free_ngroups(rdt);
168   stub_rdt_teardown(rdt);
169
170   return 0;
171 }
172
173 DEF_TEST(rdt_config_ngroups__too_long_proc_name) {
174   /* setup */
175   rdt_ctx_t *rdt = stub_rdt_setup();
176
177   oconfig_value_t values[] = {
178       {.value.string = "_seventeen_chars_", .type = OCONFIG_TYPE_STRING},
179   };
180   oconfig_item_t config_item = {
181       .values = values, .values_num = STATIC_ARRAY_SIZE(values),
182   };
183
184   /* check */
185   int result = rdt_config_ngroups(rdt, &config_item);
186   EXPECT_EQ_INT(-EINVAL, result);
187
188   /* cleanup */
189   stub_rdt_teardown(rdt);
190
191   return 0;
192 }
193
194 DEF_TEST(rdt_config_ngroups__duplicate_proc_name_between_groups) {
195   /* setup */
196   rdt_ctx_t *rdt = stub_rdt_setup();
197
198   oconfig_value_t values[] = {
199       {.value.string = "proc11,proc12,proc", .type = OCONFIG_TYPE_STRING},
200       {.value.string = "proc21,proc,proc23", .type = OCONFIG_TYPE_STRING},
201   };
202   oconfig_item_t config_item = {
203       .values = values, .values_num = STATIC_ARRAY_SIZE(values),
204   };
205
206   /* check */
207   int result = rdt_config_ngroups(rdt, &config_item);
208   EXPECT_EQ_INT(-EINVAL, result);
209
210   /* cleanup */
211   stub_rdt_teardown(rdt);
212
213   return 0;
214 }
215
216 DEF_TEST(rdt_config_ngroups__duplicate_proc_name_in_group) {
217   /* setup */
218   rdt_ctx_t *rdt = stub_rdt_setup();
219
220   oconfig_value_t values[] = {
221       {.value.string = "proc11,proc,proc,proc14", .type = OCONFIG_TYPE_STRING},
222   };
223   oconfig_item_t config_item = {
224       .values = values, .values_num = STATIC_ARRAY_SIZE(values),
225   };
226
227   /* check */
228   int result = rdt_config_ngroups(rdt, &config_item);
229   EXPECT_EQ_INT(-EINVAL, result);
230
231   /* cleanup */
232   stub_rdt_teardown(rdt);
233
234   return 0;
235 }
236
237 DEF_TEST(rdt_config_ngroups__empty_group) {
238   /* setup */
239   rdt_ctx_t *rdt = stub_rdt_setup();
240
241   oconfig_value_t values[] = {
242       {.value.string = "proc11,proc12,proc13", .type = OCONFIG_TYPE_STRING},
243       {.value.string = "", .type = OCONFIG_TYPE_STRING},
244
245   };
246   oconfig_item_t config_item = {
247       .values = values, .values_num = STATIC_ARRAY_SIZE(values),
248   };
249
250   /* check */
251   int result = rdt_config_ngroups(rdt, &config_item);
252   EXPECT_EQ_INT(-EINVAL, result);
253
254   /* cleanup */
255   stub_rdt_teardown(rdt);
256
257   return 0;
258 }
259
260 DEF_TEST(rdt_config_ngroups__empty_proc_name) {
261   /* setup */
262   rdt_ctx_t *rdt = stub_rdt_setup();
263
264   oconfig_value_t values[] = {
265       {.value.string = "proc11,,proc13", .type = OCONFIG_TYPE_STRING},
266   };
267   oconfig_item_t config_item = {
268       .values = values, .values_num = STATIC_ARRAY_SIZE(values),
269   };
270
271   /* check */
272   int result = rdt_config_ngroups(rdt, &config_item);
273   EXPECT_EQ_INT(-EINVAL, result);
274
275   /* cleanup */
276   stub_rdt_teardown(rdt);
277
278   return 0;
279 }
280
281 int main(void) {
282   RUN_TEST(rdt_config_ngroups__one_process);
283   RUN_TEST(rdt_config_ngroups__two_groups);
284   RUN_TEST(rdt_config_ngroups__too_long_proc_name);
285   RUN_TEST(rdt_config_ngroups__duplicate_proc_name_between_groups);
286   RUN_TEST(rdt_config_ngroups__duplicate_proc_name_in_group);
287   RUN_TEST(rdt_config_ngroups__empty_group);
288   RUN_TEST(rdt_config_ngroups__empty_proc_name);
289   END_TEST;
290 }
291
292 #else
293 DEF_TEST(pqos12_test_stub) {
294   EXPECT_EQ_INT(0, 0);
295   return 0;
296 }
297
298 int main(void) {
299   RUN_TEST(pqos12_test_stub);
300   END_TEST;
301 }
302 #endif