macros.h revision 240116
115103Sphk/*
215103Sphk * Automated Testing Framework (atf)
315103Sphk *
415103Sphk * Copyright (c) 2008 The NetBSD Foundation, Inc.
515103Sphk * All rights reserved.
615103Sphk *
715103Sphk * Redistribution and use in source and binary forms, with or without
815103Sphk * modification, are permitted provided that the following conditions
915103Sphk * are met:
1015103Sphk * 1. Redistributions of source code must retain the above copyright
1115103Sphk *    notice, this list of conditions and the following disclaimer.
1215103Sphk * 2. Redistributions in binary form must reproduce the above copyright
1315103Sphk *    notice, this list of conditions and the following disclaimer in the
1415103Sphk *    documentation and/or other materials provided with the distribution.
1515103Sphk *
1615103Sphk * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
1715103Sphk * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
1815103Sphk * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1915103Sphk * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2015103Sphk * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
2115103Sphk * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2215103Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
2315103Sphk * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2415103Sphk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2515103Sphk * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2615103Sphk * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2715103Sphk * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2815103Sphk */
2915103Sphk
3015103Sphk#if !defined(ATF_C_MACROS_H)
3115103Sphk#define ATF_C_MACROS_H
3215103Sphk
3315103Sphk#include <atf-c/defs.h>
3415103Sphk#include <atf-c/error.h>
3515103Sphk#include <atf-c/tc.h>
3615103Sphk#include <atf-c/tp.h>
3715103Sphk#include <atf-c/utils.h>
38116182Sobrien
39116182Sobrien#define ATF_TC_NAME(tc) \
40116182Sobrien    (atfu_ ## tc ## _tc)
41175417Sjhb
4286190Srwatson#define ATF_TC_PACK_NAME(tc) \
43169604Swkoszek    (atfu_ ## tc ## _tc_pack)
4484611Srwatson
4515103Sphk#define ATF_TC_WITHOUT_HEAD(tc) \
4615103Sphk    static void atfu_ ## tc ## _body(const atf_tc_t *); \
47169507Swkoszek    static atf_tc_t atfu_ ## tc ## _tc; \
4815103Sphk    static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \
4915103Sphk        .m_ident = #tc, \
5015103Sphk        .m_head = NULL, \
5187275Srwatson        .m_body = atfu_ ## tc ## _body, \
5287275Srwatson        .m_cleanup = NULL, \
5346155Sphk    }
5476078Sjhb
55192895Sjamie#define ATF_TC(tc) \
56105046Smike    static void atfu_ ## tc ## _head(atf_tc_t *); \
5728918Skato    static void atfu_ ## tc ## _body(const atf_tc_t *); \
5815103Sphk    static atf_tc_t atfu_ ## tc ## _tc; \
5915103Sphk    static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \
60224159Srwatson        .m_ident = #tc, \
6115103Sphk        .m_head = atfu_ ## tc ## _head, \
6215103Sphk        .m_body = atfu_ ## tc ## _body, \
6315103Sphk        .m_cleanup = NULL, \
6423382Sbde    }
6515103Sphk
6615103Sphk#define ATF_TC_WITH_CLEANUP(tc) \
6715103Sphk    static void atfu_ ## tc ## _head(atf_tc_t *); \
6815103Sphk    static void atfu_ ## tc ## _body(const atf_tc_t *); \
6915103Sphk    static void atfu_ ## tc ## _cleanup(const atf_tc_t *); \
7048891Sphk    static atf_tc_t atfu_ ## tc ## _tc; \
7148891Sphk    static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \
7215103Sphk        .m_ident = #tc, \
7315103Sphk        .m_head = atfu_ ## tc ## _head, \
7415103Sphk        .m_body = atfu_ ## tc ## _body, \
7515103Sphk        .m_cleanup = atfu_ ## tc ## _cleanup, \
7615103Sphk    }
7715103Sphk
7834925Sdufault#define ATF_TC_HEAD(tc, tcptr) \
7934925Sdufault    static \
8034029Sdufault    void \
8150465Smarcel    atfu_ ## tc ## _head(atf_tc_t *tcptr)
8250465Smarcel
8389414Sarr#define ATF_TC_HEAD_NAME(tc) \
8489414Sarr    (atfu_ ## tc ## _head)
8586190Srwatson
8686190Srwatson#define ATF_TC_BODY(tc, tcptr) \
8786190Srwatson    static \
8886190Srwatson    void \
8950465Smarcel    atfu_ ## tc ## _body(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED)
90187864Sed
91116105Sjmallett#define ATF_TC_BODY_NAME(tc) \
92116090Sjmallett    (atfu_ ## tc ## _body)
93224159Srwatson
94224159Srwatson#define ATF_TC_CLEANUP(tc, tcptr) \
9515103Sphk    static \
96224159Srwatson    void \
9746381Sbillf    atfu_ ## tc ## _cleanup(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED)
9815103Sphk
99187864Sed#define ATF_TC_CLEANUP_NAME(tc) \
10046381Sbillf    (atfu_ ## tc ## _cleanup)
10115103Sphk
102224159Srwatson#define ATF_TP_ADD_TCS(tps) \
103224159Srwatson    static atf_error_t atfu_tp_add_tcs(atf_tp_t *); \
10415103Sphk    int atf_tp_main(int, char **, atf_error_t (*)(atf_tp_t *)); \
105119203Seivind    \
106119203Seivind    int \
107119203Seivind    main(int argc, char **argv) \
108119203Seivind    { \
109224159Srwatson        return atf_tp_main(argc, argv, atfu_tp_add_tcs); \
110119203Seivind    } \
11115103Sphk    static \
112121307Ssilby    atf_error_t \
11346381Sbillf    atfu_tp_add_tcs(atf_tp_t *tps)
11415103Sphk
11586189Srwatson#define ATF_TP_ADD_TC(tp, tc) \
11646381Sbillf    do { \
11715103Sphk        atf_error_t atfu_err; \
118121307Ssilby        char **atfu_config = atf_tp_get_config(tp); \
11980418Speter        if (atfu_config == NULL) \
12080418Speter            return atf_no_memory_error(); \
121224159Srwatson        atfu_err = atf_tc_init_pack(&atfu_ ## tc ## _tc, \
12246381Sbillf                                    &atfu_ ## tc ## _tc_pack, \
12315103Sphk                                    (const char *const *)atfu_config); \
124224159Srwatson        atf_utils_free_charpp(atfu_config); \
125105046Smike        if (atf_is_error(atfu_err)) \
12615103Sphk            return atfu_err; \
127224159Srwatson        atfu_err = atf_tp_add_tc(tp, &atfu_ ## tc ## _tc); \
128202143Sbrooks        if (atf_is_error(atfu_err)) \
129201953Sbrooks            return atfu_err; \
13015103Sphk    } while (0)
131224159Srwatson
13246381Sbillf#define ATF_REQUIRE_MSG(x, fmt, ...) \
13315103Sphk    do { \
13415103Sphk        if (!(x)) \
135224159Srwatson            atf_tc_fail_requirement(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \
13646381Sbillf    } while(0)
13715103Sphk
138224159Srwatson#define ATF_CHECK_MSG(x, fmt, ...) \
13946381Sbillf    do { \
14015103Sphk        if (!(x)) \
14115103Sphk            atf_tc_fail_check(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \
14215103Sphk    } while(0)
14315103Sphk
14486189Srwatson#define ATF_REQUIRE(x) \
14546381Sbillf    do { \
14615103Sphk        if (!(x)) \
147224159Srwatson            atf_tc_fail_requirement(__FILE__, __LINE__, "%s", #x " not met"); \
14846381Sbillf    } while(0)
14915103Sphk
150224159Srwatson#define ATF_CHECK(x) \
15146381Sbillf    do { \
15215103Sphk        if (!(x)) \
153224159Srwatson            atf_tc_fail_check(__FILE__, __LINE__, "%s", #x " not met"); \
15446381Sbillf    } while(0)
15515103Sphk
156106605Stmm#define ATF_REQUIRE_EQ(x, y) \
157169727Skan    ATF_REQUIRE_MSG((x) == (y), "%s != %s", #x, #y)
158169727Skan
159176367Santoine#define ATF_CHECK_EQ(x, y) \
160176367Santoine    ATF_CHECK_MSG((x) == (y), "%s != %s", #x, #y)
161169727Skan
162176367Santoine#define ATF_REQUIRE_EQ_MSG(x, y, fmt, ...) \
163176367Santoine    ATF_REQUIRE_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__)
164176367Santoine
165176367Santoine#define ATF_CHECK_EQ_MSG(x, y, fmt, ...) \
166176367Santoine    ATF_CHECK_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__)
167169727Skan
168169727Skan#define ATF_REQUIRE_STREQ(x, y) \
169187864Sed    ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y)
170224159Srwatson
171187864Sed#define ATF_CHECK_STREQ(x, y) \
172169727Skan    ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y)
173169727Skan
174106605Stmm#define ATF_REQUIRE_STREQ_MSG(x, y, fmt, ...) \
175106605Stmm    ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \
176106605Stmm                    #x, #y, x, y, ##__VA_ARGS__)
177106605Stmm
178106605Stmm#define ATF_CHECK_STREQ_MSG(x, y, fmt, ...) \
179106605Stmm    ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \
180106605Stmm                    #x, #y, x, y, ##__VA_ARGS__)
181106605Stmm
182106605Stmm#define ATF_CHECK_ERRNO(exp_errno, bool_expr) \
183106605Stmm    atf_tc_check_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr)
184106605Stmm
185106605Stmm#define ATF_REQUIRE_ERRNO(exp_errno, bool_expr) \
186142834Swes    atf_tc_require_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr)
187142834Swes
188142834Swes#endif /* !defined(ATF_C_MACROS_H) */
189142834Swes