c_helpers.c revision 258289
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
53static
54void
55safe_remove(const char* path)
56{
57    if (unlink(path) == -1)
58        atf_tc_fail("unlink(2) of %s failed", path);
59}
60
61static
62void
63touch(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
76ATF_TC_WITH_CLEANUP(cleanup_pass);
77ATF_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}
82ATF_TC_BODY(cleanup_pass, tc)
83{
84    touch(atf_tc_get_config_var(tc, "tmpfile"));
85}
86ATF_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
92ATF_TC_WITH_CLEANUP(cleanup_fail);
93ATF_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}
98ATF_TC_BODY(cleanup_fail, tc)
99{
100    touch(atf_tc_get_config_var(tc, "tmpfile"));
101    atf_tc_fail("On purpose");
102}
103ATF_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
109ATF_TC_WITH_CLEANUP(cleanup_skip);
110ATF_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}
115ATF_TC_BODY(cleanup_skip, tc)
116{
117    touch(atf_tc_get_config_var(tc, "tmpfile"));
118    atf_tc_skip("On purpose");
119}
120ATF_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
126ATF_TC_WITH_CLEANUP(cleanup_curdir);
127ATF_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}
132ATF_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}
142ATF_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
157ATF_TC_WITH_CLEANUP(cleanup_sigterm);
158ATF_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}
163ATF_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}
175ATF_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
184ATF_TC(config_unset);
185ATF_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}
190ATF_TC_BODY(config_unset, tc)
191{
192    ATF_REQUIRE(!atf_tc_has_config_var(tc, "test"));
193}
194
195ATF_TC(config_empty);
196ATF_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}
201ATF_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
207ATF_TC(config_value);
208ATF_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}
213ATF_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
219ATF_TC(config_multi_value);
220ATF_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}
225ATF_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
235ATF_TC_WITHOUT_HEAD(expect_pass_and_pass);
236ATF_TC_BODY(expect_pass_and_pass, tc)
237{
238    atf_tc_expect_pass();
239
240}
241
242ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_requirement);
243ATF_TC_BODY(expect_pass_but_fail_requirement, tc)
244{
245    atf_tc_expect_pass();
246    atf_tc_fail("Some reason");
247}
248
249ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_check);
250ATF_TC_BODY(expect_pass_but_fail_check, tc)
251{
252    atf_tc_expect_pass();
253    atf_tc_fail_nonfatal("Some reason");
254}
255
256ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_requirement);
257ATF_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
264ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_check);
265ATF_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
276ATF_TC_WITHOUT_HEAD(expect_fail_but_pass);
277ATF_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
291ATF_TC_WITHOUT_HEAD(expect_exit_any_and_exit);
292ATF_TC_BODY(expect_exit_any_and_exit, tc)
293{
294    atf_tc_expect_exit(-1, "Call will exit");
295    exit(EXIT_SUCCESS);
296}
297
298ATF_TC_WITHOUT_HEAD(expect_exit_code_and_exit);
299ATF_TC_BODY(expect_exit_code_and_exit, tc)
300{
301    atf_tc_expect_exit(123, "Call will exit");
302    exit(123);
303}
304
305ATF_TC_WITHOUT_HEAD(expect_exit_but_pass);
306ATF_TC_BODY(expect_exit_but_pass, tc)
307{
308    atf_tc_expect_exit(-1, "Call won't exit");
309}
310
311ATF_TC_WITHOUT_HEAD(expect_signal_any_and_signal);
312ATF_TC_BODY(expect_signal_any_and_signal, tc)
313{
314    atf_tc_expect_signal(-1, "Call will signal");
315    kill(getpid(), SIGKILL);
316}
317
318ATF_TC_WITHOUT_HEAD(expect_signal_no_and_signal);
319ATF_TC_BODY(expect_signal_no_and_signal, tc)
320{
321    atf_tc_expect_signal(SIGHUP, "Call will signal");
322    kill(getpid(), SIGHUP);
323}
324
325ATF_TC_WITHOUT_HEAD(expect_signal_but_pass);
326ATF_TC_BODY(expect_signal_but_pass, tc)
327{
328    atf_tc_expect_signal(-1, "Call won't signal");
329}
330
331ATF_TC_WITHOUT_HEAD(expect_death_and_exit);
332ATF_TC_BODY(expect_death_and_exit, tc)
333{
334    atf_tc_expect_death("Exit case");
335    exit(123);
336}
337
338ATF_TC_WITHOUT_HEAD(expect_death_and_signal);
339ATF_TC_BODY(expect_death_and_signal, tc)
340{
341    atf_tc_expect_death("Signal case");
342    kill(getpid(), SIGKILL);
343}
344
345ATF_TC_WITHOUT_HEAD(expect_death_but_pass);
346ATF_TC_BODY(expect_death_but_pass, tc)
347{
348    atf_tc_expect_death("Call won't die");
349}
350
351ATF_TC(expect_timeout_and_hang);
352ATF_TC_HEAD(expect_timeout_and_hang, tc)
353{
354    atf_tc_set_md_var(tc, "timeout", "1");
355}
356ATF_TC_BODY(expect_timeout_and_hang, tc)
357{
358    atf_tc_expect_timeout("Will overrun");
359    sleep(5);
360}
361
362ATF_TC(expect_timeout_but_pass);
363ATF_TC_HEAD(expect_timeout_but_pass, tc)
364{
365    atf_tc_set_md_var(tc, "timeout", "1");
366}
367ATF_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
376ATF_TC_WITHOUT_HEAD(metadata_no_descr);
377ATF_TC_BODY(metadata_no_descr, tc)
378{
379}
380
381ATF_TC_WITHOUT_HEAD(metadata_no_head);
382ATF_TC_BODY(metadata_no_head, tc)
383{
384}
385
386/* ---------------------------------------------------------------------
387 * Helper tests for "t_srcdir".
388 * --------------------------------------------------------------------- */
389
390ATF_TC(srcdir_exists);
391ATF_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}
396ATF_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
413ATF_TC_WITHOUT_HEAD(result_pass);
414ATF_TC_BODY(result_pass, tc)
415{
416    printf("msg\n");
417}
418
419ATF_TC_WITHOUT_HEAD(result_fail);
420ATF_TC_BODY(result_fail, tc)
421{
422    printf("msg\n");
423    atf_tc_fail("Failure reason");
424}
425
426ATF_TC_WITHOUT_HEAD(result_skip);
427ATF_TC_BODY(result_skip, tc)
428{
429    printf("msg\n");
430    atf_tc_skip("Skipped reason");
431}
432
433ATF_TC(result_newlines_fail);
434ATF_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}
439ATF_TC_BODY(result_newlines_fail, tc)
440{
441    atf_tc_fail("First line\nSecond line");
442}
443
444ATF_TC(result_newlines_skip);
445ATF_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}
450ATF_TC_BODY(result_newlines_skip, tc)
451{
452    atf_tc_skip("First line\nSecond line");
453}
454
455/* ---------------------------------------------------------------------
456 * Main.
457 * --------------------------------------------------------------------- */
458
459ATF_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