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