a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt// Copyright (c) 2008 The NetBSD Foundation, Inc.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// All rights reserved.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// Redistribution and use in source and binary forms, with or without
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// modification, are permitted provided that the following conditions
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// 1. Redistributions of source code must retain the above copyright
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// notice, this list of conditions and the following disclaimer.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// 2. Redistributions in binary form must reproduce the above copyright
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// notice, this list of conditions and the following disclaimer in the
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// documentation and/or other materials provided with the distribution.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/macros.hpp"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/detail/fs.hpp"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/detail/process.hpp"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/detail/sanity.hpp"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/detail/test_helpers.hpp"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/detail/text.hpp"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews#include "atf-c++/utils.hpp"
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// Auxiliary functions.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1);
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// Auxiliary test cases.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt bool condition = atf::text::to_bool(get_config_var("condition"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt long v1 = atf::text::to_type< long >(get_config_var("v1"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt long v2 = atf::text::to_type< long >(get_config_var("v2"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt const std::string element = get_config_var("value");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt const std::string regexp = get_config_var("regexp");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt const std::string string = get_config_var("string");
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt const std::string element = get_config_var("value");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE_THROW(std::runtime_error, if (1) throw int(5));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE_THROW_RE(std::runtime_error, "5", if (1) throw int(5));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt else if (get_config_var("what") == "throw_rt_match")
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt if (1) throw std::runtime_error("a foo bar baz"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt else if (get_config_var("what") == "throw_rt_no_match")
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz",
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt if (1) throw std::runtime_error("baz foo bar a"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// Test cases for the macros.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^failed: Failed on purpose", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^skipped: Skipped on purpose",
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(atf::fs::exists(atf::fs::path("before")));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after")));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_REQUIRE macro");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt { "false", false },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt { "true", true },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking with a " << t->cond << " value\n";
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_EQ macro");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking with " << t->v1 << ", " << t->v2
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt << " and expecting " << (t->ok ? "true" : "false")
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_eq) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^failed: .*v1 != v2", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_IN macro");
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "foo", true },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "bar", true },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "baz", true },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "xxx", false },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "fooa", false },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "foo ", false },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_in) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_MATCH macro");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking with " << t->regexp << ", " << t->string
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt << " and expecting " << (t->ok ? "true" : "false")
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_match) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_NOT_IN macro");
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "foo", false },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "bar", false },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "baz", false },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "xxx", true },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "fooa", true },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "foo ", true },
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_not_in) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_THROW macro");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking with " << t->what << " and expecting "
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_throw) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking that message contains '" << t->msg
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::string exp_result = std::string("^failed: .*") + t->msg;
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_THROW_RE macro");
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt { "throw_rt_no_match", false,
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt "threw.*runtime_error\\(baz foo bar a\\).*"
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt "does not match 'foo\\.\\*baz'" },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking with " << t->what << " and expecting "
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_throw_re) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::cout << "Checking that message contains '" << t->msg
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::string exp_result = std::string("^failed: .*") + t->msg;
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_CHECK_ERRNO macro");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt { "no_error", false,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "Expected true value in errno_ok_stub\\(\\) == -1" },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt { "errno_fail", false,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_check_errno) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^failed", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::string exp_result = "macros_test.cpp:[0-9]+: " +
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "stderr"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt set_md_var("descr", "Tests the ATF_REQUIRE_ERRNO macro");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt { "no_error", false,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "Expected true value in errno_ok_stub\\(\\) == -1" },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt { "errno_fail", false,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" },
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt run_h_tc< ATF_TEST_CASE_NAME(h_require_errno) >(config);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file("^passed", "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt std::string exp_result = "^failed: .*macros_test.cpp:[0-9]+: " +
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result"));
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// Tests cases for the header file.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "Tests that the macros provided by the atf-c++/macros.hpp file "
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "do not cause syntax errors when used",
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "Build of macros_hpp_test.cpp failed; some macros in "
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt "atf-c++/macros.hpp are broken");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "Tests that defining an unused test case raises a warning (and "
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "thus an error)");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "class test_class { public: int dummy; };\n"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "#define define_unused static test_class unused\n"
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "define_unused;\n";
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews atf::utils::create_file("compiler_test.cpp", validate_compiler);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews expect_fail("Compiler does not raise a warning on an unused "
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "static global variable declared by a macro");
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews if (build_check_cxx_o_srcdir(*this, "unused_test.cpp"))
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews ATF_FAIL("Build of unused_test.cpp passed; unused test cases are "
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews "not properly detected");
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt// ------------------------------------------------------------------------
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt // Add the test cases for the macros.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt // Add the test cases for the header file.