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