xref: /freebsd/contrib/atf/atf-c++/macros_test.cpp (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
1*c243e490SMarcel Moolenaar //
2*c243e490SMarcel Moolenaar // Automated Testing Framework (atf)
3*c243e490SMarcel Moolenaar //
4*c243e490SMarcel Moolenaar // Copyright (c) 2008 The NetBSD Foundation, Inc.
5*c243e490SMarcel Moolenaar // All rights reserved.
6*c243e490SMarcel Moolenaar //
7*c243e490SMarcel Moolenaar // Redistribution and use in source and binary forms, with or without
8*c243e490SMarcel Moolenaar // modification, are permitted provided that the following conditions
9*c243e490SMarcel Moolenaar // are met:
10*c243e490SMarcel Moolenaar // 1. Redistributions of source code must retain the above copyright
11*c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer.
12*c243e490SMarcel Moolenaar // 2. Redistributions in binary form must reproduce the above copyright
13*c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer in the
14*c243e490SMarcel Moolenaar //    documentation and/or other materials provided with the distribution.
15*c243e490SMarcel Moolenaar //
16*c243e490SMarcel Moolenaar // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*c243e490SMarcel Moolenaar // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*c243e490SMarcel Moolenaar // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*c243e490SMarcel Moolenaar // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*c243e490SMarcel Moolenaar // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*c243e490SMarcel Moolenaar // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*c243e490SMarcel Moolenaar // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*c243e490SMarcel Moolenaar // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*c243e490SMarcel Moolenaar // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*c243e490SMarcel Moolenaar // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*c243e490SMarcel Moolenaar // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*c243e490SMarcel Moolenaar // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*c243e490SMarcel Moolenaar //
29*c243e490SMarcel Moolenaar 
30*c243e490SMarcel Moolenaar extern "C" {
31*c243e490SMarcel Moolenaar #include <fcntl.h>
32*c243e490SMarcel Moolenaar #include <unistd.h>
33*c243e490SMarcel Moolenaar }
34*c243e490SMarcel Moolenaar 
35*c243e490SMarcel Moolenaar #include <cerrno>
36*c243e490SMarcel Moolenaar #include <cstdlib>
37*c243e490SMarcel Moolenaar #include <iostream>
38*c243e490SMarcel Moolenaar #include <stdexcept>
39*c243e490SMarcel Moolenaar 
40*c243e490SMarcel Moolenaar #include "macros.hpp"
41*c243e490SMarcel Moolenaar 
42*c243e490SMarcel Moolenaar #include "detail/fs.hpp"
43*c243e490SMarcel Moolenaar #include "detail/process.hpp"
44*c243e490SMarcel Moolenaar #include "detail/sanity.hpp"
45*c243e490SMarcel Moolenaar #include "detail/test_helpers.hpp"
46*c243e490SMarcel Moolenaar #include "detail/text.hpp"
47*c243e490SMarcel Moolenaar 
48*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
49*c243e490SMarcel Moolenaar // Auxiliary functions.
50*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
51*c243e490SMarcel Moolenaar 
52*c243e490SMarcel Moolenaar static
53*c243e490SMarcel Moolenaar void
54*c243e490SMarcel Moolenaar create_ctl_file(const char *name)
55*c243e490SMarcel Moolenaar {
56*c243e490SMarcel Moolenaar     ATF_REQUIRE(open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1);
57*c243e490SMarcel Moolenaar }
58*c243e490SMarcel Moolenaar 
59*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
60*c243e490SMarcel Moolenaar // Auxiliary test cases.
61*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
62*c243e490SMarcel Moolenaar 
63*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_pass);
64*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_pass)
65*c243e490SMarcel Moolenaar {
66*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
67*c243e490SMarcel Moolenaar }
68*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_pass)
69*c243e490SMarcel Moolenaar {
70*c243e490SMarcel Moolenaar     create_ctl_file("before");
71*c243e490SMarcel Moolenaar     ATF_PASS();
72*c243e490SMarcel Moolenaar     create_ctl_file("after");
73*c243e490SMarcel Moolenaar }
74*c243e490SMarcel Moolenaar 
75*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_fail);
76*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_fail)
77*c243e490SMarcel Moolenaar {
78*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
79*c243e490SMarcel Moolenaar }
80*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_fail)
81*c243e490SMarcel Moolenaar {
82*c243e490SMarcel Moolenaar     create_ctl_file("before");
83*c243e490SMarcel Moolenaar     ATF_FAIL("Failed on purpose");
84*c243e490SMarcel Moolenaar     create_ctl_file("after");
85*c243e490SMarcel Moolenaar }
86*c243e490SMarcel Moolenaar 
87*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_skip);
88*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_skip)
89*c243e490SMarcel Moolenaar {
90*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
91*c243e490SMarcel Moolenaar }
92*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_skip)
93*c243e490SMarcel Moolenaar {
94*c243e490SMarcel Moolenaar     create_ctl_file("before");
95*c243e490SMarcel Moolenaar     ATF_SKIP("Skipped on purpose");
96*c243e490SMarcel Moolenaar     create_ctl_file("after");
97*c243e490SMarcel Moolenaar }
98*c243e490SMarcel Moolenaar 
99*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require);
100*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require)
101*c243e490SMarcel Moolenaar {
102*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
103*c243e490SMarcel Moolenaar }
104*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require)
105*c243e490SMarcel Moolenaar {
106*c243e490SMarcel Moolenaar     bool condition = atf::text::to_bool(get_config_var("condition"));
107*c243e490SMarcel Moolenaar 
108*c243e490SMarcel Moolenaar     create_ctl_file("before");
109*c243e490SMarcel Moolenaar     ATF_REQUIRE(condition);
110*c243e490SMarcel Moolenaar     create_ctl_file("after");
111*c243e490SMarcel Moolenaar }
112*c243e490SMarcel Moolenaar 
113*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_eq);
114*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_eq)
115*c243e490SMarcel Moolenaar {
116*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
117*c243e490SMarcel Moolenaar }
118*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_eq)
119*c243e490SMarcel Moolenaar {
120*c243e490SMarcel Moolenaar     long v1 = atf::text::to_type< long >(get_config_var("v1"));
121*c243e490SMarcel Moolenaar     long v2 = atf::text::to_type< long >(get_config_var("v2"));
122*c243e490SMarcel Moolenaar 
123*c243e490SMarcel Moolenaar     create_ctl_file("before");
124*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(v1, v2);
125*c243e490SMarcel Moolenaar     create_ctl_file("after");
126*c243e490SMarcel Moolenaar }
127*c243e490SMarcel Moolenaar 
128*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_in);
129*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_in)
130*c243e490SMarcel Moolenaar {
131*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
132*c243e490SMarcel Moolenaar }
133*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_in)
134*c243e490SMarcel Moolenaar {
135*c243e490SMarcel Moolenaar     const std::string element = get_config_var("value");
136*c243e490SMarcel Moolenaar 
137*c243e490SMarcel Moolenaar     std::set< std::string > collection;
138*c243e490SMarcel Moolenaar     collection.insert("foo");
139*c243e490SMarcel Moolenaar     collection.insert("bar");
140*c243e490SMarcel Moolenaar     collection.insert("baz");
141*c243e490SMarcel Moolenaar 
142*c243e490SMarcel Moolenaar     create_ctl_file("before");
143*c243e490SMarcel Moolenaar     ATF_REQUIRE_IN(element, collection);
144*c243e490SMarcel Moolenaar     create_ctl_file("after");
145*c243e490SMarcel Moolenaar }
146*c243e490SMarcel Moolenaar 
147*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_match);
148*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_match)
149*c243e490SMarcel Moolenaar {
150*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
151*c243e490SMarcel Moolenaar }
152*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_match)
153*c243e490SMarcel Moolenaar {
154*c243e490SMarcel Moolenaar     const std::string regexp = get_config_var("regexp");
155*c243e490SMarcel Moolenaar     const std::string string = get_config_var("string");
156*c243e490SMarcel Moolenaar 
157*c243e490SMarcel Moolenaar     create_ctl_file("before");
158*c243e490SMarcel Moolenaar     ATF_REQUIRE_MATCH(regexp, string);
159*c243e490SMarcel Moolenaar     create_ctl_file("after");
160*c243e490SMarcel Moolenaar }
161*c243e490SMarcel Moolenaar 
162*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_not_in);
163*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_not_in)
164*c243e490SMarcel Moolenaar {
165*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
166*c243e490SMarcel Moolenaar }
167*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_not_in)
168*c243e490SMarcel Moolenaar {
169*c243e490SMarcel Moolenaar     const std::string element = get_config_var("value");
170*c243e490SMarcel Moolenaar 
171*c243e490SMarcel Moolenaar     std::set< std::string > collection;
172*c243e490SMarcel Moolenaar     collection.insert("foo");
173*c243e490SMarcel Moolenaar     collection.insert("bar");
174*c243e490SMarcel Moolenaar     collection.insert("baz");
175*c243e490SMarcel Moolenaar 
176*c243e490SMarcel Moolenaar     create_ctl_file("before");
177*c243e490SMarcel Moolenaar     ATF_REQUIRE_NOT_IN(element, collection);
178*c243e490SMarcel Moolenaar     create_ctl_file("after");
179*c243e490SMarcel Moolenaar }
180*c243e490SMarcel Moolenaar 
181*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_throw);
182*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_throw)
183*c243e490SMarcel Moolenaar {
184*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
185*c243e490SMarcel Moolenaar }
186*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_throw)
187*c243e490SMarcel Moolenaar {
188*c243e490SMarcel Moolenaar     create_ctl_file("before");
189*c243e490SMarcel Moolenaar 
190*c243e490SMarcel Moolenaar     if (get_config_var("what") == "throw_int")
191*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error, if (1) throw int(5));
192*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "throw_rt")
193*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error,
194*c243e490SMarcel Moolenaar                         if (1) throw std::runtime_error("e"));
195*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "no_throw_rt")
196*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW(std::runtime_error,
197*c243e490SMarcel Moolenaar                         if (0) throw std::runtime_error("e"));
198*c243e490SMarcel Moolenaar 
199*c243e490SMarcel Moolenaar     create_ctl_file("after");
200*c243e490SMarcel Moolenaar }
201*c243e490SMarcel Moolenaar 
202*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_throw_re);
203*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_throw_re)
204*c243e490SMarcel Moolenaar {
205*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
206*c243e490SMarcel Moolenaar }
207*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_throw_re)
208*c243e490SMarcel Moolenaar {
209*c243e490SMarcel Moolenaar     create_ctl_file("before");
210*c243e490SMarcel Moolenaar 
211*c243e490SMarcel Moolenaar     if (get_config_var("what") == "throw_int")
212*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "5", if (1) throw int(5));
213*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "throw_rt_match")
214*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
215*c243e490SMarcel Moolenaar                              if (1) throw std::runtime_error("a foo bar baz"));
216*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "throw_rt_no_match")
217*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
218*c243e490SMarcel Moolenaar                              if (1) throw std::runtime_error("baz foo bar a"));
219*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "no_throw_rt")
220*c243e490SMarcel Moolenaar         ATF_REQUIRE_THROW_RE(std::runtime_error, "e",
221*c243e490SMarcel Moolenaar                              if (0) throw std::runtime_error("e"));
222*c243e490SMarcel Moolenaar 
223*c243e490SMarcel Moolenaar     create_ctl_file("after");
224*c243e490SMarcel Moolenaar }
225*c243e490SMarcel Moolenaar 
226*c243e490SMarcel Moolenaar static int
227*c243e490SMarcel Moolenaar errno_fail_stub(const int raised_errno)
228*c243e490SMarcel Moolenaar {
229*c243e490SMarcel Moolenaar     errno = raised_errno;
230*c243e490SMarcel Moolenaar     return -1;
231*c243e490SMarcel Moolenaar }
232*c243e490SMarcel Moolenaar 
233*c243e490SMarcel Moolenaar static int
234*c243e490SMarcel Moolenaar errno_ok_stub(void)
235*c243e490SMarcel Moolenaar {
236*c243e490SMarcel Moolenaar     return 0;
237*c243e490SMarcel Moolenaar }
238*c243e490SMarcel Moolenaar 
239*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_check_errno);
240*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_check_errno)
241*c243e490SMarcel Moolenaar {
242*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
243*c243e490SMarcel Moolenaar }
244*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_check_errno)
245*c243e490SMarcel Moolenaar {
246*c243e490SMarcel Moolenaar     create_ctl_file("before");
247*c243e490SMarcel Moolenaar 
248*c243e490SMarcel Moolenaar     if (get_config_var("what") == "no_error")
249*c243e490SMarcel Moolenaar         ATF_CHECK_ERRNO(-1, errno_ok_stub() == -1);
250*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_ok")
251*c243e490SMarcel Moolenaar         ATF_CHECK_ERRNO(2, errno_fail_stub(2) == -1);
252*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_fail")
253*c243e490SMarcel Moolenaar         ATF_CHECK_ERRNO(3, errno_fail_stub(4) == -1);
254*c243e490SMarcel Moolenaar     else
255*c243e490SMarcel Moolenaar         UNREACHABLE;
256*c243e490SMarcel Moolenaar 
257*c243e490SMarcel Moolenaar     create_ctl_file("after");
258*c243e490SMarcel Moolenaar }
259*c243e490SMarcel Moolenaar 
260*c243e490SMarcel Moolenaar ATF_TEST_CASE(h_require_errno);
261*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(h_require_errno)
262*c243e490SMarcel Moolenaar {
263*c243e490SMarcel Moolenaar     set_md_var("descr", "Helper test case");
264*c243e490SMarcel Moolenaar }
265*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(h_require_errno)
266*c243e490SMarcel Moolenaar {
267*c243e490SMarcel Moolenaar     create_ctl_file("before");
268*c243e490SMarcel Moolenaar 
269*c243e490SMarcel Moolenaar     if (get_config_var("what") == "no_error")
270*c243e490SMarcel Moolenaar         ATF_REQUIRE_ERRNO(-1, errno_ok_stub() == -1);
271*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_ok")
272*c243e490SMarcel Moolenaar         ATF_REQUIRE_ERRNO(2, errno_fail_stub(2) == -1);
273*c243e490SMarcel Moolenaar     else if (get_config_var("what") == "errno_fail")
274*c243e490SMarcel Moolenaar         ATF_REQUIRE_ERRNO(3, errno_fail_stub(4) == -1);
275*c243e490SMarcel Moolenaar     else
276*c243e490SMarcel Moolenaar         UNREACHABLE;
277*c243e490SMarcel Moolenaar 
278*c243e490SMarcel Moolenaar     create_ctl_file("after");
279*c243e490SMarcel Moolenaar }
280*c243e490SMarcel Moolenaar 
281*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
282*c243e490SMarcel Moolenaar // Test cases for the macros.
283*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
284*c243e490SMarcel Moolenaar 
285*c243e490SMarcel Moolenaar ATF_TEST_CASE(pass);
286*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(pass)
287*c243e490SMarcel Moolenaar {
288*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_PASS macro");
289*c243e490SMarcel Moolenaar }
290*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(pass)
291*c243e490SMarcel Moolenaar {
292*c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(h_pass);
293*c243e490SMarcel Moolenaar     run_h_tc< ATF_TEST_CASE_NAME(h_pass) >();
294*c243e490SMarcel Moolenaar     ATF_REQUIRE(grep_file("result", "^passed"));
295*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
296*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
297*c243e490SMarcel Moolenaar }
298*c243e490SMarcel Moolenaar 
299*c243e490SMarcel Moolenaar ATF_TEST_CASE(fail);
300*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(fail)
301*c243e490SMarcel Moolenaar {
302*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_FAIL macro");
303*c243e490SMarcel Moolenaar }
304*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(fail)
305*c243e490SMarcel Moolenaar {
306*c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(h_fail);
307*c243e490SMarcel Moolenaar     run_h_tc< ATF_TEST_CASE_NAME(h_fail) >();
308*c243e490SMarcel Moolenaar     ATF_REQUIRE(grep_file("result", "^failed: Failed on purpose"));
309*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
310*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
311*c243e490SMarcel Moolenaar }
312*c243e490SMarcel Moolenaar 
313*c243e490SMarcel Moolenaar ATF_TEST_CASE(skip);
314*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(skip)
315*c243e490SMarcel Moolenaar {
316*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_SKIP macro");
317*c243e490SMarcel Moolenaar }
318*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(skip)
319*c243e490SMarcel Moolenaar {
320*c243e490SMarcel Moolenaar     ATF_TEST_CASE_USE(h_skip);
321*c243e490SMarcel Moolenaar     run_h_tc< ATF_TEST_CASE_NAME(h_skip) >();
322*c243e490SMarcel Moolenaar     ATF_REQUIRE(grep_file("result", "^skipped: Skipped on purpose"));
323*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
324*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
325*c243e490SMarcel Moolenaar }
326*c243e490SMarcel Moolenaar 
327*c243e490SMarcel Moolenaar ATF_TEST_CASE(require);
328*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require)
329*c243e490SMarcel Moolenaar {
330*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE macro");
331*c243e490SMarcel Moolenaar }
332*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require)
333*c243e490SMarcel Moolenaar {
334*c243e490SMarcel Moolenaar     struct test {
335*c243e490SMarcel Moolenaar         const char *cond;
336*c243e490SMarcel Moolenaar         bool ok;
337*c243e490SMarcel Moolenaar     } *t, tests[] = {
338*c243e490SMarcel Moolenaar         { "false", false },
339*c243e490SMarcel Moolenaar         { "true", true },
340*c243e490SMarcel Moolenaar         { NULL, false }
341*c243e490SMarcel Moolenaar     };
342*c243e490SMarcel Moolenaar 
343*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
344*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
345*c243e490SMarcel Moolenaar 
346*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->cond != NULL; t++) {
347*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
348*c243e490SMarcel Moolenaar         config["condition"] = t->cond;
349*c243e490SMarcel Moolenaar 
350*c243e490SMarcel Moolenaar         std::cout << "Checking with a " << t->cond << " value\n";
351*c243e490SMarcel Moolenaar 
352*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require);
353*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require) >(config);
354*c243e490SMarcel Moolenaar 
355*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
356*c243e490SMarcel Moolenaar         if (t->ok) {
357*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
358*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
359*c243e490SMarcel Moolenaar         } else {
360*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^failed: .*condition not met"));
361*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
362*c243e490SMarcel Moolenaar         }
363*c243e490SMarcel Moolenaar 
364*c243e490SMarcel Moolenaar         atf::fs::remove(before);
365*c243e490SMarcel Moolenaar         if (t->ok)
366*c243e490SMarcel Moolenaar             atf::fs::remove(after);
367*c243e490SMarcel Moolenaar     }
368*c243e490SMarcel Moolenaar }
369*c243e490SMarcel Moolenaar 
370*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_eq);
371*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_eq)
372*c243e490SMarcel Moolenaar {
373*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_EQ macro");
374*c243e490SMarcel Moolenaar }
375*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_eq)
376*c243e490SMarcel Moolenaar {
377*c243e490SMarcel Moolenaar     struct test {
378*c243e490SMarcel Moolenaar         const char *v1;
379*c243e490SMarcel Moolenaar         const char *v2;
380*c243e490SMarcel Moolenaar         bool ok;
381*c243e490SMarcel Moolenaar     } *t, tests[] = {
382*c243e490SMarcel Moolenaar         { "1", "1", true },
383*c243e490SMarcel Moolenaar         { "1", "2", false },
384*c243e490SMarcel Moolenaar         { "2", "1", false },
385*c243e490SMarcel Moolenaar         { "2", "2", true },
386*c243e490SMarcel Moolenaar         { NULL, NULL, false }
387*c243e490SMarcel Moolenaar     };
388*c243e490SMarcel Moolenaar 
389*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
390*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
391*c243e490SMarcel Moolenaar 
392*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->v1 != NULL; t++) {
393*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
394*c243e490SMarcel Moolenaar         config["v1"] = t->v1;
395*c243e490SMarcel Moolenaar         config["v2"] = t->v2;
396*c243e490SMarcel Moolenaar 
397*c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->v1 << ", " << t->v2
398*c243e490SMarcel Moolenaar                   << " and expecting " << (t->ok ? "true" : "false")
399*c243e490SMarcel Moolenaar                   << "\n";
400*c243e490SMarcel Moolenaar 
401*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_eq);
402*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_eq) >(config);
403*c243e490SMarcel Moolenaar 
404*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
405*c243e490SMarcel Moolenaar         if (t->ok) {
406*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
407*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
408*c243e490SMarcel Moolenaar         } else {
409*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^failed: .*v1 != v2"));
410*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
411*c243e490SMarcel Moolenaar         }
412*c243e490SMarcel Moolenaar 
413*c243e490SMarcel Moolenaar         atf::fs::remove(before);
414*c243e490SMarcel Moolenaar         if (t->ok)
415*c243e490SMarcel Moolenaar             atf::fs::remove(after);
416*c243e490SMarcel Moolenaar     }
417*c243e490SMarcel Moolenaar }
418*c243e490SMarcel Moolenaar 
419*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_in);
420*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_in)
421*c243e490SMarcel Moolenaar {
422*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_IN macro");
423*c243e490SMarcel Moolenaar }
424*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_in)
425*c243e490SMarcel Moolenaar {
426*c243e490SMarcel Moolenaar     struct test {
427*c243e490SMarcel Moolenaar         const char *value;
428*c243e490SMarcel Moolenaar         bool ok;
429*c243e490SMarcel Moolenaar     } *t, tests[] = {
430*c243e490SMarcel Moolenaar         { "foo", true },
431*c243e490SMarcel Moolenaar         { "bar", true },
432*c243e490SMarcel Moolenaar         { "baz", true },
433*c243e490SMarcel Moolenaar         { "xxx", false },
434*c243e490SMarcel Moolenaar         { "fooa", false },
435*c243e490SMarcel Moolenaar         { "foo ", false },
436*c243e490SMarcel Moolenaar         { NULL, false }
437*c243e490SMarcel Moolenaar     };
438*c243e490SMarcel Moolenaar 
439*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
440*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
441*c243e490SMarcel Moolenaar 
442*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->value != NULL; t++) {
443*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
444*c243e490SMarcel Moolenaar         config["value"] = t->value;
445*c243e490SMarcel Moolenaar 
446*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_in);
447*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_in) >(config);
448*c243e490SMarcel Moolenaar 
449*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
450*c243e490SMarcel Moolenaar         if (t->ok) {
451*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
452*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
453*c243e490SMarcel Moolenaar         } else {
454*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^failed: "));
455*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
456*c243e490SMarcel Moolenaar         }
457*c243e490SMarcel Moolenaar 
458*c243e490SMarcel Moolenaar         atf::fs::remove(before);
459*c243e490SMarcel Moolenaar         if (t->ok)
460*c243e490SMarcel Moolenaar             atf::fs::remove(after);
461*c243e490SMarcel Moolenaar     }
462*c243e490SMarcel Moolenaar }
463*c243e490SMarcel Moolenaar 
464*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_match);
465*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_match)
466*c243e490SMarcel Moolenaar {
467*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_MATCH macro");
468*c243e490SMarcel Moolenaar }
469*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_match)
470*c243e490SMarcel Moolenaar {
471*c243e490SMarcel Moolenaar     struct test {
472*c243e490SMarcel Moolenaar         const char *regexp;
473*c243e490SMarcel Moolenaar         const char *string;
474*c243e490SMarcel Moolenaar         bool ok;
475*c243e490SMarcel Moolenaar     } *t, tests[] = {
476*c243e490SMarcel Moolenaar         { "foo.*bar", "this is a foo, bar, baz", true },
477*c243e490SMarcel Moolenaar         { "bar.*baz", "this is a baz, bar, foo", false },
478*c243e490SMarcel Moolenaar         { NULL, NULL, false }
479*c243e490SMarcel Moolenaar     };
480*c243e490SMarcel Moolenaar 
481*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
482*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
483*c243e490SMarcel Moolenaar 
484*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->regexp != NULL; t++) {
485*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
486*c243e490SMarcel Moolenaar         config["regexp"] = t->regexp;
487*c243e490SMarcel Moolenaar         config["string"] = t->string;
488*c243e490SMarcel Moolenaar 
489*c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->regexp << ", " << t->string
490*c243e490SMarcel Moolenaar                   << " and expecting " << (t->ok ? "true" : "false")
491*c243e490SMarcel Moolenaar                   << "\n";
492*c243e490SMarcel Moolenaar 
493*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_match);
494*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_match) >(config);
495*c243e490SMarcel Moolenaar 
496*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
497*c243e490SMarcel Moolenaar         if (t->ok) {
498*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
499*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
500*c243e490SMarcel Moolenaar         } else {
501*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^failed: "));
502*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
503*c243e490SMarcel Moolenaar         }
504*c243e490SMarcel Moolenaar 
505*c243e490SMarcel Moolenaar         atf::fs::remove(before);
506*c243e490SMarcel Moolenaar         if (t->ok)
507*c243e490SMarcel Moolenaar             atf::fs::remove(after);
508*c243e490SMarcel Moolenaar     }
509*c243e490SMarcel Moolenaar }
510*c243e490SMarcel Moolenaar 
511*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_not_in);
512*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_not_in)
513*c243e490SMarcel Moolenaar {
514*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_NOT_IN macro");
515*c243e490SMarcel Moolenaar }
516*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_not_in)
517*c243e490SMarcel Moolenaar {
518*c243e490SMarcel Moolenaar     struct test {
519*c243e490SMarcel Moolenaar         const char *value;
520*c243e490SMarcel Moolenaar         bool ok;
521*c243e490SMarcel Moolenaar     } *t, tests[] = {
522*c243e490SMarcel Moolenaar         { "foo", false },
523*c243e490SMarcel Moolenaar         { "bar", false },
524*c243e490SMarcel Moolenaar         { "baz", false },
525*c243e490SMarcel Moolenaar         { "xxx", true },
526*c243e490SMarcel Moolenaar         { "fooa", true },
527*c243e490SMarcel Moolenaar         { "foo ", true },
528*c243e490SMarcel Moolenaar         { NULL, false }
529*c243e490SMarcel Moolenaar     };
530*c243e490SMarcel Moolenaar 
531*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
532*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
533*c243e490SMarcel Moolenaar 
534*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->value != NULL; t++) {
535*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
536*c243e490SMarcel Moolenaar         config["value"] = t->value;
537*c243e490SMarcel Moolenaar 
538*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_not_in);
539*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_not_in) >(config);
540*c243e490SMarcel Moolenaar 
541*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
542*c243e490SMarcel Moolenaar         if (t->ok) {
543*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
544*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
545*c243e490SMarcel Moolenaar         } else {
546*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^failed: "));
547*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
548*c243e490SMarcel Moolenaar         }
549*c243e490SMarcel Moolenaar 
550*c243e490SMarcel Moolenaar         atf::fs::remove(before);
551*c243e490SMarcel Moolenaar         if (t->ok)
552*c243e490SMarcel Moolenaar             atf::fs::remove(after);
553*c243e490SMarcel Moolenaar     }
554*c243e490SMarcel Moolenaar }
555*c243e490SMarcel Moolenaar 
556*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_throw);
557*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_throw)
558*c243e490SMarcel Moolenaar {
559*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_THROW macro");
560*c243e490SMarcel Moolenaar }
561*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_throw)
562*c243e490SMarcel Moolenaar {
563*c243e490SMarcel Moolenaar     struct test {
564*c243e490SMarcel Moolenaar         const char *what;
565*c243e490SMarcel Moolenaar         bool ok;
566*c243e490SMarcel Moolenaar         const char *msg;
567*c243e490SMarcel Moolenaar     } *t, tests[] = {
568*c243e490SMarcel Moolenaar         { "throw_int", false, "unexpected error" },
569*c243e490SMarcel Moolenaar         { "throw_rt", true, NULL },
570*c243e490SMarcel Moolenaar         { "no_throw_rt", false, "did not throw" },
571*c243e490SMarcel Moolenaar         { NULL, false, NULL }
572*c243e490SMarcel Moolenaar     };
573*c243e490SMarcel Moolenaar 
574*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
575*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
576*c243e490SMarcel Moolenaar 
577*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
578*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
579*c243e490SMarcel Moolenaar         config["what"] = t->what;
580*c243e490SMarcel Moolenaar 
581*c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->what << " and expecting "
582*c243e490SMarcel Moolenaar                   << (t->ok ? "true" : "false") << "\n";
583*c243e490SMarcel Moolenaar 
584*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_throw);
585*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_throw) >(config);
586*c243e490SMarcel Moolenaar 
587*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
588*c243e490SMarcel Moolenaar         if (t->ok) {
589*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
590*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
591*c243e490SMarcel Moolenaar         } else {
592*c243e490SMarcel Moolenaar             std::cout << "Checking that message contains '" << t->msg
593*c243e490SMarcel Moolenaar                       << "'\n";
594*c243e490SMarcel Moolenaar             std::string exp_result = std::string("^failed: .*") + t->msg;
595*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", exp_result.c_str()));
596*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
597*c243e490SMarcel Moolenaar         }
598*c243e490SMarcel Moolenaar 
599*c243e490SMarcel Moolenaar         atf::fs::remove(before);
600*c243e490SMarcel Moolenaar         if (t->ok)
601*c243e490SMarcel Moolenaar             atf::fs::remove(after);
602*c243e490SMarcel Moolenaar     }
603*c243e490SMarcel Moolenaar }
604*c243e490SMarcel Moolenaar 
605*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_throw_re);
606*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_throw_re)
607*c243e490SMarcel Moolenaar {
608*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_THROW_RE macro");
609*c243e490SMarcel Moolenaar }
610*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_throw_re)
611*c243e490SMarcel Moolenaar {
612*c243e490SMarcel Moolenaar     struct test {
613*c243e490SMarcel Moolenaar         const char *what;
614*c243e490SMarcel Moolenaar         bool ok;
615*c243e490SMarcel Moolenaar         const char *msg;
616*c243e490SMarcel Moolenaar     } *t, tests[] = {
617*c243e490SMarcel Moolenaar         { "throw_int", false, "unexpected error" },
618*c243e490SMarcel Moolenaar         { "throw_rt_match", true, NULL },
619*c243e490SMarcel Moolenaar         { "throw_rt_no_match", false,
620*c243e490SMarcel Moolenaar           "threw.*runtime_error\\(baz foo bar a\\).*"
621*c243e490SMarcel Moolenaar           "does not match 'foo\\.\\*baz'" },
622*c243e490SMarcel Moolenaar         { "no_throw_rt", false, "did not throw" },
623*c243e490SMarcel Moolenaar         { NULL, false, NULL }
624*c243e490SMarcel Moolenaar     };
625*c243e490SMarcel Moolenaar 
626*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
627*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
628*c243e490SMarcel Moolenaar 
629*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
630*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
631*c243e490SMarcel Moolenaar         config["what"] = t->what;
632*c243e490SMarcel Moolenaar 
633*c243e490SMarcel Moolenaar         std::cout << "Checking with " << t->what << " and expecting "
634*c243e490SMarcel Moolenaar                   << (t->ok ? "true" : "false") << "\n";
635*c243e490SMarcel Moolenaar 
636*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_throw_re);
637*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_throw_re) >(config);
638*c243e490SMarcel Moolenaar 
639*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
640*c243e490SMarcel Moolenaar         if (t->ok) {
641*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
642*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
643*c243e490SMarcel Moolenaar         } else {
644*c243e490SMarcel Moolenaar             std::cout << "Checking that message contains '" << t->msg
645*c243e490SMarcel Moolenaar                       << "'\n";
646*c243e490SMarcel Moolenaar             std::string exp_result = std::string("^failed: .*") + t->msg;
647*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", exp_result.c_str()));
648*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
649*c243e490SMarcel Moolenaar         }
650*c243e490SMarcel Moolenaar 
651*c243e490SMarcel Moolenaar         atf::fs::remove(before);
652*c243e490SMarcel Moolenaar         if (t->ok)
653*c243e490SMarcel Moolenaar             atf::fs::remove(after);
654*c243e490SMarcel Moolenaar     }
655*c243e490SMarcel Moolenaar }
656*c243e490SMarcel Moolenaar 
657*c243e490SMarcel Moolenaar ATF_TEST_CASE(check_errno);
658*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(check_errno)
659*c243e490SMarcel Moolenaar {
660*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_CHECK_ERRNO macro");
661*c243e490SMarcel Moolenaar }
662*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(check_errno)
663*c243e490SMarcel Moolenaar {
664*c243e490SMarcel Moolenaar     struct test {
665*c243e490SMarcel Moolenaar         const char *what;
666*c243e490SMarcel Moolenaar         bool ok;
667*c243e490SMarcel Moolenaar         const char *msg;
668*c243e490SMarcel Moolenaar     } *t, tests[] = {
669*c243e490SMarcel Moolenaar         { "no_error", false,
670*c243e490SMarcel Moolenaar           "Expected true value in errno_ok_stub\\(\\) == -1" },
671*c243e490SMarcel Moolenaar         { "errno_ok", true, NULL },
672*c243e490SMarcel Moolenaar         { "errno_fail", false,
673*c243e490SMarcel Moolenaar           "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
674*c243e490SMarcel Moolenaar         { NULL, false, NULL }
675*c243e490SMarcel Moolenaar     };
676*c243e490SMarcel Moolenaar 
677*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
678*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
679*c243e490SMarcel Moolenaar 
680*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
681*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
682*c243e490SMarcel Moolenaar         config["what"] = t->what;
683*c243e490SMarcel Moolenaar 
684*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_check_errno);
685*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_check_errno) >(config);
686*c243e490SMarcel Moolenaar 
687*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
688*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(after));
689*c243e490SMarcel Moolenaar 
690*c243e490SMarcel Moolenaar         if (t->ok) {
691*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
692*c243e490SMarcel Moolenaar         } else {
693*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^failed"));
694*c243e490SMarcel Moolenaar 
695*c243e490SMarcel Moolenaar             std::string exp_result = "macros_test.cpp:[0-9]+: " +
696*c243e490SMarcel Moolenaar                 std::string(t->msg) + "$";
697*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("stderr", exp_result.c_str()));
698*c243e490SMarcel Moolenaar         }
699*c243e490SMarcel Moolenaar 
700*c243e490SMarcel Moolenaar         atf::fs::remove(before);
701*c243e490SMarcel Moolenaar         atf::fs::remove(after);
702*c243e490SMarcel Moolenaar     }
703*c243e490SMarcel Moolenaar }
704*c243e490SMarcel Moolenaar 
705*c243e490SMarcel Moolenaar ATF_TEST_CASE(require_errno);
706*c243e490SMarcel Moolenaar ATF_TEST_CASE_HEAD(require_errno)
707*c243e490SMarcel Moolenaar {
708*c243e490SMarcel Moolenaar     set_md_var("descr", "Tests the ATF_REQUIRE_ERRNO macro");
709*c243e490SMarcel Moolenaar }
710*c243e490SMarcel Moolenaar ATF_TEST_CASE_BODY(require_errno)
711*c243e490SMarcel Moolenaar {
712*c243e490SMarcel Moolenaar     struct test {
713*c243e490SMarcel Moolenaar         const char *what;
714*c243e490SMarcel Moolenaar         bool ok;
715*c243e490SMarcel Moolenaar         const char *msg;
716*c243e490SMarcel Moolenaar     } *t, tests[] = {
717*c243e490SMarcel Moolenaar         { "no_error", false,
718*c243e490SMarcel Moolenaar           "Expected true value in errno_ok_stub\\(\\) == -1" },
719*c243e490SMarcel Moolenaar         { "errno_ok", true, NULL },
720*c243e490SMarcel Moolenaar         { "errno_fail", false,
721*c243e490SMarcel Moolenaar           "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
722*c243e490SMarcel Moolenaar         { NULL, false, NULL }
723*c243e490SMarcel Moolenaar     };
724*c243e490SMarcel Moolenaar 
725*c243e490SMarcel Moolenaar     const atf::fs::path before("before");
726*c243e490SMarcel Moolenaar     const atf::fs::path after("after");
727*c243e490SMarcel Moolenaar 
728*c243e490SMarcel Moolenaar     for (t = &tests[0]; t->what != NULL; t++) {
729*c243e490SMarcel Moolenaar         atf::tests::vars_map config;
730*c243e490SMarcel Moolenaar         config["what"] = t->what;
731*c243e490SMarcel Moolenaar 
732*c243e490SMarcel Moolenaar         ATF_TEST_CASE_USE(h_require_errno);
733*c243e490SMarcel Moolenaar         run_h_tc< ATF_TEST_CASE_NAME(h_require_errno) >(config);
734*c243e490SMarcel Moolenaar 
735*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf::fs::exists(before));
736*c243e490SMarcel Moolenaar         if (t->ok) {
737*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", "^passed"));
738*c243e490SMarcel Moolenaar             ATF_REQUIRE(atf::fs::exists(after));
739*c243e490SMarcel Moolenaar         } else {
740*c243e490SMarcel Moolenaar             std::string exp_result = "^failed: .*macros_test.cpp:[0-9]+: " +
741*c243e490SMarcel Moolenaar                 std::string(t->msg) + "$";
742*c243e490SMarcel Moolenaar             ATF_REQUIRE(grep_file("result", exp_result.c_str()));
743*c243e490SMarcel Moolenaar 
744*c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf::fs::exists(after));
745*c243e490SMarcel Moolenaar         }
746*c243e490SMarcel Moolenaar 
747*c243e490SMarcel Moolenaar         atf::fs::remove(before);
748*c243e490SMarcel Moolenaar         if (t->ok)
749*c243e490SMarcel Moolenaar             atf::fs::remove(after);
750*c243e490SMarcel Moolenaar     }
751*c243e490SMarcel Moolenaar }
752*c243e490SMarcel Moolenaar 
753*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
754*c243e490SMarcel Moolenaar // Tests cases for the header file.
755*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
756*c243e490SMarcel Moolenaar 
757*c243e490SMarcel Moolenaar HEADER_TC(include, "atf-c++/macros.hpp");
758*c243e490SMarcel Moolenaar BUILD_TC(use, "macros_hpp_test.cpp",
759*c243e490SMarcel Moolenaar          "Tests that the macros provided by the atf-c++/macros.hpp file "
760*c243e490SMarcel Moolenaar          "do not cause syntax errors when used",
761*c243e490SMarcel Moolenaar          "Build of macros_hpp_test.cpp failed; some macros in "
762*c243e490SMarcel Moolenaar          "atf-c++/macros.hpp are broken");
763*c243e490SMarcel Moolenaar BUILD_TC_FAIL(detect_unused_tests, "unused_test.cpp",
764*c243e490SMarcel Moolenaar          "Tests that defining an unused test case raises a warning (and thus "
765*c243e490SMarcel Moolenaar          "an error)",
766*c243e490SMarcel Moolenaar          "Build of unused_test.cpp passed; unused test cases are not properly "
767*c243e490SMarcel Moolenaar          "detected");
768*c243e490SMarcel Moolenaar 
769*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
770*c243e490SMarcel Moolenaar // Main.
771*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------
772*c243e490SMarcel Moolenaar 
773*c243e490SMarcel Moolenaar ATF_INIT_TEST_CASES(tcs)
774*c243e490SMarcel Moolenaar {
775*c243e490SMarcel Moolenaar     // Add the test cases for the macros.
776*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, pass);
777*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, fail);
778*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, skip);
779*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, check_errno);
780*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require);
781*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_eq);
782*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_in);
783*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_match);
784*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_not_in);
785*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_throw);
786*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_throw_re);
787*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, require_errno);
788*c243e490SMarcel Moolenaar 
789*c243e490SMarcel Moolenaar     // Add the test cases for the header file.
790*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, include);
791*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, use);
792*c243e490SMarcel Moolenaar     ATF_ADD_TEST_CASE(tcs, detect_unused_tests);
793*c243e490SMarcel Moolenaar }
794