10677dfd1SJulio Merino.\" Copyright (c) 2008 The NetBSD Foundation, Inc. 20677dfd1SJulio Merino.\" All rights reserved. 30677dfd1SJulio Merino.\" 40677dfd1SJulio Merino.\" Redistribution and use in source and binary forms, with or without 50677dfd1SJulio Merino.\" modification, are permitted provided that the following conditions 60677dfd1SJulio Merino.\" are met: 70677dfd1SJulio Merino.\" 1. Redistributions of source code must retain the above copyright 80677dfd1SJulio Merino.\" notice, this list of conditions and the following disclaimer. 90677dfd1SJulio Merino.\" 2. Redistributions in binary form must reproduce the above copyright 100677dfd1SJulio Merino.\" notice, this list of conditions and the following disclaimer in the 110677dfd1SJulio Merino.\" documentation and/or other materials provided with the distribution. 120677dfd1SJulio Merino.\" 130677dfd1SJulio Merino.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 140677dfd1SJulio Merino.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 150677dfd1SJulio Merino.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 160677dfd1SJulio Merino.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 170677dfd1SJulio Merino.\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 180677dfd1SJulio Merino.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 190677dfd1SJulio Merino.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 200677dfd1SJulio Merino.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 210677dfd1SJulio Merino.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 220677dfd1SJulio Merino.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 230677dfd1SJulio Merino.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 240677dfd1SJulio Merino.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*1d303879SEnji Cooper.Dd April 5, 2017 260677dfd1SJulio Merino.Dt ATF-C 3 270677dfd1SJulio Merino.Os 280677dfd1SJulio Merino.Sh NAME 290677dfd1SJulio Merino.Nm atf-c , 300677dfd1SJulio Merino.Nm ATF_CHECK , 310677dfd1SJulio Merino.Nm ATF_CHECK_MSG , 320677dfd1SJulio Merino.Nm ATF_CHECK_EQ , 330677dfd1SJulio Merino.Nm ATF_CHECK_EQ_MSG , 340677dfd1SJulio Merino.Nm ATF_CHECK_MATCH , 350677dfd1SJulio Merino.Nm ATF_CHECK_MATCH_MSG , 360677dfd1SJulio Merino.Nm ATF_CHECK_STREQ , 370677dfd1SJulio Merino.Nm ATF_CHECK_STREQ_MSG , 380677dfd1SJulio Merino.Nm ATF_CHECK_ERRNO , 390677dfd1SJulio Merino.Nm ATF_REQUIRE , 400677dfd1SJulio Merino.Nm ATF_REQUIRE_MSG , 410677dfd1SJulio Merino.Nm ATF_REQUIRE_EQ , 420677dfd1SJulio Merino.Nm ATF_REQUIRE_EQ_MSG , 430677dfd1SJulio Merino.Nm ATF_REQUIRE_MATCH , 440677dfd1SJulio Merino.Nm ATF_REQUIRE_MATCH_MSG , 450677dfd1SJulio Merino.Nm ATF_REQUIRE_STREQ , 460677dfd1SJulio Merino.Nm ATF_REQUIRE_STREQ_MSG , 470677dfd1SJulio Merino.Nm ATF_REQUIRE_ERRNO , 480677dfd1SJulio Merino.Nm ATF_TC , 490677dfd1SJulio Merino.Nm ATF_TC_BODY , 500677dfd1SJulio Merino.Nm ATF_TC_BODY_NAME , 510677dfd1SJulio Merino.Nm ATF_TC_CLEANUP , 520677dfd1SJulio Merino.Nm ATF_TC_CLEANUP_NAME , 530677dfd1SJulio Merino.Nm ATF_TC_HEAD , 540677dfd1SJulio Merino.Nm ATF_TC_HEAD_NAME , 550677dfd1SJulio Merino.Nm ATF_TC_NAME , 560677dfd1SJulio Merino.Nm ATF_TC_WITH_CLEANUP , 570677dfd1SJulio Merino.Nm ATF_TC_WITHOUT_HEAD , 580677dfd1SJulio Merino.Nm ATF_TP_ADD_TC , 590677dfd1SJulio Merino.Nm ATF_TP_ADD_TCS , 600677dfd1SJulio Merino.Nm atf_tc_get_config_var , 610677dfd1SJulio Merino.Nm atf_tc_get_config_var_wd , 620677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_bool , 630677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_bool_wd , 640677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_long , 650677dfd1SJulio Merino.Nm atf_tc_get_config_var_as_long_wd , 660677dfd1SJulio Merino.Nm atf_no_error , 670677dfd1SJulio Merino.Nm atf_tc_expect_death , 680677dfd1SJulio Merino.Nm atf_tc_expect_exit , 690677dfd1SJulio Merino.Nm atf_tc_expect_fail , 700677dfd1SJulio Merino.Nm atf_tc_expect_pass , 710677dfd1SJulio Merino.Nm atf_tc_expect_signal , 720677dfd1SJulio Merino.Nm atf_tc_expect_timeout , 730677dfd1SJulio Merino.Nm atf_tc_fail , 740677dfd1SJulio Merino.Nm atf_tc_fail_nonfatal , 750677dfd1SJulio Merino.Nm atf_tc_pass , 760677dfd1SJulio Merino.Nm atf_tc_skip , 770677dfd1SJulio Merino.Nm atf_utils_cat_file , 780677dfd1SJulio Merino.Nm atf_utils_compare_file , 790677dfd1SJulio Merino.Nm atf_utils_copy_file , 800677dfd1SJulio Merino.Nm atf_utils_create_file , 810677dfd1SJulio Merino.Nm atf_utils_file_exists , 820677dfd1SJulio Merino.Nm atf_utils_fork , 830677dfd1SJulio Merino.Nm atf_utils_free_charpp , 840677dfd1SJulio Merino.Nm atf_utils_grep_file , 850677dfd1SJulio Merino.Nm atf_utils_grep_string , 860677dfd1SJulio Merino.Nm atf_utils_readline , 870677dfd1SJulio Merino.Nm atf_utils_redirect , 880677dfd1SJulio Merino.Nm atf_utils_wait 890677dfd1SJulio Merino.Nd C API to write ATF-based test programs 900677dfd1SJulio Merino.Sh SYNOPSIS 910677dfd1SJulio Merino.In atf-c.h 920677dfd1SJulio Merino.\" NO_CHECK_STYLE_BEGIN 930677dfd1SJulio Merino.Fn ATF_CHECK "expression" 940677dfd1SJulio Merino.Fn ATF_CHECK_MSG "expression" "fail_msg_fmt" ... 950677dfd1SJulio Merino.Fn ATF_CHECK_EQ "expected_expression" "actual_expression" 960677dfd1SJulio Merino.Fn ATF_CHECK_EQ_MSG "expected_expression" "actual_expression" "fail_msg_fmt" ... 970677dfd1SJulio Merino.Fn ATF_CHECK_MATCH "regexp" "string" 980677dfd1SJulio Merino.Fn ATF_CHECK_MATCH_MSG "regexp" "string" "fail_msg_fmt" ... 990677dfd1SJulio Merino.Fn ATF_CHECK_STREQ "string_1" "string_2" 1000677dfd1SJulio Merino.Fn ATF_CHECK_STREQ_MSG "string_1" "string_2" "fail_msg_fmt" ... 1010677dfd1SJulio Merino.Fn ATF_CHECK_ERRNO "expected_errno" "bool_expression" 1020677dfd1SJulio Merino.Fn ATF_REQUIRE "expression" 1030677dfd1SJulio Merino.Fn ATF_REQUIRE_MSG "expression" "fail_msg_fmt" ... 1040677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ "expected_expression" "actual_expression" 1050677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ_MSG "expected_expression" "actual_expression" "fail_msg_fmt" ... 1060677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH "regexp" "string" 1070677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH_MSG "regexp" "string" "fail_msg_fmt" ... 1080677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ "expected_string" "actual_string" 1090677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ_MSG "expected_string" "actual_string" "fail_msg_fmt" ... 1100677dfd1SJulio Merino.Fn ATF_REQUIRE_ERRNO "expected_errno" "bool_expression" 1110677dfd1SJulio Merino.\" NO_CHECK_STYLE_END 1120677dfd1SJulio Merino.Fn ATF_TC "name" 1130677dfd1SJulio Merino.Fn ATF_TC_BODY "name" "tc" 1140677dfd1SJulio Merino.Fn ATF_TC_BODY_NAME "name" 1150677dfd1SJulio Merino.Fn ATF_TC_CLEANUP "name" "tc" 1160677dfd1SJulio Merino.Fn ATF_TC_CLEANUP_NAME "name" 1170677dfd1SJulio Merino.Fn ATF_TC_HEAD "name" "tc" 1180677dfd1SJulio Merino.Fn ATF_TC_HEAD_NAME "name" 1190677dfd1SJulio Merino.Fn ATF_TC_NAME "name" 1200677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP "name" 1210677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD "name" 1220677dfd1SJulio Merino.Fn ATF_TP_ADD_TC "tp_name" "tc_name" 1230677dfd1SJulio Merino.Fn ATF_TP_ADD_TCS "tp_name" 1240677dfd1SJulio Merino.Fn atf_tc_get_config_var "tc" "varname" 1250677dfd1SJulio Merino.Fn atf_tc_get_config_var_wd "tc" "variable_name" "default_value" 1260677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool "tc" "variable_name" 1270677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool_wd "tc" "variable_name" "default_value" 1280677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long "tc" "variable_name" 1290677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long_wd "tc" "variable_name" "default_value" 1300677dfd1SJulio Merino.Fn atf_no_error 1310677dfd1SJulio Merino.Fn atf_tc_expect_death "reason" "..." 1320677dfd1SJulio Merino.Fn atf_tc_expect_exit "exitcode" "reason" "..." 1330677dfd1SJulio Merino.Fn atf_tc_expect_fail "reason" "..." 1340677dfd1SJulio Merino.Fn atf_tc_expect_pass 1350677dfd1SJulio Merino.Fn atf_tc_expect_signal "signo" "reason" "..." 1360677dfd1SJulio Merino.Fn atf_tc_expect_timeout "reason" "..." 1370677dfd1SJulio Merino.Fn atf_tc_fail "reason" 1380677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal "reason" 1390677dfd1SJulio Merino.Fn atf_tc_pass 1400677dfd1SJulio Merino.Fn atf_tc_skip "reason" 1410677dfd1SJulio Merino.Ft void 1420677dfd1SJulio Merino.Fo atf_utils_cat_file 1430677dfd1SJulio Merino.Fa "const char *file" 1440677dfd1SJulio Merino.Fa "const char *prefix" 1450677dfd1SJulio Merino.Fc 1460677dfd1SJulio Merino.Ft bool 1470677dfd1SJulio Merino.Fo atf_utils_compare_file 1480677dfd1SJulio Merino.Fa "const char *file" 1490677dfd1SJulio Merino.Fa "const char *contents" 1500677dfd1SJulio Merino.Fc 1510677dfd1SJulio Merino.Ft void 1520677dfd1SJulio Merino.Fo atf_utils_copy_file 1530677dfd1SJulio Merino.Fa "const char *source" 1540677dfd1SJulio Merino.Fa "const char *destination" 1550677dfd1SJulio Merino.Fc 1560677dfd1SJulio Merino.Ft void 1570677dfd1SJulio Merino.Fo atf_utils_create_file 1580677dfd1SJulio Merino.Fa "const char *file" 1590677dfd1SJulio Merino.Fa "const char *contents" 1600677dfd1SJulio Merino.Fa "..." 1610677dfd1SJulio Merino.Fc 1620677dfd1SJulio Merino.Ft void 1630677dfd1SJulio Merino.Fo atf_utils_file_exists 1640677dfd1SJulio Merino.Fa "const char *file" 1650677dfd1SJulio Merino.Fc 1660677dfd1SJulio Merino.Ft pid_t 1670677dfd1SJulio Merino.Fo atf_utils_fork 1680677dfd1SJulio Merino.Fa "void" 1690677dfd1SJulio Merino.Fc 1700677dfd1SJulio Merino.Ft void 1710677dfd1SJulio Merino.Fo atf_utils_free_charpp 1720677dfd1SJulio Merino.Fa "char **argv" 1730677dfd1SJulio Merino.Fc 1740677dfd1SJulio Merino.Ft bool 1750677dfd1SJulio Merino.Fo atf_utils_grep_file 1760677dfd1SJulio Merino.Fa "const char *regexp" 1770677dfd1SJulio Merino.Fa "const char *file" 1780677dfd1SJulio Merino.Fa "..." 1790677dfd1SJulio Merino.Fc 1800677dfd1SJulio Merino.Ft bool 1810677dfd1SJulio Merino.Fo atf_utils_grep_string 1820677dfd1SJulio Merino.Fa "const char *regexp" 1830677dfd1SJulio Merino.Fa "const char *str" 1840677dfd1SJulio Merino.Fa "..." 1850677dfd1SJulio Merino.Fc 1860677dfd1SJulio Merino.Ft char * 1870677dfd1SJulio Merino.Fo atf_utils_readline 1880677dfd1SJulio Merino.Fa "int fd" 1890677dfd1SJulio Merino.Fc 1900677dfd1SJulio Merino.Ft void 1910677dfd1SJulio Merino.Fo atf_utils_redirect 1920677dfd1SJulio Merino.Fa "const int fd" 1930677dfd1SJulio Merino.Fa "const char *file" 1940677dfd1SJulio Merino.Fc 1950677dfd1SJulio Merino.Ft void 1960677dfd1SJulio Merino.Fo atf_utils_wait 1970677dfd1SJulio Merino.Fa "const pid_t pid" 1980677dfd1SJulio Merino.Fa "const int expected_exit_status" 1990677dfd1SJulio Merino.Fa "const char *expected_stdout" 2000677dfd1SJulio Merino.Fa "const char *expected_stderr" 2010677dfd1SJulio Merino.Fc 2020677dfd1SJulio Merino.Sh DESCRIPTION 2030677dfd1SJulio MerinoATF provides a C programming interface to implement test programs. 2040677dfd1SJulio MerinoC-based test programs follow this template: 2050677dfd1SJulio Merino.Bd -literal -offset indent 206ddde9fa7SEnji Cooper\&... C-specific includes go here ... 2070677dfd1SJulio Merino 2080677dfd1SJulio Merino#include <atf-c.h> 2090677dfd1SJulio Merino 2100677dfd1SJulio MerinoATF_TC(tc1); 2110677dfd1SJulio MerinoATF_TC_HEAD(tc1, tc) 2120677dfd1SJulio Merino{ 2130677dfd1SJulio Merino ... first test case's header ... 2140677dfd1SJulio Merino} 2150677dfd1SJulio MerinoATF_TC_BODY(tc1, tc) 2160677dfd1SJulio Merino{ 2170677dfd1SJulio Merino ... first test case's body ... 2180677dfd1SJulio Merino} 2190677dfd1SJulio Merino 2200677dfd1SJulio MerinoATF_TC_WITH_CLEANUP(tc2); 2210677dfd1SJulio MerinoATF_TC_HEAD(tc2, tc) 2220677dfd1SJulio Merino{ 2230677dfd1SJulio Merino ... second test case's header ... 2240677dfd1SJulio Merino} 2250677dfd1SJulio MerinoATF_TC_BODY(tc2, tc) 2260677dfd1SJulio Merino{ 2270677dfd1SJulio Merino ... second test case's body ... 2280677dfd1SJulio Merino} 2290677dfd1SJulio MerinoATF_TC_CLEANUP(tc2, tc) 2300677dfd1SJulio Merino{ 2310677dfd1SJulio Merino ... second test case's cleanup ... 2320677dfd1SJulio Merino} 2330677dfd1SJulio Merino 2340677dfd1SJulio MerinoATF_TC_WITHOUT_HEAD(tc3); 2350677dfd1SJulio MerinoATF_TC_BODY(tc3, tc) 2360677dfd1SJulio Merino{ 2370677dfd1SJulio Merino ... third test case's body ... 2380677dfd1SJulio Merino} 2390677dfd1SJulio Merino 240ddde9fa7SEnji Cooper\&... additional test cases ... 2410677dfd1SJulio Merino 2420677dfd1SJulio MerinoATF_TP_ADD_TCS(tp) 2430677dfd1SJulio Merino{ 2440677dfd1SJulio Merino ATF_TP_ADD_TC(tcs, tc1); 2450677dfd1SJulio Merino ATF_TP_ADD_TC(tcs, tc2); 2460677dfd1SJulio Merino ATF_TP_ADD_TC(tcs, tc3); 2470677dfd1SJulio Merino ... add additional test cases ... 2480677dfd1SJulio Merino 2490677dfd1SJulio Merino return atf_no_error(); 2500677dfd1SJulio Merino} 2510677dfd1SJulio Merino.Ed 2520677dfd1SJulio Merino.Ss Definition of test cases 2530677dfd1SJulio MerinoTest cases have an identifier and are composed of three different parts: 2540677dfd1SJulio Merinothe header, the body and an optional cleanup routine, all of which are 2550677dfd1SJulio Merinodescribed in 2560677dfd1SJulio Merino.Xr atf-test-case 4 . 2570677dfd1SJulio MerinoTo define test cases, one can use the 2580677dfd1SJulio Merino.Fn ATF_TC , 2590677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP 2600677dfd1SJulio Merinoor the 2610677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD 262ddde9fa7SEnji Coopermacros, which take a single parameter specifying the test case's name. 2630677dfd1SJulio Merino.Fn ATF_TC , 2640677dfd1SJulio Merinorequires to define a head and a body for the test case, 2650677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP 2660677dfd1SJulio Merinorequires to define a head, a body and a cleanup for the test case and 2670677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD 2680677dfd1SJulio Merinorequires only a body for the test case. 2690677dfd1SJulio MerinoIt is important to note that these 2700677dfd1SJulio Merino.Em do not 2710677dfd1SJulio Merinoset the test case up for execution when the program is run. 2720677dfd1SJulio MerinoIn order to do so, a later registration is needed with the 2730677dfd1SJulio Merino.Fn ATF_TP_ADD_TC 2740677dfd1SJulio Merinomacro detailed in 2750677dfd1SJulio Merino.Sx Program initialization . 2760677dfd1SJulio Merino.Pp 2770677dfd1SJulio MerinoLater on, one must define the three parts of the body by means of three 2780677dfd1SJulio Merinofunctions. 2790677dfd1SJulio MerinoTheir headers are given by the 2800677dfd1SJulio Merino.Fn ATF_TC_HEAD , 2810677dfd1SJulio Merino.Fn ATF_TC_BODY 2820677dfd1SJulio Merinoand 2830677dfd1SJulio Merino.Fn ATF_TC_CLEANUP 2840677dfd1SJulio Merinomacros, all of which take the test case name provided to the 2850677dfd1SJulio Merino.Fn ATF_TC 2860677dfd1SJulio Merino.Fn ATF_TC_WITH_CLEANUP , 2870677dfd1SJulio Merinoor 2880677dfd1SJulio Merino.Fn ATF_TC_WITHOUT_HEAD 2890677dfd1SJulio Merinomacros and the name of the variable that will hold a pointer to the 2900677dfd1SJulio Merinotest case data. 2910677dfd1SJulio MerinoFollowing each of these, a block of code is expected, surrounded by the 2920677dfd1SJulio Merinoopening and closing brackets. 2930677dfd1SJulio Merino.Ss Program initialization 2940677dfd1SJulio MerinoThe library provides a way to easily define the test program's 2950677dfd1SJulio Merino.Fn main 2960677dfd1SJulio Merinofunction. 2970677dfd1SJulio MerinoYou should never define one on your own, but rely on the 2980677dfd1SJulio Merinolibrary to do it for you. 2990677dfd1SJulio MerinoThis is done by using the 3000677dfd1SJulio Merino.Fn ATF_TP_ADD_TCS 3010677dfd1SJulio Merinomacro, which is passed the name of the object that will hold the test 302ddde9fa7SEnji Coopercases, i.e., the test program instance. 3030677dfd1SJulio MerinoThis name can be whatever you want as long as it is a valid variable 3040677dfd1SJulio Merinoidentifier. 3050677dfd1SJulio Merino.Pp 3060677dfd1SJulio MerinoAfter the macro, you are supposed to provide the body of a function, which 3070677dfd1SJulio Merinoshould only use the 3080677dfd1SJulio Merino.Fn ATF_TP_ADD_TC 3090677dfd1SJulio Merinomacro to register the test cases the test program will execute and return 3100677dfd1SJulio Merinoa success error code. 3110677dfd1SJulio MerinoThe first parameter of this macro matches the name you provided in the 3120677dfd1SJulio Merinoformer call. 3130677dfd1SJulio MerinoThe success status can be returned using the 3140677dfd1SJulio Merino.Fn atf_no_error 3150677dfd1SJulio Merinofunction. 3160677dfd1SJulio Merino.Ss Header definitions 3170677dfd1SJulio MerinoThe test case's header can define the meta-data by using the 3180677dfd1SJulio Merino.Fn atf_tc_set_md_var 3190677dfd1SJulio Merinomethod, which takes three parameters: the first one points to the test 3200677dfd1SJulio Merinocase data, the second one specifies the meta-data variable to be set 3210677dfd1SJulio Merinoand the third one specifies its value. 3220677dfd1SJulio MerinoBoth of them are strings. 3230677dfd1SJulio Merino.Ss Configuration variables 3240677dfd1SJulio MerinoThe test case has read-only access to the current configuration variables 3250677dfd1SJulio Merinoby means of the 3260677dfd1SJulio Merino.Ft bool 3270677dfd1SJulio Merino.Fn atf_tc_has_config_var , 3280677dfd1SJulio Merino.Ft const char * 3290677dfd1SJulio Merino.Fn atf_tc_get_config_var , 3300677dfd1SJulio Merino.Ft const char * 3310677dfd1SJulio Merino.Fn atf_tc_get_config_var_wd , 3320677dfd1SJulio Merino.Ft bool 3330677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool , 3340677dfd1SJulio Merino.Ft bool 3350677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_bool_wd , 3360677dfd1SJulio Merino.Ft long 3370677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long , 3380677dfd1SJulio Merinoand the 3390677dfd1SJulio Merino.Ft long 3400677dfd1SJulio Merino.Fn atf_tc_get_config_var_as_long_wd 3410677dfd1SJulio Merinofunctions, which can be called in any of the three parts of a test case. 3420677dfd1SJulio Merino.Pp 3430677dfd1SJulio MerinoThe 3440677dfd1SJulio Merino.Sq _wd 3450677dfd1SJulio Merinovariants take a default value for the variable which is returned if the 3460677dfd1SJulio Merinovariable is not defined. 3470677dfd1SJulio MerinoThe other functions without the 3480677dfd1SJulio Merino.Sq _wd 3490677dfd1SJulio Merinosuffix 3500677dfd1SJulio Merino.Em require 3510677dfd1SJulio Merinothe variable to be defined. 3520677dfd1SJulio Merino.Ss Access to the source directory 3530677dfd1SJulio MerinoIt is possible to get the path to the test case's source directory from any 3540677dfd1SJulio Merinoof its three components by querying the 3550677dfd1SJulio Merino.Sq srcdir 3560677dfd1SJulio Merinoconfiguration variable. 3570677dfd1SJulio Merino.Ss Requiring programs 3580677dfd1SJulio MerinoAside from the 3590677dfd1SJulio Merino.Va require.progs 3600677dfd1SJulio Merinometa-data variable available in the header only, one can also check for 3610677dfd1SJulio Merinoadditional programs in the test case's body by using the 3620677dfd1SJulio Merino.Fn atf_tc_require_prog 3630677dfd1SJulio Merinofunction, which takes the base name or full path of a single binary. 3640677dfd1SJulio MerinoRelative paths are forbidden. 3650677dfd1SJulio MerinoIf it is not found, the test case will be automatically skipped. 3660677dfd1SJulio Merino.Ss Test case finalization 3670677dfd1SJulio MerinoThe test case finalizes either when the body reaches its end, at which 3680677dfd1SJulio Merinopoint the test is assumed to have 3690677dfd1SJulio Merino.Em passed , 3700677dfd1SJulio Merinounless any non-fatal errors were raised using 3710677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal , 3720677dfd1SJulio Merinoor at any explicit call to 3730677dfd1SJulio Merino.Fn atf_tc_pass , 3740677dfd1SJulio Merino.Fn atf_tc_fail 3750677dfd1SJulio Merinoor 3760677dfd1SJulio Merino.Fn atf_tc_skip . 3770677dfd1SJulio MerinoThese three functions terminate the execution of the test case immediately. 3780677dfd1SJulio MerinoThe cleanup routine will be processed afterwards in a completely automated 3790677dfd1SJulio Merinoway, regardless of the test case's termination reason. 3800677dfd1SJulio Merino.Pp 3810677dfd1SJulio Merino.Fn atf_tc_pass 3820677dfd1SJulio Merinodoes not take any parameters. 3830677dfd1SJulio Merino.Fn atf_tc_fail , 3840677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal 3850677dfd1SJulio Merinoand 3860677dfd1SJulio Merino.Fn atf_tc_skip 3870677dfd1SJulio Merinotake a format string and a variable list of parameters, which describe, in 3880677dfd1SJulio Merinoa user-friendly manner, why the test case failed or was skipped, 3890677dfd1SJulio Merinorespectively. 3900677dfd1SJulio MerinoIt is very important to provide a clear error message in both cases so that 3910677dfd1SJulio Merinothe user can quickly know why the test did not pass. 3920677dfd1SJulio Merino.Ss Expectations 3930677dfd1SJulio MerinoEverything explained in the previous section changes when the test case 3940677dfd1SJulio Merinoexpectations are redefined by the programmer. 3950677dfd1SJulio Merino.Pp 3960677dfd1SJulio MerinoEach test case has an internal state called 3970677dfd1SJulio Merino.Sq expect 3980677dfd1SJulio Merinothat describes what the test case expectations are at any point in time. 3990677dfd1SJulio MerinoThe value of this property can change during execution by any of: 4000677dfd1SJulio Merino.Bl -tag -width indent 4010677dfd1SJulio Merino.It Fn atf_tc_expect_death "reason" "..." 4020677dfd1SJulio MerinoExpects the test case to exit prematurely regardless of the nature of the 4030677dfd1SJulio Merinoexit. 4040677dfd1SJulio Merino.It Fn atf_tc_expect_exit "exitcode" "reason" "..." 4050677dfd1SJulio MerinoExpects the test case to exit cleanly. 4060677dfd1SJulio MerinoIf 4070677dfd1SJulio Merino.Va exitcode 4080677dfd1SJulio Merinois not 4090677dfd1SJulio Merino.Sq -1 , 4100677dfd1SJulio Merinothe runtime engine will validate that the exit code of the test case 4110677dfd1SJulio Merinomatches the one provided in this call. 4120677dfd1SJulio MerinoOtherwise, the exact value will be ignored. 4130677dfd1SJulio Merino.It Fn atf_tc_expect_fail "reason" "..." 4140677dfd1SJulio MerinoAny failure (be it fatal or non-fatal) raised in this mode is recorded. 4150677dfd1SJulio MerinoHowever, such failures do not report the test case as failed; instead, the 4160677dfd1SJulio Merinotest case finalizes cleanly and is reported as 4170677dfd1SJulio Merino.Sq expected failure ; 4180677dfd1SJulio Merinothis report includes the provided 4190677dfd1SJulio Merino.Fa reason 4200677dfd1SJulio Merinoas part of it. 4210677dfd1SJulio MerinoIf no error is raised while running in this mode, then the test case is 4220677dfd1SJulio Merinoreported as 4230677dfd1SJulio Merino.Sq failed . 4240677dfd1SJulio Merino.Pp 4250677dfd1SJulio MerinoThis mode is useful to reproduce actual known bugs in tests. 4260677dfd1SJulio MerinoWhenever the developer fixes the bug later on, the test case will start 4270677dfd1SJulio Merinoreporting a failure, signaling the developer that the test case must be 4280677dfd1SJulio Merinoadjusted to the new conditions. 4290677dfd1SJulio MerinoIn this situation, it is useful, for example, to set 4300677dfd1SJulio Merino.Fa reason 4310677dfd1SJulio Merinoas the bug number for tracking purposes. 4320677dfd1SJulio Merino.It Fn atf_tc_expect_pass 4330677dfd1SJulio MerinoThis is the normal mode of execution. 4340677dfd1SJulio MerinoIn this mode, any failure is reported as such to the user and the test case 4350677dfd1SJulio Merinois marked as 4360677dfd1SJulio Merino.Sq failed . 4370677dfd1SJulio Merino.It Fn atf_tc_expect_signal "signo" "reason" "..." 4380677dfd1SJulio MerinoExpects the test case to terminate due to the reception of a signal. 4390677dfd1SJulio MerinoIf 4400677dfd1SJulio Merino.Va signo 4410677dfd1SJulio Merinois not 4420677dfd1SJulio Merino.Sq -1 , 4430677dfd1SJulio Merinothe runtime engine will validate that the signal that terminated the test 4440677dfd1SJulio Merinocase matches the one provided in this call. 4450677dfd1SJulio MerinoOtherwise, the exact value will be ignored. 4460677dfd1SJulio Merino.It Fn atf_tc_expect_timeout "reason" "..." 4470677dfd1SJulio MerinoExpects the test case to execute for longer than its timeout. 4480677dfd1SJulio Merino.El 4490677dfd1SJulio Merino.Ss Helper macros for common checks 4500677dfd1SJulio MerinoThe library provides several macros that are very handy in multiple 4510677dfd1SJulio Merinosituations. 4520677dfd1SJulio MerinoThese basically check some condition after executing a given statement or 4530677dfd1SJulio Merinoprocessing a given expression and, if the condition is not met, they 4540677dfd1SJulio Merinoreport the test case as failed. 4550677dfd1SJulio Merino.Pp 4560677dfd1SJulio MerinoThe 4570677dfd1SJulio Merino.Sq REQUIRE 4580677dfd1SJulio Merinovariant of the macros immediately abort the test case as soon as an error 4590677dfd1SJulio Merinocondition is detected by calling the 4600677dfd1SJulio Merino.Fn atf_tc_fail 4610677dfd1SJulio Merinofunction. 4620677dfd1SJulio MerinoUse this variant whenever it makes no sense to continue the execution of a 4630677dfd1SJulio Merinotest case when the checked condition is not met. 4640677dfd1SJulio MerinoThe 4650677dfd1SJulio Merino.Sq CHECK 4660677dfd1SJulio Merinovariant, on the other hand, reports a failure as soon as it is encountered 4670677dfd1SJulio Merinousing the 4680677dfd1SJulio Merino.Fn atf_tc_fail_nonfatal 4690677dfd1SJulio Merinofunction, but the execution of the test case continues as if nothing had 4700677dfd1SJulio Merinohappened. 4710677dfd1SJulio MerinoUse this variant whenever the checked condition is important as a result of 4720677dfd1SJulio Merinothe test case, but there are other conditions that can be subsequently 4730677dfd1SJulio Merinochecked on the same run without aborting. 4740677dfd1SJulio Merino.Pp 4750677dfd1SJulio MerinoAdditionally, the 4760677dfd1SJulio Merino.Sq MSG 4770677dfd1SJulio Merinovariants take an extra set of parameters to explicitly specify the failure 4780677dfd1SJulio Merinomessage. 4790677dfd1SJulio MerinoThis failure message is formatted according to the 4800677dfd1SJulio Merino.Xr printf 3 4810677dfd1SJulio Merinoformatters. 4820677dfd1SJulio Merino.Pp 4830677dfd1SJulio Merino.Fn ATF_CHECK , 4840677dfd1SJulio Merino.Fn ATF_CHECK_MSG , 4850677dfd1SJulio Merino.Fn ATF_REQUIRE 4860677dfd1SJulio Merinoand 4870677dfd1SJulio Merino.Fn ATF_REQUIRE_MSG 4880677dfd1SJulio Merinotake an expression and fail if the expression evaluates to false. 4890677dfd1SJulio Merino.Pp 4900677dfd1SJulio Merino.Fn ATF_CHECK_EQ , 4910677dfd1SJulio Merino.Fn ATF_CHECK_EQ_MSG , 4920677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ 4930677dfd1SJulio Merinoand 4940677dfd1SJulio Merino.Fn ATF_REQUIRE_EQ_MSG 4950677dfd1SJulio Merinotake two expressions and fail if the two evaluated values are not equal. 4960677dfd1SJulio MerinoThe common style is to put the expected value in the first parameter and the 4970677dfd1SJulio Merinoactual value in the second parameter. 4980677dfd1SJulio Merino.Pp 4990677dfd1SJulio Merino.Fn ATF_CHECK_MATCH , 5000677dfd1SJulio Merino.Fn ATF_CHECK_MATCH_MSG , 5010677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH 5020677dfd1SJulio Merinoand 5030677dfd1SJulio Merino.Fn ATF_REQUIRE_MATCH_MSG 5040677dfd1SJulio Merinotake a regular expression and a string and fail if the regular expression does 5050677dfd1SJulio Merinonot match the given string. 5060677dfd1SJulio MerinoNote that the regular expression is not anchored, so it will match anywhere in 5070677dfd1SJulio Merinothe string. 5080677dfd1SJulio Merino.Pp 5090677dfd1SJulio Merino.Fn ATF_CHECK_STREQ , 5100677dfd1SJulio Merino.Fn ATF_CHECK_STREQ_MSG , 5110677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ 5120677dfd1SJulio Merinoand 5130677dfd1SJulio Merino.Fn ATF_REQUIRE_STREQ_MSG 5140677dfd1SJulio Merinotake two strings and fail if the two are not equal character by character. 5150677dfd1SJulio MerinoThe common style is to put the expected string in the first parameter and the 5160677dfd1SJulio Merinoactual string in the second parameter. 5170677dfd1SJulio Merino.Pp 5180677dfd1SJulio Merino.Fn ATF_CHECK_ERRNO 5190677dfd1SJulio Merinoand 5200677dfd1SJulio Merino.Fn ATF_REQUIRE_ERRNO 5210677dfd1SJulio Merinotake, first, the error code that the check is expecting to find in the 5220677dfd1SJulio Merino.Va errno 5230677dfd1SJulio Merinovariable and, second, a boolean expression that, if evaluates to true, 5240677dfd1SJulio Merinomeans that a call failed and 5250677dfd1SJulio Merino.Va errno 5260677dfd1SJulio Merinohas to be checked against the first value. 5270677dfd1SJulio Merino.Ss Utility functions 5280677dfd1SJulio MerinoThe following functions are provided as part of the 5290677dfd1SJulio Merino.Nm 5300677dfd1SJulio MerinoAPI to simplify the creation of a variety of tests. 5310677dfd1SJulio MerinoIn particular, these are useful to write tests for command-line interfaces. 5320677dfd1SJulio Merino.Pp 5330677dfd1SJulio Merino.Ft void 5340677dfd1SJulio Merino.Fo atf_utils_cat_file 5350677dfd1SJulio Merino.Fa "const char *file" 5360677dfd1SJulio Merino.Fa "const char *prefix" 5370677dfd1SJulio Merino.Fc 5380677dfd1SJulio Merino.Bd -ragged -offset indent 5390677dfd1SJulio MerinoPrints the contents of 5400677dfd1SJulio Merino.Fa file 5410677dfd1SJulio Merinoto the standard output, prefixing every line with the string in 5420677dfd1SJulio Merino.Fa prefix . 5430677dfd1SJulio Merino.Ed 5440677dfd1SJulio Merino.Pp 5450677dfd1SJulio Merino.Ft bool 5460677dfd1SJulio Merino.Fo atf_utils_compare_file 5470677dfd1SJulio Merino.Fa "const char *file" 5480677dfd1SJulio Merino.Fa "const char *contents" 5490677dfd1SJulio Merino.Fc 5500677dfd1SJulio Merino.Bd -ragged -offset indent 5510677dfd1SJulio MerinoReturns true if the given 5520677dfd1SJulio Merino.Fa file 5530677dfd1SJulio Merinomatches exactly the expected inlined 5540677dfd1SJulio Merino.Fa contents . 5550677dfd1SJulio Merino.Ed 5560677dfd1SJulio Merino.Pp 5570677dfd1SJulio Merino.Ft void 5580677dfd1SJulio Merino.Fo atf_utils_copy_file 5590677dfd1SJulio Merino.Fa "const char *source" 5600677dfd1SJulio Merino.Fa "const char *destination" 5610677dfd1SJulio Merino.Fc 5620677dfd1SJulio Merino.Bd -ragged -offset indent 5630677dfd1SJulio MerinoCopies the file 5640677dfd1SJulio Merino.Fa source 5650677dfd1SJulio Merinoto 5660677dfd1SJulio Merino.Fa destination . 5670677dfd1SJulio MerinoThe permissions of the file are preserved during the code. 5680677dfd1SJulio Merino.Ed 5690677dfd1SJulio Merino.Pp 5700677dfd1SJulio Merino.Ft void 5710677dfd1SJulio Merino.Fo atf_utils_create_file 5720677dfd1SJulio Merino.Fa "const char *file" 5730677dfd1SJulio Merino.Fa "const char *contents" 5740677dfd1SJulio Merino.Fa "..." 5750677dfd1SJulio Merino.Fc 5760677dfd1SJulio Merino.Bd -ragged -offset indent 5770677dfd1SJulio MerinoCreates 5780677dfd1SJulio Merino.Fa file 5790677dfd1SJulio Merinowith the text given in 5800677dfd1SJulio Merino.Fa contents , 5810677dfd1SJulio Merinowhich is a formatting string that uses the rest of the variable arguments. 5820677dfd1SJulio Merino.Ed 5830677dfd1SJulio Merino.Pp 5840677dfd1SJulio Merino.Ft void 5850677dfd1SJulio Merino.Fo atf_utils_file_exists 5860677dfd1SJulio Merino.Fa "const char *file" 5870677dfd1SJulio Merino.Fc 5880677dfd1SJulio Merino.Bd -ragged -offset indent 5890677dfd1SJulio MerinoChecks if 5900677dfd1SJulio Merino.Fa file 5910677dfd1SJulio Merinoexists. 5920677dfd1SJulio Merino.Ed 5930677dfd1SJulio Merino.Pp 5940677dfd1SJulio Merino.Ft pid_t 5950677dfd1SJulio Merino.Fo atf_utils_fork 5960677dfd1SJulio Merino.Fa "void" 5970677dfd1SJulio Merino.Fc 5980677dfd1SJulio Merino.Bd -ragged -offset indent 5990677dfd1SJulio MerinoForks a process and redirects the standard output and standard error of the 6000677dfd1SJulio Merinochild to files for later validation with 6010677dfd1SJulio Merino.Fn atf_utils_wait . 6020677dfd1SJulio MerinoFails the test case if the fork fails, so this does not return an error. 6030677dfd1SJulio Merino.Ed 6040677dfd1SJulio Merino.Pp 6050677dfd1SJulio Merino.Ft void 6060677dfd1SJulio Merino.Fo atf_utils_free_charpp 6070677dfd1SJulio Merino.Fa "char **argv" 6080677dfd1SJulio Merino.Fc 6090677dfd1SJulio Merino.Bd -ragged -offset indent 6100677dfd1SJulio MerinoFrees a dynamically-allocated array of dynamically-allocated strings. 6110677dfd1SJulio Merino.Ed 6120677dfd1SJulio Merino.Pp 6130677dfd1SJulio Merino.Ft bool 6140677dfd1SJulio Merino.Fo atf_utils_grep_file 6150677dfd1SJulio Merino.Fa "const char *regexp" 6160677dfd1SJulio Merino.Fa "const char *file" 6170677dfd1SJulio Merino.Fa "..." 6180677dfd1SJulio Merino.Fc 6190677dfd1SJulio Merino.Bd -ragged -offset indent 6200677dfd1SJulio MerinoSearches for the 6210677dfd1SJulio Merino.Fa regexp , 6220677dfd1SJulio Merinowhich is a formatting string representing the regular expression, 6230677dfd1SJulio Merinoin the 6240677dfd1SJulio Merino.Fa file . 6250677dfd1SJulio MerinoThe variable arguments are used to construct the regular expression. 6260677dfd1SJulio Merino.Ed 6270677dfd1SJulio Merino.Pp 6280677dfd1SJulio Merino.Ft bool 6290677dfd1SJulio Merino.Fo atf_utils_grep_string 6300677dfd1SJulio Merino.Fa "const char *regexp" 6310677dfd1SJulio Merino.Fa "const char *str" 6320677dfd1SJulio Merino.Fa "..." 6330677dfd1SJulio Merino.Fc 6340677dfd1SJulio Merino.Bd -ragged -offset indent 6350677dfd1SJulio MerinoSearches for the 6360677dfd1SJulio Merino.Fa regexp , 6370677dfd1SJulio Merinowhich is a formatting string representing the regular expression, 6380677dfd1SJulio Merinoin the literal string 6390677dfd1SJulio Merino.Fa str . 6400677dfd1SJulio MerinoThe variable arguments are used to construct the regular expression. 6410677dfd1SJulio Merino.Ed 6420677dfd1SJulio Merino.Pp 6430677dfd1SJulio Merino.Ft char * 6440677dfd1SJulio Merino.Fo atf_utils_readline 6450677dfd1SJulio Merino.Fa "int fd" 6460677dfd1SJulio Merino.Fc 6470677dfd1SJulio Merino.Bd -ragged -offset indent 6480677dfd1SJulio MerinoReads a line from the file descriptor 6490677dfd1SJulio Merino.Fa fd . 6500677dfd1SJulio MerinoThe line, if any, is returned as a dynamically-allocated buffer that must be 6510677dfd1SJulio Merinoreleased with 6520677dfd1SJulio Merino.Xr free 3 . 6530677dfd1SJulio MerinoIf there was nothing to read, returns 6540677dfd1SJulio Merino.Sq NULL . 6550677dfd1SJulio Merino.Ed 6560677dfd1SJulio Merino.Pp 6570677dfd1SJulio Merino.Ft void 6580677dfd1SJulio Merino.Fo atf_utils_redirect 6590677dfd1SJulio Merino.Fa "const int fd" 6600677dfd1SJulio Merino.Fa "const char *file" 6610677dfd1SJulio Merino.Fc 6620677dfd1SJulio Merino.Bd -ragged -offset indent 6630677dfd1SJulio MerinoRedirects the given file descriptor 6640677dfd1SJulio Merino.Fa fd 6650677dfd1SJulio Merinoto 6660677dfd1SJulio Merino.Fa file . 6670677dfd1SJulio MerinoThis function exits the process in case of an error and does not properly mark 6680677dfd1SJulio Merinothe test case as failed. 6690677dfd1SJulio MerinoAs a result, it should only be used in subprocesses of the test case; specially 6700677dfd1SJulio Merinothose spawned by 6710677dfd1SJulio Merino.Fn atf_utils_fork . 6720677dfd1SJulio Merino.Ed 6730677dfd1SJulio Merino.Pp 6740677dfd1SJulio Merino.Ft void 6750677dfd1SJulio Merino.Fo atf_utils_wait 6760677dfd1SJulio Merino.Fa "const pid_t pid" 6770677dfd1SJulio Merino.Fa "const int expected_exit_status" 6780677dfd1SJulio Merino.Fa "const char *expected_stdout" 6790677dfd1SJulio Merino.Fa "const char *expected_stderr" 6800677dfd1SJulio Merino.Fc 6810677dfd1SJulio Merino.Bd -ragged -offset indent 6820677dfd1SJulio MerinoWaits and validates the result of a subprocess spawned with 683*1d303879SEnji Cooper.Fn atf_utils_fork . 6840677dfd1SJulio MerinoThe validation involves checking that the subprocess exited cleanly and returned 6850677dfd1SJulio Merinothe code specified in 6860677dfd1SJulio Merino.Fa expected_exit_status 6870677dfd1SJulio Merinoand that its standard output and standard error match the strings given in 6880677dfd1SJulio Merino.Fa expected_stdout 6890677dfd1SJulio Merinoand 6900677dfd1SJulio Merino.Fa expected_stderr . 6910677dfd1SJulio Merino.Pp 6920677dfd1SJulio MerinoIf any of the 6930677dfd1SJulio Merino.Fa expected_stdout 6940677dfd1SJulio Merinoor 6950677dfd1SJulio Merino.Fa expected_stderr 6960677dfd1SJulio Merinostrings are prefixed with 6970677dfd1SJulio Merino.Sq save: , 6980677dfd1SJulio Merinothen they specify the name of the file into which to store the stdout or stderr 6990677dfd1SJulio Merinoof the subprocess, and no comparison is performed. 7000677dfd1SJulio Merino.Ed 7010677dfd1SJulio Merino.Sh ENVIRONMENT 7020677dfd1SJulio MerinoThe following variables are recognized by 7030677dfd1SJulio Merino.Nm 7040677dfd1SJulio Merinobut should not be overridden other than for testing purposes: 7050677dfd1SJulio Merino.Pp 7060677dfd1SJulio Merino.Bl -tag -width ATFXBUILDXCXXFLAGSXX -compact 7070677dfd1SJulio Merino.It Va ATF_BUILD_CC 7080677dfd1SJulio MerinoPath to the C compiler. 7090677dfd1SJulio Merino.It Va ATF_BUILD_CFLAGS 7100677dfd1SJulio MerinoC compiler flags. 7110677dfd1SJulio Merino.It Va ATF_BUILD_CPP 7120677dfd1SJulio MerinoPath to the C/C++ preprocessor. 7130677dfd1SJulio Merino.It Va ATF_BUILD_CPPFLAGS 7140677dfd1SJulio MerinoC/C++ preprocessor flags. 7150677dfd1SJulio Merino.It Va ATF_BUILD_CXX 7160677dfd1SJulio MerinoPath to the C++ compiler. 7170677dfd1SJulio Merino.It Va ATF_BUILD_CXXFLAGS 7180677dfd1SJulio MerinoC++ compiler flags. 7190677dfd1SJulio Merino.El 7200677dfd1SJulio Merino.Sh EXAMPLES 7210677dfd1SJulio MerinoThe following shows a complete test program with a single test case that 7220677dfd1SJulio Merinovalidates the addition operator: 7230677dfd1SJulio Merino.Bd -literal -offset indent 7240677dfd1SJulio Merino#include <atf-c.h> 7250677dfd1SJulio Merino 7260677dfd1SJulio MerinoATF_TC(addition); 7270677dfd1SJulio MerinoATF_TC_HEAD(addition, tc) 7280677dfd1SJulio Merino{ 7290677dfd1SJulio Merino atf_tc_set_md_var(tc, "descr", 7300677dfd1SJulio Merino "Sample tests for the addition operator"); 7310677dfd1SJulio Merino} 7320677dfd1SJulio MerinoATF_TC_BODY(addition, tc) 7330677dfd1SJulio Merino{ 7340677dfd1SJulio Merino ATF_CHECK_EQ(0, 0 + 0); 7350677dfd1SJulio Merino ATF_CHECK_EQ(1, 0 + 1); 7360677dfd1SJulio Merino ATF_CHECK_EQ(1, 1 + 0); 7370677dfd1SJulio Merino 7380677dfd1SJulio Merino ATF_CHECK_EQ(2, 1 + 1); 7390677dfd1SJulio Merino 7400677dfd1SJulio Merino ATF_CHECK_EQ(300, 100 + 200); 7410677dfd1SJulio Merino} 7420677dfd1SJulio Merino 7430677dfd1SJulio MerinoATF_TC(string_formatting); 7440677dfd1SJulio MerinoATF_TC_HEAD(string_formatting, tc) 7450677dfd1SJulio Merino{ 7460677dfd1SJulio Merino atf_tc_set_md_var(tc, "descr", 7470677dfd1SJulio Merino "Sample tests for the snprintf"); 7480677dfd1SJulio Merino} 7490677dfd1SJulio MerinoATF_TC_BODY(string_formatting, tc) 7500677dfd1SJulio Merino{ 7510677dfd1SJulio Merino char buf[1024]; 7520677dfd1SJulio Merino snprintf(buf, sizeof(buf), "a %s", "string"); 7530677dfd1SJulio Merino ATF_CHECK_STREQ_MSG("a string", buf, "%s is not working"); 7540677dfd1SJulio Merino} 7550677dfd1SJulio Merino 7560677dfd1SJulio MerinoATF_TC(open_failure); 7570677dfd1SJulio MerinoATF_TC_HEAD(open_failure, tc) 7580677dfd1SJulio Merino{ 7590677dfd1SJulio Merino atf_tc_set_md_var(tc, "descr", 7600677dfd1SJulio Merino "Sample tests for the open function"); 7610677dfd1SJulio Merino} 7620677dfd1SJulio MerinoATF_TC_BODY(open_failure, tc) 7630677dfd1SJulio Merino{ 7640677dfd1SJulio Merino ATF_CHECK_ERRNO(ENOENT, open("non-existent", O_RDONLY) == -1); 7650677dfd1SJulio Merino} 7660677dfd1SJulio Merino 7670677dfd1SJulio MerinoATF_TC(known_bug); 7680677dfd1SJulio MerinoATF_TC_HEAD(known_bug, tc) 7690677dfd1SJulio Merino{ 7700677dfd1SJulio Merino atf_tc_set_md_var(tc, "descr", 7710677dfd1SJulio Merino "Reproduces a known bug"); 7720677dfd1SJulio Merino} 7730677dfd1SJulio MerinoATF_TC_BODY(known_bug, tc) 7740677dfd1SJulio Merino{ 7750677dfd1SJulio Merino atf_tc_expect_fail("See bug number foo/bar"); 7760677dfd1SJulio Merino ATF_CHECK_EQ(3, 1 + 1); 7770677dfd1SJulio Merino atf_tc_expect_pass(); 7780677dfd1SJulio Merino ATF_CHECK_EQ(3, 1 + 2); 7790677dfd1SJulio Merino} 7800677dfd1SJulio Merino 7810677dfd1SJulio MerinoATF_TP_ADD_TCS(tp) 7820677dfd1SJulio Merino{ 7830677dfd1SJulio Merino ATF_TP_ADD_TC(tp, addition); 7840677dfd1SJulio Merino ATF_TP_ADD_TC(tp, string_formatting); 7850677dfd1SJulio Merino ATF_TP_ADD_TC(tp, open_failure); 7860677dfd1SJulio Merino ATF_TP_ADD_TC(tp, known_bug); 7870677dfd1SJulio Merino 7880677dfd1SJulio Merino return atf_no_error(); 7890677dfd1SJulio Merino} 7900677dfd1SJulio Merino.Ed 7910677dfd1SJulio Merino.Sh SEE ALSO 7920677dfd1SJulio Merino.Xr atf-test-program 1 , 7930677dfd1SJulio Merino.Xr atf-test-case 4 794