summaryrefslogtreecommitdiffstats
path: root/lib/tests/test_generic_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tests/test_generic_output.c')
-rw-r--r--lib/tests/test_generic_output.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/lib/tests/test_generic_output.c b/lib/tests/test_generic_output.c
new file mode 100644
index 00000000..e4a78bcd
--- /dev/null
+++ b/lib/tests/test_generic_output.c
@@ -0,0 +1,317 @@
1#include "../lib/output.h"
2#include "../../tap/tap.h"
3#include "./states.h"
4
5#include <string.h>
6
7void test_one_subcheck(void);
8void test_two_subchecks(void);
9
10void test_perfdata_formatting(void);
11void test_perfdata_formatting2(void);
12
13void test_deep_check_hierarchy(void);
14void test_deep_check_hierarchy2(void);
15
16void test_default_states1(void);
17void test_default_states2(void);
18
19int main(void) {
20 plan_tests(19);
21
22 diag("Simple test with one subcheck");
23 test_one_subcheck();
24
25 diag("Test with two subchecks");
26 test_two_subchecks();
27
28 diag("Test for performance data formatting");
29 test_perfdata_formatting();
30
31 diag("Another test for performance data formatting");
32 test_perfdata_formatting2();
33
34 diag("Test for deeper hierarchies");
35 test_deep_check_hierarchy();
36
37 diag("Another test for deeper hierarchies");
38 test_deep_check_hierarchy2();
39
40 diag("Testing the default state logic");
41 test_default_states1();
42
43 diag("Testing the default state logic #2");
44 test_default_states2();
45
46 return exit_status();
47}
48
49void test_one_subcheck(void) {
50 mp_subcheck sc1 = mp_subcheck_init();
51
52 sc1.output = "foobar";
53 sc1 = mp_set_subcheck_state(sc1, STATE_WARNING);
54
55 mp_check check = mp_check_init();
56 mp_add_subcheck_to_check(&check, sc1);
57
58 ok(mp_compute_check_state(check) == STATE_WARNING, "Main state should be warning");
59
60 char *output = mp_fmt_output(check);
61
62 // diag("Formatted output");
63 // diag(output);
64
65 char expected[] = "[WARNING] - ok=0, warning=1, critical=0, unknown=0\n"
66 "\t\\_[WARNING] - foobar\n";
67
68 // diag("Expected output");
69 // diag(expected);
70
71 ok(strcmp(output, expected) == 0, "Simple output test");
72}
73
74void test_perfdata_formatting2(void) {
75 mp_perfdata pd1 = perfdata_init();
76 mp_perfdata pd2 = perfdata_init();
77
78 pd1.label = "foo";
79 pd2.label = "bar";
80
81 pd1 = mp_set_pd_value(pd1, 23);
82 pd2 = mp_set_pd_value(pd2, 1LL);
83
84 pd_list *tmp = pd_list_init();
85
86 pd_list_append(tmp, pd1);
87 pd_list_append(tmp, pd2);
88
89 char *result = pd_list_to_string(*tmp);
90
91 ok(strcmp(result, "foo=23;;; bar=1;;;") == 0, "Perfdata string formatting");
92}
93
94void test_perfdata_formatting(void) {
95 mp_perfdata pd1 = perfdata_init();
96
97 pd1.uom = "s";
98 pd1.label = "foo";
99
100 pd1 = mp_set_pd_value(pd1, 23);
101
102 char *pd_string = pd_to_string(pd1);
103
104 ok(strcmp(pd_string, "foo=23s;;;") == 0, "Perfdata string formatting");
105}
106
107void test_two_subchecks(void) {
108 mp_subcheck sc1 = mp_subcheck_init();
109
110 sc1.output = "foobar";
111 sc1 = mp_set_subcheck_state(sc1, STATE_WARNING);
112
113 ok(mp_compute_subcheck_state(sc1) == STATE_WARNING,
114 "Test subcheck state directly after setting it");
115
116 mp_perfdata pd1 = perfdata_init();
117
118 pd1 = mp_set_pd_value(pd1, 23);
119
120 pd1.uom = "s";
121 pd1.label = "foo";
122
123 mp_add_perfdata_to_subcheck(&sc1, pd1);
124
125 mp_subcheck sc2 = mp_subcheck_init();
126 sc2.output = "baz";
127 sc2 = mp_set_subcheck_state(sc2, STATE_OK);
128
129 ok(mp_compute_subcheck_state(sc2) == STATE_OK, "Test subcheck 2 state after setting it");
130
131 mp_add_subcheck_to_subcheck(&sc1, sc2);
132
133 ok(mp_compute_subcheck_state(sc1) == STATE_WARNING,
134 "Test subcheck state after adding a subcheck");
135
136 mp_check check = mp_check_init();
137 mp_add_subcheck_to_check(&check, sc1);
138
139 ok(mp_compute_check_state(check) == STATE_WARNING, "Test main check result");
140
141 char *output = mp_fmt_output(check);
142
143 // diag("Formatted output. Length: %u", strlen(output));
144 // diag(output);
145
146 ok(output != NULL, "Output should not be NULL");
147
148 char expected[] = "[WARNING] - ok=0, warning=1, critical=0, unknown=0\n"
149 "\t\\_[WARNING] - foobar\n"
150 "\t\t\\_[OK] - baz\n"
151 "|foo=23s;;; \n";
152
153 // diag("Expected output. Length: %u", strlen(expected));
154 // diag(expected);
155
156 ok(strcmp(output, expected) == 0, "Output is as expected");
157}
158
159void test_deep_check_hierarchy(void) {
160 // level 4
161 mp_subcheck sc4 = mp_subcheck_init();
162 sc4.output = "level4";
163 sc4 = mp_set_subcheck_state(sc4, STATE_OK);
164
165 // level 3
166 mp_subcheck sc3 = mp_subcheck_init();
167 sc3.output = "level3";
168 sc3 = mp_set_subcheck_state(sc3, STATE_OK);
169
170 // level 2
171 mp_subcheck sc2 = mp_subcheck_init();
172 sc2.output = "baz";
173 sc2 = mp_set_subcheck_state(sc2, STATE_OK);
174
175 // level 1
176 mp_subcheck sc1 = mp_subcheck_init();
177
178 sc1.output = "foobar";
179 sc1 = mp_set_subcheck_state(sc1, STATE_WARNING);
180
181 mp_perfdata pd1 = perfdata_init();
182
183 pd1.uom = "s";
184 pd1.label = "foo";
185 pd1 = mp_set_pd_value(pd1, 23);
186
187 mp_add_perfdata_to_subcheck(&sc1, pd1);
188
189 // main check
190 mp_check check = mp_check_init();
191
192 mp_add_subcheck_to_subcheck(&sc3, sc4);
193 mp_add_subcheck_to_subcheck(&sc2, sc3);
194 mp_add_subcheck_to_subcheck(&sc1, sc2);
195 mp_add_subcheck_to_check(&check, sc1);
196
197 char *output = mp_fmt_output(check);
198
199 size_t output_length = strlen(output);
200
201 // diag("Formatted output of length %i", output_length);
202 // diag(output);
203
204 ok(output != NULL, "Output should not be NULL");
205
206 char expected[] = "[WARNING] - ok=0, warning=1, critical=0, unknown=0\n"
207 "\t\\_[WARNING] - foobar\n"
208 "\t\t\\_[OK] - baz\n"
209 "\t\t\t\\_[OK] - level3\n"
210 "\t\t\t\t\\_[OK] - level4\n"
211 "|foo=23s;;; \n";
212
213 size_t expected_length = strlen(expected);
214
215 // diag("Expected output of length: %i", expected_length);
216 // diag(expected);
217
218 ok(output_length == expected_length, "Outputs are of equal length");
219 ok(strcmp(output, expected) == 0, "Output is as expected");
220}
221
222void test_deep_check_hierarchy2(void) {
223 // level 1
224 mp_subcheck sc1 = mp_subcheck_init();
225
226 sc1.output = "foobar";
227 sc1 = mp_set_subcheck_state(sc1, STATE_WARNING);
228
229 mp_perfdata pd1 = perfdata_init();
230 pd1.uom = "s";
231 pd1.label = "foo";
232 pd1 = mp_set_pd_value(pd1, 23);
233
234 mp_add_perfdata_to_subcheck(&sc1, pd1);
235
236 // level 2
237 mp_subcheck sc2 = mp_subcheck_init();
238 sc2.output = "baz";
239 sc2 = mp_set_subcheck_state(sc2, STATE_OK);
240
241 mp_perfdata pd2 = perfdata_init();
242 pd2.uom = "B";
243 pd2.label = "baz";
244 pd2 = mp_set_pd_value(pd2, 1024);
245 mp_add_perfdata_to_subcheck(&sc2, pd2);
246
247 // level 3
248 mp_subcheck sc3 = mp_subcheck_init();
249 sc3.output = "level3";
250 sc3 = mp_set_subcheck_state(sc3, STATE_OK);
251
252 mp_perfdata pd3 = perfdata_init();
253 pd3.label = "floatMe";
254 pd3 = mp_set_pd_value(pd3, 1024.1024);
255 mp_add_perfdata_to_subcheck(&sc3, pd3);
256
257 // level 4
258 mp_subcheck sc4 = mp_subcheck_init();
259 sc4.output = "level4";
260 sc4 = mp_set_subcheck_state(sc4, STATE_OK);
261
262 mp_check check = mp_check_init();
263
264 mp_add_subcheck_to_subcheck(&sc3, sc4);
265 mp_add_subcheck_to_subcheck(&sc2, sc3);
266 mp_add_subcheck_to_subcheck(&sc1, sc2);
267 mp_add_subcheck_to_check(&check, sc1);
268
269 char *output = mp_fmt_output(check);
270
271 // diag("Formatted output of length: %i", strlen(output));
272 // diag(output);
273
274 ok(output != NULL, "Output should not be NULL");
275
276 char expected[] = "[WARNING] - ok=0, warning=1, critical=0, unknown=0\n"
277 "\t\\_[WARNING] - foobar\n"
278 "\t\t\\_[OK] - baz\n"
279 "\t\t\t\\_[OK] - level3\n"
280 "\t\t\t\t\\_[OK] - level4\n"
281 "|foo=23s;;; baz=1024B;;; floatMe=1024.102400;;; \n";
282
283 // diag("Expected output of length: %i", strlen(expected));
284 // diag(expected);
285
286 ok(strcmp(output, expected) == 0, "Output is as expected");
287}
288
289void test_default_states1(void) {
290 mp_subcheck sc = mp_subcheck_init();
291
292 mp_state_enum state1 = mp_compute_subcheck_state(sc);
293 ok(state1 == STATE_UNKNOWN, "Default default state is Unknown");
294
295 sc = mp_set_subcheck_default_state(sc, STATE_CRITICAL);
296
297 mp_state_enum state2 = mp_compute_subcheck_state(sc);
298 ok(state2 == STATE_CRITICAL, "Default state is Critical");
299
300 sc = mp_set_subcheck_state(sc, STATE_OK);
301
302 mp_state_enum state3 = mp_compute_subcheck_state(sc);
303 ok(state3 == STATE_OK, "Default state is Critical");
304}
305
306void test_default_states2(void) {
307 mp_check check = mp_check_init();
308
309 mp_subcheck sc = mp_subcheck_init();
310 sc.output = "placeholder";
311 sc = mp_set_subcheck_default_state(sc, STATE_CRITICAL);
312
313 mp_add_subcheck_to_check(&check, sc);
314
315 mp_state_enum result_state = mp_compute_check_state(check);
316 ok(result_state == STATE_CRITICAL, "Derived state is the proper default state");
317}