1*5ade3599Smpi /* $OpenBSD: atf-c.h,v 1.1 2020/02/28 12:48:30 mpi Exp $ */ 2*5ade3599Smpi /* 3*5ade3599Smpi * Copyright (c) 2019 Moritz Buhl <openbsd@moritzbuhl.de> 4*5ade3599Smpi * 5*5ade3599Smpi * Permission to use, copy, modify, and distribute this software for any 6*5ade3599Smpi * purpose with or without fee is hereby granted, provided that the above 7*5ade3599Smpi * copyright notice and this permission notice appear in all copies. 8*5ade3599Smpi * 9*5ade3599Smpi * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10*5ade3599Smpi * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*5ade3599Smpi * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12*5ade3599Smpi * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*5ade3599Smpi * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*5ade3599Smpi * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15*5ade3599Smpi * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16*5ade3599Smpi */ 17*5ade3599Smpi 18*5ade3599Smpi #if !defined(ATF_C_H) 19*5ade3599Smpi #define ATF_C_H 20*5ade3599Smpi 21*5ade3599Smpi #include <pwd.h> 22*5ade3599Smpi #include <stdio.h> 23*5ade3599Smpi #include <string.h> 24*5ade3599Smpi #include <unistd.h> 25*5ade3599Smpi 26*5ade3599Smpi 27*5ade3599Smpi int atf_test(int, int); 28*5ade3599Smpi void atf_require(int, int, const char *, const char *, const int, char *, ...); 29*5ade3599Smpi void atf_tc_fail(char *, ...) 30*5ade3599Smpi __attribute__((__noreturn__, __format__ (printf, 1, 2))); 31*5ade3599Smpi 32*5ade3599Smpi #define ATF_INSPECT_TEST 1 33*5ade3599Smpi #define ATF_RUN_TEST 2 34*5ade3599Smpi #define ATF_CLEANUP_TEST 3 35*5ade3599Smpi 36*5ade3599Smpi #define ATF_TC_FUNCTIONS(fn) \ 37*5ade3599Smpi void atf_head_##fn(void); \ 38*5ade3599Smpi void atf_body_##fn(void); \ 39*5ade3599Smpi void atf_cleanup_##fn(void); 40*5ade3599Smpi 41*5ade3599Smpi #define ATF_TC(fn) \ 42*5ade3599Smpi ATF_TC_FUNCTIONS(fn) \ 43*5ade3599Smpi void atf_cleanup_##fn(void) { return; } 44*5ade3599Smpi 45*5ade3599Smpi #define ATF_TC_WITH_CLEANUP(fn) \ 46*5ade3599Smpi ATF_TC_FUNCTIONS(fn) 47*5ade3599Smpi 48*5ade3599Smpi #define ATF_TC_WITHOUT_HEAD(fn) ATF_TC_HEAD(fn, NULL) 49*5ade3599Smpi #define ATF_TC_HEAD(fn, tc) void atf_head_##fn(void) 50*5ade3599Smpi #define ATF_TC_BODY(fn, tc) void atf_body_##fn(void) 51*5ade3599Smpi #define ATF_TC_CLEANUP(fn, tc) void atf_cleanup_##fn(void) 52*5ade3599Smpi 53*5ade3599Smpi 54*5ade3599Smpi #define ATF_TP_ADD_TCS(tp) int atf_test(int tst, int what) 55*5ade3599Smpi #define ATF_TP_ADD_TC(tp, fn) tst--; \ 56*5ade3599Smpi if (tst == 0) { \ 57*5ade3599Smpi if (what == ATF_RUN_TEST) \ 58*5ade3599Smpi atf_body_##fn(); \ 59*5ade3599Smpi return 0; \ 60*5ade3599Smpi } 61*5ade3599Smpi 62*5ade3599Smpi #define atf_no_error() (-tst) 63*5ade3599Smpi 64*5ade3599Smpi #define ATF_INSPECT(i) atf_test(i, ATF_INSPECT_TEST) 65*5ade3599Smpi #define ATF_RUN(i) atf_test(i, ATF_RUN_TEST) 66*5ade3599Smpi #define ATF_CLEANUP(i) atf_test(i, ATF_CLEANUP_TEST) 67*5ade3599Smpi 68*5ade3599Smpi #define atf_tc_set_md_var(tc, attr, fmt, ...) \ 69*5ade3599Smpi if (strcmp(attr, "descr") == 0) \ 70*5ade3599Smpi printf("DESCR=\"" fmt "\"\n", ##__VA_ARGS__); \ 71*5ade3599Smpi else if (strcmp(attr, "require.user") == 0) \ 72*5ade3599Smpi printf("REQ_USER=" fmt "\n", ##__VA_ARGS__); 73*5ade3599Smpi 74*5ade3599Smpi #define ATF_CHECK ATF_REQUIRE 75*5ade3599Smpi #define ATF_CHECK_MSG ATF_REQUIRE_MSG 76*5ade3599Smpi #define ATF_CHECK_EQ ATF_REQUIRE_EQ 77*5ade3599Smpi 78*5ade3599Smpi #define atf_req(exp, err, msg, ...) \ 79*5ade3599Smpi atf_require(exp, err, #exp, __FILE__, __LINE__, NULL) 80*5ade3599Smpi #define ATF_REQUIRE(exp) atf_req(exp, -1, NULL) 81*5ade3599Smpi #define ATF_REQUIRE_ERRNO(no, exp) atf_req(exp, no, NULL) 82*5ade3599Smpi #define ATF_REQUIRE_MSG(exp, fmt, ...) atf_req(exp, -1, fmt, ##__VA_ARGS__) 83*5ade3599Smpi #define ATF_REQUIRE_EQ(a, b) atf_req((a) == (b), -1, NULL) 84*5ade3599Smpi #define ATF_REQUIRE_EQ_MSG(a, b, fmt, ...) \ 85*5ade3599Smpi atf_req((a) == (b), -1, fmt, ##__VA_ARGS__) 86*5ade3599Smpi 87*5ade3599Smpi #define atf_tc_fail_nonfatal(fmt, ...) atf_tc_fail(fmt, ##__VA_ARGS__) 88*5ade3599Smpi #define atf_tc_expect_fail(fmt, ...) \ 89*5ade3599Smpi atf_tc_fail(fmt "\nEXPECTED_FAIL", ##__VA_ARGS__) 90*5ade3599Smpi #define atf_tc_skip(fmt, ...) \ 91*5ade3599Smpi atf_tc_fail(fmt "\nSKIPPING", ##__VA_ARGS__) 92*5ade3599Smpi #define atf_tc_pass() exit(0) 93*5ade3599Smpi 94*5ade3599Smpi #define atf_tc_get_config_var(a, b) "." 95*5ade3599Smpi 96*5ade3599Smpi #define atf_utils_fork() fork() 97*5ade3599Smpi 98*5ade3599Smpi #define atf_tc_get_config_var_as_bool_wd(tc, str, b) 0 99*5ade3599Smpi 100*5ade3599Smpi #endif /* !defined(ATF_C_H) */ 101