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