xref: /freebsd/contrib/atf/atf-c++/tests.hpp (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
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