1*00b67f09SDavid van Moolenbroek //
2*00b67f09SDavid van Moolenbroek // Automated Testing Framework (atf)
3*00b67f09SDavid van Moolenbroek //
4*00b67f09SDavid van Moolenbroek // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*00b67f09SDavid van Moolenbroek // All rights reserved.
6*00b67f09SDavid van Moolenbroek //
7*00b67f09SDavid van Moolenbroek // Redistribution and use in source and binary forms, with or without
8*00b67f09SDavid van Moolenbroek // modification, are permitted provided that the following conditions
9*00b67f09SDavid van Moolenbroek // are met:
10*00b67f09SDavid van Moolenbroek // 1. Redistributions of source code must retain the above copyright
11*00b67f09SDavid van Moolenbroek // notice, this list of conditions and the following disclaimer.
12*00b67f09SDavid van Moolenbroek // 2. Redistributions in binary form must reproduce the above copyright
13*00b67f09SDavid van Moolenbroek // notice, this list of conditions and the following disclaimer in the
14*00b67f09SDavid van Moolenbroek // documentation and/or other materials provided with the distribution.
15*00b67f09SDavid van Moolenbroek //
16*00b67f09SDavid van Moolenbroek // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*00b67f09SDavid van Moolenbroek // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*00b67f09SDavid van Moolenbroek // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*00b67f09SDavid van Moolenbroek // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*00b67f09SDavid van Moolenbroek // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*00b67f09SDavid van Moolenbroek // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*00b67f09SDavid van Moolenbroek // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*00b67f09SDavid van Moolenbroek // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*00b67f09SDavid van Moolenbroek // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*00b67f09SDavid van Moolenbroek // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*00b67f09SDavid van Moolenbroek // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*00b67f09SDavid van Moolenbroek // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*00b67f09SDavid van Moolenbroek //
29*00b67f09SDavid van Moolenbroek
30*00b67f09SDavid van Moolenbroek #include <cstring>
31*00b67f09SDavid van Moolenbroek
32*00b67f09SDavid van Moolenbroek extern "C" {
33*00b67f09SDavid van Moolenbroek #include "atf-c/build.h"
34*00b67f09SDavid van Moolenbroek #include "atf-c/error.h"
35*00b67f09SDavid van Moolenbroek }
36*00b67f09SDavid van Moolenbroek
37*00b67f09SDavid van Moolenbroek #include "check.hpp"
38*00b67f09SDavid van Moolenbroek
39*00b67f09SDavid van Moolenbroek #include "detail/exceptions.hpp"
40*00b67f09SDavid van Moolenbroek #include "detail/process.hpp"
41*00b67f09SDavid van Moolenbroek #include "detail/sanity.hpp"
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek namespace impl = atf::check;
44*00b67f09SDavid van Moolenbroek #define IMPL_NAME "atf::check"
45*00b67f09SDavid van Moolenbroek
46*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
47*00b67f09SDavid van Moolenbroek // The "check_result" class.
48*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
49*00b67f09SDavid van Moolenbroek
check_result(const atf_check_result_t * result)50*00b67f09SDavid van Moolenbroek impl::check_result::check_result(const atf_check_result_t* result)
51*00b67f09SDavid van Moolenbroek {
52*00b67f09SDavid van Moolenbroek std::memcpy(&m_result, result, sizeof(m_result));
53*00b67f09SDavid van Moolenbroek }
54*00b67f09SDavid van Moolenbroek
~check_result(void)55*00b67f09SDavid van Moolenbroek impl::check_result::~check_result(void)
56*00b67f09SDavid van Moolenbroek {
57*00b67f09SDavid van Moolenbroek atf_check_result_fini(&m_result);
58*00b67f09SDavid van Moolenbroek }
59*00b67f09SDavid van Moolenbroek
60*00b67f09SDavid van Moolenbroek bool
exited(void) const61*00b67f09SDavid van Moolenbroek impl::check_result::exited(void)
62*00b67f09SDavid van Moolenbroek const
63*00b67f09SDavid van Moolenbroek {
64*00b67f09SDavid van Moolenbroek return atf_check_result_exited(&m_result);
65*00b67f09SDavid van Moolenbroek }
66*00b67f09SDavid van Moolenbroek
67*00b67f09SDavid van Moolenbroek int
exitcode(void) const68*00b67f09SDavid van Moolenbroek impl::check_result::exitcode(void)
69*00b67f09SDavid van Moolenbroek const
70*00b67f09SDavid van Moolenbroek {
71*00b67f09SDavid van Moolenbroek PRE(exited());
72*00b67f09SDavid van Moolenbroek return atf_check_result_exitcode(&m_result);
73*00b67f09SDavid van Moolenbroek }
74*00b67f09SDavid van Moolenbroek
75*00b67f09SDavid van Moolenbroek bool
signaled(void) const76*00b67f09SDavid van Moolenbroek impl::check_result::signaled(void)
77*00b67f09SDavid van Moolenbroek const
78*00b67f09SDavid van Moolenbroek {
79*00b67f09SDavid van Moolenbroek return atf_check_result_signaled(&m_result);
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek
82*00b67f09SDavid van Moolenbroek int
termsig(void) const83*00b67f09SDavid van Moolenbroek impl::check_result::termsig(void)
84*00b67f09SDavid van Moolenbroek const
85*00b67f09SDavid van Moolenbroek {
86*00b67f09SDavid van Moolenbroek PRE(signaled());
87*00b67f09SDavid van Moolenbroek return atf_check_result_termsig(&m_result);
88*00b67f09SDavid van Moolenbroek }
89*00b67f09SDavid van Moolenbroek
90*00b67f09SDavid van Moolenbroek const std::string
stdout_path(void) const91*00b67f09SDavid van Moolenbroek impl::check_result::stdout_path(void) const
92*00b67f09SDavid van Moolenbroek {
93*00b67f09SDavid van Moolenbroek return atf_check_result_stdout(&m_result);
94*00b67f09SDavid van Moolenbroek }
95*00b67f09SDavid van Moolenbroek
96*00b67f09SDavid van Moolenbroek const std::string
stderr_path(void) const97*00b67f09SDavid van Moolenbroek impl::check_result::stderr_path(void) const
98*00b67f09SDavid van Moolenbroek {
99*00b67f09SDavid van Moolenbroek return atf_check_result_stderr(&m_result);
100*00b67f09SDavid van Moolenbroek }
101*00b67f09SDavid van Moolenbroek
102*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
103*00b67f09SDavid van Moolenbroek // Free functions.
104*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
105*00b67f09SDavid van Moolenbroek
106*00b67f09SDavid van Moolenbroek bool
build_c_o(const std::string & sfile,const std::string & ofile,const atf::process::argv_array & optargs)107*00b67f09SDavid van Moolenbroek impl::build_c_o(const std::string& sfile, const std::string& ofile,
108*00b67f09SDavid van Moolenbroek const atf::process::argv_array& optargs)
109*00b67f09SDavid van Moolenbroek {
110*00b67f09SDavid van Moolenbroek bool success;
111*00b67f09SDavid van Moolenbroek
112*00b67f09SDavid van Moolenbroek atf_error_t err = atf_check_build_c_o(sfile.c_str(), ofile.c_str(),
113*00b67f09SDavid van Moolenbroek optargs.exec_argv(), &success);
114*00b67f09SDavid van Moolenbroek if (atf_is_error(err))
115*00b67f09SDavid van Moolenbroek throw_atf_error(err);
116*00b67f09SDavid van Moolenbroek
117*00b67f09SDavid van Moolenbroek return success;
118*00b67f09SDavid van Moolenbroek }
119*00b67f09SDavid van Moolenbroek
120*00b67f09SDavid van Moolenbroek bool
build_cpp(const std::string & sfile,const std::string & ofile,const atf::process::argv_array & optargs)121*00b67f09SDavid van Moolenbroek impl::build_cpp(const std::string& sfile, const std::string& ofile,
122*00b67f09SDavid van Moolenbroek const atf::process::argv_array& optargs)
123*00b67f09SDavid van Moolenbroek {
124*00b67f09SDavid van Moolenbroek bool success;
125*00b67f09SDavid van Moolenbroek
126*00b67f09SDavid van Moolenbroek atf_error_t err = atf_check_build_cpp(sfile.c_str(), ofile.c_str(),
127*00b67f09SDavid van Moolenbroek optargs.exec_argv(), &success);
128*00b67f09SDavid van Moolenbroek if (atf_is_error(err))
129*00b67f09SDavid van Moolenbroek throw_atf_error(err);
130*00b67f09SDavid van Moolenbroek
131*00b67f09SDavid van Moolenbroek return success;
132*00b67f09SDavid van Moolenbroek }
133*00b67f09SDavid van Moolenbroek
134*00b67f09SDavid van Moolenbroek bool
build_cxx_o(const std::string & sfile,const std::string & ofile,const atf::process::argv_array & optargs)135*00b67f09SDavid van Moolenbroek impl::build_cxx_o(const std::string& sfile, const std::string& ofile,
136*00b67f09SDavid van Moolenbroek const atf::process::argv_array& optargs)
137*00b67f09SDavid van Moolenbroek {
138*00b67f09SDavid van Moolenbroek bool success;
139*00b67f09SDavid van Moolenbroek
140*00b67f09SDavid van Moolenbroek atf_error_t err = atf_check_build_cxx_o(sfile.c_str(), ofile.c_str(),
141*00b67f09SDavid van Moolenbroek optargs.exec_argv(), &success);
142*00b67f09SDavid van Moolenbroek if (atf_is_error(err))
143*00b67f09SDavid van Moolenbroek throw_atf_error(err);
144*00b67f09SDavid van Moolenbroek
145*00b67f09SDavid van Moolenbroek return success;
146*00b67f09SDavid van Moolenbroek }
147*00b67f09SDavid van Moolenbroek
148*00b67f09SDavid van Moolenbroek std::auto_ptr< impl::check_result >
exec(const atf::process::argv_array & argva)149*00b67f09SDavid van Moolenbroek impl::exec(const atf::process::argv_array& argva)
150*00b67f09SDavid van Moolenbroek {
151*00b67f09SDavid van Moolenbroek atf_check_result_t result;
152*00b67f09SDavid van Moolenbroek
153*00b67f09SDavid van Moolenbroek atf_error_t err = atf_check_exec_array(argva.exec_argv(), &result);
154*00b67f09SDavid van Moolenbroek if (atf_is_error(err))
155*00b67f09SDavid van Moolenbroek throw_atf_error(err);
156*00b67f09SDavid van Moolenbroek
157*00b67f09SDavid van Moolenbroek return std::auto_ptr< impl::check_result >(new impl::check_result(&result));
158*00b67f09SDavid van Moolenbroek }
159