xref: /freebsd/contrib/atf/atf-c/atf-c.3 (revision 0677dfd1c4dadb62482e2c72fa4c6720902128a4)
1*0677dfd1SJulio Merino.\" Copyright (c) 2008 The NetBSD Foundation, Inc.
2*0677dfd1SJulio Merino.\" All rights reserved.
3*0677dfd1SJulio Merino.\"
4*0677dfd1SJulio Merino.\" Redistribution and use in source and binary forms, with or without
5*0677dfd1SJulio Merino.\" modification, are permitted provided that the following conditions
6*0677dfd1SJulio Merino.\" are met:
7*0677dfd1SJulio Merino.\" 1. Redistributions of source code must retain the above copyright
8*0677dfd1SJulio Merino.\"    notice, this list of conditions and the following disclaimer.
9*0677dfd1SJulio Merino.\" 2. Redistributions in binary form must reproduce the above copyright
10*0677dfd1SJulio Merino.\"    notice, this list of conditions and the following disclaimer in the
11*0677dfd1SJulio Merino.\"    documentation and/or other materials provided with the distribution.
12*0677dfd1SJulio Merino.\"
13*0677dfd1SJulio Merino.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14*0677dfd1SJulio Merino.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15*0677dfd1SJulio Merino.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16*0677dfd1SJulio Merino.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17*0677dfd1SJulio Merino.\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18*0677dfd1SJulio Merino.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*0677dfd1SJulio Merino.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20*0677dfd1SJulio Merino.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21*0677dfd1SJulio Merino.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22*0677dfd1SJulio Merino.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23*0677dfd1SJulio Merino.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24*0677dfd1SJulio Merino.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*0677dfd1SJulio Merino.Dd October 13, 2014
26*0677dfd1SJulio Merino.Dt ATF-C 3
27*0677dfd1SJulio Merino.Os
28*0677dfd1SJulio Merino.Sh NAME
29*0677dfd1SJulio Merino.Nm atf-c ,
30*0677dfd1SJulio Merino.Nm ATF_CHECK ,
31*0677dfd1SJulio Merino.Nm ATF_CHECK_MSG ,
32*0677dfd1SJulio Merino.Nm ATF_CHECK_EQ ,
33*0677dfd1SJulio Merino.Nm ATF_CHECK_EQ_MSG ,
34*0677dfd1SJulio Merino.Nm ATF_CHECK_MATCH ,
35*0677dfd1SJulio Merino.Nm ATF_CHECK_MATCH_MSG ,
36*0677dfd1SJulio Merino.Nm ATF_CHECK_STREQ ,
37*0677dfd1SJulio Merino.Nm ATF_CHECK_STREQ_MSG ,
38*0677dfd1SJulio Merino.Nm ATF_CHECK_ERRNO ,
39*0677dfd1SJulio Merino.Nm ATF_REQUIRE ,
40*0677dfd1SJulio Merino.Nm ATF_REQUIRE_MSG ,
41*0677dfd1SJulio Merino.Nm ATF_REQUIRE_EQ ,
42*0677dfd1SJulio Merino.Nm ATF_REQUIRE_EQ_MSG ,
43*0677dfd1SJulio Merino.Nm ATF_REQUIRE_MATCH ,
44*0677dfd1SJulio Merino.Nm ATF_REQUIRE_MATCH_MSG ,
45*0677dfd1SJulio Merino.Nm ATF_REQUIRE_STREQ ,
46*0677dfd1SJulio Merino.Nm ATF_REQUIRE_STREQ_MSG ,
47*0677dfd1SJulio Merino.Nm ATF_REQUIRE_ERRNO ,
48*0677dfd1SJulio Merino.Nm ATF_TC ,
49*0677dfd1SJulio Merino.Nm ATF_TC_BODY ,
50*0677dfd1SJulio Merino.Nm ATF_TC_BODY_NAME ,
51*0677dfd1SJulio Merino.Nm ATF_TC_CLEANUP ,
52*0677dfd1SJulio Merino.Nm ATF_TC_CLEANUP_NAME ,
53*0677dfd1SJulio Merino.Nm ATF_TC_HEAD ,
54*0677dfd1SJulio Merino.Nm ATF_TC_HEAD_NAME ,
55*0677dfd1SJulio Merino.Nm ATF_TC_NAME ,
56*0677dfd1SJulio Merino.Nm ATF_TC_WITH_CLEANUP ,
57*0677dfd1SJulio Merino.Nm ATF_TC_WITHOUT_HEAD ,
58*0677dfd1SJulio Merino.Nm ATF_TP_ADD_TC ,
59*0677dfd1SJulio Merino.Nm ATF_TP_ADD_TCS ,
60*0677dfd1SJulio Merino.Nm atf_tc_get_config_var ,
61*0677dfd1SJulio Merino.Nm atf_tc_get_config_var_wd ,
62*0677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_bool ,
63*0677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_bool_wd ,
64*0677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_long ,
65*0677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_long_wd ,
66*0677dfd1SJulio Merino.Nm atf_no_error ,
67*0677dfd1SJulio Merino.Nm atf_tc_expect_death ,
68*0677dfd1SJulio Merino.Nm atf_tc_expect_exit ,
69*0677dfd1SJulio Merino.Nm atf_tc_expect_fail ,
70*0677dfd1SJulio Merino.Nm atf_tc_expect_pass ,
71*0677dfd1SJulio Merino.Nm atf_tc_expect_signal ,
72*0677dfd1SJulio Merino.Nm atf_tc_expect_timeout ,
73*0677dfd1SJulio Merino.Nm atf_tc_fail ,
74*0677dfd1SJulio Merino.Nm atf_tc_fail_nonfatal ,
75*0677dfd1SJulio Merino.Nm atf_tc_pass ,
76*0677dfd1SJulio Merino.Nm atf_tc_skip ,
77*0677dfd1SJulio Merino.Nm atf_utils_cat_file ,
78*0677dfd1SJulio Merino.Nm atf_utils_compare_file ,
79*0677dfd1SJulio Merino.Nm atf_utils_copy_file ,
80*0677dfd1SJulio Merino.Nm atf_utils_create_file ,
81*0677dfd1SJulio Merino.Nm atf_utils_file_exists ,
82*0677dfd1SJulio Merino.Nm atf_utils_fork ,
83*0677dfd1SJulio Merino.Nm atf_utils_free_charpp ,
84*0677dfd1SJulio Merino.Nm atf_utils_grep_file ,
85*0677dfd1SJulio Merino.Nm atf_utils_grep_string ,
86*0677dfd1SJulio Merino.Nm atf_utils_readline ,
87*0677dfd1SJulio Merino.Nm atf_utils_redirect ,
88*0677dfd1SJulio Merino.Nm atf_utils_wait
89*0677dfd1SJulio Merino.Nd C API to write ATF-based test programs
90*0677dfd1SJulio Merino.Sh SYNOPSIS
91*0677dfd1SJulio Merino.In atf-c.h
92*0677dfd1SJulio Merino.\" NO_CHECK_STYLE_BEGIN
93*0677dfd1SJulio Merino.Fn ATF_CHECK "expression"
94*0677dfd1SJulio Merino.Fn ATF_CHECK_MSG "expression" "fail_msg_fmt" ...
95*0677dfd1SJulio Merino.Fn ATF_CHECK_EQ "expected_expression" "actual_expression"
96*0677dfd1SJulio Merino.Fn ATF_CHECK_EQ_MSG "expected_expression" "actual_expression" "fail_msg_fmt" ...
97*0677dfd1SJulio Merino.Fn ATF_CHECK_MATCH "regexp" "string"
98*0677dfd1SJulio Merino.Fn ATF_CHECK_MATCH_MSG "regexp" "string" "fail_msg_fmt" ...
99*0677dfd1SJulio Merino.Fn ATF_CHECK_STREQ "string_1" "string_2"
100*0677dfd1SJulio Merino.Fn ATF_CHECK_STREQ_MSG "string_1" "string_2" "fail_msg_fmt" ...
101*0677dfd1SJulio Merino.Fn ATF_CHECK_ERRNO "expected_errno" "bool_expression"
102*0677dfd1SJulio Merino.Fn ATF_REQUIRE "expression"
103*0677dfd1SJulio Merino.Fn ATF_REQUIRE_MSG "expression" "fail_msg_fmt" ...
104*0677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ "expected_expression" "actual_expression"
105*0677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ_MSG "expected_expression" "actual_expression" "fail_msg_fmt" ...
106*0677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH "regexp" "string"
107*0677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH_MSG "regexp" "string" "fail_msg_fmt" ...
108*0677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ "expected_string" "actual_string"
109*0677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ_MSG "expected_string" "actual_string" "fail_msg_fmt" ...
110*0677dfd1SJulio Merino.Fn ATF_REQUIRE_ERRNO "expected_errno" "bool_expression"
111*0677dfd1SJulio Merino.\" NO_CHECK_STYLE_END
112*0677dfd1SJulio Merino.Fn ATF_TC "name"
113*0677dfd1SJulio Merino.Fn ATF_TC_BODY "name" "tc"
114*0677dfd1SJulio Merino.Fn ATF_TC_BODY_NAME "name"
115*0677dfd1SJulio Merino.Fn ATF_TC_CLEANUP "name" "tc"
116*0677dfd1SJulio Merino.Fn ATF_TC_CLEANUP_NAME "name"
117*0677dfd1SJulio Merino.Fn ATF_TC_HEAD "name" "tc"
118*0677dfd1SJulio Merino.Fn ATF_TC_HEAD_NAME "name"
119*0677dfd1SJulio Merino.Fn ATF_TC_NAME "name"
120*0677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP "name"
121*0677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD "name"
122*0677dfd1SJulio Merino.Fn ATF_TP_ADD_TC "tp_name" "tc_name"
123*0677dfd1SJulio Merino.Fn ATF_TP_ADD_TCS "tp_name"
124*0677dfd1SJulio Merino.Fn atf_tc_get_config_var "tc" "varname"
125*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_wd "tc" "variable_name" "default_value"
126*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool "tc" "variable_name"
127*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool_wd "tc" "variable_name" "default_value"
128*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long "tc" "variable_name"
129*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long_wd "tc" "variable_name" "default_value"
130*0677dfd1SJulio Merino.Fn atf_no_error
131*0677dfd1SJulio Merino.Fn atf_tc_expect_death "reason" "..."
132*0677dfd1SJulio Merino.Fn atf_tc_expect_exit "exitcode" "reason" "..."
133*0677dfd1SJulio Merino.Fn atf_tc_expect_fail "reason" "..."
134*0677dfd1SJulio Merino.Fn atf_tc_expect_pass
135*0677dfd1SJulio Merino.Fn atf_tc_expect_signal "signo" "reason" "..."
136*0677dfd1SJulio Merino.Fn atf_tc_expect_timeout "reason" "..."
137*0677dfd1SJulio Merino.Fn atf_tc_fail "reason"
138*0677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal "reason"
139*0677dfd1SJulio Merino.Fn atf_tc_pass
140*0677dfd1SJulio Merino.Fn atf_tc_skip "reason"
141*0677dfd1SJulio Merino.Ft void
142*0677dfd1SJulio Merino.Fo atf_utils_cat_file
143*0677dfd1SJulio Merino.Fa "const char *file"
144*0677dfd1SJulio Merino.Fa "const char *prefix"
145*0677dfd1SJulio Merino.Fc
146*0677dfd1SJulio Merino.Ft bool
147*0677dfd1SJulio Merino.Fo atf_utils_compare_file
148*0677dfd1SJulio Merino.Fa "const char *file"
149*0677dfd1SJulio Merino.Fa "const char *contents"
150*0677dfd1SJulio Merino.Fc
151*0677dfd1SJulio Merino.Ft void
152*0677dfd1SJulio Merino.Fo atf_utils_copy_file
153*0677dfd1SJulio Merino.Fa "const char *source"
154*0677dfd1SJulio Merino.Fa "const char *destination"
155*0677dfd1SJulio Merino.Fc
156*0677dfd1SJulio Merino.Ft void
157*0677dfd1SJulio Merino.Fo atf_utils_create_file
158*0677dfd1SJulio Merino.Fa "const char *file"
159*0677dfd1SJulio Merino.Fa "const char *contents"
160*0677dfd1SJulio Merino.Fa "..."
161*0677dfd1SJulio Merino.Fc
162*0677dfd1SJulio Merino.Ft void
163*0677dfd1SJulio Merino.Fo atf_utils_file_exists
164*0677dfd1SJulio Merino.Fa "const char *file"
165*0677dfd1SJulio Merino.Fc
166*0677dfd1SJulio Merino.Ft pid_t
167*0677dfd1SJulio Merino.Fo atf_utils_fork
168*0677dfd1SJulio Merino.Fa "void"
169*0677dfd1SJulio Merino.Fc
170*0677dfd1SJulio Merino.Ft void
171*0677dfd1SJulio Merino.Fo atf_utils_free_charpp
172*0677dfd1SJulio Merino.Fa "char **argv"
173*0677dfd1SJulio Merino.Fc
174*0677dfd1SJulio Merino.Ft bool
175*0677dfd1SJulio Merino.Fo atf_utils_grep_file
176*0677dfd1SJulio Merino.Fa "const char *regexp"
177*0677dfd1SJulio Merino.Fa "const char *file"
178*0677dfd1SJulio Merino.Fa "..."
179*0677dfd1SJulio Merino.Fc
180*0677dfd1SJulio Merino.Ft bool
181*0677dfd1SJulio Merino.Fo atf_utils_grep_string
182*0677dfd1SJulio Merino.Fa "const char *regexp"
183*0677dfd1SJulio Merino.Fa "const char *str"
184*0677dfd1SJulio Merino.Fa "..."
185*0677dfd1SJulio Merino.Fc
186*0677dfd1SJulio Merino.Ft char *
187*0677dfd1SJulio Merino.Fo atf_utils_readline
188*0677dfd1SJulio Merino.Fa "int fd"
189*0677dfd1SJulio Merino.Fc
190*0677dfd1SJulio Merino.Ft void
191*0677dfd1SJulio Merino.Fo atf_utils_redirect
192*0677dfd1SJulio Merino.Fa "const int fd"
193*0677dfd1SJulio Merino.Fa "const char *file"
194*0677dfd1SJulio Merino.Fc
195*0677dfd1SJulio Merino.Ft void
196*0677dfd1SJulio Merino.Fo atf_utils_wait
197*0677dfd1SJulio Merino.Fa "const pid_t pid"
198*0677dfd1SJulio Merino.Fa "const int expected_exit_status"
199*0677dfd1SJulio Merino.Fa "const char *expected_stdout"
200*0677dfd1SJulio Merino.Fa "const char *expected_stderr"
201*0677dfd1SJulio Merino.Fc
202*0677dfd1SJulio Merino.Sh DESCRIPTION
203*0677dfd1SJulio MerinoATF provides a C programming interface to implement test programs.
204*0677dfd1SJulio MerinoC-based test programs follow this template:
205*0677dfd1SJulio Merino.Bd -literal -offset indent
206*0677dfd1SJulio Merino.Ns ... C-specific includes go here ...
207*0677dfd1SJulio Merino
208*0677dfd1SJulio Merino#include <atf-c.h>
209*0677dfd1SJulio Merino
210*0677dfd1SJulio MerinoATF_TC(tc1);
211*0677dfd1SJulio MerinoATF_TC_HEAD(tc1, tc)
212*0677dfd1SJulio Merino{
213*0677dfd1SJulio Merino    ... first test case's header ...
214*0677dfd1SJulio Merino}
215*0677dfd1SJulio MerinoATF_TC_BODY(tc1, tc)
216*0677dfd1SJulio Merino{
217*0677dfd1SJulio Merino    ... first test case's body ...
218*0677dfd1SJulio Merino}
219*0677dfd1SJulio Merino
220*0677dfd1SJulio MerinoATF_TC_WITH_CLEANUP(tc2);
221*0677dfd1SJulio MerinoATF_TC_HEAD(tc2, tc)
222*0677dfd1SJulio Merino{
223*0677dfd1SJulio Merino    ... second test case's header ...
224*0677dfd1SJulio Merino}
225*0677dfd1SJulio MerinoATF_TC_BODY(tc2, tc)
226*0677dfd1SJulio Merino{
227*0677dfd1SJulio Merino    ... second test case's body ...
228*0677dfd1SJulio Merino}
229*0677dfd1SJulio MerinoATF_TC_CLEANUP(tc2, tc)
230*0677dfd1SJulio Merino{
231*0677dfd1SJulio Merino    ... second test case's cleanup ...
232*0677dfd1SJulio Merino}
233*0677dfd1SJulio Merino
234*0677dfd1SJulio MerinoATF_TC_WITHOUT_HEAD(tc3);
235*0677dfd1SJulio MerinoATF_TC_BODY(tc3, tc)
236*0677dfd1SJulio Merino{
237*0677dfd1SJulio Merino    ... third test case's body ...
238*0677dfd1SJulio Merino}
239*0677dfd1SJulio Merino
240*0677dfd1SJulio Merino.Ns ... additional test cases ...
241*0677dfd1SJulio Merino
242*0677dfd1SJulio MerinoATF_TP_ADD_TCS(tp)
243*0677dfd1SJulio Merino{
244*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tcs, tc1);
245*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tcs, tc2);
246*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tcs, tc3);
247*0677dfd1SJulio Merino    ... add additional test cases ...
248*0677dfd1SJulio Merino
249*0677dfd1SJulio Merino    return atf_no_error();
250*0677dfd1SJulio Merino}
251*0677dfd1SJulio Merino.Ed
252*0677dfd1SJulio Merino.Ss Definition of test cases
253*0677dfd1SJulio MerinoTest cases have an identifier and are composed of three different parts:
254*0677dfd1SJulio Merinothe header, the body and an optional cleanup routine, all of which are
255*0677dfd1SJulio Merinodescribed in
256*0677dfd1SJulio Merino.Xr atf-test-case 4 .
257*0677dfd1SJulio MerinoTo define test cases, one can use the
258*0677dfd1SJulio Merino.Fn ATF_TC ,
259*0677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP
260*0677dfd1SJulio Merinoor the
261*0677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD
262*0677dfd1SJulio Merinomacros, which take a single parameter specifiying the test case's name.
263*0677dfd1SJulio Merino.Fn ATF_TC ,
264*0677dfd1SJulio Merinorequires to define a head and a body for the test case,
265*0677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP
266*0677dfd1SJulio Merinorequires to define a head, a body and a cleanup for the test case and
267*0677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD
268*0677dfd1SJulio Merinorequires only a body for the test case.
269*0677dfd1SJulio MerinoIt is important to note that these
270*0677dfd1SJulio Merino.Em do not
271*0677dfd1SJulio Merinoset the test case up for execution when the program is run.
272*0677dfd1SJulio MerinoIn order to do so, a later registration is needed with the
273*0677dfd1SJulio Merino.Fn ATF_TP_ADD_TC
274*0677dfd1SJulio Merinomacro detailed in
275*0677dfd1SJulio Merino.Sx Program initialization .
276*0677dfd1SJulio Merino.Pp
277*0677dfd1SJulio MerinoLater on, one must define the three parts of the body by means of three
278*0677dfd1SJulio Merinofunctions.
279*0677dfd1SJulio MerinoTheir headers are given by the
280*0677dfd1SJulio Merino.Fn ATF_TC_HEAD ,
281*0677dfd1SJulio Merino.Fn ATF_TC_BODY
282*0677dfd1SJulio Merinoand
283*0677dfd1SJulio Merino.Fn ATF_TC_CLEANUP
284*0677dfd1SJulio Merinomacros, all of which take the test case name provided to the
285*0677dfd1SJulio Merino.Fn ATF_TC
286*0677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP ,
287*0677dfd1SJulio Merinoor
288*0677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD
289*0677dfd1SJulio Merinomacros and the name of the variable that will hold a pointer to the
290*0677dfd1SJulio Merinotest case data.
291*0677dfd1SJulio MerinoFollowing each of these, a block of code is expected, surrounded by the
292*0677dfd1SJulio Merinoopening and closing brackets.
293*0677dfd1SJulio Merino.Ss Program initialization
294*0677dfd1SJulio MerinoThe library provides a way to easily define the test program's
295*0677dfd1SJulio Merino.Fn main
296*0677dfd1SJulio Merinofunction.
297*0677dfd1SJulio MerinoYou should never define one on your own, but rely on the
298*0677dfd1SJulio Merinolibrary to do it for you.
299*0677dfd1SJulio MerinoThis is done by using the
300*0677dfd1SJulio Merino.Fn ATF_TP_ADD_TCS
301*0677dfd1SJulio Merinomacro, which is passed the name of the object that will hold the test
302*0677dfd1SJulio Merinocases; i.e. the test program instance.
303*0677dfd1SJulio MerinoThis name can be whatever you want as long as it is a valid variable
304*0677dfd1SJulio Merinoidentifier.
305*0677dfd1SJulio Merino.Pp
306*0677dfd1SJulio MerinoAfter the macro, you are supposed to provide the body of a function, which
307*0677dfd1SJulio Merinoshould only use the
308*0677dfd1SJulio Merino.Fn ATF_TP_ADD_TC
309*0677dfd1SJulio Merinomacro to register the test cases the test program will execute and return
310*0677dfd1SJulio Merinoa success error code.
311*0677dfd1SJulio MerinoThe first parameter of this macro matches the name you provided in the
312*0677dfd1SJulio Merinoformer call.
313*0677dfd1SJulio MerinoThe success status can be returned using the
314*0677dfd1SJulio Merino.Fn atf_no_error
315*0677dfd1SJulio Merinofunction.
316*0677dfd1SJulio Merino.Ss Header definitions
317*0677dfd1SJulio MerinoThe test case's header can define the meta-data by using the
318*0677dfd1SJulio Merino.Fn atf_tc_set_md_var
319*0677dfd1SJulio Merinomethod, which takes three parameters: the first one points to the test
320*0677dfd1SJulio Merinocase data, the second one specifies the meta-data variable to be set
321*0677dfd1SJulio Merinoand the third one specifies its value.
322*0677dfd1SJulio MerinoBoth of them are strings.
323*0677dfd1SJulio Merino.Ss Configuration variables
324*0677dfd1SJulio MerinoThe test case has read-only access to the current configuration variables
325*0677dfd1SJulio Merinoby means of the
326*0677dfd1SJulio Merino.Ft bool
327*0677dfd1SJulio Merino.Fn atf_tc_has_config_var ,
328*0677dfd1SJulio Merino.Ft const char *
329*0677dfd1SJulio Merino.Fn atf_tc_get_config_var ,
330*0677dfd1SJulio Merino.Ft const char *
331*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_wd ,
332*0677dfd1SJulio Merino.Ft bool
333*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool ,
334*0677dfd1SJulio Merino.Ft bool
335*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool_wd ,
336*0677dfd1SJulio Merino.Ft long
337*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long ,
338*0677dfd1SJulio Merinoand the
339*0677dfd1SJulio Merino.Ft long
340*0677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long_wd
341*0677dfd1SJulio Merinofunctions, which can be called in any of the three parts of a test case.
342*0677dfd1SJulio Merino.Pp
343*0677dfd1SJulio MerinoThe
344*0677dfd1SJulio Merino.Sq _wd
345*0677dfd1SJulio Merinovariants take a default value for the variable which is returned if the
346*0677dfd1SJulio Merinovariable is not defined.
347*0677dfd1SJulio MerinoThe other functions without the
348*0677dfd1SJulio Merino.Sq _wd
349*0677dfd1SJulio Merinosuffix
350*0677dfd1SJulio Merino.Em require
351*0677dfd1SJulio Merinothe variable to be defined.
352*0677dfd1SJulio Merino.Ss Access to the source directory
353*0677dfd1SJulio MerinoIt is possible to get the path to the test case's source directory from any
354*0677dfd1SJulio Merinoof its three components by querying the
355*0677dfd1SJulio Merino.Sq srcdir
356*0677dfd1SJulio Merinoconfiguration variable.
357*0677dfd1SJulio Merino.Ss Requiring programs
358*0677dfd1SJulio MerinoAside from the
359*0677dfd1SJulio Merino.Va require.progs
360*0677dfd1SJulio Merinometa-data variable available in the header only, one can also check for
361*0677dfd1SJulio Merinoadditional programs in the test case's body by using the
362*0677dfd1SJulio Merino.Fn atf_tc_require_prog
363*0677dfd1SJulio Merinofunction, which takes the base name or full path of a single binary.
364*0677dfd1SJulio MerinoRelative paths are forbidden.
365*0677dfd1SJulio MerinoIf it is not found, the test case will be automatically skipped.
366*0677dfd1SJulio Merino.Ss Test case finalization
367*0677dfd1SJulio MerinoThe test case finalizes either when the body reaches its end, at which
368*0677dfd1SJulio Merinopoint the test is assumed to have
369*0677dfd1SJulio Merino.Em passed ,
370*0677dfd1SJulio Merinounless any non-fatal errors were raised using
371*0677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal ,
372*0677dfd1SJulio Merinoor at any explicit call to
373*0677dfd1SJulio Merino.Fn atf_tc_pass ,
374*0677dfd1SJulio Merino.Fn atf_tc_fail
375*0677dfd1SJulio Merinoor
376*0677dfd1SJulio Merino.Fn atf_tc_skip .
377*0677dfd1SJulio MerinoThese three functions terminate the execution of the test case immediately.
378*0677dfd1SJulio MerinoThe cleanup routine will be processed afterwards in a completely automated
379*0677dfd1SJulio Merinoway, regardless of the test case's termination reason.
380*0677dfd1SJulio Merino.Pp
381*0677dfd1SJulio Merino.Fn atf_tc_pass
382*0677dfd1SJulio Merinodoes not take any parameters.
383*0677dfd1SJulio Merino.Fn atf_tc_fail ,
384*0677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal
385*0677dfd1SJulio Merinoand
386*0677dfd1SJulio Merino.Fn atf_tc_skip
387*0677dfd1SJulio Merinotake a format string and a variable list of parameters, which describe, in
388*0677dfd1SJulio Merinoa user-friendly manner, why the test case failed or was skipped,
389*0677dfd1SJulio Merinorespectively.
390*0677dfd1SJulio MerinoIt is very important to provide a clear error message in both cases so that
391*0677dfd1SJulio Merinothe user can quickly know why the test did not pass.
392*0677dfd1SJulio Merino.Ss Expectations
393*0677dfd1SJulio MerinoEverything explained in the previous section changes when the test case
394*0677dfd1SJulio Merinoexpectations are redefined by the programmer.
395*0677dfd1SJulio Merino.Pp
396*0677dfd1SJulio MerinoEach test case has an internal state called
397*0677dfd1SJulio Merino.Sq expect
398*0677dfd1SJulio Merinothat describes what the test case expectations are at any point in time.
399*0677dfd1SJulio MerinoThe value of this property can change during execution by any of:
400*0677dfd1SJulio Merino.Bl -tag -width indent
401*0677dfd1SJulio Merino.It Fn atf_tc_expect_death "reason" "..."
402*0677dfd1SJulio MerinoExpects the test case to exit prematurely regardless of the nature of the
403*0677dfd1SJulio Merinoexit.
404*0677dfd1SJulio Merino.It Fn atf_tc_expect_exit "exitcode" "reason" "..."
405*0677dfd1SJulio MerinoExpects the test case to exit cleanly.
406*0677dfd1SJulio MerinoIf
407*0677dfd1SJulio Merino.Va exitcode
408*0677dfd1SJulio Merinois not
409*0677dfd1SJulio Merino.Sq -1 ,
410*0677dfd1SJulio Merinothe runtime engine will validate that the exit code of the test case
411*0677dfd1SJulio Merinomatches the one provided in this call.
412*0677dfd1SJulio MerinoOtherwise, the exact value will be ignored.
413*0677dfd1SJulio Merino.It Fn atf_tc_expect_fail "reason" "..."
414*0677dfd1SJulio MerinoAny failure (be it fatal or non-fatal) raised in this mode is recorded.
415*0677dfd1SJulio MerinoHowever, such failures do not report the test case as failed; instead, the
416*0677dfd1SJulio Merinotest case finalizes cleanly and is reported as
417*0677dfd1SJulio Merino.Sq expected failure ;
418*0677dfd1SJulio Merinothis report includes the provided
419*0677dfd1SJulio Merino.Fa reason
420*0677dfd1SJulio Merinoas part of it.
421*0677dfd1SJulio MerinoIf no error is raised while running in this mode, then the test case is
422*0677dfd1SJulio Merinoreported as
423*0677dfd1SJulio Merino.Sq failed .
424*0677dfd1SJulio Merino.Pp
425*0677dfd1SJulio MerinoThis mode is useful to reproduce actual known bugs in tests.
426*0677dfd1SJulio MerinoWhenever the developer fixes the bug later on, the test case will start
427*0677dfd1SJulio Merinoreporting a failure, signaling the developer that the test case must be
428*0677dfd1SJulio Merinoadjusted to the new conditions.
429*0677dfd1SJulio MerinoIn this situation, it is useful, for example, to set
430*0677dfd1SJulio Merino.Fa reason
431*0677dfd1SJulio Merinoas the bug number for tracking purposes.
432*0677dfd1SJulio Merino.It Fn atf_tc_expect_pass
433*0677dfd1SJulio MerinoThis is the normal mode of execution.
434*0677dfd1SJulio MerinoIn this mode, any failure is reported as such to the user and the test case
435*0677dfd1SJulio Merinois marked as
436*0677dfd1SJulio Merino.Sq failed .
437*0677dfd1SJulio Merino.It Fn atf_tc_expect_signal "signo" "reason" "..."
438*0677dfd1SJulio MerinoExpects the test case to terminate due to the reception of a signal.
439*0677dfd1SJulio MerinoIf
440*0677dfd1SJulio Merino.Va signo
441*0677dfd1SJulio Merinois not
442*0677dfd1SJulio Merino.Sq -1 ,
443*0677dfd1SJulio Merinothe runtime engine will validate that the signal that terminated the test
444*0677dfd1SJulio Merinocase matches the one provided in this call.
445*0677dfd1SJulio MerinoOtherwise, the exact value will be ignored.
446*0677dfd1SJulio Merino.It Fn atf_tc_expect_timeout "reason" "..."
447*0677dfd1SJulio MerinoExpects the test case to execute for longer than its timeout.
448*0677dfd1SJulio Merino.El
449*0677dfd1SJulio Merino.Ss Helper macros for common checks
450*0677dfd1SJulio MerinoThe library provides several macros that are very handy in multiple
451*0677dfd1SJulio Merinosituations.
452*0677dfd1SJulio MerinoThese basically check some condition after executing a given statement or
453*0677dfd1SJulio Merinoprocessing a given expression and, if the condition is not met, they
454*0677dfd1SJulio Merinoreport the test case as failed.
455*0677dfd1SJulio Merino.Pp
456*0677dfd1SJulio MerinoThe
457*0677dfd1SJulio Merino.Sq REQUIRE
458*0677dfd1SJulio Merinovariant of the macros immediately abort the test case as soon as an error
459*0677dfd1SJulio Merinocondition is detected by calling the
460*0677dfd1SJulio Merino.Fn atf_tc_fail
461*0677dfd1SJulio Merinofunction.
462*0677dfd1SJulio MerinoUse this variant whenever it makes no sense to continue the execution of a
463*0677dfd1SJulio Merinotest case when the checked condition is not met.
464*0677dfd1SJulio MerinoThe
465*0677dfd1SJulio Merino.Sq CHECK
466*0677dfd1SJulio Merinovariant, on the other hand, reports a failure as soon as it is encountered
467*0677dfd1SJulio Merinousing the
468*0677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal
469*0677dfd1SJulio Merinofunction, but the execution of the test case continues as if nothing had
470*0677dfd1SJulio Merinohappened.
471*0677dfd1SJulio MerinoUse this variant whenever the checked condition is important as a result of
472*0677dfd1SJulio Merinothe test case, but there are other conditions that can be subsequently
473*0677dfd1SJulio Merinochecked on the same run without aborting.
474*0677dfd1SJulio Merino.Pp
475*0677dfd1SJulio MerinoAdditionally, the
476*0677dfd1SJulio Merino.Sq MSG
477*0677dfd1SJulio Merinovariants take an extra set of parameters to explicitly specify the failure
478*0677dfd1SJulio Merinomessage.
479*0677dfd1SJulio MerinoThis failure message is formatted according to the
480*0677dfd1SJulio Merino.Xr printf 3
481*0677dfd1SJulio Merinoformatters.
482*0677dfd1SJulio Merino.Pp
483*0677dfd1SJulio Merino.Fn ATF_CHECK ,
484*0677dfd1SJulio Merino.Fn ATF_CHECK_MSG ,
485*0677dfd1SJulio Merino.Fn ATF_REQUIRE
486*0677dfd1SJulio Merinoand
487*0677dfd1SJulio Merino.Fn ATF_REQUIRE_MSG
488*0677dfd1SJulio Merinotake an expression and fail if the expression evaluates to false.
489*0677dfd1SJulio Merino.Pp
490*0677dfd1SJulio Merino.Fn ATF_CHECK_EQ ,
491*0677dfd1SJulio Merino.Fn ATF_CHECK_EQ_MSG ,
492*0677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ
493*0677dfd1SJulio Merinoand
494*0677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ_MSG
495*0677dfd1SJulio Merinotake two expressions and fail if the two evaluated values are not equal.
496*0677dfd1SJulio MerinoThe common style is to put the expected value in the first parameter and the
497*0677dfd1SJulio Merinoactual value in the second parameter.
498*0677dfd1SJulio Merino.Pp
499*0677dfd1SJulio Merino.Fn ATF_CHECK_MATCH ,
500*0677dfd1SJulio Merino.Fn ATF_CHECK_MATCH_MSG ,
501*0677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH
502*0677dfd1SJulio Merinoand
503*0677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH_MSG
504*0677dfd1SJulio Merinotake a regular expression and a string and fail if the regular expression does
505*0677dfd1SJulio Merinonot match the given string.
506*0677dfd1SJulio MerinoNote that the regular expression is not anchored, so it will match anywhere in
507*0677dfd1SJulio Merinothe string.
508*0677dfd1SJulio Merino.Pp
509*0677dfd1SJulio Merino.Fn ATF_CHECK_STREQ ,
510*0677dfd1SJulio Merino.Fn ATF_CHECK_STREQ_MSG ,
511*0677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ
512*0677dfd1SJulio Merinoand
513*0677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ_MSG
514*0677dfd1SJulio Merinotake two strings and fail if the two are not equal character by character.
515*0677dfd1SJulio MerinoThe common style is to put the expected string in the first parameter and the
516*0677dfd1SJulio Merinoactual string in the second parameter.
517*0677dfd1SJulio Merino.Pp
518*0677dfd1SJulio Merino.Fn ATF_CHECK_ERRNO
519*0677dfd1SJulio Merinoand
520*0677dfd1SJulio Merino.Fn ATF_REQUIRE_ERRNO
521*0677dfd1SJulio Merinotake, first, the error code that the check is expecting to find in the
522*0677dfd1SJulio Merino.Va errno
523*0677dfd1SJulio Merinovariable and, second, a boolean expression that, if evaluates to true,
524*0677dfd1SJulio Merinomeans that a call failed and
525*0677dfd1SJulio Merino.Va errno
526*0677dfd1SJulio Merinohas to be checked against the first value.
527*0677dfd1SJulio Merino.Ss Utility functions
528*0677dfd1SJulio MerinoThe following functions are provided as part of the
529*0677dfd1SJulio Merino.Nm
530*0677dfd1SJulio MerinoAPI to simplify the creation of a variety of tests.
531*0677dfd1SJulio MerinoIn particular, these are useful to write tests for command-line interfaces.
532*0677dfd1SJulio Merino.Pp
533*0677dfd1SJulio Merino.Ft void
534*0677dfd1SJulio Merino.Fo atf_utils_cat_file
535*0677dfd1SJulio Merino.Fa "const char *file"
536*0677dfd1SJulio Merino.Fa "const char *prefix"
537*0677dfd1SJulio Merino.Fc
538*0677dfd1SJulio Merino.Bd -ragged -offset indent
539*0677dfd1SJulio MerinoPrints the contents of
540*0677dfd1SJulio Merino.Fa file
541*0677dfd1SJulio Merinoto the standard output, prefixing every line with the string in
542*0677dfd1SJulio Merino.Fa prefix .
543*0677dfd1SJulio Merino.Ed
544*0677dfd1SJulio Merino.Pp
545*0677dfd1SJulio Merino.Ft bool
546*0677dfd1SJulio Merino.Fo atf_utils_compare_file
547*0677dfd1SJulio Merino.Fa "const char *file"
548*0677dfd1SJulio Merino.Fa "const char *contents"
549*0677dfd1SJulio Merino.Fc
550*0677dfd1SJulio Merino.Bd -ragged -offset indent
551*0677dfd1SJulio MerinoReturns true if the given
552*0677dfd1SJulio Merino.Fa file
553*0677dfd1SJulio Merinomatches exactly the expected inlined
554*0677dfd1SJulio Merino.Fa contents .
555*0677dfd1SJulio Merino.Ed
556*0677dfd1SJulio Merino.Pp
557*0677dfd1SJulio Merino.Ft void
558*0677dfd1SJulio Merino.Fo atf_utils_copy_file
559*0677dfd1SJulio Merino.Fa "const char *source"
560*0677dfd1SJulio Merino.Fa "const char *destination"
561*0677dfd1SJulio Merino.Fc
562*0677dfd1SJulio Merino.Bd -ragged -offset indent
563*0677dfd1SJulio MerinoCopies the file
564*0677dfd1SJulio Merino.Fa source
565*0677dfd1SJulio Merinoto
566*0677dfd1SJulio Merino.Fa destination .
567*0677dfd1SJulio MerinoThe permissions of the file are preserved during the code.
568*0677dfd1SJulio Merino.Ed
569*0677dfd1SJulio Merino.Pp
570*0677dfd1SJulio Merino.Ft void
571*0677dfd1SJulio Merino.Fo atf_utils_create_file
572*0677dfd1SJulio Merino.Fa "const char *file"
573*0677dfd1SJulio Merino.Fa "const char *contents"
574*0677dfd1SJulio Merino.Fa "..."
575*0677dfd1SJulio Merino.Fc
576*0677dfd1SJulio Merino.Bd -ragged -offset indent
577*0677dfd1SJulio MerinoCreates
578*0677dfd1SJulio Merino.Fa file
579*0677dfd1SJulio Merinowith the text given in
580*0677dfd1SJulio Merino.Fa contents ,
581*0677dfd1SJulio Merinowhich is a formatting string that uses the rest of the variable arguments.
582*0677dfd1SJulio Merino.Ed
583*0677dfd1SJulio Merino.Pp
584*0677dfd1SJulio Merino.Ft void
585*0677dfd1SJulio Merino.Fo atf_utils_file_exists
586*0677dfd1SJulio Merino.Fa "const char *file"
587*0677dfd1SJulio Merino.Fc
588*0677dfd1SJulio Merino.Bd -ragged -offset indent
589*0677dfd1SJulio MerinoChecks if
590*0677dfd1SJulio Merino.Fa file
591*0677dfd1SJulio Merinoexists.
592*0677dfd1SJulio Merino.Ed
593*0677dfd1SJulio Merino.Pp
594*0677dfd1SJulio Merino.Ft pid_t
595*0677dfd1SJulio Merino.Fo atf_utils_fork
596*0677dfd1SJulio Merino.Fa "void"
597*0677dfd1SJulio Merino.Fc
598*0677dfd1SJulio Merino.Bd -ragged -offset indent
599*0677dfd1SJulio MerinoForks a process and redirects the standard output and standard error of the
600*0677dfd1SJulio Merinochild to files for later validation with
601*0677dfd1SJulio Merino.Fn atf_utils_wait .
602*0677dfd1SJulio MerinoFails the test case if the fork fails, so this does not return an error.
603*0677dfd1SJulio Merino.Ed
604*0677dfd1SJulio Merino.Pp
605*0677dfd1SJulio Merino.Ft void
606*0677dfd1SJulio Merino.Fo atf_utils_free_charpp
607*0677dfd1SJulio Merino.Fa "char **argv"
608*0677dfd1SJulio Merino.Fc
609*0677dfd1SJulio Merino.Bd -ragged -offset indent
610*0677dfd1SJulio MerinoFrees a dynamically-allocated array of dynamically-allocated strings.
611*0677dfd1SJulio Merino.Ed
612*0677dfd1SJulio Merino.Pp
613*0677dfd1SJulio Merino.Ft bool
614*0677dfd1SJulio Merino.Fo atf_utils_grep_file
615*0677dfd1SJulio Merino.Fa "const char *regexp"
616*0677dfd1SJulio Merino.Fa "const char *file"
617*0677dfd1SJulio Merino.Fa "..."
618*0677dfd1SJulio Merino.Fc
619*0677dfd1SJulio Merino.Bd -ragged -offset indent
620*0677dfd1SJulio MerinoSearches for the
621*0677dfd1SJulio Merino.Fa regexp ,
622*0677dfd1SJulio Merinowhich is a formatting string representing the regular expression,
623*0677dfd1SJulio Merinoin the
624*0677dfd1SJulio Merino.Fa file .
625*0677dfd1SJulio MerinoThe variable arguments are used to construct the regular expression.
626*0677dfd1SJulio Merino.Ed
627*0677dfd1SJulio Merino.Pp
628*0677dfd1SJulio Merino.Ft bool
629*0677dfd1SJulio Merino.Fo atf_utils_grep_string
630*0677dfd1SJulio Merino.Fa "const char *regexp"
631*0677dfd1SJulio Merino.Fa "const char *str"
632*0677dfd1SJulio Merino.Fa "..."
633*0677dfd1SJulio Merino.Fc
634*0677dfd1SJulio Merino.Bd -ragged -offset indent
635*0677dfd1SJulio MerinoSearches for the
636*0677dfd1SJulio Merino.Fa regexp ,
637*0677dfd1SJulio Merinowhich is a formatting string representing the regular expression,
638*0677dfd1SJulio Merinoin the literal string
639*0677dfd1SJulio Merino.Fa str .
640*0677dfd1SJulio MerinoThe variable arguments are used to construct the regular expression.
641*0677dfd1SJulio Merino.Ed
642*0677dfd1SJulio Merino.Pp
643*0677dfd1SJulio Merino.Ft char *
644*0677dfd1SJulio Merino.Fo atf_utils_readline
645*0677dfd1SJulio Merino.Fa "int fd"
646*0677dfd1SJulio Merino.Fc
647*0677dfd1SJulio Merino.Bd -ragged -offset indent
648*0677dfd1SJulio MerinoReads a line from the file descriptor
649*0677dfd1SJulio Merino.Fa fd .
650*0677dfd1SJulio MerinoThe line, if any, is returned as a dynamically-allocated buffer that must be
651*0677dfd1SJulio Merinoreleased with
652*0677dfd1SJulio Merino.Xr free 3 .
653*0677dfd1SJulio MerinoIf there was nothing to read, returns
654*0677dfd1SJulio Merino.Sq NULL .
655*0677dfd1SJulio Merino.Ed
656*0677dfd1SJulio Merino.Pp
657*0677dfd1SJulio Merino.Ft void
658*0677dfd1SJulio Merino.Fo atf_utils_redirect
659*0677dfd1SJulio Merino.Fa "const int fd"
660*0677dfd1SJulio Merino.Fa "const char *file"
661*0677dfd1SJulio Merino.Fc
662*0677dfd1SJulio Merino.Bd -ragged -offset indent
663*0677dfd1SJulio MerinoRedirects the given file descriptor
664*0677dfd1SJulio Merino.Fa fd
665*0677dfd1SJulio Merinoto
666*0677dfd1SJulio Merino.Fa file .
667*0677dfd1SJulio MerinoThis function exits the process in case of an error and does not properly mark
668*0677dfd1SJulio Merinothe test case as failed.
669*0677dfd1SJulio MerinoAs a result, it should only be used in subprocesses of the test case; specially
670*0677dfd1SJulio Merinothose spawned by
671*0677dfd1SJulio Merino.Fn atf_utils_fork .
672*0677dfd1SJulio Merino.Ed
673*0677dfd1SJulio Merino.Pp
674*0677dfd1SJulio Merino.Ft void
675*0677dfd1SJulio Merino.Fo atf_utils_wait
676*0677dfd1SJulio Merino.Fa "const pid_t pid"
677*0677dfd1SJulio Merino.Fa "const int expected_exit_status"
678*0677dfd1SJulio Merino.Fa "const char *expected_stdout"
679*0677dfd1SJulio Merino.Fa "const char *expected_stderr"
680*0677dfd1SJulio Merino.Fc
681*0677dfd1SJulio Merino.Bd -ragged -offset indent
682*0677dfd1SJulio MerinoWaits and validates the result of a subprocess spawned with
683*0677dfd1SJulio Merino.Fn atf_utils_wait .
684*0677dfd1SJulio MerinoThe validation involves checking that the subprocess exited cleanly and returned
685*0677dfd1SJulio Merinothe code specified in
686*0677dfd1SJulio Merino.Fa expected_exit_status
687*0677dfd1SJulio Merinoand that its standard output and standard error match the strings given in
688*0677dfd1SJulio Merino.Fa expected_stdout
689*0677dfd1SJulio Merinoand
690*0677dfd1SJulio Merino.Fa expected_stderr .
691*0677dfd1SJulio Merino.Pp
692*0677dfd1SJulio MerinoIf any of the
693*0677dfd1SJulio Merino.Fa expected_stdout
694*0677dfd1SJulio Merinoor
695*0677dfd1SJulio Merino.Fa expected_stderr
696*0677dfd1SJulio Merinostrings are prefixed with
697*0677dfd1SJulio Merino.Sq save: ,
698*0677dfd1SJulio Merinothen they specify the name of the file into which to store the stdout or stderr
699*0677dfd1SJulio Merinoof the subprocess, and no comparison is performed.
700*0677dfd1SJulio Merino.Ed
701*0677dfd1SJulio Merino.Sh ENVIRONMENT
702*0677dfd1SJulio MerinoThe following variables are recognized by
703*0677dfd1SJulio Merino.Nm
704*0677dfd1SJulio Merinobut should not be overridden other than for testing purposes:
705*0677dfd1SJulio Merino.Pp
706*0677dfd1SJulio Merino.Bl -tag -width ATFXBUILDXCXXFLAGSXX -compact
707*0677dfd1SJulio Merino.It Va ATF_BUILD_CC
708*0677dfd1SJulio MerinoPath to the C compiler.
709*0677dfd1SJulio Merino.It Va ATF_BUILD_CFLAGS
710*0677dfd1SJulio MerinoC compiler flags.
711*0677dfd1SJulio Merino.It Va ATF_BUILD_CPP
712*0677dfd1SJulio MerinoPath to the C/C++ preprocessor.
713*0677dfd1SJulio Merino.It Va ATF_BUILD_CPPFLAGS
714*0677dfd1SJulio MerinoC/C++ preprocessor flags.
715*0677dfd1SJulio Merino.It Va ATF_BUILD_CXX
716*0677dfd1SJulio MerinoPath to the C++ compiler.
717*0677dfd1SJulio Merino.It Va ATF_BUILD_CXXFLAGS
718*0677dfd1SJulio MerinoC++ compiler flags.
719*0677dfd1SJulio Merino.El
720*0677dfd1SJulio Merino.Sh EXAMPLES
721*0677dfd1SJulio MerinoThe following shows a complete test program with a single test case that
722*0677dfd1SJulio Merinovalidates the addition operator:
723*0677dfd1SJulio Merino.Bd -literal -offset indent
724*0677dfd1SJulio Merino#include <atf-c.h>
725*0677dfd1SJulio Merino
726*0677dfd1SJulio MerinoATF_TC(addition);
727*0677dfd1SJulio MerinoATF_TC_HEAD(addition, tc)
728*0677dfd1SJulio Merino{
729*0677dfd1SJulio Merino    atf_tc_set_md_var(tc, "descr",
730*0677dfd1SJulio Merino                      "Sample tests for the addition operator");
731*0677dfd1SJulio Merino}
732*0677dfd1SJulio MerinoATF_TC_BODY(addition, tc)
733*0677dfd1SJulio Merino{
734*0677dfd1SJulio Merino    ATF_CHECK_EQ(0, 0 + 0);
735*0677dfd1SJulio Merino    ATF_CHECK_EQ(1, 0 + 1);
736*0677dfd1SJulio Merino    ATF_CHECK_EQ(1, 1 + 0);
737*0677dfd1SJulio Merino
738*0677dfd1SJulio Merino    ATF_CHECK_EQ(2, 1 + 1);
739*0677dfd1SJulio Merino
740*0677dfd1SJulio Merino    ATF_CHECK_EQ(300, 100 + 200);
741*0677dfd1SJulio Merino}
742*0677dfd1SJulio Merino
743*0677dfd1SJulio MerinoATF_TC(string_formatting);
744*0677dfd1SJulio MerinoATF_TC_HEAD(string_formatting, tc)
745*0677dfd1SJulio Merino{
746*0677dfd1SJulio Merino    atf_tc_set_md_var(tc, "descr",
747*0677dfd1SJulio Merino                      "Sample tests for the snprintf");
748*0677dfd1SJulio Merino}
749*0677dfd1SJulio MerinoATF_TC_BODY(string_formatting, tc)
750*0677dfd1SJulio Merino{
751*0677dfd1SJulio Merino    char buf[1024];
752*0677dfd1SJulio Merino    snprintf(buf, sizeof(buf), "a %s", "string");
753*0677dfd1SJulio Merino    ATF_CHECK_STREQ_MSG("a string", buf, "%s is not working");
754*0677dfd1SJulio Merino}
755*0677dfd1SJulio Merino
756*0677dfd1SJulio MerinoATF_TC(open_failure);
757*0677dfd1SJulio MerinoATF_TC_HEAD(open_failure, tc)
758*0677dfd1SJulio Merino{
759*0677dfd1SJulio Merino    atf_tc_set_md_var(tc, "descr",
760*0677dfd1SJulio Merino                      "Sample tests for the open function");
761*0677dfd1SJulio Merino}
762*0677dfd1SJulio MerinoATF_TC_BODY(open_failure, tc)
763*0677dfd1SJulio Merino{
764*0677dfd1SJulio Merino    ATF_CHECK_ERRNO(ENOENT, open("non-existent", O_RDONLY) == -1);
765*0677dfd1SJulio Merino}
766*0677dfd1SJulio Merino
767*0677dfd1SJulio MerinoATF_TC(known_bug);
768*0677dfd1SJulio MerinoATF_TC_HEAD(known_bug, tc)
769*0677dfd1SJulio Merino{
770*0677dfd1SJulio Merino    atf_tc_set_md_var(tc, "descr",
771*0677dfd1SJulio Merino                      "Reproduces a known bug");
772*0677dfd1SJulio Merino}
773*0677dfd1SJulio MerinoATF_TC_BODY(known_bug, tc)
774*0677dfd1SJulio Merino{
775*0677dfd1SJulio Merino    atf_tc_expect_fail("See bug number foo/bar");
776*0677dfd1SJulio Merino    ATF_CHECK_EQ(3, 1 + 1);
777*0677dfd1SJulio Merino    atf_tc_expect_pass();
778*0677dfd1SJulio Merino    ATF_CHECK_EQ(3, 1 + 2);
779*0677dfd1SJulio Merino}
780*0677dfd1SJulio Merino
781*0677dfd1SJulio MerinoATF_TP_ADD_TCS(tp)
782*0677dfd1SJulio Merino{
783*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tp, addition);
784*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tp, string_formatting);
785*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tp, open_failure);
786*0677dfd1SJulio Merino    ATF_TP_ADD_TC(tp, known_bug);
787*0677dfd1SJulio Merino
788*0677dfd1SJulio Merino    return atf_no_error();
789*0677dfd1SJulio Merino}
790*0677dfd1SJulio Merino.Ed
791*0677dfd1SJulio Merino.Sh SEE ALSO
792*0677dfd1SJulio Merino.Xr atf-test-program 1 ,
793*0677dfd1SJulio Merino.Xr atf-test-case 4
794