xref: /minix3/external/bsd/bind/dist/unit/atf-src/atf-c++/build_test.cpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek //
2*00b67f09SDavid van Moolenbroek // Automated Testing Framework (atf)
3*00b67f09SDavid van Moolenbroek //
4*00b67f09SDavid van Moolenbroek // Copyright (c) 2009 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 #include <iostream>
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include "../atf-c/h_build.h"
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek #include "build.hpp"
36*00b67f09SDavid van Moolenbroek #include "config.hpp"
37*00b67f09SDavid van Moolenbroek #include "macros.hpp"
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek #include "detail/env.hpp"
40*00b67f09SDavid van Moolenbroek #include "detail/process.hpp"
41*00b67f09SDavid van Moolenbroek #include "detail/test_helpers.hpp"
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
44*00b67f09SDavid van Moolenbroek // Auxiliary functions.
45*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek namespace atf {
48*00b67f09SDavid van Moolenbroek     namespace config {
49*00b67f09SDavid van Moolenbroek         void __reinit(void);
50*00b67f09SDavid van Moolenbroek     }
51*00b67f09SDavid van Moolenbroek }
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek template< class C >
54*00b67f09SDavid van Moolenbroek void
print_col(const char * prefix,const C & c)55*00b67f09SDavid van Moolenbroek print_col(const char* prefix, const C& c)
56*00b67f09SDavid van Moolenbroek {
57*00b67f09SDavid van Moolenbroek     std::cout << prefix << ":";
58*00b67f09SDavid van Moolenbroek     for (typename C::const_iterator iter = c.begin(); iter != c.end();
59*00b67f09SDavid van Moolenbroek          iter++)
60*00b67f09SDavid van Moolenbroek         std::cout << " '" << *iter << "'";
61*00b67f09SDavid van Moolenbroek     std::cout << "\n";
62*00b67f09SDavid van Moolenbroek }
63*00b67f09SDavid van Moolenbroek 
64*00b67f09SDavid van Moolenbroek static
65*00b67f09SDavid van Moolenbroek void
print_array(const char * prefix,const char * const * a)66*00b67f09SDavid van Moolenbroek print_array(const char* prefix, const char* const* a)
67*00b67f09SDavid van Moolenbroek {
68*00b67f09SDavid van Moolenbroek     std::cout << prefix << ":";
69*00b67f09SDavid van Moolenbroek     for (; *a != NULL; a++)
70*00b67f09SDavid van Moolenbroek         std::cout << " '" << *a << "'";
71*00b67f09SDavid van Moolenbroek     std::cout << "\n";
72*00b67f09SDavid van Moolenbroek }
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek static
75*00b67f09SDavid van Moolenbroek void
verbose_set_env(const char * var,const char * val)76*00b67f09SDavid van Moolenbroek verbose_set_env(const char *var, const char *val)
77*00b67f09SDavid van Moolenbroek {
78*00b67f09SDavid van Moolenbroek     std::cout << "Setting " << var << " to '" << val << "'\n";
79*00b67f09SDavid van Moolenbroek     atf::env::set(var, val);
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek static
83*00b67f09SDavid van Moolenbroek bool
equal_argvs(const atf::process::argv_array & aa,const char * const * array)84*00b67f09SDavid van Moolenbroek equal_argvs(const atf::process::argv_array& aa, const char* const* array)
85*00b67f09SDavid van Moolenbroek {
86*00b67f09SDavid van Moolenbroek     bool equal = true;
87*00b67f09SDavid van Moolenbroek 
88*00b67f09SDavid van Moolenbroek     atf::process::argv_array::size_type i = 0;
89*00b67f09SDavid van Moolenbroek     while (equal && (i < aa.size() && array[i] != NULL)) {
90*00b67f09SDavid van Moolenbroek         if (std::strcmp(aa[i], array[i]) != 0)
91*00b67f09SDavid van Moolenbroek             equal = false;
92*00b67f09SDavid van Moolenbroek         else
93*00b67f09SDavid van Moolenbroek             i++;
94*00b67f09SDavid van Moolenbroek     }
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek     if (equal && (i < aa.size() || array[i] != NULL))
97*00b67f09SDavid van Moolenbroek         equal = false;
98*00b67f09SDavid van Moolenbroek 
99*00b67f09SDavid van Moolenbroek     return equal;
100*00b67f09SDavid van Moolenbroek }
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek static
103*00b67f09SDavid van Moolenbroek void
check_equal_argvs(const atf::process::argv_array & aa,const char * const * array)104*00b67f09SDavid van Moolenbroek check_equal_argvs(const atf::process::argv_array& aa, const char* const* array)
105*00b67f09SDavid van Moolenbroek {
106*00b67f09SDavid van Moolenbroek     print_array("Expected arguments", array);
107*00b67f09SDavid van Moolenbroek     print_col("Arguments returned", aa);
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek     if (!equal_argvs(aa, array))
110*00b67f09SDavid van Moolenbroek         ATF_FAIL("The constructed argv differs from the expected values");
111*00b67f09SDavid van Moolenbroek }
112*00b67f09SDavid van Moolenbroek 
113*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
114*00b67f09SDavid van Moolenbroek // Internal test cases.
115*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
116*00b67f09SDavid van Moolenbroek 
117*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(equal_argvs);
ATF_TEST_CASE_HEAD(equal_argvs)118*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(equal_argvs)
119*00b67f09SDavid van Moolenbroek {
120*00b67f09SDavid van Moolenbroek     set_md_var("descr", "Tests the test case internal equal_argvs function");
121*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(equal_argvs)122*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(equal_argvs)
123*00b67f09SDavid van Moolenbroek {
124*00b67f09SDavid van Moolenbroek     {
125*00b67f09SDavid van Moolenbroek         const char* const array[] = { NULL };
126*00b67f09SDavid van Moolenbroek         const char* const argv[] = { NULL };
127*00b67f09SDavid van Moolenbroek 
128*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array));
129*00b67f09SDavid van Moolenbroek     }
130*00b67f09SDavid van Moolenbroek 
131*00b67f09SDavid van Moolenbroek     {
132*00b67f09SDavid van Moolenbroek         const char* const array[] = { NULL };
133*00b67f09SDavid van Moolenbroek         const char* const argv[] = { "foo", NULL };
134*00b67f09SDavid van Moolenbroek 
135*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array));
136*00b67f09SDavid van Moolenbroek     }
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek     {
139*00b67f09SDavid van Moolenbroek         const char* const array[] = { "foo", NULL };
140*00b67f09SDavid van Moolenbroek         const char* const argv[] = { NULL };
141*00b67f09SDavid van Moolenbroek 
142*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array));
143*00b67f09SDavid van Moolenbroek     }
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek     {
146*00b67f09SDavid van Moolenbroek         const char* const array[] = { "foo", NULL };
147*00b67f09SDavid van Moolenbroek         const char* const argv[] = { "foo", NULL };
148*00b67f09SDavid van Moolenbroek 
149*00b67f09SDavid van Moolenbroek         ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array));
150*00b67f09SDavid van Moolenbroek     }
151*00b67f09SDavid van Moolenbroek }
152*00b67f09SDavid van Moolenbroek 
153*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
154*00b67f09SDavid van Moolenbroek // Test cases for the free functions.
155*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(c_o);
ATF_TEST_CASE_HEAD(c_o)158*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(c_o)
159*00b67f09SDavid van Moolenbroek {
160*00b67f09SDavid van Moolenbroek     set_md_var("descr", "Tests the c_o function");
161*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(c_o)162*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(c_o)
163*00b67f09SDavid van Moolenbroek {
164*00b67f09SDavid van Moolenbroek     for (struct c_o_test* test = c_o_tests; test->expargv[0] != NULL;
165*00b67f09SDavid van Moolenbroek          test++) {
166*00b67f09SDavid van Moolenbroek         std::cout << "> Test: " << test->msg << "\n";
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CC", test->cc);
169*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CFLAGS", test->cflags);
170*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
171*00b67f09SDavid van Moolenbroek         atf::config::__reinit();
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek         atf::process::argv_array argv =
174*00b67f09SDavid van Moolenbroek             atf::build::c_o(test->sfile, test->ofile,
175*00b67f09SDavid van Moolenbroek                             atf::process::argv_array(test->optargs));
176*00b67f09SDavid van Moolenbroek         check_equal_argvs(argv, test->expargv);
177*00b67f09SDavid van Moolenbroek     }
178*00b67f09SDavid van Moolenbroek }
179*00b67f09SDavid van Moolenbroek 
180*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(cpp);
ATF_TEST_CASE_HEAD(cpp)181*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(cpp)
182*00b67f09SDavid van Moolenbroek {
183*00b67f09SDavid van Moolenbroek     set_md_var("descr", "Tests the cpp function");
184*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(cpp)185*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(cpp)
186*00b67f09SDavid van Moolenbroek {
187*00b67f09SDavid van Moolenbroek     for (struct cpp_test* test = cpp_tests; test->expargv[0] != NULL;
188*00b67f09SDavid van Moolenbroek          test++) {
189*00b67f09SDavid van Moolenbroek         std::cout << "> Test: " << test->msg << "\n";
190*00b67f09SDavid van Moolenbroek 
191*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CPP", test->cpp);
192*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
193*00b67f09SDavid van Moolenbroek         atf::config::__reinit();
194*00b67f09SDavid van Moolenbroek 
195*00b67f09SDavid van Moolenbroek         atf::process::argv_array argv =
196*00b67f09SDavid van Moolenbroek             atf::build::cpp(test->sfile, test->ofile,
197*00b67f09SDavid van Moolenbroek                             atf::process::argv_array(test->optargs));
198*00b67f09SDavid van Moolenbroek         check_equal_argvs(argv, test->expargv);
199*00b67f09SDavid van Moolenbroek     }
200*00b67f09SDavid van Moolenbroek }
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(cxx_o);
ATF_TEST_CASE_HEAD(cxx_o)203*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(cxx_o)
204*00b67f09SDavid van Moolenbroek {
205*00b67f09SDavid van Moolenbroek     set_md_var("descr", "Tests the cxx_o function");
206*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(cxx_o)207*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(cxx_o)
208*00b67f09SDavid van Moolenbroek {
209*00b67f09SDavid van Moolenbroek     for (struct cxx_o_test* test = cxx_o_tests; test->expargv[0] != NULL;
210*00b67f09SDavid van Moolenbroek          test++) {
211*00b67f09SDavid van Moolenbroek         std::cout << "> Test: " << test->msg << "\n";
212*00b67f09SDavid van Moolenbroek 
213*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CXX", test->cxx);
214*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CXXFLAGS", test->cxxflags);
215*00b67f09SDavid van Moolenbroek         verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
216*00b67f09SDavid van Moolenbroek         atf::config::__reinit();
217*00b67f09SDavid van Moolenbroek 
218*00b67f09SDavid van Moolenbroek         atf::process::argv_array argv =
219*00b67f09SDavid van Moolenbroek             atf::build::cxx_o(test->sfile, test->ofile,
220*00b67f09SDavid van Moolenbroek                               atf::process::argv_array(test->optargs));
221*00b67f09SDavid van Moolenbroek         check_equal_argvs(argv, test->expargv);
222*00b67f09SDavid van Moolenbroek     }
223*00b67f09SDavid van Moolenbroek }
224*00b67f09SDavid van Moolenbroek 
225*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
226*00b67f09SDavid van Moolenbroek // Tests cases for the header file.
227*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
228*00b67f09SDavid van Moolenbroek 
229*00b67f09SDavid van Moolenbroek HEADER_TC(include, "atf-c++/build.hpp");
230*00b67f09SDavid van Moolenbroek 
231*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
232*00b67f09SDavid van Moolenbroek // Main.
233*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
234*00b67f09SDavid van Moolenbroek 
ATF_INIT_TEST_CASES(tcs)235*00b67f09SDavid van Moolenbroek ATF_INIT_TEST_CASES(tcs)
236*00b67f09SDavid van Moolenbroek {
237*00b67f09SDavid van Moolenbroek     // Add the internal test cases.
238*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, equal_argvs);
239*00b67f09SDavid van Moolenbroek 
240*00b67f09SDavid van Moolenbroek     // Add the test cases for the free functions.
241*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, c_o);
242*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, cpp);
243*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, cxx_o);
244*00b67f09SDavid van Moolenbroek 
245*00b67f09SDavid van Moolenbroek     // Add the test cases for the header file.
246*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, include);
247*00b67f09SDavid van Moolenbroek }
248