macros.h revision 240117
1243791Sdim/* 2243791Sdim * Automated Testing Framework (atf) 3353358Sdim * 4353358Sdim * Copyright (c) 2008 The NetBSD Foundation, Inc. 5353358Sdim * All rights reserved. 6243791Sdim * 7243791Sdim * Redistribution and use in source and binary forms, with or without 8243791Sdim * modification, are permitted provided that the following conditions 9243791Sdim * are met: 10243791Sdim * 1. Redistributions of source code must retain the above copyright 11243791Sdim * notice, this list of conditions and the following disclaimer. 12243791Sdim * 2. Redistributions in binary form must reproduce the above copyright 13243791Sdim * notice, this list of conditions and the following disclaimer in the 14243791Sdim * documentation and/or other materials provided with the distribution. 15344779Sdim * 16360784Sdim * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17249423Sdim * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18249423Sdim * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19249423Sdim * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20249423Sdim * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21249423Sdim * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22243791Sdim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23243791Sdim * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24249423Sdim * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25243791Sdim * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26243791Sdim * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27243791Sdim * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28243791Sdim */ 29243791Sdim 30243791Sdim#if !defined(ATF_C_MACROS_H) 31249423Sdim#define ATF_C_MACROS_H 32249423Sdim 33249423Sdim#include <atf-c/defs.h> 34249423Sdim#include <atf-c/error.h> 35249423Sdim#include <atf-c/tc.h> 36243791Sdim#include <atf-c/tp.h> 37243791Sdim#include <atf-c/utils.h> 38243791Sdim 39243791Sdim#define ATF_TC_NAME(tc) \ 40243791Sdim (atfu_ ## tc ## _tc) 41243791Sdim 42243791Sdim#define ATF_TC_PACK_NAME(tc) \ 43243791Sdim (atfu_ ## tc ## _tc_pack) 44243791Sdim 45243791Sdim#define ATF_TC_WITHOUT_HEAD(tc) \ 46243791Sdim static void atfu_ ## tc ## _body(const atf_tc_t *); \ 47243791Sdim static atf_tc_t atfu_ ## tc ## _tc; \ 48243791Sdim static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ 49243791Sdim .m_ident = #tc, \ 50243791Sdim .m_head = NULL, \ 51296417Sdim .m_body = atfu_ ## tc ## _body, \ 52243791Sdim .m_cleanup = NULL, \ 53243791Sdim } 54243791Sdim 55243791Sdim#define ATF_TC(tc) \ 56243791Sdim static void atfu_ ## tc ## _head(atf_tc_t *); \ 57243791Sdim static void atfu_ ## tc ## _body(const atf_tc_t *); \ 58243791Sdim static atf_tc_t atfu_ ## tc ## _tc; \ 59243791Sdim static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ 60243791Sdim .m_ident = #tc, \ 61296417Sdim .m_head = atfu_ ## tc ## _head, \ 62243791Sdim .m_body = atfu_ ## tc ## _body, \ 63243791Sdim .m_cleanup = NULL, \ 64243791Sdim } 65243791Sdim 66243791Sdim#define ATF_TC_WITH_CLEANUP(tc) \ 67249423Sdim static void atfu_ ## tc ## _head(atf_tc_t *); \ 68249423Sdim static void atfu_ ## tc ## _body(const atf_tc_t *); \ 69243791Sdim static void atfu_ ## tc ## _cleanup(const atf_tc_t *); \ 70243791Sdim static atf_tc_t atfu_ ## tc ## _tc; \ 71249423Sdim static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ 72249423Sdim .m_ident = #tc, \ 73249423Sdim .m_head = atfu_ ## tc ## _head, \ 74249423Sdim .m_body = atfu_ ## tc ## _body, \ 75249423Sdim .m_cleanup = atfu_ ## tc ## _cleanup, \ 76249423Sdim } 77249423Sdim 78249423Sdim#define ATF_TC_HEAD(tc, tcptr) \ 79243791Sdim static \ 80249423Sdim void \ 81243791Sdim atfu_ ## tc ## _head(atf_tc_t *tcptr) 82243791Sdim 83341825Sdim#define ATF_TC_HEAD_NAME(tc) \ 84249423Sdim (atfu_ ## tc ## _head) 85249423Sdim 86249423Sdim#define ATF_TC_BODY(tc, tcptr) \ 87249423Sdim static \ 88249423Sdim void \ 89249423Sdim atfu_ ## tc ## _body(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) 90296417Sdim 91249423Sdim#define ATF_TC_BODY_NAME(tc) \ 92249423Sdim (atfu_ ## tc ## _body) 93249423Sdim 94249423Sdim#define ATF_TC_CLEANUP(tc, tcptr) \ 95249423Sdim static \ 96249423Sdim void \ 97249423Sdim atfu_ ## tc ## _cleanup(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) 98249423Sdim 99249423Sdim#define ATF_TC_CLEANUP_NAME(tc) \ 100249423Sdim (atfu_ ## tc ## _cleanup) 101249423Sdim 102249423Sdim#define ATF_TP_ADD_TCS(tps) \ 103249423Sdim static atf_error_t atfu_tp_add_tcs(atf_tp_t *); \ 104249423Sdim int atf_tp_main(int, char **, atf_error_t (*)(atf_tp_t *)); \ 105249423Sdim \ 106249423Sdim int \ 107249423Sdim main(int argc, char **argv) \ 108249423Sdim { \ 109249423Sdim return atf_tp_main(argc, argv, atfu_tp_add_tcs); \ 110249423Sdim } \ 111249423Sdim static \ 112249423Sdim atf_error_t \ 113249423Sdim atfu_tp_add_tcs(atf_tp_t *tps) 114249423Sdim 115249423Sdim#define ATF_TP_ADD_TC(tp, tc) \ 116249423Sdim do { \ 117249423Sdim atf_error_t atfu_err; \ 118249423Sdim char **atfu_config = atf_tp_get_config(tp); \ 119249423Sdim if (atfu_config == NULL) \ 120249423Sdim return atf_no_memory_error(); \ 121249423Sdim atfu_err = atf_tc_init_pack(&atfu_ ## tc ## _tc, \ 122249423Sdim &atfu_ ## tc ## _tc_pack, \ 123249423Sdim (const char *const *)atfu_config); \ 124249423Sdim atf_utils_free_charpp(atfu_config); \ 125249423Sdim if (atf_is_error(atfu_err)) \ 126249423Sdim return atfu_err; \ 127249423Sdim atfu_err = atf_tp_add_tc(tp, &atfu_ ## tc ## _tc); \ 128249423Sdim if (atf_is_error(atfu_err)) \ 129249423Sdim return atfu_err; \ 130249423Sdim } while (0) 131249423Sdim 132249423Sdim#define ATF_REQUIRE_MSG(x, fmt, ...) \ 133249423Sdim do { \ 134249423Sdim if (!(x)) \ 135249423Sdim atf_tc_fail_requirement(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \ 136249423Sdim } while(0) 137249423Sdim 138249423Sdim#define ATF_CHECK_MSG(x, fmt, ...) \ 139249423Sdim do { \ 140249423Sdim if (!(x)) \ 141249423Sdim atf_tc_fail_check(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \ 142249423Sdim } while(0) 143249423Sdim 144249423Sdim#define ATF_REQUIRE(x) \ 145249423Sdim do { \ 146249423Sdim if (!(x)) \ 147249423Sdim atf_tc_fail_requirement(__FILE__, __LINE__, "%s", #x " not met"); \ 148249423Sdim } while(0) 149249423Sdim 150249423Sdim#define ATF_CHECK(x) \ 151249423Sdim do { \ 152249423Sdim if (!(x)) \ 153249423Sdim atf_tc_fail_check(__FILE__, __LINE__, "%s", #x " not met"); \ 154249423Sdim } while(0) 155249423Sdim 156249423Sdim#define ATF_REQUIRE_EQ(x, y) \ 157249423Sdim ATF_REQUIRE_MSG((x) == (y), "%s != %s", #x, #y) 158249423Sdim 159249423Sdim#define ATF_CHECK_EQ(x, y) \ 160249423Sdim ATF_CHECK_MSG((x) == (y), "%s != %s", #x, #y) 161249423Sdim 162249423Sdim#define ATF_REQUIRE_EQ_MSG(x, y, fmt, ...) \ 163249423Sdim ATF_REQUIRE_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__) 164249423Sdim 165243791Sdim#define ATF_CHECK_EQ_MSG(x, y, fmt, ...) \ 166243791Sdim ATF_CHECK_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__) 167243791Sdim 168243791Sdim#define ATF_REQUIRE_STREQ(x, y) \ 169243791Sdim ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y) 170249423Sdim 171249423Sdim#define ATF_CHECK_STREQ(x, y) \ 172249423Sdim ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y) 173249423Sdim 174249423Sdim#define ATF_REQUIRE_STREQ_MSG(x, y, fmt, ...) \ 175249423Sdim ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \ 176249423Sdim #x, #y, x, y, ##__VA_ARGS__) 177243791Sdim 178243791Sdim#define ATF_CHECK_STREQ_MSG(x, y, fmt, ...) \ 179243791Sdim ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \ 180243791Sdim #x, #y, x, y, ##__VA_ARGS__) 181276479Sdim 182276479Sdim#define ATF_CHECK_ERRNO(exp_errno, bool_expr) \ 183243791Sdim atf_tc_check_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr) 184249423Sdim 185243791Sdim#define ATF_REQUIRE_ERRNO(exp_errno, bool_expr) \ 186243791Sdim atf_tc_require_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr) 187243791Sdim 188243791Sdim#endif /* !defined(ATF_C_MACROS_H) */ 189243791Sdim