1240116Smarcel// 2240116Smarcel// Automated Testing Framework (atf) 3240116Smarcel// 4240116Smarcel// Copyright (c) 2009 The NetBSD Foundation, Inc. 5240116Smarcel// All rights reserved. 6240116Smarcel// 7240116Smarcel// Redistribution and use in source and binary forms, with or without 8240116Smarcel// modification, are permitted provided that the following conditions 9240116Smarcel// are met: 10240116Smarcel// 1. Redistributions of source code must retain the above copyright 11240116Smarcel// notice, this list of conditions and the following disclaimer. 12240116Smarcel// 2. Redistributions in binary form must reproduce the above copyright 13240116Smarcel// notice, this list of conditions and the following disclaimer in the 14240116Smarcel// documentation and/or other materials provided with the distribution. 15240116Smarcel// 16240116Smarcel// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17240116Smarcel// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18240116Smarcel// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19240116Smarcel// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20240116Smarcel// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21240116Smarcel// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22240116Smarcel// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23240116Smarcel// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24240116Smarcel// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25240116Smarcel// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26240116Smarcel// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27240116Smarcel// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28240116Smarcel// 29240116Smarcel 30240116Smarcel#if defined(TESTS_ATF_ATF_CXX_TEST_HELPERS_H) 31240116Smarcel# error "Cannot include test_helpers.hpp more than once." 32240116Smarcel#else 33240116Smarcel# define TESTS_ATF_ATF_CXX_TEST_HELPERS_H 34240116Smarcel#endif 35240116Smarcel 36240116Smarcel#include <cstdlib> 37240116Smarcel#include <iostream> 38240116Smarcel#include <sstream> 39240116Smarcel#include <utility> 40240116Smarcel 41240116Smarcel#include "../macros.hpp" 42240116Smarcel#include "../tests.hpp" 43240116Smarcel#include "process.hpp" 44240116Smarcel 45240116Smarcel#define HEADER_TC(name, hdrname) \ 46240116Smarcel ATF_TEST_CASE(name); \ 47240116Smarcel ATF_TEST_CASE_HEAD(name) \ 48240116Smarcel { \ 49240116Smarcel set_md_var("descr", "Tests that the " hdrname " file can be " \ 50240116Smarcel "included on its own, without any prerequisites"); \ 51240116Smarcel } \ 52240116Smarcel ATF_TEST_CASE_BODY(name) \ 53240116Smarcel { \ 54240116Smarcel header_check(hdrname); \ 55240116Smarcel } 56240116Smarcel 57240116Smarcel#define BUILD_TC(name, sfile, descr, failmsg) \ 58240116Smarcel ATF_TEST_CASE(name); \ 59240116Smarcel ATF_TEST_CASE_HEAD(name) \ 60240116Smarcel { \ 61240116Smarcel set_md_var("descr", descr); \ 62240116Smarcel } \ 63240116Smarcel ATF_TEST_CASE_BODY(name) \ 64240116Smarcel { \ 65262855Sjmmv if (!build_check_cxx_o_srcdir(*this, sfile)) \ 66262855Sjmmv ATF_FAIL(failmsg); \ 67240116Smarcel } 68240116Smarcel 69240116Smarcelnamespace atf { 70240116Smarcelnamespace tests { 71240116Smarcelclass tc; 72240116Smarcel} 73240116Smarcel} 74240116Smarcel 75240116Smarcelvoid header_check(const char*); 76262855Sjmmvbool build_check_cxx_o(const char*); 77262855Sjmmvbool build_check_cxx_o_srcdir(const atf::tests::tc&, const char*); 78251108Smarcelatf::fs::path get_process_helpers_path(const atf::tests::tc&, bool); 79240116Smarcel 80240116Smarcelstruct run_h_tc_data { 81240116Smarcel const atf::tests::vars_map& m_config; 82240116Smarcel 83240116Smarcel run_h_tc_data(const atf::tests::vars_map& config) : 84240116Smarcel m_config(config) {} 85240116Smarcel}; 86240116Smarcel 87240116Smarceltemplate< class TestCase > 88240116Smarcelvoid 89240116Smarcelrun_h_tc_child(void* v) 90240116Smarcel{ 91240116Smarcel run_h_tc_data* data = static_cast< run_h_tc_data* >(v); 92240116Smarcel 93240116Smarcel TestCase tc; 94240116Smarcel tc.init(data->m_config); 95240116Smarcel tc.run("result"); 96240116Smarcel std::exit(EXIT_SUCCESS); 97240116Smarcel} 98240116Smarcel 99240116Smarceltemplate< class TestCase > 100240116Smarcelvoid 101240116Smarcelrun_h_tc(atf::tests::vars_map config = atf::tests::vars_map()) 102240116Smarcel{ 103240116Smarcel run_h_tc_data data(config); 104240116Smarcel atf::process::child c = atf::process::fork( 105240116Smarcel run_h_tc_child< TestCase >, 106240116Smarcel atf::process::stream_redirect_path(atf::fs::path("stdout")), 107240116Smarcel atf::process::stream_redirect_path(atf::fs::path("stderr")), 108240116Smarcel &data); 109240116Smarcel const atf::process::status s = c.wait(); 110240116Smarcel ATF_REQUIRE(s.exited()); 111240116Smarcel} 112