xref: /freebsd/contrib/atf/test-programs/c_helpers.c (revision 40a8ac8f62b535d30349faf28cf47106b7041b83)
1 /*
2  * Automated Testing Framework (atf)
3  *
4  * Copyright (c) 2007 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <sys/types.h>
31 #include <sys/wait.h>
32 #include <fcntl.h>
33 #include <unistd.h>
34 
35 #include <signal.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <string.h>
39 
40 #include <atf-c.h>
41 
42 #include "atf-c/error.h"
43 
44 #include "atf-c/detail/env.h"
45 #include "atf-c/detail/fs.h"
46 #include "atf-c/detail/test_helpers.h"
47 #include "atf-c/detail/text.h"
48 
49 /* ---------------------------------------------------------------------
50  * Auxiliary functions.
51  * --------------------------------------------------------------------- */
52 
53 static
54 void
55 safe_remove(const char* path)
56 {
57     if (unlink(path) == -1)
58         atf_tc_fail("unlink(2) of %s failed", path);
59 }
60 
61 static
62 void
63 touch(const char *path)
64 {
65     int fd;
66     fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0644);
67     if (fd == -1)
68         atf_tc_fail("Could not create file %s", path);
69     close(fd);
70 }
71 
72 /* ---------------------------------------------------------------------
73  * Helper tests for "t_cleanup".
74  * --------------------------------------------------------------------- */
75 
76 ATF_TC_WITH_CLEANUP(cleanup_pass);
77 ATF_TC_HEAD(cleanup_pass, tc)
78 {
79     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "
80                "program");
81 }
82 ATF_TC_BODY(cleanup_pass, tc)
83 {
84     touch(atf_tc_get_config_var(tc, "tmpfile"));
85 }
86 ATF_TC_CLEANUP(cleanup_pass, tc)
87 {
88     if (atf_tc_get_config_var_as_bool(tc, "cleanup"))
89         safe_remove(atf_tc_get_config_var(tc, "tmpfile"));
90 }
91 
92 ATF_TC_WITH_CLEANUP(cleanup_fail);
93 ATF_TC_HEAD(cleanup_fail, tc)
94 {
95     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "
96                       "program");
97 }
98 ATF_TC_BODY(cleanup_fail, tc)
99 {
100     touch(atf_tc_get_config_var(tc, "tmpfile"));
101     atf_tc_fail("On purpose");
102 }
103 ATF_TC_CLEANUP(cleanup_fail, tc)
104 {
105     if (atf_tc_get_config_var_as_bool(tc, "cleanup"))
106         safe_remove(atf_tc_get_config_var(tc, "tmpfile"));
107 }
108 
109 ATF_TC_WITH_CLEANUP(cleanup_skip);
110 ATF_TC_HEAD(cleanup_skip, tc)
111 {
112     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "
113                       "program");
114 }
115 ATF_TC_BODY(cleanup_skip, tc)
116 {
117     touch(atf_tc_get_config_var(tc, "tmpfile"));
118     atf_tc_skip("On purpose");
119 }
120 ATF_TC_CLEANUP(cleanup_skip, tc)
121 {
122     if (atf_tc_get_config_var_as_bool(tc, "cleanup"))
123         safe_remove(atf_tc_get_config_var(tc, "tmpfile"));
124 }
125 
126 ATF_TC_WITH_CLEANUP(cleanup_curdir);
127 ATF_TC_HEAD(cleanup_curdir, tc)
128 {
129     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "
130                       "program");
131 }
132 ATF_TC_BODY(cleanup_curdir, tc)
133 {
134     FILE *f;
135 
136     f = fopen("oldvalue", "w");
137     if (f == NULL)
138         atf_tc_fail("Failed to create oldvalue file");
139     fprintf(f, "1234");
140     fclose(f);
141 }
142 ATF_TC_CLEANUP(cleanup_curdir, tc)
143 {
144     FILE *f;
145 
146     f = fopen("oldvalue", "r");
147     if (f != NULL) {
148         int i;
149         if (fscanf(f, "%d", &i) != 1)
150             fprintf(stderr, "Failed to read old value\n");
151         else
152             printf("Old value: %d", i);
153         fclose(f);
154     }
155 }
156 
157 ATF_TC_WITH_CLEANUP(cleanup_sigterm);
158 ATF_TC_HEAD(cleanup_sigterm, tc)
159 {
160     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test "
161                       "program");
162 }
163 ATF_TC_BODY(cleanup_sigterm, tc)
164 {
165     char *nofile;
166 
167     touch(atf_tc_get_config_var(tc, "tmpfile"));
168     kill(getpid(), SIGTERM);
169 
170     RE(atf_text_format(&nofile, "%s.no",
171                        atf_tc_get_config_var(tc, "tmpfile")));
172     touch(nofile);
173     free(nofile);
174 }
175 ATF_TC_CLEANUP(cleanup_sigterm, tc)
176 {
177     safe_remove(atf_tc_get_config_var(tc, "tmpfile"));
178 }
179 
180 /* ---------------------------------------------------------------------
181  * Helper tests for "t_config".
182  * --------------------------------------------------------------------- */
183 
184 ATF_TC(config_unset);
185 ATF_TC_HEAD(config_unset, tc)
186 {
187     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "
188                       "program");
189 }
190 ATF_TC_BODY(config_unset, tc)
191 {
192     ATF_REQUIRE(!atf_tc_has_config_var(tc, "test"));
193 }
194 
195 ATF_TC(config_empty);
196 ATF_TC_HEAD(config_empty, tc)
197 {
198     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "
199                       "program");
200 }
201 ATF_TC_BODY(config_empty, tc)
202 {
203     ATF_REQUIRE(atf_tc_has_config_var(tc, "test"));
204     ATF_REQUIRE(strlen(atf_tc_get_config_var(tc, "test")) == 0);
205 }
206 
207 ATF_TC(config_value);
208 ATF_TC_HEAD(config_value, tc)
209 {
210     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "
211                       "program");
212 }
213 ATF_TC_BODY(config_value, tc)
214 {
215     ATF_REQUIRE(atf_tc_has_config_var(tc, "test"));
216     ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo") == 0);
217 }
218 
219 ATF_TC(config_multi_value);
220 ATF_TC_HEAD(config_multi_value, tc)
221 {
222     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test "
223                       "program");
224 }
225 ATF_TC_BODY(config_multi_value, tc)
226 {
227     ATF_REQUIRE(atf_tc_has_config_var(tc, "test"));
228     ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo bar") == 0);
229 }
230 
231 /* ---------------------------------------------------------------------
232  * Helper tests for "t_expect".
233  * --------------------------------------------------------------------- */
234 
235 ATF_TC_WITHOUT_HEAD(expect_pass_and_pass);
236 ATF_TC_BODY(expect_pass_and_pass, tc)
237 {
238     atf_tc_expect_pass();
239 
240 }
241 
242 ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_requirement);
243 ATF_TC_BODY(expect_pass_but_fail_requirement, tc)
244 {
245     atf_tc_expect_pass();
246     atf_tc_fail("Some reason");
247 }
248 
249 ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_check);
250 ATF_TC_BODY(expect_pass_but_fail_check, tc)
251 {
252     atf_tc_expect_pass();
253     atf_tc_fail_nonfatal("Some reason");
254 }
255 
256 ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_requirement);
257 ATF_TC_BODY(expect_fail_and_fail_requirement, tc)
258 {
259     atf_tc_expect_fail("Fail %s", "reason");
260     atf_tc_fail("The failure");
261     atf_tc_expect_pass();
262 }
263 
264 ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_check);
265 ATF_TC_BODY(expect_fail_and_fail_check, tc)
266 {
267     atf_tc_expect_fail("Fail first");
268     atf_tc_fail_nonfatal("abc");
269     atf_tc_expect_pass();
270 
271     atf_tc_expect_fail("And fail again");
272     atf_tc_fail_nonfatal("def");
273     atf_tc_expect_pass();
274 }
275 
276 ATF_TC_WITHOUT_HEAD(expect_fail_but_pass);
277 ATF_TC_BODY(expect_fail_but_pass, tc)
278 {
279     atf_tc_expect_fail("Fail first");
280     atf_tc_fail_nonfatal("abc");
281     atf_tc_expect_pass();
282 
283     atf_tc_expect_fail("Will not fail");
284     atf_tc_expect_pass();
285 
286     atf_tc_expect_fail("And fail again");
287     atf_tc_fail_nonfatal("def");
288     atf_tc_expect_pass();
289 }
290 
291 ATF_TC_WITHOUT_HEAD(expect_exit_any_and_exit);
292 ATF_TC_BODY(expect_exit_any_and_exit, tc)
293 {
294     atf_tc_expect_exit(-1, "Call will exit");
295     exit(EXIT_SUCCESS);
296 }
297 
298 ATF_TC_WITHOUT_HEAD(expect_exit_code_and_exit);
299 ATF_TC_BODY(expect_exit_code_and_exit, tc)
300 {
301     atf_tc_expect_exit(123, "Call will exit");
302     exit(123);
303 }
304 
305 ATF_TC_WITHOUT_HEAD(expect_exit_but_pass);
306 ATF_TC_BODY(expect_exit_but_pass, tc)
307 {
308     atf_tc_expect_exit(-1, "Call won't exit");
309 }
310 
311 ATF_TC_WITHOUT_HEAD(expect_signal_any_and_signal);
312 ATF_TC_BODY(expect_signal_any_and_signal, tc)
313 {
314     atf_tc_expect_signal(-1, "Call will signal");
315     kill(getpid(), SIGKILL);
316 }
317 
318 ATF_TC_WITHOUT_HEAD(expect_signal_no_and_signal);
319 ATF_TC_BODY(expect_signal_no_and_signal, tc)
320 {
321     atf_tc_expect_signal(SIGHUP, "Call will signal");
322     kill(getpid(), SIGHUP);
323 }
324 
325 ATF_TC_WITHOUT_HEAD(expect_signal_but_pass);
326 ATF_TC_BODY(expect_signal_but_pass, tc)
327 {
328     atf_tc_expect_signal(-1, "Call won't signal");
329 }
330 
331 ATF_TC_WITHOUT_HEAD(expect_death_and_exit);
332 ATF_TC_BODY(expect_death_and_exit, tc)
333 {
334     atf_tc_expect_death("Exit case");
335     exit(123);
336 }
337 
338 ATF_TC_WITHOUT_HEAD(expect_death_and_signal);
339 ATF_TC_BODY(expect_death_and_signal, tc)
340 {
341     atf_tc_expect_death("Signal case");
342     kill(getpid(), SIGKILL);
343 }
344 
345 ATF_TC_WITHOUT_HEAD(expect_death_but_pass);
346 ATF_TC_BODY(expect_death_but_pass, tc)
347 {
348     atf_tc_expect_death("Call won't die");
349 }
350 
351 ATF_TC(expect_timeout_and_hang);
352 ATF_TC_HEAD(expect_timeout_and_hang, tc)
353 {
354     atf_tc_set_md_var(tc, "timeout", "1");
355 }
356 ATF_TC_BODY(expect_timeout_and_hang, tc)
357 {
358     atf_tc_expect_timeout("Will overrun");
359     sleep(5);
360 }
361 
362 ATF_TC(expect_timeout_but_pass);
363 ATF_TC_HEAD(expect_timeout_but_pass, tc)
364 {
365     atf_tc_set_md_var(tc, "timeout", "1");
366 }
367 ATF_TC_BODY(expect_timeout_but_pass, tc)
368 {
369     atf_tc_expect_timeout("Will just exit");
370 }
371 
372 /* ---------------------------------------------------------------------
373  * Helper tests for "t_meta_data".
374  * --------------------------------------------------------------------- */
375 
376 ATF_TC_WITHOUT_HEAD(metadata_no_descr);
377 ATF_TC_BODY(metadata_no_descr, tc)
378 {
379 }
380 
381 ATF_TC_WITHOUT_HEAD(metadata_no_head);
382 ATF_TC_BODY(metadata_no_head, tc)
383 {
384 }
385 
386 /* ---------------------------------------------------------------------
387  * Helper tests for "t_srcdir".
388  * --------------------------------------------------------------------- */
389 
390 ATF_TC(srcdir_exists);
391 ATF_TC_HEAD(srcdir_exists, tc)
392 {
393     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_srcdir test "
394                       "program");
395 }
396 ATF_TC_BODY(srcdir_exists, tc)
397 {
398     atf_fs_path_t p;
399     bool b;
400 
401     RE(atf_fs_path_init_fmt(&p, "%s/datafile",
402                             atf_tc_get_config_var(tc, "srcdir")));
403     RE(atf_fs_exists(&p, &b));
404     atf_fs_path_fini(&p);
405     if (!b)
406         atf_tc_fail("Cannot find datafile");
407 }
408 
409 /* ---------------------------------------------------------------------
410  * Helper tests for "t_result".
411  * --------------------------------------------------------------------- */
412 
413 ATF_TC_WITHOUT_HEAD(result_pass);
414 ATF_TC_BODY(result_pass, tc)
415 {
416     printf("msg\n");
417 }
418 
419 ATF_TC_WITHOUT_HEAD(result_fail);
420 ATF_TC_BODY(result_fail, tc)
421 {
422     printf("msg\n");
423     atf_tc_fail("Failure reason");
424 }
425 
426 ATF_TC_WITHOUT_HEAD(result_skip);
427 ATF_TC_BODY(result_skip, tc)
428 {
429     printf("msg\n");
430     atf_tc_skip("Skipped reason");
431 }
432 
433 ATF_TC(result_newlines_fail);
434 ATF_TC_HEAD(result_newlines_fail, tc)
435 {
436     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test "
437                       "program");
438 }
439 ATF_TC_BODY(result_newlines_fail, tc)
440 {
441     atf_tc_fail("First line\nSecond line");
442 }
443 
444 ATF_TC(result_newlines_skip);
445 ATF_TC_HEAD(result_newlines_skip, tc)
446 {
447     atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test "
448                       "program");
449 }
450 ATF_TC_BODY(result_newlines_skip, tc)
451 {
452     atf_tc_skip("First line\nSecond line");
453 }
454 
455 /* ---------------------------------------------------------------------
456  * Main.
457  * --------------------------------------------------------------------- */
458 
459 ATF_TP_ADD_TCS(tp)
460 {
461     /* Add helper tests for t_cleanup. */
462     ATF_TP_ADD_TC(tp, cleanup_pass);
463     ATF_TP_ADD_TC(tp, cleanup_fail);
464     ATF_TP_ADD_TC(tp, cleanup_skip);
465     ATF_TP_ADD_TC(tp, cleanup_curdir);
466     ATF_TP_ADD_TC(tp, cleanup_sigterm);
467 
468     /* Add helper tests for t_config. */
469     ATF_TP_ADD_TC(tp, config_unset);
470     ATF_TP_ADD_TC(tp, config_empty);
471     ATF_TP_ADD_TC(tp, config_value);
472     ATF_TP_ADD_TC(tp, config_multi_value);
473 
474     /* Add helper tests for t_expect. */
475     ATF_TP_ADD_TC(tp, expect_pass_and_pass);
476     ATF_TP_ADD_TC(tp, expect_pass_but_fail_requirement);
477     ATF_TP_ADD_TC(tp, expect_pass_but_fail_check);
478     ATF_TP_ADD_TC(tp, expect_fail_and_fail_requirement);
479     ATF_TP_ADD_TC(tp, expect_fail_and_fail_check);
480     ATF_TP_ADD_TC(tp, expect_fail_but_pass);
481     ATF_TP_ADD_TC(tp, expect_exit_any_and_exit);
482     ATF_TP_ADD_TC(tp, expect_exit_code_and_exit);
483     ATF_TP_ADD_TC(tp, expect_exit_but_pass);
484     ATF_TP_ADD_TC(tp, expect_signal_any_and_signal);
485     ATF_TP_ADD_TC(tp, expect_signal_no_and_signal);
486     ATF_TP_ADD_TC(tp, expect_signal_but_pass);
487     ATF_TP_ADD_TC(tp, expect_death_and_exit);
488     ATF_TP_ADD_TC(tp, expect_death_and_signal);
489     ATF_TP_ADD_TC(tp, expect_death_but_pass);
490     ATF_TP_ADD_TC(tp, expect_timeout_and_hang);
491     ATF_TP_ADD_TC(tp, expect_timeout_but_pass);
492 
493     /* Add helper tests for t_meta_data. */
494     ATF_TP_ADD_TC(tp, metadata_no_descr);
495     ATF_TP_ADD_TC(tp, metadata_no_head);
496 
497     /* Add helper tests for t_srcdir. */
498     ATF_TP_ADD_TC(tp, srcdir_exists);
499 
500     /* Add helper tests for t_result. */
501     ATF_TP_ADD_TC(tp, result_pass);
502     ATF_TP_ADD_TC(tp, result_fail);
503     ATF_TP_ADD_TC(tp, result_skip);
504     ATF_TP_ADD_TC(tp, result_newlines_fail);
505     ATF_TP_ADD_TC(tp, result_newlines_skip);
506 
507     return atf_no_error();
508 }
509