1*754f425fSjmmv // Copyright 2012 Google Inc.
2*754f425fSjmmv // All rights reserved.
3*754f425fSjmmv //
4*754f425fSjmmv // Redistribution and use in source and binary forms, with or without
5*754f425fSjmmv // modification, are permitted provided that the following conditions are
6*754f425fSjmmv // met:
7*754f425fSjmmv //
8*754f425fSjmmv // * Redistributions of source code must retain the above copyright
9*754f425fSjmmv // notice, this list of conditions and the following disclaimer.
10*754f425fSjmmv // * Redistributions in binary form must reproduce the above copyright
11*754f425fSjmmv // notice, this list of conditions and the following disclaimer in the
12*754f425fSjmmv // documentation and/or other materials provided with the distribution.
13*754f425fSjmmv // * Neither the name of Google Inc. nor the names of its contributors
14*754f425fSjmmv // may be used to endorse or promote products derived from this software
15*754f425fSjmmv // without specific prior written permission.
16*754f425fSjmmv //
17*754f425fSjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*754f425fSjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*754f425fSjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*754f425fSjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*754f425fSjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*754f425fSjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*754f425fSjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*754f425fSjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*754f425fSjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*754f425fSjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*754f425fSjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*754f425fSjmmv
29*754f425fSjmmv #include <signal.h>
30*754f425fSjmmv #include <stdio.h>
31*754f425fSjmmv #include <stdlib.h>
32*754f425fSjmmv #include <unistd.h>
33*754f425fSjmmv
34*754f425fSjmmv #include <atf-c.h>
35*754f425fSjmmv
36*754f425fSjmmv
37*754f425fSjmmv ATF_TC_WITHOUT_HEAD(fail);
ATF_TC_BODY(fail,tc)38*754f425fSjmmv ATF_TC_BODY(fail, tc)
39*754f425fSjmmv {
40*754f425fSjmmv fprintf(stdout, "First line to stdout\n");
41*754f425fSjmmv fprintf(stderr, "First line to stderr\n");
42*754f425fSjmmv atf_tc_fail("This is the failure message");
43*754f425fSjmmv }
44*754f425fSjmmv
45*754f425fSjmmv
46*754f425fSjmmv ATF_TC_WITHOUT_HEAD(pass);
ATF_TC_BODY(pass,tc)47*754f425fSjmmv ATF_TC_BODY(pass, tc)
48*754f425fSjmmv {
49*754f425fSjmmv fprintf(stdout, "First line to stdout\n");
50*754f425fSjmmv fprintf(stdout, "Second line to stdout\n");
51*754f425fSjmmv fprintf(stderr, "First line to stderr\n");
52*754f425fSjmmv fprintf(stderr, "Second line to stderr\n");
53*754f425fSjmmv }
54*754f425fSjmmv
55*754f425fSjmmv
56*754f425fSjmmv ATF_TC_WITHOUT_HEAD(signal);
ATF_TC_BODY(signal,tc)57*754f425fSjmmv ATF_TC_BODY(signal, tc)
58*754f425fSjmmv {
59*754f425fSjmmv fprintf(stderr, "About to die due to SIGABRT!\n");
60*754f425fSjmmv abort();
61*754f425fSjmmv }
62*754f425fSjmmv
63*754f425fSjmmv
64*754f425fSjmmv ATF_TC_WITHOUT_HEAD(sleep);
ATF_TC_BODY(sleep,tc)65*754f425fSjmmv ATF_TC_BODY(sleep, tc)
66*754f425fSjmmv {
67*754f425fSjmmv sleep(300);
68*754f425fSjmmv }
69*754f425fSjmmv
70*754f425fSjmmv
71*754f425fSjmmv ATF_TC_WITH_CLEANUP(cleanup_check_work_directory);
ATF_TC_HEAD(cleanup_check_work_directory,tc)72*754f425fSjmmv ATF_TC_HEAD(cleanup_check_work_directory, tc) { }
ATF_TC_BODY(cleanup_check_work_directory,tc)73*754f425fSjmmv ATF_TC_BODY(cleanup_check_work_directory, tc)
74*754f425fSjmmv {
75*754f425fSjmmv fprintf(stdout, "Body stdout\n");
76*754f425fSjmmv fprintf(stderr, "Body stderr\n");
77*754f425fSjmmv atf_utils_create_file("cookie-in-work-directory", "the value\n");
78*754f425fSjmmv }
ATF_TC_CLEANUP(cleanup_check_work_directory,tc)79*754f425fSjmmv ATF_TC_CLEANUP(cleanup_check_work_directory, tc)
80*754f425fSjmmv {
81*754f425fSjmmv fprintf(stdout, "Cleanup stdout\n");
82*754f425fSjmmv fprintf(stderr, "Cleanup stderr\n");
83*754f425fSjmmv if (atf_utils_compare_file("cookie-in-work-directory", "the value\n")) {
84*754f425fSjmmv printf("Cleanup properly ran in the same directory as the body\n");
85*754f425fSjmmv } else {
86*754f425fSjmmv printf("Cleanup did not run in the same directory as the body\n");
87*754f425fSjmmv }
88*754f425fSjmmv }
89*754f425fSjmmv
90*754f425fSjmmv
91*754f425fSjmmv ATF_TC_WITH_CLEANUP(cleanup_fail);
ATF_TC_HEAD(cleanup_fail,tc)92*754f425fSjmmv ATF_TC_HEAD(cleanup_fail, tc) { }
ATF_TC_BODY(cleanup_fail,tc)93*754f425fSjmmv ATF_TC_BODY(cleanup_fail, tc)
94*754f425fSjmmv {
95*754f425fSjmmv }
ATF_TC_CLEANUP(cleanup_fail,tc)96*754f425fSjmmv ATF_TC_CLEANUP(cleanup_fail, tc)
97*754f425fSjmmv {
98*754f425fSjmmv exit(EXIT_FAILURE);
99*754f425fSjmmv }
100*754f425fSjmmv
101*754f425fSjmmv
102*754f425fSjmmv ATF_TC_WITH_CLEANUP(cleanup_signal);
ATF_TC_HEAD(cleanup_signal,tc)103*754f425fSjmmv ATF_TC_HEAD(cleanup_signal, tc) { }
ATF_TC_BODY(cleanup_signal,tc)104*754f425fSjmmv ATF_TC_BODY(cleanup_signal, tc) { }
ATF_TC_CLEANUP(cleanup_signal,tc)105*754f425fSjmmv ATF_TC_CLEANUP(cleanup_signal, tc)
106*754f425fSjmmv {
107*754f425fSjmmv fprintf(stderr, "About to die due to SIGABRT!\n");
108*754f425fSjmmv abort();
109*754f425fSjmmv }
110*754f425fSjmmv
111*754f425fSjmmv
112*754f425fSjmmv ATF_TC_WITH_CLEANUP(cleanup_sleep);
ATF_TC_HEAD(cleanup_sleep,tc)113*754f425fSjmmv ATF_TC_HEAD(cleanup_sleep, tc) { }
ATF_TC_BODY(cleanup_sleep,tc)114*754f425fSjmmv ATF_TC_BODY(cleanup_sleep, tc) { }
ATF_TC_CLEANUP(cleanup_sleep,tc)115*754f425fSjmmv ATF_TC_CLEANUP(cleanup_sleep, tc)
116*754f425fSjmmv {
117*754f425fSjmmv sleep(300);
118*754f425fSjmmv }
119*754f425fSjmmv
120*754f425fSjmmv
121*754f425fSjmmv ATF_TC_WITH_CLEANUP(body_and_cleanup_fail);
ATF_TC_HEAD(body_and_cleanup_fail,tc)122*754f425fSjmmv ATF_TC_HEAD(body_and_cleanup_fail, tc) { }
ATF_TC_BODY(body_and_cleanup_fail,tc)123*754f425fSjmmv ATF_TC_BODY(body_and_cleanup_fail, tc)
124*754f425fSjmmv {
125*754f425fSjmmv atf_tc_fail("Body fails");
126*754f425fSjmmv }
ATF_TC_CLEANUP(body_and_cleanup_fail,tc)127*754f425fSjmmv ATF_TC_CLEANUP(body_and_cleanup_fail, tc)
128*754f425fSjmmv {
129*754f425fSjmmv printf("Killing cleanup\n");
130*754f425fSjmmv fflush(stdout);
131*754f425fSjmmv kill(getpid(), SIGKILL);
132*754f425fSjmmv }
133*754f425fSjmmv
134*754f425fSjmmv
135*754f425fSjmmv /// Prints a configuration variable if it exists.
136*754f425fSjmmv ///
137*754f425fSjmmv /// \param tc Caller test case.
138*754f425fSjmmv /// \param part Identifier for the part of the test case.
139*754f425fSjmmv /// \param name Name of the configuration variable.
140*754f425fSjmmv static void
print_config_var(const atf_tc_t * tc,const char * part,const char * name)141*754f425fSjmmv print_config_var(const atf_tc_t* tc, const char* part, const char* name)
142*754f425fSjmmv {
143*754f425fSjmmv if (atf_tc_has_config_var(tc, name))
144*754f425fSjmmv printf("%s %s %s\n", part, name, atf_tc_get_config_var(tc, name));
145*754f425fSjmmv }
146*754f425fSjmmv
147*754f425fSjmmv
148*754f425fSjmmv /// Prints the configuration variables of the test case.
149*754f425fSjmmv ///
150*754f425fSjmmv /// Ideally we'd print all variables but the ATF interface does not have an API
151*754f425fSjmmv /// to iterate over them all. Instead, this just prints the variables we are
152*754f425fSjmmv /// interested in for testing purposes.
153*754f425fSjmmv ///
154*754f425fSjmmv /// \param tc Caller test case.
155*754f425fSjmmv /// \param part Identifier for the part of the test case.
156*754f425fSjmmv static void
print_config_vars(const atf_tc_t * tc,const char * part)157*754f425fSjmmv print_config_vars(const atf_tc_t* tc, const char* part)
158*754f425fSjmmv {
159*754f425fSjmmv print_config_var(tc, part, "my-var1");
160*754f425fSjmmv print_config_var(tc, part, "v2");
161*754f425fSjmmv }
162*754f425fSjmmv
163*754f425fSjmmv
164*754f425fSjmmv ATF_TC_WITH_CLEANUP(print_config);
ATF_TC_HEAD(print_config,tc)165*754f425fSjmmv ATF_TC_HEAD(print_config, tc) {}
ATF_TC_BODY(print_config,tc)166*754f425fSjmmv ATF_TC_BODY(print_config, tc)
167*754f425fSjmmv {
168*754f425fSjmmv print_config_vars(tc, "body");
169*754f425fSjmmv }
ATF_TC_CLEANUP(print_config,tc)170*754f425fSjmmv ATF_TC_CLEANUP(print_config, tc)
171*754f425fSjmmv {
172*754f425fSjmmv print_config_vars(tc, "cleanup");
173*754f425fSjmmv }
174*754f425fSjmmv
175*754f425fSjmmv
ATF_TP_ADD_TCS(tp)176*754f425fSjmmv ATF_TP_ADD_TCS(tp)
177*754f425fSjmmv {
178*754f425fSjmmv ATF_TP_ADD_TC(tp, fail);
179*754f425fSjmmv ATF_TP_ADD_TC(tp, pass);
180*754f425fSjmmv ATF_TP_ADD_TC(tp, signal);
181*754f425fSjmmv ATF_TP_ADD_TC(tp, sleep);
182*754f425fSjmmv
183*754f425fSjmmv ATF_TP_ADD_TC(tp, cleanup_check_work_directory);
184*754f425fSjmmv ATF_TP_ADD_TC(tp, cleanup_fail);
185*754f425fSjmmv ATF_TP_ADD_TC(tp, cleanup_signal);
186*754f425fSjmmv ATF_TP_ADD_TC(tp, cleanup_sleep);
187*754f425fSjmmv
188*754f425fSjmmv ATF_TP_ADD_TC(tp, body_and_cleanup_fail);
189*754f425fSjmmv
190*754f425fSjmmv ATF_TP_ADD_TC(tp, print_config);
191*754f425fSjmmv
192*754f425fSjmmv return atf_no_error();
193*754f425fSjmmv }
194