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