1*c243e490SMarcel Moolenaar // 2*c243e490SMarcel Moolenaar // Automated Testing Framework (atf) 3*c243e490SMarcel Moolenaar // 4*c243e490SMarcel Moolenaar // Copyright (c) 2007 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 #if !defined(_ATF_CXX_TESTS_HPP_) 31*c243e490SMarcel Moolenaar #define _ATF_CXX_TESTS_HPP_ 32*c243e490SMarcel Moolenaar 33*c243e490SMarcel Moolenaar #include <map> 34*c243e490SMarcel Moolenaar #include <memory> 35*c243e490SMarcel Moolenaar #include <string> 36*c243e490SMarcel Moolenaar 37*c243e490SMarcel Moolenaar extern "C" { 38*c243e490SMarcel Moolenaar #include <atf-c/defs.h> 39*c243e490SMarcel Moolenaar } 40*c243e490SMarcel Moolenaar 41*c243e490SMarcel Moolenaar #include <atf-c++/utils.hpp> 42*c243e490SMarcel Moolenaar 43*c243e490SMarcel Moolenaar namespace atf { 44*c243e490SMarcel Moolenaar namespace tests { 45*c243e490SMarcel Moolenaar 46*c243e490SMarcel Moolenaar namespace detail { 47*c243e490SMarcel Moolenaar 48*c243e490SMarcel Moolenaar class atf_tp_writer { 49*c243e490SMarcel Moolenaar std::ostream& m_os; 50*c243e490SMarcel Moolenaar 51*c243e490SMarcel Moolenaar bool m_is_first; 52*c243e490SMarcel Moolenaar 53*c243e490SMarcel Moolenaar public: 54*c243e490SMarcel Moolenaar atf_tp_writer(std::ostream&); 55*c243e490SMarcel Moolenaar 56*c243e490SMarcel Moolenaar void start_tc(const std::string&); 57*c243e490SMarcel Moolenaar void end_tc(void); 58*c243e490SMarcel Moolenaar void tc_meta_data(const std::string&, const std::string&); 59*c243e490SMarcel Moolenaar }; 60*c243e490SMarcel Moolenaar 61*c243e490SMarcel Moolenaar bool match(const std::string&, const std::string&); 62*c243e490SMarcel Moolenaar 63*c243e490SMarcel Moolenaar } // namespace 64*c243e490SMarcel Moolenaar 65*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 66*c243e490SMarcel Moolenaar // The "vars_map" class. 67*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 68*c243e490SMarcel Moolenaar 69*c243e490SMarcel Moolenaar typedef std::map< std::string, std::string > vars_map; 70*c243e490SMarcel Moolenaar 71*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 72*c243e490SMarcel Moolenaar // The "tc" class. 73*c243e490SMarcel Moolenaar // ------------------------------------------------------------------------ 74*c243e490SMarcel Moolenaar 75*c243e490SMarcel Moolenaar struct tc_impl; 76*c243e490SMarcel Moolenaar 77*c243e490SMarcel Moolenaar class tc : utils::noncopyable { 78*c243e490SMarcel Moolenaar std::auto_ptr< tc_impl > pimpl; 79*c243e490SMarcel Moolenaar 80*c243e490SMarcel Moolenaar protected: 81*c243e490SMarcel Moolenaar virtual void head(void); 82*c243e490SMarcel Moolenaar virtual void body(void) const = 0; 83*c243e490SMarcel Moolenaar virtual void cleanup(void) const; 84*c243e490SMarcel Moolenaar 85*c243e490SMarcel Moolenaar void require_prog(const std::string&) const; 86*c243e490SMarcel Moolenaar 87*c243e490SMarcel Moolenaar friend struct tc_impl; 88*c243e490SMarcel Moolenaar 89*c243e490SMarcel Moolenaar public: 90*c243e490SMarcel Moolenaar tc(const std::string&, const bool); 91*c243e490SMarcel Moolenaar virtual ~tc(void); 92*c243e490SMarcel Moolenaar 93*c243e490SMarcel Moolenaar void init(const vars_map&); 94*c243e490SMarcel Moolenaar 95*c243e490SMarcel Moolenaar const std::string get_config_var(const std::string&) const; 96*c243e490SMarcel Moolenaar const std::string get_config_var(const std::string&, const std::string&) 97*c243e490SMarcel Moolenaar const; 98*c243e490SMarcel Moolenaar const std::string get_md_var(const std::string&) const; 99*c243e490SMarcel Moolenaar const vars_map get_md_vars(void) const; 100*c243e490SMarcel Moolenaar bool has_config_var(const std::string&) const; 101*c243e490SMarcel Moolenaar bool has_md_var(const std::string&) const; 102*c243e490SMarcel Moolenaar void set_md_var(const std::string&, const std::string&); 103*c243e490SMarcel Moolenaar 104*c243e490SMarcel Moolenaar void run(const std::string&) const; 105*c243e490SMarcel Moolenaar void run_cleanup(void) const; 106*c243e490SMarcel Moolenaar 107*c243e490SMarcel Moolenaar // To be called from the child process only. 108*c243e490SMarcel Moolenaar static void pass(void) ATF_DEFS_ATTRIBUTE_NORETURN; 109*c243e490SMarcel Moolenaar static void fail(const std::string&) ATF_DEFS_ATTRIBUTE_NORETURN; 110*c243e490SMarcel Moolenaar static void fail_nonfatal(const std::string&); 111*c243e490SMarcel Moolenaar static void skip(const std::string&) ATF_DEFS_ATTRIBUTE_NORETURN; 112*c243e490SMarcel Moolenaar static void check_errno(const char*, const int, const int, const char*, 113*c243e490SMarcel Moolenaar const bool); 114*c243e490SMarcel Moolenaar static void require_errno(const char*, const int, const int, const char*, 115*c243e490SMarcel Moolenaar const bool); 116*c243e490SMarcel Moolenaar static void expect_pass(void); 117*c243e490SMarcel Moolenaar static void expect_fail(const std::string&); 118*c243e490SMarcel Moolenaar static void expect_exit(const int, const std::string&); 119*c243e490SMarcel Moolenaar static void expect_signal(const int, const std::string&); 120*c243e490SMarcel Moolenaar static void expect_death(const std::string&); 121*c243e490SMarcel Moolenaar static void expect_timeout(const std::string&); 122*c243e490SMarcel Moolenaar }; 123*c243e490SMarcel Moolenaar 124*c243e490SMarcel Moolenaar } // namespace tests 125*c243e490SMarcel Moolenaar } // namespace atf 126*c243e490SMarcel Moolenaar 127*c243e490SMarcel Moolenaar #endif // !defined(_ATF_CXX_TESTS_HPP_) 128