1*00b67f09SDavid van Moolenbroek /* $NetBSD: macros.h,v 1.4 2014/12/10 04:38:03 christos Exp $ */ 2*00b67f09SDavid van Moolenbroek 3*00b67f09SDavid van Moolenbroek /* 4*00b67f09SDavid van Moolenbroek * Automated Testing Framework (atf) 5*00b67f09SDavid van Moolenbroek * 6*00b67f09SDavid van Moolenbroek * Copyright (c) 2008 The NetBSD Foundation, Inc. 7*00b67f09SDavid van Moolenbroek * All rights reserved. 8*00b67f09SDavid van Moolenbroek * 9*00b67f09SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 10*00b67f09SDavid van Moolenbroek * modification, are permitted provided that the following conditions 11*00b67f09SDavid van Moolenbroek * are met: 12*00b67f09SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 13*00b67f09SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 14*00b67f09SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 15*00b67f09SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 16*00b67f09SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 17*00b67f09SDavid van Moolenbroek * 18*00b67f09SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 19*00b67f09SDavid van Moolenbroek * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 20*00b67f09SDavid van Moolenbroek * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21*00b67f09SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22*00b67f09SDavid van Moolenbroek * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 23*00b67f09SDavid van Moolenbroek * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24*00b67f09SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 25*00b67f09SDavid van Moolenbroek * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*00b67f09SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 27*00b67f09SDavid van Moolenbroek * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28*00b67f09SDavid van Moolenbroek * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 29*00b67f09SDavid van Moolenbroek * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*00b67f09SDavid van Moolenbroek */ 31*00b67f09SDavid van Moolenbroek 32*00b67f09SDavid van Moolenbroek #if !defined(ATF_C_MACROS_H) 33*00b67f09SDavid van Moolenbroek #define ATF_C_MACROS_H 34*00b67f09SDavid van Moolenbroek 35*00b67f09SDavid van Moolenbroek #include <string.h> 36*00b67f09SDavid van Moolenbroek 37*00b67f09SDavid van Moolenbroek #include <atf-c/defs.h> 38*00b67f09SDavid van Moolenbroek #include <atf-c/error.h> 39*00b67f09SDavid van Moolenbroek #include <atf-c/tc.h> 40*00b67f09SDavid van Moolenbroek #include <atf-c/tp.h> 41*00b67f09SDavid van Moolenbroek #include <atf-c/utils.h> 42*00b67f09SDavid van Moolenbroek 43*00b67f09SDavid van Moolenbroek #define ATF_TC_NAME(tc) \ 44*00b67f09SDavid van Moolenbroek (atfu_ ## tc ## _tc) 45*00b67f09SDavid van Moolenbroek 46*00b67f09SDavid van Moolenbroek #define ATF_TC_PACK_NAME(tc) \ 47*00b67f09SDavid van Moolenbroek (atfu_ ## tc ## _tc_pack) 48*00b67f09SDavid van Moolenbroek 49*00b67f09SDavid van Moolenbroek #define ATF_TC_WITHOUT_HEAD(tc) \ 50*00b67f09SDavid van Moolenbroek static void atfu_ ## tc ## _body(const atf_tc_t *); \ 51*00b67f09SDavid van Moolenbroek static atf_tc_t atfu_ ## tc ## _tc; \ 52*00b67f09SDavid van Moolenbroek static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ 53*00b67f09SDavid van Moolenbroek .m_ident = #tc, \ 54*00b67f09SDavid van Moolenbroek .m_head = NULL, \ 55*00b67f09SDavid van Moolenbroek .m_body = atfu_ ## tc ## _body, \ 56*00b67f09SDavid van Moolenbroek .m_cleanup = NULL, \ 57*00b67f09SDavid van Moolenbroek } 58*00b67f09SDavid van Moolenbroek 59*00b67f09SDavid van Moolenbroek #define ATF_TC(tc) \ 60*00b67f09SDavid van Moolenbroek static void atfu_ ## tc ## _head(atf_tc_t *); \ 61*00b67f09SDavid van Moolenbroek static void atfu_ ## tc ## _body(const atf_tc_t *); \ 62*00b67f09SDavid van Moolenbroek static atf_tc_t atfu_ ## tc ## _tc; \ 63*00b67f09SDavid van Moolenbroek static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ 64*00b67f09SDavid van Moolenbroek .m_ident = #tc, \ 65*00b67f09SDavid van Moolenbroek .m_head = atfu_ ## tc ## _head, \ 66*00b67f09SDavid van Moolenbroek .m_body = atfu_ ## tc ## _body, \ 67*00b67f09SDavid van Moolenbroek .m_cleanup = NULL, \ 68*00b67f09SDavid van Moolenbroek } 69*00b67f09SDavid van Moolenbroek 70*00b67f09SDavid van Moolenbroek #define ATF_TC_WITH_CLEANUP(tc) \ 71*00b67f09SDavid van Moolenbroek static void atfu_ ## tc ## _head(atf_tc_t *); \ 72*00b67f09SDavid van Moolenbroek static void atfu_ ## tc ## _body(const atf_tc_t *); \ 73*00b67f09SDavid van Moolenbroek static void atfu_ ## tc ## _cleanup(const atf_tc_t *); \ 74*00b67f09SDavid van Moolenbroek static atf_tc_t atfu_ ## tc ## _tc; \ 75*00b67f09SDavid van Moolenbroek static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ 76*00b67f09SDavid van Moolenbroek .m_ident = #tc, \ 77*00b67f09SDavid van Moolenbroek .m_head = atfu_ ## tc ## _head, \ 78*00b67f09SDavid van Moolenbroek .m_body = atfu_ ## tc ## _body, \ 79*00b67f09SDavid van Moolenbroek .m_cleanup = atfu_ ## tc ## _cleanup, \ 80*00b67f09SDavid van Moolenbroek } 81*00b67f09SDavid van Moolenbroek 82*00b67f09SDavid van Moolenbroek #define ATF_TC_HEAD(tc, tcptr) \ 83*00b67f09SDavid van Moolenbroek static \ 84*00b67f09SDavid van Moolenbroek void \ 85*00b67f09SDavid van Moolenbroek atfu_ ## tc ## _head(atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) 86*00b67f09SDavid van Moolenbroek 87*00b67f09SDavid van Moolenbroek #define ATF_TC_HEAD_NAME(tc) \ 88*00b67f09SDavid van Moolenbroek (atfu_ ## tc ## _head) 89*00b67f09SDavid van Moolenbroek 90*00b67f09SDavid van Moolenbroek #define ATF_TC_BODY(tc, tcptr) \ 91*00b67f09SDavid van Moolenbroek static \ 92*00b67f09SDavid van Moolenbroek void \ 93*00b67f09SDavid van Moolenbroek atfu_ ## tc ## _body(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) 94*00b67f09SDavid van Moolenbroek 95*00b67f09SDavid van Moolenbroek #define ATF_TC_BODY_NAME(tc) \ 96*00b67f09SDavid van Moolenbroek (atfu_ ## tc ## _body) 97*00b67f09SDavid van Moolenbroek 98*00b67f09SDavid van Moolenbroek #define ATF_TC_CLEANUP(tc, tcptr) \ 99*00b67f09SDavid van Moolenbroek static \ 100*00b67f09SDavid van Moolenbroek void \ 101*00b67f09SDavid van Moolenbroek atfu_ ## tc ## _cleanup(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) 102*00b67f09SDavid van Moolenbroek 103*00b67f09SDavid van Moolenbroek #define ATF_TC_CLEANUP_NAME(tc) \ 104*00b67f09SDavid van Moolenbroek (atfu_ ## tc ## _cleanup) 105*00b67f09SDavid van Moolenbroek 106*00b67f09SDavid van Moolenbroek #define ATF_TP_ADD_TCS(tps) \ 107*00b67f09SDavid van Moolenbroek static atf_error_t atfu_tp_add_tcs(atf_tp_t *); \ 108*00b67f09SDavid van Moolenbroek int atf_tp_main(int, char **, atf_error_t (*)(atf_tp_t *)); \ 109*00b67f09SDavid van Moolenbroek \ 110*00b67f09SDavid van Moolenbroek int \ 111*00b67f09SDavid van Moolenbroek main(int argc, char **argv) \ 112*00b67f09SDavid van Moolenbroek { \ 113*00b67f09SDavid van Moolenbroek return atf_tp_main(argc, argv, atfu_tp_add_tcs); \ 114*00b67f09SDavid van Moolenbroek } \ 115*00b67f09SDavid van Moolenbroek static \ 116*00b67f09SDavid van Moolenbroek atf_error_t \ 117*00b67f09SDavid van Moolenbroek atfu_tp_add_tcs(atf_tp_t *tps) 118*00b67f09SDavid van Moolenbroek 119*00b67f09SDavid van Moolenbroek #define ATF_TP_ADD_TC(tp, tc) \ 120*00b67f09SDavid van Moolenbroek do { \ 121*00b67f09SDavid van Moolenbroek atf_error_t atfu_err; \ 122*00b67f09SDavid van Moolenbroek char **atfu_config = atf_tp_get_config(tp); \ 123*00b67f09SDavid van Moolenbroek if (atfu_config == NULL) \ 124*00b67f09SDavid van Moolenbroek return atf_no_memory_error(); \ 125*00b67f09SDavid van Moolenbroek atfu_err = atf_tc_init_pack(&atfu_ ## tc ## _tc, \ 126*00b67f09SDavid van Moolenbroek &atfu_ ## tc ## _tc_pack, \ 127*00b67f09SDavid van Moolenbroek (const char *const *)atfu_config); \ 128*00b67f09SDavid van Moolenbroek atf_utils_free_charpp(atfu_config); \ 129*00b67f09SDavid van Moolenbroek if (atf_is_error(atfu_err)) \ 130*00b67f09SDavid van Moolenbroek return atfu_err; \ 131*00b67f09SDavid van Moolenbroek atfu_err = atf_tp_add_tc(tp, &atfu_ ## tc ## _tc); \ 132*00b67f09SDavid van Moolenbroek if (atf_is_error(atfu_err)) \ 133*00b67f09SDavid van Moolenbroek return atfu_err; \ 134*00b67f09SDavid van Moolenbroek } while (/*CONSTCOND*/0) 135*00b67f09SDavid van Moolenbroek 136*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_MSG(x, fmt, ...) \ 137*00b67f09SDavid van Moolenbroek do { \ 138*00b67f09SDavid van Moolenbroek if (!(x)) \ 139*00b67f09SDavid van Moolenbroek atf_tc_fail_requirement(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \ 140*00b67f09SDavid van Moolenbroek } while(/*CONSTCOND*/0) 141*00b67f09SDavid van Moolenbroek 142*00b67f09SDavid van Moolenbroek #define ATF_CHECK_MSG(x, fmt, ...) \ 143*00b67f09SDavid van Moolenbroek do { \ 144*00b67f09SDavid van Moolenbroek if (!(x)) \ 145*00b67f09SDavid van Moolenbroek atf_tc_fail_check(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \ 146*00b67f09SDavid van Moolenbroek } while(/*CONSTCOND*/0) 147*00b67f09SDavid van Moolenbroek 148*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE(x) \ 149*00b67f09SDavid van Moolenbroek do { \ 150*00b67f09SDavid van Moolenbroek if (!(x)) \ 151*00b67f09SDavid van Moolenbroek atf_tc_fail_requirement(__FILE__, __LINE__, "%s", #x " not met"); \ 152*00b67f09SDavid van Moolenbroek } while(/*CONSTCOND*/0) 153*00b67f09SDavid van Moolenbroek 154*00b67f09SDavid van Moolenbroek #define ATF_CHECK(x) \ 155*00b67f09SDavid van Moolenbroek do { \ 156*00b67f09SDavid van Moolenbroek if (!(x)) \ 157*00b67f09SDavid van Moolenbroek atf_tc_fail_check(__FILE__, __LINE__, "%s", #x " not met"); \ 158*00b67f09SDavid van Moolenbroek } while(/*CONSTCOND*/0) 159*00b67f09SDavid van Moolenbroek 160*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_EQ(x, y) \ 161*00b67f09SDavid van Moolenbroek ATF_REQUIRE_MSG((x) == (y), "%s != %s", #x, #y) 162*00b67f09SDavid van Moolenbroek 163*00b67f09SDavid van Moolenbroek #define ATF_CHECK_EQ(x, y) \ 164*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG((x) == (y), "%s != %s", #x, #y) 165*00b67f09SDavid van Moolenbroek 166*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_EQ_MSG(x, y, fmt, ...) \ 167*00b67f09SDavid van Moolenbroek ATF_REQUIRE_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__) 168*00b67f09SDavid van Moolenbroek 169*00b67f09SDavid van Moolenbroek #define ATF_CHECK_EQ_MSG(x, y, fmt, ...) \ 170*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__) 171*00b67f09SDavid van Moolenbroek 172*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_STREQ(x, y) \ 173*00b67f09SDavid van Moolenbroek ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y) 174*00b67f09SDavid van Moolenbroek 175*00b67f09SDavid van Moolenbroek #define ATF_CHECK_STREQ(x, y) \ 176*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y) 177*00b67f09SDavid van Moolenbroek 178*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_STREQ_MSG(x, y, fmt, ...) \ 179*00b67f09SDavid van Moolenbroek ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \ 180*00b67f09SDavid van Moolenbroek #x, #y, x, y, ##__VA_ARGS__) 181*00b67f09SDavid van Moolenbroek 182*00b67f09SDavid van Moolenbroek #define ATF_CHECK_STREQ_MSG(x, y, fmt, ...) \ 183*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \ 184*00b67f09SDavid van Moolenbroek #x, #y, x, y, ##__VA_ARGS__) 185*00b67f09SDavid van Moolenbroek 186*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_MATCH(regexp, string) \ 187*00b67f09SDavid van Moolenbroek ATF_REQUIRE_MSG(atf_utils_grep_string("%s", string, regexp), \ 188*00b67f09SDavid van Moolenbroek "'%s' not matched in '%s'", regexp, string); 189*00b67f09SDavid van Moolenbroek 190*00b67f09SDavid van Moolenbroek #define ATF_CHECK_MATCH(regexp, string) \ 191*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG(atf_utils_grep_string("%s", string, regexp), \ 192*00b67f09SDavid van Moolenbroek "'%s' not matched in '%s'", regexp, string); 193*00b67f09SDavid van Moolenbroek 194*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_MATCH_MSG(regexp, string, fmt, ...) \ 195*00b67f09SDavid van Moolenbroek ATF_REQUIRE_MSG(atf_utils_grep_string("%s", string, regexp), \ 196*00b67f09SDavid van Moolenbroek "'%s' not matched in '%s': " fmt, regexp, string, \ 197*00b67f09SDavid van Moolenbroek ##__VA_ARGS__); 198*00b67f09SDavid van Moolenbroek 199*00b67f09SDavid van Moolenbroek #define ATF_CHECK_MATCH_MSG(regexp, string, fmt, ...) \ 200*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG(atf_utils_grep_string("%s", string, regexp), \ 201*00b67f09SDavid van Moolenbroek "'%s' not matched in '%s': " fmt, regexp, string, \ 202*00b67f09SDavid van Moolenbroek ##__VA_ARGS__); 203*00b67f09SDavid van Moolenbroek 204*00b67f09SDavid van Moolenbroek #define ATF_CHECK_ERRNO(exp_errno, bool_expr) \ 205*00b67f09SDavid van Moolenbroek atf_tc_check_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr) 206*00b67f09SDavid van Moolenbroek 207*00b67f09SDavid van Moolenbroek #define ATF_REQUIRE_ERRNO(exp_errno, bool_expr) \ 208*00b67f09SDavid van Moolenbroek atf_tc_require_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr) 209*00b67f09SDavid van Moolenbroek 210*00b67f09SDavid van Moolenbroek #endif /* !defined(ATF_C_MACROS_H) */ 211