1e2207522Sjmmv //
2e2207522Sjmmv // Automated Testing Framework (atf)
3e2207522Sjmmv //
4a551a20fSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
5e2207522Sjmmv // All rights reserved.
6e2207522Sjmmv //
7e2207522Sjmmv // Redistribution and use in source and binary forms, with or without
8e2207522Sjmmv // modification, are permitted provided that the following conditions
9e2207522Sjmmv // are met:
10e2207522Sjmmv // 1. Redistributions of source code must retain the above copyright
11e2207522Sjmmv // notice, this list of conditions and the following disclaimer.
12e2207522Sjmmv // 2. Redistributions in binary form must reproduce the above copyright
13e2207522Sjmmv // notice, this list of conditions and the following disclaimer in the
14e2207522Sjmmv // documentation and/or other materials provided with the distribution.
15e2207522Sjmmv //
16e2207522Sjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17e2207522Sjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18e2207522Sjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19e2207522Sjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20e2207522Sjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21e2207522Sjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22e2207522Sjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23e2207522Sjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24e2207522Sjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25e2207522Sjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26e2207522Sjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27e2207522Sjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28e2207522Sjmmv //
29e2207522Sjmmv
30e2207522Sjmmv #include <cstring>
31e2207522Sjmmv
32e2207522Sjmmv extern "C" {
3312aa0b5aSjmmv #include "atf-c/build.h"
34e2207522Sjmmv #include "atf-c/error.h"
35e2207522Sjmmv }
36e2207522Sjmmv
37895f502bSjmmv #include "check.hpp"
38895f502bSjmmv
39895f502bSjmmv #include "detail/exceptions.hpp"
40895f502bSjmmv #include "detail/process.hpp"
41895f502bSjmmv #include "detail/sanity.hpp"
42e2207522Sjmmv
43e2207522Sjmmv namespace impl = atf::check;
44e2207522Sjmmv #define IMPL_NAME "atf::check"
45e2207522Sjmmv
46e2207522Sjmmv // ------------------------------------------------------------------------
47e2207522Sjmmv // The "check_result" class.
48e2207522Sjmmv // ------------------------------------------------------------------------
49e2207522Sjmmv
check_result(const atf_check_result_t * result)50e2207522Sjmmv impl::check_result::check_result(const atf_check_result_t* result)
51e2207522Sjmmv {
52e2207522Sjmmv std::memcpy(&m_result, result, sizeof(m_result));
53e2207522Sjmmv }
54e2207522Sjmmv
~check_result(void)55e2207522Sjmmv impl::check_result::~check_result(void)
56e2207522Sjmmv {
57e2207522Sjmmv atf_check_result_fini(&m_result);
58e2207522Sjmmv }
59e2207522Sjmmv
60e2207522Sjmmv bool
exited(void) const61e2207522Sjmmv impl::check_result::exited(void)
62e2207522Sjmmv const
63e2207522Sjmmv {
64e2207522Sjmmv return atf_check_result_exited(&m_result);
65e2207522Sjmmv }
66e2207522Sjmmv
67e2207522Sjmmv int
exitcode(void) const68e2207522Sjmmv impl::check_result::exitcode(void)
69e2207522Sjmmv const
70e2207522Sjmmv {
71e2207522Sjmmv PRE(exited());
72e2207522Sjmmv return atf_check_result_exitcode(&m_result);
73e2207522Sjmmv }
74e2207522Sjmmv
75edebbb8eSjmmv bool
signaled(void) const76edebbb8eSjmmv impl::check_result::signaled(void)
77edebbb8eSjmmv const
78edebbb8eSjmmv {
79edebbb8eSjmmv return atf_check_result_signaled(&m_result);
80edebbb8eSjmmv }
81edebbb8eSjmmv
82edebbb8eSjmmv int
termsig(void) const83edebbb8eSjmmv impl::check_result::termsig(void)
84edebbb8eSjmmv const
85edebbb8eSjmmv {
86edebbb8eSjmmv PRE(signaled());
87edebbb8eSjmmv return atf_check_result_termsig(&m_result);
88edebbb8eSjmmv }
89edebbb8eSjmmv
90895f502bSjmmv const std::string
stdout_path(void) const91895f502bSjmmv impl::check_result::stdout_path(void) const
92e2207522Sjmmv {
93e2207522Sjmmv return atf_check_result_stdout(&m_result);
94e2207522Sjmmv }
95e2207522Sjmmv
96895f502bSjmmv const std::string
stderr_path(void) const97895f502bSjmmv impl::check_result::stderr_path(void) const
98e2207522Sjmmv {
99e2207522Sjmmv return atf_check_result_stderr(&m_result);
100e2207522Sjmmv }
101e2207522Sjmmv
102e2207522Sjmmv // ------------------------------------------------------------------------
103e2207522Sjmmv // Free functions.
104e2207522Sjmmv // ------------------------------------------------------------------------
105e2207522Sjmmv
10612aa0b5aSjmmv bool
build_c_o(const std::string & sfile,const std::string & ofile,const atf::process::argv_array & optargs)107895f502bSjmmv impl::build_c_o(const std::string& sfile, const std::string& ofile,
10812aa0b5aSjmmv const atf::process::argv_array& optargs)
10912aa0b5aSjmmv {
11012aa0b5aSjmmv bool success;
11112aa0b5aSjmmv
11212aa0b5aSjmmv atf_error_t err = atf_check_build_c_o(sfile.c_str(), ofile.c_str(),
11312aa0b5aSjmmv optargs.exec_argv(), &success);
11412aa0b5aSjmmv if (atf_is_error(err))
11512aa0b5aSjmmv throw_atf_error(err);
11612aa0b5aSjmmv
11712aa0b5aSjmmv return success;
11812aa0b5aSjmmv }
11912aa0b5aSjmmv
12012aa0b5aSjmmv bool
build_cpp(const std::string & sfile,const std::string & ofile,const atf::process::argv_array & optargs)121895f502bSjmmv impl::build_cpp(const std::string& sfile, const std::string& ofile,
12212aa0b5aSjmmv const atf::process::argv_array& optargs)
12312aa0b5aSjmmv {
12412aa0b5aSjmmv bool success;
12512aa0b5aSjmmv
12612aa0b5aSjmmv atf_error_t err = atf_check_build_cpp(sfile.c_str(), ofile.c_str(),
12712aa0b5aSjmmv optargs.exec_argv(), &success);
12812aa0b5aSjmmv if (atf_is_error(err))
12912aa0b5aSjmmv throw_atf_error(err);
13012aa0b5aSjmmv
13112aa0b5aSjmmv return success;
13212aa0b5aSjmmv }
13312aa0b5aSjmmv
13412aa0b5aSjmmv bool
build_cxx_o(const std::string & sfile,const std::string & ofile,const atf::process::argv_array & optargs)135895f502bSjmmv impl::build_cxx_o(const std::string& sfile, const std::string& ofile,
13612aa0b5aSjmmv const atf::process::argv_array& optargs)
13712aa0b5aSjmmv {
13812aa0b5aSjmmv bool success;
13912aa0b5aSjmmv
14012aa0b5aSjmmv atf_error_t err = atf_check_build_cxx_o(sfile.c_str(), ofile.c_str(),
14112aa0b5aSjmmv optargs.exec_argv(), &success);
14212aa0b5aSjmmv if (atf_is_error(err))
14312aa0b5aSjmmv throw_atf_error(err);
14412aa0b5aSjmmv
14512aa0b5aSjmmv return success;
14612aa0b5aSjmmv }
14712aa0b5aSjmmv
148*ee43138cSchristos std::unique_ptr< impl::check_result >
exec(const atf::process::argv_array & argva)14912aa0b5aSjmmv impl::exec(const atf::process::argv_array& argva)
150e2207522Sjmmv {
151e2207522Sjmmv atf_check_result_t result;
152e2207522Sjmmv
15312aa0b5aSjmmv atf_error_t err = atf_check_exec_array(argva.exec_argv(), &result);
154e2207522Sjmmv if (atf_is_error(err))
155e2207522Sjmmv throw_atf_error(err);
156e2207522Sjmmv
157*ee43138cSchristos return std::unique_ptr< impl::check_result >(new impl::check_result(&result));
158e2207522Sjmmv }
159