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