xref: /freebsd/contrib/atf/atf-c/macros_test.c (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
1*0677dfd1SJulio Merino /* Copyright (c) 2008 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar  * All rights reserved.
3c243e490SMarcel Moolenaar  *
4c243e490SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar  * modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar  * are met:
7c243e490SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar  *
13c243e490SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24*0677dfd1SJulio Merino  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
25*0677dfd1SJulio Merino 
26*0677dfd1SJulio Merino #include "atf-c/macros.h"
27c243e490SMarcel Moolenaar 
28c243e490SMarcel Moolenaar #include <sys/types.h>
29c243e490SMarcel Moolenaar #include <sys/wait.h>
30c243e490SMarcel Moolenaar 
31c243e490SMarcel Moolenaar #include <errno.h>
32c243e490SMarcel Moolenaar #include <fcntl.h>
33c243e490SMarcel Moolenaar #include <stdarg.h>
34c243e490SMarcel Moolenaar #include <stdbool.h>
35c243e490SMarcel Moolenaar #include <stdio.h>
36c243e490SMarcel Moolenaar #include <stdlib.h>
37c243e490SMarcel Moolenaar #include <string.h>
38c243e490SMarcel Moolenaar #include <unistd.h>
39c243e490SMarcel Moolenaar 
40c243e490SMarcel Moolenaar #include <atf-c.h>
41c243e490SMarcel Moolenaar 
42*0677dfd1SJulio Merino #include "atf-c/detail/fs.h"
43*0677dfd1SJulio Merino #include "atf-c/detail/process.h"
44*0677dfd1SJulio Merino #include "atf-c/detail/test_helpers.h"
45*0677dfd1SJulio Merino #include "atf-c/detail/text.h"
46c243e490SMarcel Moolenaar 
47c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
48c243e490SMarcel Moolenaar  * Auxiliary functions.
49c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
50c243e490SMarcel Moolenaar 
51c243e490SMarcel Moolenaar static
52c243e490SMarcel Moolenaar void
create_ctl_file(const char * name)53c243e490SMarcel Moolenaar create_ctl_file(const char *name)
54c243e490SMarcel Moolenaar {
55c243e490SMarcel Moolenaar     atf_fs_path_t p;
56c243e490SMarcel Moolenaar 
57c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "%s", name));
58c243e490SMarcel Moolenaar     ATF_REQUIRE(open(atf_fs_path_cstring(&p),
59c243e490SMarcel Moolenaar                    O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1);
60c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
61c243e490SMarcel Moolenaar }
62c243e490SMarcel Moolenaar 
63c243e490SMarcel Moolenaar static
64c243e490SMarcel Moolenaar bool
exists(const char * p)65c243e490SMarcel Moolenaar exists(const char *p)
66c243e490SMarcel Moolenaar {
67c243e490SMarcel Moolenaar     bool b;
68c243e490SMarcel Moolenaar     atf_fs_path_t pp;
69c243e490SMarcel Moolenaar 
70c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&pp, "%s", p));
71c243e490SMarcel Moolenaar     RE(atf_fs_exists(&pp, &b));
72c243e490SMarcel Moolenaar     atf_fs_path_fini(&pp);
73c243e490SMarcel Moolenaar 
74c243e490SMarcel Moolenaar     return b;
75c243e490SMarcel Moolenaar }
76c243e490SMarcel Moolenaar 
77c243e490SMarcel Moolenaar static
78c243e490SMarcel Moolenaar void
init_and_run_h_tc(const char * name,void (* head)(atf_tc_t *),void (* body)(const atf_tc_t *))79c243e490SMarcel Moolenaar init_and_run_h_tc(const char *name, void (*head)(atf_tc_t *),
80c243e490SMarcel Moolenaar                   void (*body)(const atf_tc_t *))
81c243e490SMarcel Moolenaar {
82c243e490SMarcel Moolenaar     atf_tc_t tc;
83c243e490SMarcel Moolenaar     const char *const config[] = { NULL };
84c243e490SMarcel Moolenaar 
85c243e490SMarcel Moolenaar     RE(atf_tc_init(&tc, name, head, body, NULL, config));
86c243e490SMarcel Moolenaar     run_h_tc(&tc, "output", "error", "result");
87c243e490SMarcel Moolenaar     atf_tc_fini(&tc);
88c243e490SMarcel Moolenaar }
89c243e490SMarcel Moolenaar 
90c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
91c243e490SMarcel Moolenaar  * Helper test cases.
92c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
93c243e490SMarcel Moolenaar 
94c243e490SMarcel Moolenaar #define H_DEF(id, macro) \
95c243e490SMarcel Moolenaar     ATF_TC_HEAD(h_ ## id, tc) \
96c243e490SMarcel Moolenaar     { \
97c243e490SMarcel Moolenaar         atf_tc_set_md_var(tc, "descr", "Helper test case"); \
98c243e490SMarcel Moolenaar     } \
99c243e490SMarcel Moolenaar     ATF_TC_BODY(h_ ## id, tc) \
100c243e490SMarcel Moolenaar     { \
101c243e490SMarcel Moolenaar         create_ctl_file("before"); \
102c243e490SMarcel Moolenaar         macro; \
103c243e490SMarcel Moolenaar         create_ctl_file("after"); \
104c243e490SMarcel Moolenaar     }
105c243e490SMarcel Moolenaar 
106c243e490SMarcel Moolenaar #define H_CHECK_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_ ## id)
107c243e490SMarcel Moolenaar #define H_CHECK_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_ ## id)
108c243e490SMarcel Moolenaar #define H_CHECK(id, condition) \
109c243e490SMarcel Moolenaar     H_DEF(check_ ## id, ATF_CHECK(condition))
110c243e490SMarcel Moolenaar 
111c243e490SMarcel Moolenaar #define H_CHECK_MSG_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_msg_ ## id)
112c243e490SMarcel Moolenaar #define H_CHECK_MSG_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_msg_ ## id)
113c243e490SMarcel Moolenaar #define H_CHECK_MSG(id, condition, msg) \
114c243e490SMarcel Moolenaar     H_DEF(check_msg_ ## id, ATF_CHECK_MSG(condition, msg))
115c243e490SMarcel Moolenaar 
116c243e490SMarcel Moolenaar #define H_CHECK_EQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_eq_ ## id)
117c243e490SMarcel Moolenaar #define H_CHECK_EQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_eq_ ## id)
118c243e490SMarcel Moolenaar #define H_CHECK_EQ(id, v1, v2) \
119c243e490SMarcel Moolenaar     H_DEF(check_eq_ ## id, ATF_CHECK_EQ(v1, v2))
120c243e490SMarcel Moolenaar 
121c243e490SMarcel Moolenaar #define H_CHECK_STREQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_streq_ ## id)
122c243e490SMarcel Moolenaar #define H_CHECK_STREQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_streq_ ## id)
123c243e490SMarcel Moolenaar #define H_CHECK_STREQ(id, v1, v2) \
124c243e490SMarcel Moolenaar     H_DEF(check_streq_ ## id, ATF_CHECK_STREQ(v1, v2))
125c243e490SMarcel Moolenaar 
126a18eacbeSJulio Merino #define H_CHECK_MATCH_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_match_ ## id)
127a18eacbeSJulio Merino #define H_CHECK_MATCH_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_match_ ## id)
128a18eacbeSJulio Merino #define H_CHECK_MATCH(id, v1, v2) \
129a18eacbeSJulio Merino     H_DEF(check_match_ ## id, ATF_CHECK_MATCH(v1, v2))
130a18eacbeSJulio Merino 
131c243e490SMarcel Moolenaar #define H_CHECK_EQ_MSG_HEAD_NAME(id) \
132c243e490SMarcel Moolenaar     ATF_TC_HEAD_NAME(h_check_eq_msg_ ## id)
133c243e490SMarcel Moolenaar #define H_CHECK_EQ_MSG_BODY_NAME(id) \
134c243e490SMarcel Moolenaar     ATF_TC_BODY_NAME(h_check_eq_msg_ ## id)
135c243e490SMarcel Moolenaar #define H_CHECK_EQ_MSG(id, v1, v2, msg) \
136c243e490SMarcel Moolenaar     H_DEF(check_eq_msg_ ## id, ATF_CHECK_EQ_MSG(v1, v2, msg))
137c243e490SMarcel Moolenaar 
138c243e490SMarcel Moolenaar #define H_CHECK_STREQ_MSG_HEAD_NAME(id) \
139c243e490SMarcel Moolenaar     ATF_TC_HEAD_NAME(h_check_streq_msg_ ## id)
140c243e490SMarcel Moolenaar #define H_CHECK_STREQ_MSG_BODY_NAME(id) \
141c243e490SMarcel Moolenaar     ATF_TC_BODY_NAME(h_check_streq_msg_ ## id)
142c243e490SMarcel Moolenaar #define H_CHECK_STREQ_MSG(id, v1, v2, msg) \
143c243e490SMarcel Moolenaar     H_DEF(check_streq_msg_ ## id, ATF_CHECK_STREQ_MSG(v1, v2, msg))
144c243e490SMarcel Moolenaar 
145a18eacbeSJulio Merino #define H_CHECK_MATCH_MSG_HEAD_NAME(id) \
146a18eacbeSJulio Merino     ATF_TC_HEAD_NAME(h_check_match_msg_ ## id)
147a18eacbeSJulio Merino #define H_CHECK_MATCH_MSG_BODY_NAME(id) \
148a18eacbeSJulio Merino     ATF_TC_BODY_NAME(h_check_match_msg_ ## id)
149a18eacbeSJulio Merino #define H_CHECK_MATCH_MSG(id, v1, v2, msg) \
150a18eacbeSJulio Merino     H_DEF(check_match_msg_ ## id, ATF_CHECK_MATCH_MSG(v1, v2, msg))
151a18eacbeSJulio Merino 
152c243e490SMarcel Moolenaar #define H_CHECK_ERRNO_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_errno_ ## id)
153c243e490SMarcel Moolenaar #define H_CHECK_ERRNO_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_errno_ ## id)
154c243e490SMarcel Moolenaar #define H_CHECK_ERRNO(id, exp_errno, bool_expr) \
155c243e490SMarcel Moolenaar     H_DEF(check_errno_ ## id, ATF_CHECK_ERRNO(exp_errno, bool_expr))
156c243e490SMarcel Moolenaar 
157c243e490SMarcel Moolenaar #define H_REQUIRE_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_ ## id)
158c243e490SMarcel Moolenaar #define H_REQUIRE_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_ ## id)
159c243e490SMarcel Moolenaar #define H_REQUIRE(id, condition) \
160c243e490SMarcel Moolenaar     H_DEF(require_ ## id, ATF_REQUIRE(condition))
161c243e490SMarcel Moolenaar 
162c243e490SMarcel Moolenaar #define H_REQUIRE_MSG_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_msg_ ## id)
163c243e490SMarcel Moolenaar #define H_REQUIRE_MSG_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_msg_ ## id)
164c243e490SMarcel Moolenaar #define H_REQUIRE_MSG(id, condition, msg) \
165c243e490SMarcel Moolenaar     H_DEF(require_msg_ ## id, ATF_REQUIRE_MSG(condition, msg))
166c243e490SMarcel Moolenaar 
167c243e490SMarcel Moolenaar #define H_REQUIRE_EQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_eq_ ## id)
168c243e490SMarcel Moolenaar #define H_REQUIRE_EQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_eq_ ## id)
169c243e490SMarcel Moolenaar #define H_REQUIRE_EQ(id, v1, v2) \
170c243e490SMarcel Moolenaar     H_DEF(require_eq_ ## id, ATF_REQUIRE_EQ(v1, v2))
171c243e490SMarcel Moolenaar 
172c243e490SMarcel Moolenaar #define H_REQUIRE_STREQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_streq_ ## id)
173c243e490SMarcel Moolenaar #define H_REQUIRE_STREQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_streq_ ## id)
174c243e490SMarcel Moolenaar #define H_REQUIRE_STREQ(id, v1, v2) \
175c243e490SMarcel Moolenaar     H_DEF(require_streq_ ## id, ATF_REQUIRE_STREQ(v1, v2))
176c243e490SMarcel Moolenaar 
177a18eacbeSJulio Merino #define H_REQUIRE_MATCH_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_match_ ## id)
178a18eacbeSJulio Merino #define H_REQUIRE_MATCH_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_match_ ## id)
179a18eacbeSJulio Merino #define H_REQUIRE_MATCH(id, v1, v2) \
180a18eacbeSJulio Merino     H_DEF(require_match_ ## id, ATF_REQUIRE_MATCH(v1, v2))
181a18eacbeSJulio Merino 
182c243e490SMarcel Moolenaar #define H_REQUIRE_EQ_MSG_HEAD_NAME(id) \
183c243e490SMarcel Moolenaar     ATF_TC_HEAD_NAME(h_require_eq_msg_ ## id)
184c243e490SMarcel Moolenaar #define H_REQUIRE_EQ_MSG_BODY_NAME(id) \
185c243e490SMarcel Moolenaar     ATF_TC_BODY_NAME(h_require_eq_msg_ ## id)
186c243e490SMarcel Moolenaar #define H_REQUIRE_EQ_MSG(id, v1, v2, msg) \
187c243e490SMarcel Moolenaar     H_DEF(require_eq_msg_ ## id, ATF_REQUIRE_EQ_MSG(v1, v2, msg))
188c243e490SMarcel Moolenaar 
189c243e490SMarcel Moolenaar #define H_REQUIRE_STREQ_MSG_HEAD_NAME(id) \
190c243e490SMarcel Moolenaar     ATF_TC_HEAD_NAME(h_require_streq_msg_ ## id)
191c243e490SMarcel Moolenaar #define H_REQUIRE_STREQ_MSG_BODY_NAME(id) \
192c243e490SMarcel Moolenaar     ATF_TC_BODY_NAME(h_require_streq_msg_ ## id)
193c243e490SMarcel Moolenaar #define H_REQUIRE_STREQ_MSG(id, v1, v2, msg) \
194c243e490SMarcel Moolenaar     H_DEF(require_streq_msg_ ## id, ATF_REQUIRE_STREQ_MSG(v1, v2, msg))
195c243e490SMarcel Moolenaar 
196a18eacbeSJulio Merino #define H_REQUIRE_MATCH_MSG_HEAD_NAME(id) \
197a18eacbeSJulio Merino     ATF_TC_HEAD_NAME(h_require_match_msg_ ## id)
198a18eacbeSJulio Merino #define H_REQUIRE_MATCH_MSG_BODY_NAME(id) \
199a18eacbeSJulio Merino     ATF_TC_BODY_NAME(h_require_match_msg_ ## id)
200a18eacbeSJulio Merino #define H_REQUIRE_MATCH_MSG(id, v1, v2, msg) \
201a18eacbeSJulio Merino     H_DEF(require_match_msg_ ## id, ATF_REQUIRE_MATCH_MSG(v1, v2, msg))
202a18eacbeSJulio Merino 
203c243e490SMarcel Moolenaar #define H_REQUIRE_ERRNO_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_errno_ ## id)
204c243e490SMarcel Moolenaar #define H_REQUIRE_ERRNO_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_errno_ ## id)
205c243e490SMarcel Moolenaar #define H_REQUIRE_ERRNO(id, exp_errno, bool_expr) \
206c243e490SMarcel Moolenaar     H_DEF(require_errno_ ## id, ATF_REQUIRE_ERRNO(exp_errno, bool_expr))
207c243e490SMarcel Moolenaar 
208c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
209c243e490SMarcel Moolenaar  * Test cases for the ATF_{CHECK,REQUIRE}_ERRNO macros.
210c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
211c243e490SMarcel Moolenaar 
212c243e490SMarcel Moolenaar static int
errno_fail_stub(const int raised_errno)213c243e490SMarcel Moolenaar errno_fail_stub(const int raised_errno)
214c243e490SMarcel Moolenaar {
215c243e490SMarcel Moolenaar     errno = raised_errno;
216c243e490SMarcel Moolenaar     return -1;
217c243e490SMarcel Moolenaar }
218c243e490SMarcel Moolenaar 
219c243e490SMarcel Moolenaar static int
errno_ok_stub(void)220c243e490SMarcel Moolenaar errno_ok_stub(void)
221c243e490SMarcel Moolenaar {
222c243e490SMarcel Moolenaar     return 0;
223c243e490SMarcel Moolenaar }
224c243e490SMarcel Moolenaar 
225c243e490SMarcel Moolenaar H_CHECK_ERRNO(no_error, -1, errno_ok_stub() == -1);
226c243e490SMarcel Moolenaar H_CHECK_ERRNO(errno_ok, 2, errno_fail_stub(2) == -1);
227c243e490SMarcel Moolenaar H_CHECK_ERRNO(errno_fail, 3, errno_fail_stub(4) == -1);
228c243e490SMarcel Moolenaar 
229c243e490SMarcel Moolenaar H_REQUIRE_ERRNO(no_error, -1, errno_ok_stub() == -1);
230c243e490SMarcel Moolenaar H_REQUIRE_ERRNO(errno_ok, 2, errno_fail_stub(2) == -1);
231c243e490SMarcel Moolenaar H_REQUIRE_ERRNO(errno_fail, 3, errno_fail_stub(4) == -1);
232c243e490SMarcel Moolenaar 
233c243e490SMarcel Moolenaar ATF_TC(check_errno);
ATF_TC_HEAD(check_errno,tc)234c243e490SMarcel Moolenaar ATF_TC_HEAD(check_errno, tc)
235c243e490SMarcel Moolenaar {
236c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_ERRNO macro");
237c243e490SMarcel Moolenaar }
ATF_TC_BODY(check_errno,tc)238c243e490SMarcel Moolenaar ATF_TC_BODY(check_errno, tc)
239c243e490SMarcel Moolenaar {
240c243e490SMarcel Moolenaar     struct test {
241c243e490SMarcel Moolenaar         void (*head)(atf_tc_t *);
242c243e490SMarcel Moolenaar         void (*body)(const atf_tc_t *);
243c243e490SMarcel Moolenaar         bool ok;
244c243e490SMarcel Moolenaar         const char *exp_regex;
245c243e490SMarcel Moolenaar     } *t, tests[] = {
246c243e490SMarcel Moolenaar         { H_CHECK_ERRNO_HEAD_NAME(no_error),
247c243e490SMarcel Moolenaar           H_CHECK_ERRNO_BODY_NAME(no_error),
248c243e490SMarcel Moolenaar           false, "Expected true value in errno_ok_stub\\(\\) == -1" },
249c243e490SMarcel Moolenaar         { H_CHECK_ERRNO_HEAD_NAME(errno_ok),
250c243e490SMarcel Moolenaar           H_CHECK_ERRNO_BODY_NAME(errno_ok),
251c243e490SMarcel Moolenaar           true, NULL },
252c243e490SMarcel Moolenaar         { H_CHECK_ERRNO_HEAD_NAME(errno_fail),
253c243e490SMarcel Moolenaar           H_CHECK_ERRNO_BODY_NAME(errno_fail),
254c243e490SMarcel Moolenaar           false, "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
255c243e490SMarcel Moolenaar         { NULL, NULL, false, NULL }
256c243e490SMarcel Moolenaar     };
257c243e490SMarcel Moolenaar 
258c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
259c243e490SMarcel Moolenaar         init_and_run_h_tc("h_check_errno", t->head, t->body);
260c243e490SMarcel Moolenaar 
261c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("before"));
262c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("after"));
263c243e490SMarcel Moolenaar 
264c243e490SMarcel Moolenaar         if (t->ok) {
265a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
266c243e490SMarcel Moolenaar         } else {
267a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^failed", "result"));
268a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file(
269a18eacbeSJulio Merino                 "macros_test.c:[0-9]+: %s$", "error", t->exp_regex));
270c243e490SMarcel Moolenaar         }
271c243e490SMarcel Moolenaar 
272c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("before") != -1);
273c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("after") != -1);
274c243e490SMarcel Moolenaar     }
275c243e490SMarcel Moolenaar }
276c243e490SMarcel Moolenaar 
277c243e490SMarcel Moolenaar ATF_TC(require_errno);
ATF_TC_HEAD(require_errno,tc)278c243e490SMarcel Moolenaar ATF_TC_HEAD(require_errno, tc)
279c243e490SMarcel Moolenaar {
280c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_ERRNO macro");
281c243e490SMarcel Moolenaar }
ATF_TC_BODY(require_errno,tc)282c243e490SMarcel Moolenaar ATF_TC_BODY(require_errno, tc)
283c243e490SMarcel Moolenaar {
284c243e490SMarcel Moolenaar     struct test {
285c243e490SMarcel Moolenaar         void (*head)(atf_tc_t *);
286c243e490SMarcel Moolenaar         void (*body)(const atf_tc_t *);
287c243e490SMarcel Moolenaar         bool ok;
288c243e490SMarcel Moolenaar         const char *exp_regex;
289c243e490SMarcel Moolenaar     } *t, tests[] = {
290c243e490SMarcel Moolenaar         { H_REQUIRE_ERRNO_HEAD_NAME(no_error),
291c243e490SMarcel Moolenaar           H_REQUIRE_ERRNO_BODY_NAME(no_error),
292c243e490SMarcel Moolenaar           false, "Expected true value in errno_ok_stub\\(\\) == -1" },
293c243e490SMarcel Moolenaar         { H_REQUIRE_ERRNO_HEAD_NAME(errno_ok),
294c243e490SMarcel Moolenaar           H_REQUIRE_ERRNO_BODY_NAME(errno_ok),
295c243e490SMarcel Moolenaar           true, NULL },
296c243e490SMarcel Moolenaar         { H_REQUIRE_ERRNO_HEAD_NAME(errno_fail),
297c243e490SMarcel Moolenaar           H_REQUIRE_ERRNO_BODY_NAME(errno_fail),
298c243e490SMarcel Moolenaar           false, "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
299c243e490SMarcel Moolenaar         { NULL, NULL, false, NULL }
300c243e490SMarcel Moolenaar     };
301c243e490SMarcel Moolenaar 
302c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
303c243e490SMarcel Moolenaar         init_and_run_h_tc("h_require_errno", t->head, t->body);
304c243e490SMarcel Moolenaar 
305c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("before"));
306c243e490SMarcel Moolenaar         if (t->ok) {
307a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
308c243e490SMarcel Moolenaar             ATF_REQUIRE(exists("after"));
309c243e490SMarcel Moolenaar         } else {
310a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file(
311a18eacbeSJulio Merino                 "^failed: .*macros_test.c:[0-9]+: %s$", "result",
312a18eacbeSJulio Merino                 t->exp_regex));
313c243e490SMarcel Moolenaar             ATF_REQUIRE(!exists("after"));
314c243e490SMarcel Moolenaar         }
315c243e490SMarcel Moolenaar 
316c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("before") != -1);
317c243e490SMarcel Moolenaar         if (t->ok)
318c243e490SMarcel Moolenaar             ATF_REQUIRE(unlink("after") != -1);
319c243e490SMarcel Moolenaar     }
320c243e490SMarcel Moolenaar }
321c243e490SMarcel Moolenaar 
322c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
323c243e490SMarcel Moolenaar  * Test cases for the ATF_CHECK and ATF_CHECK_MSG macros.
324c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
325c243e490SMarcel Moolenaar 
326c243e490SMarcel Moolenaar H_CHECK(0, 0);
327c243e490SMarcel Moolenaar H_CHECK(1, 1);
328c243e490SMarcel Moolenaar H_CHECK_MSG(0, 0, "expected a false value");
329c243e490SMarcel Moolenaar H_CHECK_MSG(1, 1, "expected a true value");
330c243e490SMarcel Moolenaar 
331c243e490SMarcel Moolenaar ATF_TC(check);
ATF_TC_HEAD(check,tc)332c243e490SMarcel Moolenaar ATF_TC_HEAD(check, tc)
333c243e490SMarcel Moolenaar {
334c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK and "
335c243e490SMarcel Moolenaar                       "ATF_CHECK_MSG macros");
336c243e490SMarcel Moolenaar }
ATF_TC_BODY(check,tc)337c243e490SMarcel Moolenaar ATF_TC_BODY(check, tc)
338c243e490SMarcel Moolenaar {
339c243e490SMarcel Moolenaar     struct test {
340c243e490SMarcel Moolenaar         void (*head)(atf_tc_t *);
341c243e490SMarcel Moolenaar         void (*body)(const atf_tc_t *);
342c243e490SMarcel Moolenaar         bool value;
343c243e490SMarcel Moolenaar         const char *msg;
344c243e490SMarcel Moolenaar         bool ok;
345c243e490SMarcel Moolenaar     } *t, tests[] = {
346c243e490SMarcel Moolenaar         { H_CHECK_HEAD_NAME(0), H_CHECK_BODY_NAME(0), 0,
347c243e490SMarcel Moolenaar           "0 not met", false },
348c243e490SMarcel Moolenaar         { H_CHECK_HEAD_NAME(1), H_CHECK_BODY_NAME(1), 1,
349c243e490SMarcel Moolenaar           "1 not met", true },
350c243e490SMarcel Moolenaar         { H_CHECK_MSG_HEAD_NAME(0), H_CHECK_MSG_BODY_NAME(0), 0,
351c243e490SMarcel Moolenaar           "expected a false value", false },
352c243e490SMarcel Moolenaar         { H_CHECK_MSG_HEAD_NAME(1), H_CHECK_MSG_BODY_NAME(1), 1,
353c243e490SMarcel Moolenaar           "expected a true value", true },
354c243e490SMarcel Moolenaar         { NULL, NULL, false, NULL, false }
355c243e490SMarcel Moolenaar     };
356c243e490SMarcel Moolenaar 
357c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
358c243e490SMarcel Moolenaar         printf("Checking with a %d value\n", t->value);
359c243e490SMarcel Moolenaar 
360c243e490SMarcel Moolenaar         init_and_run_h_tc("h_check", t->head, t->body);
361c243e490SMarcel Moolenaar 
362c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("before"));
363c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("after"));
364c243e490SMarcel Moolenaar 
365c243e490SMarcel Moolenaar         if (t->ok) {
366a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
367c243e490SMarcel Moolenaar         } else {
368a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^failed", "result"));
369a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("Check failed: .*"
370a18eacbeSJulio Merino                 "macros_test.c:[0-9]+: %s$", "error", t->msg));
371c243e490SMarcel Moolenaar         }
372c243e490SMarcel Moolenaar 
373c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("before") != -1);
374c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("after") != -1);
375c243e490SMarcel Moolenaar     }
376c243e490SMarcel Moolenaar }
377c243e490SMarcel Moolenaar 
378c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
379c243e490SMarcel Moolenaar  * Test cases for the ATF_CHECK_*EQ_ macros.
380c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
381c243e490SMarcel Moolenaar 
382c243e490SMarcel Moolenaar struct check_eq_test {
383c243e490SMarcel Moolenaar     void (*head)(atf_tc_t *);
384c243e490SMarcel Moolenaar     void (*body)(const atf_tc_t *);
385c243e490SMarcel Moolenaar     const char *v1;
386c243e490SMarcel Moolenaar     const char *v2;
387c243e490SMarcel Moolenaar     const char *msg;
388c243e490SMarcel Moolenaar     bool ok;
389c243e490SMarcel Moolenaar };
390c243e490SMarcel Moolenaar 
391c243e490SMarcel Moolenaar static
392c243e490SMarcel Moolenaar void
do_check_eq_tests(const struct check_eq_test * tests)393c243e490SMarcel Moolenaar do_check_eq_tests(const struct check_eq_test *tests)
394c243e490SMarcel Moolenaar {
395c243e490SMarcel Moolenaar     const struct check_eq_test *t;
396c243e490SMarcel Moolenaar 
397c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
398c243e490SMarcel Moolenaar         printf("Checking with %s, %s and expecting %s\n", t->v1, t->v2,
399c243e490SMarcel Moolenaar                t->ok ? "true" : "false");
400c243e490SMarcel Moolenaar 
401c243e490SMarcel Moolenaar         init_and_run_h_tc("h_check", t->head, t->body);
402c243e490SMarcel Moolenaar 
403c243e490SMarcel Moolenaar         ATF_CHECK(exists("before"));
404c243e490SMarcel Moolenaar         ATF_CHECK(exists("after"));
405c243e490SMarcel Moolenaar 
406c243e490SMarcel Moolenaar         if (t->ok) {
407a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
408c243e490SMarcel Moolenaar         } else {
409a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^failed", "result"));
410a18eacbeSJulio Merino             ATF_CHECK(atf_utils_grep_file("Check failed: .*"
411a18eacbeSJulio Merino                 "macros_test.c:[0-9]+: %s$", "error", t->msg));
412c243e490SMarcel Moolenaar         }
413c243e490SMarcel Moolenaar 
414c243e490SMarcel Moolenaar         ATF_CHECK(unlink("before") != -1);
415c243e490SMarcel Moolenaar         ATF_CHECK(unlink("after") != -1);
416c243e490SMarcel Moolenaar     }
417c243e490SMarcel Moolenaar }
418c243e490SMarcel Moolenaar 
419c243e490SMarcel Moolenaar H_CHECK_EQ(1_1, 1, 1);
420c243e490SMarcel Moolenaar H_CHECK_EQ(1_2, 1, 2);
421c243e490SMarcel Moolenaar H_CHECK_EQ(2_1, 2, 1);
422c243e490SMarcel Moolenaar H_CHECK_EQ(2_2, 2, 2);
423c243e490SMarcel Moolenaar H_CHECK_EQ_MSG(1_1, 1, 1, "1 does not match 1");
424c243e490SMarcel Moolenaar H_CHECK_EQ_MSG(1_2, 1, 2, "1 does not match 2");
425c243e490SMarcel Moolenaar H_CHECK_EQ_MSG(2_1, 2, 1, "2 does not match 1");
426c243e490SMarcel Moolenaar H_CHECK_EQ_MSG(2_2, 2, 2, "2 does not match 2");
427c243e490SMarcel Moolenaar 
428c243e490SMarcel Moolenaar ATF_TC(check_eq);
ATF_TC_HEAD(check_eq,tc)429c243e490SMarcel Moolenaar ATF_TC_HEAD(check_eq, tc)
430c243e490SMarcel Moolenaar {
431c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_EQ and "
432c243e490SMarcel Moolenaar                       "ATF_CHECK_EQ_MSG macros");
433c243e490SMarcel Moolenaar }
ATF_TC_BODY(check_eq,tc)434c243e490SMarcel Moolenaar ATF_TC_BODY(check_eq, tc)
435c243e490SMarcel Moolenaar {
436c243e490SMarcel Moolenaar     struct check_eq_test tests[] = {
437c243e490SMarcel Moolenaar         { H_CHECK_EQ_HEAD_NAME(1_1), H_CHECK_EQ_BODY_NAME(1_1),
438c243e490SMarcel Moolenaar           "1", "1", "1 != 1", true },
439c243e490SMarcel Moolenaar         { H_CHECK_EQ_HEAD_NAME(1_2), H_CHECK_EQ_BODY_NAME(1_2),
440c243e490SMarcel Moolenaar           "1", "2", "1 != 2", false },
441c243e490SMarcel Moolenaar         { H_CHECK_EQ_HEAD_NAME(2_1), H_CHECK_EQ_BODY_NAME(2_1),
442c243e490SMarcel Moolenaar           "2", "1", "2 != 1", false },
443c243e490SMarcel Moolenaar         { H_CHECK_EQ_HEAD_NAME(2_2), H_CHECK_EQ_BODY_NAME(2_2),
444c243e490SMarcel Moolenaar           "2", "2", "2 != 2", true },
445c243e490SMarcel Moolenaar         { H_CHECK_EQ_MSG_HEAD_NAME(1_1), H_CHECK_EQ_MSG_BODY_NAME(1_1),
446c243e490SMarcel Moolenaar           "1", "1", "1 != 1: 1 does not match 1", true },
447c243e490SMarcel Moolenaar         { H_CHECK_EQ_MSG_HEAD_NAME(1_2), H_CHECK_EQ_MSG_BODY_NAME(1_2),
448c243e490SMarcel Moolenaar           "1", "2", "1 != 2: 1 does not match 2", false },
449c243e490SMarcel Moolenaar         { H_CHECK_EQ_MSG_HEAD_NAME(2_1), H_CHECK_EQ_MSG_BODY_NAME(2_1),
450c243e490SMarcel Moolenaar           "2", "1", "2 != 1: 2 does not match 1", false },
451c243e490SMarcel Moolenaar         { H_CHECK_EQ_MSG_HEAD_NAME(2_2), H_CHECK_EQ_MSG_BODY_NAME(2_2),
452c243e490SMarcel Moolenaar           "2", "2", "2 != 2: 2 does not match 2", true },
453c243e490SMarcel Moolenaar         { NULL, NULL, 0, 0, "", false }
454c243e490SMarcel Moolenaar     };
455c243e490SMarcel Moolenaar     do_check_eq_tests(tests);
456c243e490SMarcel Moolenaar }
457c243e490SMarcel Moolenaar 
458c243e490SMarcel Moolenaar H_CHECK_STREQ(1_1, "1", "1");
459c243e490SMarcel Moolenaar H_CHECK_STREQ(1_2, "1", "2");
460c243e490SMarcel Moolenaar H_CHECK_STREQ(2_1, "2", "1");
461c243e490SMarcel Moolenaar H_CHECK_STREQ(2_2, "2", "2");
462c243e490SMarcel Moolenaar H_CHECK_STREQ_MSG(1_1, "1", "1", "1 does not match 1");
463c243e490SMarcel Moolenaar H_CHECK_STREQ_MSG(1_2, "1", "2", "1 does not match 2");
464c243e490SMarcel Moolenaar H_CHECK_STREQ_MSG(2_1, "2", "1", "2 does not match 1");
465c243e490SMarcel Moolenaar H_CHECK_STREQ_MSG(2_2, "2", "2", "2 does not match 2");
466c243e490SMarcel Moolenaar #define CHECK_STREQ_VAR1 "5"
467c243e490SMarcel Moolenaar #define CHECK_STREQ_VAR2 "9"
468a18eacbeSJulio Merino const char *check_streq_var1 = CHECK_STREQ_VAR1;
469a18eacbeSJulio Merino const char *check_streq_var2 = CHECK_STREQ_VAR2;
470c243e490SMarcel Moolenaar H_CHECK_STREQ(vars, check_streq_var1, check_streq_var2);
471c243e490SMarcel Moolenaar 
472c243e490SMarcel Moolenaar ATF_TC(check_streq);
ATF_TC_HEAD(check_streq,tc)473c243e490SMarcel Moolenaar ATF_TC_HEAD(check_streq, tc)
474c243e490SMarcel Moolenaar {
475c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_STREQ and "
476c243e490SMarcel Moolenaar                       "ATF_CHECK_STREQ_MSG macros");
477c243e490SMarcel Moolenaar }
ATF_TC_BODY(check_streq,tc)478c243e490SMarcel Moolenaar ATF_TC_BODY(check_streq, tc)
479c243e490SMarcel Moolenaar {
480c243e490SMarcel Moolenaar     struct check_eq_test tests[] = {
481c243e490SMarcel Moolenaar         { H_CHECK_STREQ_HEAD_NAME(1_1), H_CHECK_STREQ_BODY_NAME(1_1),
482c243e490SMarcel Moolenaar           "1", "1", "\"1\" != \"1\" \\(1 != 1\\)", true },
483c243e490SMarcel Moolenaar         { H_CHECK_STREQ_HEAD_NAME(1_2), H_CHECK_STREQ_BODY_NAME(1_2),
484c243e490SMarcel Moolenaar           "1", "2", "\"1\" != \"2\" \\(1 != 2\\)", false },
485c243e490SMarcel Moolenaar         { H_CHECK_STREQ_HEAD_NAME(2_1), H_CHECK_STREQ_BODY_NAME(2_1),
486c243e490SMarcel Moolenaar           "2", "1", "\"2\" != \"1\" \\(2 != 1\\)", false },
487c243e490SMarcel Moolenaar         { H_CHECK_STREQ_HEAD_NAME(2_2), H_CHECK_STREQ_BODY_NAME(2_2),
488c243e490SMarcel Moolenaar           "2", "2", "\"2\" != \"2\" \\(2 != 2\\)", true },
489c243e490SMarcel Moolenaar         { H_CHECK_STREQ_MSG_HEAD_NAME(1_1),
490c243e490SMarcel Moolenaar           H_CHECK_STREQ_MSG_BODY_NAME(1_1),
491c243e490SMarcel Moolenaar           "1", "1", "\"1\" != \"1\" \\(1 != 1\\): 1 does not match 1", true },
492c243e490SMarcel Moolenaar         { H_CHECK_STREQ_MSG_HEAD_NAME(1_2),
493c243e490SMarcel Moolenaar           H_CHECK_STREQ_MSG_BODY_NAME(1_2),
494c243e490SMarcel Moolenaar           "1", "2", "\"1\" != \"2\" \\(1 != 2\\): 1 does not match 2", false },
495c243e490SMarcel Moolenaar         { H_CHECK_STREQ_MSG_HEAD_NAME(2_1),
496c243e490SMarcel Moolenaar           H_CHECK_STREQ_MSG_BODY_NAME(2_1),
497c243e490SMarcel Moolenaar           "2", "1", "\"2\" != \"1\" \\(2 != 1\\): 2 does not match 1", false },
498c243e490SMarcel Moolenaar         { H_CHECK_STREQ_MSG_HEAD_NAME(2_2),
499c243e490SMarcel Moolenaar           H_CHECK_STREQ_MSG_BODY_NAME(2_2),
500c243e490SMarcel Moolenaar           "2", "2", "\"2\" != \"2\" \\(2 != 2\\): 2 does not match 2", true },
501c243e490SMarcel Moolenaar         { H_CHECK_STREQ_HEAD_NAME(vars), H_CHECK_STREQ_BODY_NAME(vars),
502c243e490SMarcel Moolenaar           check_streq_var1, check_streq_var2,
503c243e490SMarcel Moolenaar           "check_streq_var1 != check_streq_var2 \\("
504c243e490SMarcel Moolenaar           CHECK_STREQ_VAR1 " != " CHECK_STREQ_VAR2 "\\)", false },
505c243e490SMarcel Moolenaar         { NULL, NULL, 0, 0, "", false }
506c243e490SMarcel Moolenaar     };
507c243e490SMarcel Moolenaar     do_check_eq_tests(tests);
508c243e490SMarcel Moolenaar }
509c243e490SMarcel Moolenaar 
510c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
511a18eacbeSJulio Merino  * Test cases for the ATF_CHECK_MATCH and ATF_CHECK_MATCH_MSG macros.
512a18eacbeSJulio Merino  * --------------------------------------------------------------------- */
513a18eacbeSJulio Merino 
514a18eacbeSJulio Merino H_CHECK_MATCH(yes, "hello [a-z]+", "abc hello world");
515a18eacbeSJulio Merino H_CHECK_MATCH(no, "hello [a-z]+", "abc hello WORLD");
516a18eacbeSJulio Merino H_CHECK_MATCH_MSG(yes, "hello [a-z]+", "abc hello world", "lowercase");
517a18eacbeSJulio Merino H_CHECK_MATCH_MSG(no, "hello [a-z]+", "abc hello WORLD", "uppercase");
518a18eacbeSJulio Merino 
519a18eacbeSJulio Merino ATF_TC(check_match);
ATF_TC_HEAD(check_match,tc)520a18eacbeSJulio Merino ATF_TC_HEAD(check_match, tc)
521a18eacbeSJulio Merino {
522a18eacbeSJulio Merino     atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_MATCH and "
523a18eacbeSJulio Merino                       "ATF_CHECK_MATCH_MSG macros");
524a18eacbeSJulio Merino }
ATF_TC_BODY(check_match,tc)525a18eacbeSJulio Merino ATF_TC_BODY(check_match, tc)
526a18eacbeSJulio Merino {
527a18eacbeSJulio Merino     struct check_eq_test tests[] = {
528a18eacbeSJulio Merino         { H_CHECK_MATCH_HEAD_NAME(yes), H_CHECK_MATCH_BODY_NAME(yes),
529a18eacbeSJulio Merino           "hello [a-z]+", "abc hello world", "", true },
530a18eacbeSJulio Merino         { H_CHECK_MATCH_HEAD_NAME(no), H_CHECK_MATCH_BODY_NAME(no),
531a18eacbeSJulio Merino           "hello [a-z]+", "abc hello WORLD",
532a18eacbeSJulio Merino           "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD'", false },
533a18eacbeSJulio Merino         { H_CHECK_MATCH_MSG_HEAD_NAME(yes), H_CHECK_MATCH_MSG_BODY_NAME(yes),
534a18eacbeSJulio Merino           "hello [a-z]+", "abc hello world", "", true },
535a18eacbeSJulio Merino         { H_CHECK_MATCH_MSG_HEAD_NAME(no), H_CHECK_MATCH_MSG_BODY_NAME(no),
536a18eacbeSJulio Merino           "hello [a-z]+", "abc hello WORLD",
537a18eacbeSJulio Merino           "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD': uppercase",
538a18eacbeSJulio Merino           false },
539a18eacbeSJulio Merino         { NULL, NULL, 0, 0, "", false }
540a18eacbeSJulio Merino     };
541a18eacbeSJulio Merino     do_check_eq_tests(tests);
542a18eacbeSJulio Merino }
543a18eacbeSJulio Merino 
544a18eacbeSJulio Merino /* ---------------------------------------------------------------------
545c243e490SMarcel Moolenaar  * Test cases for the ATF_REQUIRE and ATF_REQUIRE_MSG macros.
546c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
547c243e490SMarcel Moolenaar 
548c243e490SMarcel Moolenaar H_REQUIRE(0, 0);
549c243e490SMarcel Moolenaar H_REQUIRE(1, 1);
550c243e490SMarcel Moolenaar H_REQUIRE_MSG(0, 0, "expected a false value");
551c243e490SMarcel Moolenaar H_REQUIRE_MSG(1, 1, "expected a true value");
552c243e490SMarcel Moolenaar 
553c243e490SMarcel Moolenaar ATF_TC(require);
ATF_TC_HEAD(require,tc)554c243e490SMarcel Moolenaar ATF_TC_HEAD(require, tc)
555c243e490SMarcel Moolenaar {
556c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE and "
557c243e490SMarcel Moolenaar                       "ATF_REQUIRE_MSG macros");
558c243e490SMarcel Moolenaar }
ATF_TC_BODY(require,tc)559c243e490SMarcel Moolenaar ATF_TC_BODY(require, tc)
560c243e490SMarcel Moolenaar {
561c243e490SMarcel Moolenaar     struct test {
562c243e490SMarcel Moolenaar         void (*head)(atf_tc_t *);
563c243e490SMarcel Moolenaar         void (*body)(const atf_tc_t *);
564c243e490SMarcel Moolenaar         bool value;
565c243e490SMarcel Moolenaar         const char *msg;
566c243e490SMarcel Moolenaar         bool ok;
567c243e490SMarcel Moolenaar     } *t, tests[] = {
568c243e490SMarcel Moolenaar         { H_REQUIRE_HEAD_NAME(0), H_REQUIRE_BODY_NAME(0), 0,
569c243e490SMarcel Moolenaar           "0 not met", false },
570c243e490SMarcel Moolenaar         { H_REQUIRE_HEAD_NAME(1), H_REQUIRE_BODY_NAME(1), 1,
571c243e490SMarcel Moolenaar           "1 not met", true },
572c243e490SMarcel Moolenaar         { H_REQUIRE_MSG_HEAD_NAME(0), H_REQUIRE_MSG_BODY_NAME(0), 0,
573c243e490SMarcel Moolenaar           "expected a false value", false },
574c243e490SMarcel Moolenaar         { H_REQUIRE_MSG_HEAD_NAME(1), H_REQUIRE_MSG_BODY_NAME(1), 1,
575c243e490SMarcel Moolenaar           "expected a true value", true },
576c243e490SMarcel Moolenaar         { NULL, NULL, false, NULL, false }
577c243e490SMarcel Moolenaar     };
578c243e490SMarcel Moolenaar 
579c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
580c243e490SMarcel Moolenaar         printf("Checking with a %d value\n", t->value);
581c243e490SMarcel Moolenaar 
582c243e490SMarcel Moolenaar         init_and_run_h_tc("h_require", t->head, t->body);
583c243e490SMarcel Moolenaar 
584c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("before"));
585c243e490SMarcel Moolenaar         if (t->ok) {
586a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
587c243e490SMarcel Moolenaar             ATF_REQUIRE(exists("after"));
588c243e490SMarcel Moolenaar         } else {
589a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file(
590a18eacbeSJulio Merino                 "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->msg));
591c243e490SMarcel Moolenaar             ATF_REQUIRE(!exists("after"));
592c243e490SMarcel Moolenaar         }
593c243e490SMarcel Moolenaar 
594c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("before") != -1);
595c243e490SMarcel Moolenaar         if (t->ok)
596c243e490SMarcel Moolenaar             ATF_REQUIRE(unlink("after") != -1);
597c243e490SMarcel Moolenaar     }
598c243e490SMarcel Moolenaar }
599c243e490SMarcel Moolenaar 
600c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
601c243e490SMarcel Moolenaar  * Test cases for the ATF_REQUIRE_*EQ_ macros.
602c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
603c243e490SMarcel Moolenaar 
604c243e490SMarcel Moolenaar struct require_eq_test {
605c243e490SMarcel Moolenaar     void (*head)(atf_tc_t *);
606c243e490SMarcel Moolenaar     void (*body)(const atf_tc_t *);
607c243e490SMarcel Moolenaar     const char *v1;
608c243e490SMarcel Moolenaar     const char *v2;
609c243e490SMarcel Moolenaar     const char *msg;
610c243e490SMarcel Moolenaar     bool ok;
611c243e490SMarcel Moolenaar };
612c243e490SMarcel Moolenaar 
613c243e490SMarcel Moolenaar static
614c243e490SMarcel Moolenaar void
do_require_eq_tests(const struct require_eq_test * tests)615c243e490SMarcel Moolenaar do_require_eq_tests(const struct require_eq_test *tests)
616c243e490SMarcel Moolenaar {
617c243e490SMarcel Moolenaar     const struct require_eq_test *t;
618c243e490SMarcel Moolenaar 
619c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
620c243e490SMarcel Moolenaar         printf("Checking with %s, %s and expecting %s\n", t->v1, t->v2,
621c243e490SMarcel Moolenaar                t->ok ? "true" : "false");
622c243e490SMarcel Moolenaar 
623c243e490SMarcel Moolenaar         init_and_run_h_tc("h_require", t->head, t->body);
624c243e490SMarcel Moolenaar 
625c243e490SMarcel Moolenaar         ATF_REQUIRE(exists("before"));
626c243e490SMarcel Moolenaar         if (t->ok) {
627a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
628c243e490SMarcel Moolenaar             ATF_REQUIRE(exists("after"));
629c243e490SMarcel Moolenaar         } else {
630a18eacbeSJulio Merino             ATF_REQUIRE(atf_utils_grep_file("^failed: .*macros_test.c"
631a18eacbeSJulio Merino                 ":[0-9]+: %s$", "result", t->msg));
632c243e490SMarcel Moolenaar             ATF_REQUIRE(!exists("after"));
633c243e490SMarcel Moolenaar         }
634c243e490SMarcel Moolenaar 
635c243e490SMarcel Moolenaar         ATF_REQUIRE(unlink("before") != -1);
636c243e490SMarcel Moolenaar         if (t->ok)
637c243e490SMarcel Moolenaar             ATF_REQUIRE(unlink("after") != -1);
638c243e490SMarcel Moolenaar     }
639c243e490SMarcel Moolenaar }
640c243e490SMarcel Moolenaar 
641c243e490SMarcel Moolenaar H_REQUIRE_EQ(1_1, 1, 1);
642c243e490SMarcel Moolenaar H_REQUIRE_EQ(1_2, 1, 2);
643c243e490SMarcel Moolenaar H_REQUIRE_EQ(2_1, 2, 1);
644c243e490SMarcel Moolenaar H_REQUIRE_EQ(2_2, 2, 2);
645c243e490SMarcel Moolenaar H_REQUIRE_EQ_MSG(1_1, 1, 1, "1 does not match 1");
646c243e490SMarcel Moolenaar H_REQUIRE_EQ_MSG(1_2, 1, 2, "1 does not match 2");
647c243e490SMarcel Moolenaar H_REQUIRE_EQ_MSG(2_1, 2, 1, "2 does not match 1");
648c243e490SMarcel Moolenaar H_REQUIRE_EQ_MSG(2_2, 2, 2, "2 does not match 2");
649c243e490SMarcel Moolenaar 
650c243e490SMarcel Moolenaar ATF_TC(require_eq);
ATF_TC_HEAD(require_eq,tc)651c243e490SMarcel Moolenaar ATF_TC_HEAD(require_eq, tc)
652c243e490SMarcel Moolenaar {
653c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_EQ and "
654c243e490SMarcel Moolenaar                       "ATF_REQUIRE_EQ_MSG macros");
655c243e490SMarcel Moolenaar }
ATF_TC_BODY(require_eq,tc)656c243e490SMarcel Moolenaar ATF_TC_BODY(require_eq, tc)
657c243e490SMarcel Moolenaar {
658c243e490SMarcel Moolenaar     struct require_eq_test tests[] = {
659c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_HEAD_NAME(1_1), H_REQUIRE_EQ_BODY_NAME(1_1),
660c243e490SMarcel Moolenaar           "1", "1", "1 != 1", true },
661c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_HEAD_NAME(1_2), H_REQUIRE_EQ_BODY_NAME(1_2),
662c243e490SMarcel Moolenaar           "1", "2", "1 != 2", false },
663c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_HEAD_NAME(2_1), H_REQUIRE_EQ_BODY_NAME(2_1),
664c243e490SMarcel Moolenaar           "2", "1", "2 != 1", false },
665c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_HEAD_NAME(2_2), H_REQUIRE_EQ_BODY_NAME(2_2),
666c243e490SMarcel Moolenaar           "2", "2", "2 != 2", true },
667c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_MSG_HEAD_NAME(1_1), H_REQUIRE_EQ_MSG_BODY_NAME(1_1),
668c243e490SMarcel Moolenaar           "1", "1", "1 != 1: 1 does not match 1", true },
669c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_MSG_HEAD_NAME(1_2), H_REQUIRE_EQ_MSG_BODY_NAME(1_2),
670c243e490SMarcel Moolenaar           "1", "2", "1 != 2: 1 does not match 2", false },
671c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_MSG_HEAD_NAME(2_1), H_REQUIRE_EQ_MSG_BODY_NAME(2_1),
672c243e490SMarcel Moolenaar           "2", "1", "2 != 1: 2 does not match 1", false },
673c243e490SMarcel Moolenaar         { H_REQUIRE_EQ_MSG_HEAD_NAME(2_2), H_REQUIRE_EQ_MSG_BODY_NAME(2_2),
674c243e490SMarcel Moolenaar           "2", "2", "2 != 2: 2 does not match 2", true },
675c243e490SMarcel Moolenaar         { NULL, NULL, 0, 0, "", false }
676c243e490SMarcel Moolenaar     };
677c243e490SMarcel Moolenaar     do_require_eq_tests(tests);
678c243e490SMarcel Moolenaar }
679c243e490SMarcel Moolenaar 
680c243e490SMarcel Moolenaar H_REQUIRE_STREQ(1_1, "1", "1");
681c243e490SMarcel Moolenaar H_REQUIRE_STREQ(1_2, "1", "2");
682c243e490SMarcel Moolenaar H_REQUIRE_STREQ(2_1, "2", "1");
683c243e490SMarcel Moolenaar H_REQUIRE_STREQ(2_2, "2", "2");
684c243e490SMarcel Moolenaar H_REQUIRE_STREQ_MSG(1_1, "1", "1", "1 does not match 1");
685c243e490SMarcel Moolenaar H_REQUIRE_STREQ_MSG(1_2, "1", "2", "1 does not match 2");
686c243e490SMarcel Moolenaar H_REQUIRE_STREQ_MSG(2_1, "2", "1", "2 does not match 1");
687c243e490SMarcel Moolenaar H_REQUIRE_STREQ_MSG(2_2, "2", "2", "2 does not match 2");
688c243e490SMarcel Moolenaar #define REQUIRE_STREQ_VAR1 "5"
689c243e490SMarcel Moolenaar #define REQUIRE_STREQ_VAR2 "9"
690a18eacbeSJulio Merino const char *require_streq_var1 = REQUIRE_STREQ_VAR1;
691a18eacbeSJulio Merino const char *require_streq_var2 = REQUIRE_STREQ_VAR2;
692c243e490SMarcel Moolenaar H_REQUIRE_STREQ(vars, require_streq_var1, require_streq_var2);
693c243e490SMarcel Moolenaar 
694c243e490SMarcel Moolenaar ATF_TC(require_streq);
ATF_TC_HEAD(require_streq,tc)695c243e490SMarcel Moolenaar ATF_TC_HEAD(require_streq, tc)
696c243e490SMarcel Moolenaar {
697c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_STREQ and "
698c243e490SMarcel Moolenaar                       "ATF_REQUIRE_STREQ_MSG macros");
699c243e490SMarcel Moolenaar }
ATF_TC_BODY(require_streq,tc)700c243e490SMarcel Moolenaar ATF_TC_BODY(require_streq, tc)
701c243e490SMarcel Moolenaar {
702c243e490SMarcel Moolenaar     struct require_eq_test tests[] = {
703c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_HEAD_NAME(1_1), H_REQUIRE_STREQ_BODY_NAME(1_1),
704c243e490SMarcel Moolenaar           "1", "1", "\"1\" != \"1\" \\(1 != 1\\)", true },
705c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_HEAD_NAME(1_2), H_REQUIRE_STREQ_BODY_NAME(1_2),
706c243e490SMarcel Moolenaar           "1", "2", "\"1\" != \"2\" \\(1 != 2\\)", false },
707c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_HEAD_NAME(2_1), H_REQUIRE_STREQ_BODY_NAME(2_1),
708c243e490SMarcel Moolenaar           "2", "1", "\"2\" != \"1\" \\(2 != 1\\)", false },
709c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_HEAD_NAME(2_2), H_REQUIRE_STREQ_BODY_NAME(2_2),
710c243e490SMarcel Moolenaar           "2", "2", "\"2\" != \"2\" \\(2 != 2\\)", true },
711c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_MSG_HEAD_NAME(1_1),
712c243e490SMarcel Moolenaar           H_REQUIRE_STREQ_MSG_BODY_NAME(1_1),
713c243e490SMarcel Moolenaar           "1", "1", "\"1\" != \"1\" \\(1 != 1\\): 1 does not match 1", true },
714c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_MSG_HEAD_NAME(1_2),
715c243e490SMarcel Moolenaar           H_REQUIRE_STREQ_MSG_BODY_NAME(1_2),
716c243e490SMarcel Moolenaar           "1", "2", "\"1\" != \"2\" \\(1 != 2\\): 1 does not match 2", false },
717c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_MSG_HEAD_NAME(2_1),
718c243e490SMarcel Moolenaar           H_REQUIRE_STREQ_MSG_BODY_NAME(2_1),
719c243e490SMarcel Moolenaar           "2", "1", "\"2\" != \"1\" \\(2 != 1\\): 2 does not match 1", false },
720c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_MSG_HEAD_NAME(2_2),
721c243e490SMarcel Moolenaar           H_REQUIRE_STREQ_MSG_BODY_NAME(2_2),
722c243e490SMarcel Moolenaar           "2", "2", "\"2\" != \"2\" \\(2 != 2\\): 2 does not match 2", true },
723c243e490SMarcel Moolenaar         { H_REQUIRE_STREQ_HEAD_NAME(vars), H_REQUIRE_STREQ_BODY_NAME(vars),
724c243e490SMarcel Moolenaar           require_streq_var1, require_streq_var2,
725c243e490SMarcel Moolenaar           "require_streq_var1 != require_streq_var2 \\("
726c243e490SMarcel Moolenaar           REQUIRE_STREQ_VAR1 " != " REQUIRE_STREQ_VAR2 "\\)", false },
727c243e490SMarcel Moolenaar         { NULL, NULL, 0, 0, "", false }
728c243e490SMarcel Moolenaar     };
729c243e490SMarcel Moolenaar     do_require_eq_tests(tests);
730c243e490SMarcel Moolenaar }
731c243e490SMarcel Moolenaar 
732c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
733a18eacbeSJulio Merino  * Test cases for the ATF_REQUIRE_MATCH and ATF_REQUIRE_MATCH_MSG macros.
734a18eacbeSJulio Merino  * --------------------------------------------------------------------- */
735a18eacbeSJulio Merino 
736a18eacbeSJulio Merino H_REQUIRE_MATCH(yes, "hello [a-z]+", "abc hello world");
737a18eacbeSJulio Merino H_REQUIRE_MATCH(no, "hello [a-z]+", "abc hello WORLD");
738a18eacbeSJulio Merino H_REQUIRE_MATCH_MSG(yes, "hello [a-z]+", "abc hello world", "lowercase");
739a18eacbeSJulio Merino H_REQUIRE_MATCH_MSG(no, "hello [a-z]+", "abc hello WORLD", "uppercase");
740a18eacbeSJulio Merino 
741a18eacbeSJulio Merino ATF_TC(require_match);
ATF_TC_HEAD(require_match,tc)742a18eacbeSJulio Merino ATF_TC_HEAD(require_match, tc)
743a18eacbeSJulio Merino {
744a18eacbeSJulio Merino     atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_MATCH and "
745a18eacbeSJulio Merino                       "ATF_REQUIRE_MATCH_MSG macros");
746a18eacbeSJulio Merino }
ATF_TC_BODY(require_match,tc)747a18eacbeSJulio Merino ATF_TC_BODY(require_match, tc)
748a18eacbeSJulio Merino {
749a18eacbeSJulio Merino     struct require_eq_test tests[] = {
750a18eacbeSJulio Merino         { H_REQUIRE_MATCH_HEAD_NAME(yes), H_REQUIRE_MATCH_BODY_NAME(yes),
751a18eacbeSJulio Merino           "hello [a-z]+", "abc hello world", "", true },
752a18eacbeSJulio Merino         { H_REQUIRE_MATCH_HEAD_NAME(no), H_REQUIRE_MATCH_BODY_NAME(no),
753a18eacbeSJulio Merino           "hello [a-z]+", "abc hello WORLD",
754a18eacbeSJulio Merino           "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD'", false },
755a18eacbeSJulio Merino         { H_REQUIRE_MATCH_MSG_HEAD_NAME(yes),
756a18eacbeSJulio Merino           H_REQUIRE_MATCH_MSG_BODY_NAME(yes),
757a18eacbeSJulio Merino           "hello [a-z]+", "abc hello world", "", true },
758a18eacbeSJulio Merino         { H_REQUIRE_MATCH_MSG_HEAD_NAME(no), H_REQUIRE_MATCH_MSG_BODY_NAME(no),
759a18eacbeSJulio Merino           "hello [a-z]+", "abc hello WORLD",
760a18eacbeSJulio Merino           "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD': uppercase",
761a18eacbeSJulio Merino           false },
762a18eacbeSJulio Merino         { NULL, NULL, 0, 0, "", false }
763a18eacbeSJulio Merino     };
764a18eacbeSJulio Merino     do_require_eq_tests(tests);
765a18eacbeSJulio Merino }
766a18eacbeSJulio Merino 
767a18eacbeSJulio Merino /* ---------------------------------------------------------------------
768c243e490SMarcel Moolenaar  * Miscellaneous test cases covering several macros.
769c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
770c243e490SMarcel Moolenaar 
771c243e490SMarcel Moolenaar static
772c243e490SMarcel Moolenaar bool
aux_bool(const char * fmt ATF_DEFS_ATTRIBUTE_UNUSED)773c243e490SMarcel Moolenaar aux_bool(const char *fmt ATF_DEFS_ATTRIBUTE_UNUSED)
774c243e490SMarcel Moolenaar {
775c243e490SMarcel Moolenaar     return false;
776c243e490SMarcel Moolenaar }
777c243e490SMarcel Moolenaar 
778c243e490SMarcel Moolenaar static
779c243e490SMarcel Moolenaar const char *
aux_str(const char * fmt ATF_DEFS_ATTRIBUTE_UNUSED)780c243e490SMarcel Moolenaar aux_str(const char *fmt ATF_DEFS_ATTRIBUTE_UNUSED)
781c243e490SMarcel Moolenaar {
782c243e490SMarcel Moolenaar     return "foo";
783c243e490SMarcel Moolenaar }
784c243e490SMarcel Moolenaar 
785c243e490SMarcel Moolenaar H_CHECK(msg, aux_bool("%d"));
786c243e490SMarcel Moolenaar H_REQUIRE(msg, aux_bool("%d"));
787c243e490SMarcel Moolenaar H_CHECK_STREQ(msg, aux_str("%d"), "");
788c243e490SMarcel Moolenaar H_REQUIRE_STREQ(msg, aux_str("%d"), "");
789c243e490SMarcel Moolenaar 
790c243e490SMarcel Moolenaar ATF_TC(msg_embedded_fmt);
ATF_TC_HEAD(msg_embedded_fmt,tc)791c243e490SMarcel Moolenaar ATF_TC_HEAD(msg_embedded_fmt, tc)
792c243e490SMarcel Moolenaar {
793c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests that format strings passed "
794c243e490SMarcel Moolenaar                       "as part of the automatically-generated messages "
795c243e490SMarcel Moolenaar                       "do not get expanded");
796c243e490SMarcel Moolenaar }
ATF_TC_BODY(msg_embedded_fmt,tc)797c243e490SMarcel Moolenaar ATF_TC_BODY(msg_embedded_fmt, tc)
798c243e490SMarcel Moolenaar {
799c243e490SMarcel Moolenaar     struct test {
800c243e490SMarcel Moolenaar         void (*head)(atf_tc_t *);
801c243e490SMarcel Moolenaar         void (*body)(const atf_tc_t *);
802c243e490SMarcel Moolenaar         bool fatal;
803c243e490SMarcel Moolenaar         const char *msg;
804c243e490SMarcel Moolenaar     } *t, tests[] = {
805c243e490SMarcel Moolenaar        {  H_CHECK_HEAD_NAME(msg), H_CHECK_BODY_NAME(msg), false,
806c243e490SMarcel Moolenaar           "aux_bool\\(\"%d\"\\) not met" },
807c243e490SMarcel Moolenaar        {  H_REQUIRE_HEAD_NAME(msg), H_REQUIRE_BODY_NAME(msg), true,
808c243e490SMarcel Moolenaar           "aux_bool\\(\"%d\"\\) not met" },
809c243e490SMarcel Moolenaar        {  H_CHECK_STREQ_HEAD_NAME(msg), H_CHECK_STREQ_BODY_NAME(msg), false,
810c243e490SMarcel Moolenaar           "aux_str\\(\"%d\"\\) != \"\" \\(foo != \\)" },
811c243e490SMarcel Moolenaar        {  H_REQUIRE_STREQ_HEAD_NAME(msg), H_REQUIRE_STREQ_BODY_NAME(msg), true,
812c243e490SMarcel Moolenaar           "aux_str\\(\"%d\"\\) != \"\" \\(foo != \\)" },
813c243e490SMarcel Moolenaar        { NULL, NULL, false, NULL }
814c243e490SMarcel Moolenaar     };
815c243e490SMarcel Moolenaar 
816c243e490SMarcel Moolenaar     for (t = &tests[0]; t->head != NULL; t++) {
817c243e490SMarcel Moolenaar         printf("Checking with an expected '%s' message\n", t->msg);
818c243e490SMarcel Moolenaar 
819c243e490SMarcel Moolenaar         init_and_run_h_tc("h_check", t->head, t->body);
820c243e490SMarcel Moolenaar 
821c243e490SMarcel Moolenaar         if (t->fatal) {
822c243e490SMarcel Moolenaar             bool matched =
823a18eacbeSJulio Merino                 atf_utils_grep_file(
824a18eacbeSJulio Merino                     "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->msg);
825c243e490SMarcel Moolenaar             ATF_CHECK_MSG(matched, "couldn't find error string in result");
826c243e490SMarcel Moolenaar         } else {
827a18eacbeSJulio Merino             bool matched = atf_utils_grep_file("Check failed: .*"
828a18eacbeSJulio Merino                 "macros_test.c:[0-9]+: %s$", "error", t->msg);
829c243e490SMarcel Moolenaar             ATF_CHECK_MSG(matched, "couldn't find error string in output");
830c243e490SMarcel Moolenaar         }
831c243e490SMarcel Moolenaar     }
832c243e490SMarcel Moolenaar }
833c243e490SMarcel Moolenaar 
834c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
835c243e490SMarcel Moolenaar  * Tests cases for the header file.
836c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
837c243e490SMarcel Moolenaar 
838c243e490SMarcel Moolenaar BUILD_TC(use, "macros_h_test.c",
839c243e490SMarcel Moolenaar          "Tests that the macros provided by the atf-c/macros.h file "
840c243e490SMarcel Moolenaar          "do not cause syntax errors when used",
841c243e490SMarcel Moolenaar          "Build of macros_h_test.c failed; some macros in atf-c/macros.h "
842c243e490SMarcel Moolenaar          "are broken");
8431a61beb0SJulio Merino 
8441a61beb0SJulio Merino ATF_TC(detect_unused_tests);
ATF_TC_HEAD(detect_unused_tests,tc)8451a61beb0SJulio Merino ATF_TC_HEAD(detect_unused_tests, tc)
8461a61beb0SJulio Merino {
8471a61beb0SJulio Merino     atf_tc_set_md_var(tc, "descr",
8481a61beb0SJulio Merino                       "Tests that defining an unused test case raises a "
8491a61beb0SJulio Merino                       "warning (and thus an error)");
8501a61beb0SJulio Merino }
ATF_TC_BODY(detect_unused_tests,tc)8511a61beb0SJulio Merino ATF_TC_BODY(detect_unused_tests, tc)
8521a61beb0SJulio Merino {
8531a61beb0SJulio Merino     const char* validate_compiler =
8541a61beb0SJulio Merino         "struct test_struct { int dummy; };\n"
8551a61beb0SJulio Merino         "#define define_unused static struct test_struct unused\n"
8561a61beb0SJulio Merino         "define_unused;\n";
8571a61beb0SJulio Merino 
8581a61beb0SJulio Merino     atf_utils_create_file("compiler_test.c", "%s", validate_compiler);
8591a61beb0SJulio Merino     if (build_check_c_o("compiler_test.c"))
8601a61beb0SJulio Merino         atf_tc_expect_fail("Compiler does not raise a warning on an unused "
8611a61beb0SJulio Merino                            "static global variable declared by a macro");
8621a61beb0SJulio Merino 
8631a61beb0SJulio Merino     if (build_check_c_o_srcdir(tc, "unused_test.c"))
8641a61beb0SJulio Merino         atf_tc_fail("Build of unused_test.c passed; unused test cases are "
8651a61beb0SJulio Merino                     "not properly detected");
8661a61beb0SJulio Merino }
867c243e490SMarcel Moolenaar 
868c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
869c243e490SMarcel Moolenaar  * Main.
870c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
871c243e490SMarcel Moolenaar 
ATF_TP_ADD_TCS(tp)872c243e490SMarcel Moolenaar ATF_TP_ADD_TCS(tp)
873c243e490SMarcel Moolenaar {
874c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, check);
875c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, check_eq);
876c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, check_streq);
877c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, check_errno);
878a18eacbeSJulio Merino     ATF_TP_ADD_TC(tp, check_match);
879c243e490SMarcel Moolenaar 
880c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, require);
881c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, require_eq);
882c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, require_streq);
883c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, require_errno);
884a18eacbeSJulio Merino     ATF_TP_ADD_TC(tp, require_match);
885c243e490SMarcel Moolenaar 
886c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, msg_embedded_fmt);
887c243e490SMarcel Moolenaar 
888c243e490SMarcel Moolenaar     /* Add the test cases for the header file. */
889c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, use);
890c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, detect_unused_tests);
891c243e490SMarcel Moolenaar 
892c243e490SMarcel Moolenaar     return atf_no_error();
893c243e490SMarcel Moolenaar }
894