|
NAMEatf-c , ATF_CHECK ,
ATF_CHECK_MSG , ATF_CHECK_EQ ,
ATF_CHECK_EQ_MSG ,
ATF_CHECK_MATCH ,
ATF_CHECK_MATCH_MSG ,
ATF_CHECK_STREQ ,
ATF_CHECK_STREQ_MSG ,
ATF_CHECK_ERRNO , ATF_REQUIRE ,
ATF_REQUIRE_MSG ,
ATF_REQUIRE_EQ ,
ATF_REQUIRE_EQ_MSG ,
ATF_REQUIRE_MATCH ,
ATF_REQUIRE_MATCH_MSG ,
ATF_REQUIRE_STREQ ,
ATF_REQUIRE_STREQ_MSG ,
ATF_REQUIRE_ERRNO , ATF_TC ,
ATF_TC_BODY , ATF_TC_BODY_NAME ,
ATF_TC_CLEANUP ,
ATF_TC_CLEANUP_NAME ,
ATF_TC_HEAD , ATF_TC_HEAD_NAME ,
ATF_TC_NAME ,
ATF_TC_WITH_CLEANUP ,
ATF_TC_WITHOUT_HEAD ,
ATF_TP_ADD_TC , ATF_TP_ADD_TCS ,
atf_tc_get_config_var ,
atf_tc_get_config_var_wd ,
atf_tc_get_config_var_as_bool ,
atf_tc_get_config_var_as_bool_wd ,
atf_tc_get_config_var_as_long ,
atf_tc_get_config_var_as_long_wd ,
atf_no_error ,
atf_tc_expect_death ,
atf_tc_expect_exit ,
atf_tc_expect_fail ,
atf_tc_expect_pass ,
atf_tc_expect_signal ,
atf_tc_expect_timeout ,
atf_tc_fail ,
atf_tc_fail_nonfatal ,
atf_tc_pass , atf_tc_skip ,
atf_utils_cat_file ,
atf_utils_compare_file ,
atf_utils_copy_file ,
atf_utils_create_file ,
atf_utils_file_exists ,
atf_utils_fork ,
atf_utils_free_charpp ,
atf_utils_grep_file ,
atf_utils_grep_string ,
atf_utils_readline ,
atf_utils_redirect ,
atf_utils_wait —
C API to write ATF-based test programs
SYNOPSIS#include <atf-c.h>
void
bool
void
void
void
pid_t
void
bool
bool
char *
void
void
DESCRIPTIONATF provides a C programming interface to implement test programs. C-based test programs follow this template:... C-specific includes go here ... #include <atf-c.h> ATF_TC(tc1); ATF_TC_HEAD(tc1, tc) { ... first test case's header ... } ATF_TC_BODY(tc1, tc) { ... first test case's body ... } ATF_TC_WITH_CLEANUP(tc2); ATF_TC_HEAD(tc2, tc) { ... second test case's header ... } ATF_TC_BODY(tc2, tc) { ... second test case's body ... } ATF_TC_CLEANUP(tc2, tc) { ... second test case's cleanup ... } ATF_TC_WITHOUT_HEAD(tc3); ATF_TC_BODY(tc3, tc) { ... third test case's body ... } ... additional test cases ... ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tcs, tc1); ATF_TP_ADD_TC(tcs, tc2); ATF_TP_ADD_TC(tcs, tc3); ... add additional test cases ... return atf_no_error(); } Definition of test casesTest cases have an identifier and are composed of three different parts: the header, the body and an optional cleanup routine, all of which are described in atf-test-case(4). To define test cases, one can use theATF_TC (),
ATF_TC_WITH_CLEANUP () or the
ATF_TC_WITHOUT_HEAD () macros, which take a single
parameter specifying the test case's name. ATF_TC (),
requires to define a head and a body for the test case,
ATF_TC_WITH_CLEANUP () requires to define a head, a
body and a cleanup for the test case and
ATF_TC_WITHOUT_HEAD () requires only a body for the
test case. It is important to note that these do not set the
test case up for execution when the program is run. In order to do so, a later
registration is needed with the ATF_TP_ADD_TC () macro
detailed in Program
initialization.
Later on, one must define the three parts of the body by means of
three functions. Their headers are given by the
Program initializationThe library provides a way to easily define the test program'smain () function. You should never define one on your
own, but rely on the library to do it for you. This is done by using the
ATF_TP_ADD_TCS () macro, which is passed the name of
the object that will hold the test cases, i.e., the test program instance.
This name can be whatever you want as long as it is a valid variable
identifier.
After the macro, you are supposed to provide the body of a
function, which should only use the Header definitionsThe test case's header can define the meta-data by using theatf_tc_set_md_var () method, which takes three
parameters: the first one points to the test case data, the second one
specifies the meta-data variable to be set and the third one specifies its
value. Both of them are strings.
Configuration variablesThe test case has read-only access to the current configuration variables by means of the boolatf_tc_has_config_var (), const char
* atf_tc_get_config_var (), const
char * atf_tc_get_config_var_wd (),
bool
atf_tc_get_config_var_as_bool (),
bool
atf_tc_get_config_var_as_bool_wd (),
long
atf_tc_get_config_var_as_long (), and the
long
atf_tc_get_config_var_as_long_wd () functions, which
can be called in any of the three parts of a test case.
The ‘_wd’ variants take a default value for the variable which is returned if the variable is not defined. The other functions without the ‘_wd’ suffix require the variable to be defined. Access to the source directoryIt is possible to get the path to the test case's source directory from any of its three components by querying the ‘srcdir’ configuration variable.Requiring programsAside from the require.progs meta-data variable available in the header only, one can also check for additional programs in the test case's body by using theatf_tc_require_prog ()
function, which takes the base name or full path of a single binary. Relative
paths are forbidden. If it is not found, the test case will be automatically
skipped.
Test case finalizationThe test case finalizes either when the body reaches its end, at which point the test is assumed to have passed, unless any non-fatal errors were raised usingatf_tc_fail_nonfatal (), or at any
explicit call to atf_tc_pass (),
atf_tc_fail () or
atf_tc_skip (). These three functions terminate the
execution of the test case immediately. The cleanup routine will be processed
afterwards in a completely automated way, regardless of the test case's
termination reason.
ExpectationsEverything explained in the previous section changes when the test case expectations are redefined by the programmer.Each test case has an internal state called ‘expect’ that describes what the test case expectations are at any point in time. The value of this property can change during execution by any of:
Helper macros for common checksThe library provides several macros that are very handy in multiple situations. These basically check some condition after executing a given statement or processing a given expression and, if the condition is not met, they report the test case as failed.The ‘REQUIRE’ variant of the macros immediately
abort the test case as soon as an error condition is detected by calling the
Additionally, the ‘MSG’ variants take an extra set of parameters to explicitly specify the failure message. This failure message is formatted according to the printf(3) formatters.
Utility functionsThe following functions are provided as part of theatf-c API to simplify the creation of a variety of
tests. In particular, these are useful to write tests for command-line
interfaces.
void
Prints the contents of file
to the standard output, prefixing every line with the string in
prefix.
bool
Returns true if the given
file matches exactly the expected inlined
contents.
void
Copies the file source to
destination. The permissions of the file are preserved
during the code.
void
Creates file with the text
given in contents, which is a formatting string that
uses the rest of the variable arguments.
void
Checks if file exists.
pid_t
Forks a process and redirects the standard output
and standard error of the child to files for later validation with
atf_utils_wait (). Fails the test case if the fork
fails, so this does not return an error.void
Frees a dynamically-allocated array of
dynamically-allocated strings.
bool
Searches for the regexp,
which is a formatting string representing the regular expression, in the
file. The variable arguments are used to construct the
regular expression.
bool
Searches for the regexp,
which is a formatting string representing the regular expression, in the
literal string str. The variable arguments are used to
construct the regular expression.
char *
Reads a line from the file descriptor
fd. The line, if any, is returned as a
dynamically-allocated buffer that must be released with
free(3). If
there was nothing to read, returns ‘NULL’.
void
Redirects the given file descriptor
fd to file. This function exits
the process in case of an error and does not properly mark the test case as
failed. As a result, it should only be used in subprocesses of the test case;
specially those spawned by
atf_utils_fork ().void
Waits and validates the result of a subprocess
spawned with
atf_utils_fork (). The validation involves
checking that the subprocess exited cleanly and returned the code specified in
expected_exit_status and that its standard output and
standard error match the strings given in
expected_stdout and
expected_stderr.
If any of the expected_stdout or expected_stderr strings are prefixed with ‘save:’, then they specify the name of the file into which to store the stdout or stderr of the subprocess, and no comparison is performed. ENVIRONMENTThe following variables are recognized byatf-c but
should not be overridden other than for testing purposes:
EXAMPLESThe following shows a complete test program with a single test case that validates the addition operator:#include <atf-c.h> ATF_TC(addition); ATF_TC_HEAD(addition, tc) { atf_tc_set_md_var(tc, "descr", "Sample tests for the addition operator"); } ATF_TC_BODY(addition, tc) { ATF_CHECK_EQ(0, 0 + 0); ATF_CHECK_EQ(1, 0 + 1); ATF_CHECK_EQ(1, 1 + 0); ATF_CHECK_EQ(2, 1 + 1); ATF_CHECK_EQ(300, 100 + 200); } ATF_TC(string_formatting); ATF_TC_HEAD(string_formatting, tc) { atf_tc_set_md_var(tc, "descr", "Sample tests for the snprintf"); } ATF_TC_BODY(string_formatting, tc) { char buf[1024]; snprintf(buf, sizeof(buf), "a %s", "string"); ATF_CHECK_STREQ_MSG("a string", buf, "%s is not working"); } ATF_TC(open_failure); ATF_TC_HEAD(open_failure, tc) { atf_tc_set_md_var(tc, "descr", "Sample tests for the open function"); } ATF_TC_BODY(open_failure, tc) { ATF_CHECK_ERRNO(ENOENT, open("non-existent", O_RDONLY) == -1); } ATF_TC(known_bug); ATF_TC_HEAD(known_bug, tc) { atf_tc_set_md_var(tc, "descr", "Reproduces a known bug"); } ATF_TC_BODY(known_bug, tc) { atf_tc_expect_fail("See bug number foo/bar"); ATF_CHECK_EQ(3, 1 + 1); atf_tc_expect_pass(); ATF_CHECK_EQ(3, 1 + 2); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, addition); ATF_TP_ADD_TC(tp, string_formatting); ATF_TP_ADD_TC(tp, open_failure); ATF_TP_ADD_TC(tp, known_bug); return atf_no_error(); } SEE ALSOatf-test-program(1), atf-test-case(4)
Visit the GSP FreeBSD Man Page Interface. |