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