1*00b67f09SDavid van Moolenbroek /* $NetBSD: build_test.c,v 1.1.1.3 2014/12/10 03:34:48 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Automated Testing Framework (atf)
5*00b67f09SDavid van Moolenbroek *
6*00b67f09SDavid van Moolenbroek * Copyright (c) 2009 The NetBSD Foundation, Inc.
7*00b67f09SDavid van Moolenbroek * All rights reserved.
8*00b67f09SDavid van Moolenbroek *
9*00b67f09SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
10*00b67f09SDavid van Moolenbroek * modification, are permitted provided that the following conditions
11*00b67f09SDavid van Moolenbroek * are met:
12*00b67f09SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
13*00b67f09SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
14*00b67f09SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
15*00b67f09SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
16*00b67f09SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
17*00b67f09SDavid van Moolenbroek *
18*00b67f09SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
19*00b67f09SDavid van Moolenbroek * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
20*00b67f09SDavid van Moolenbroek * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21*00b67f09SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*00b67f09SDavid van Moolenbroek * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
23*00b67f09SDavid van Moolenbroek * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*00b67f09SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
25*00b67f09SDavid van Moolenbroek * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*00b67f09SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
27*00b67f09SDavid van Moolenbroek * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28*00b67f09SDavid van Moolenbroek * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
29*00b67f09SDavid van Moolenbroek * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*00b67f09SDavid van Moolenbroek */
31*00b67f09SDavid van Moolenbroek
32*00b67f09SDavid van Moolenbroek #include <stdio.h>
33*00b67f09SDavid van Moolenbroek #include <stdlib.h>
34*00b67f09SDavid van Moolenbroek #include <string.h>
35*00b67f09SDavid van Moolenbroek
36*00b67f09SDavid van Moolenbroek #include <atf-c.h>
37*00b67f09SDavid van Moolenbroek
38*00b67f09SDavid van Moolenbroek #include "atf-c/build.h"
39*00b67f09SDavid van Moolenbroek #include "atf-c/config.h"
40*00b67f09SDavid van Moolenbroek #include "atf-c/utils.h"
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek #include "detail/env.h"
43*00b67f09SDavid van Moolenbroek #include "detail/test_helpers.h"
44*00b67f09SDavid van Moolenbroek #include "h_build.h"
45*00b67f09SDavid van Moolenbroek
46*00b67f09SDavid van Moolenbroek /* ---------------------------------------------------------------------
47*00b67f09SDavid van Moolenbroek * Auxiliary functions.
48*00b67f09SDavid van Moolenbroek * --------------------------------------------------------------------- */
49*00b67f09SDavid van Moolenbroek
50*00b67f09SDavid van Moolenbroek void __atf_config_reinit(void);
51*00b67f09SDavid van Moolenbroek
52*00b67f09SDavid van Moolenbroek static
53*00b67f09SDavid van Moolenbroek bool
equal_arrays(const char * const * exp_array,char ** actual_array)54*00b67f09SDavid van Moolenbroek equal_arrays(const char *const *exp_array, char **actual_array)
55*00b67f09SDavid van Moolenbroek {
56*00b67f09SDavid van Moolenbroek bool equal;
57*00b67f09SDavid van Moolenbroek
58*00b67f09SDavid van Moolenbroek if (*exp_array == NULL && *actual_array == NULL)
59*00b67f09SDavid van Moolenbroek equal = true;
60*00b67f09SDavid van Moolenbroek else if (*exp_array == NULL || *actual_array == NULL)
61*00b67f09SDavid van Moolenbroek equal = false;
62*00b67f09SDavid van Moolenbroek else {
63*00b67f09SDavid van Moolenbroek equal = true;
64*00b67f09SDavid van Moolenbroek while (*actual_array != NULL) {
65*00b67f09SDavid van Moolenbroek if (*exp_array == NULL || strcmp(*exp_array, *actual_array) != 0) {
66*00b67f09SDavid van Moolenbroek equal = false;
67*00b67f09SDavid van Moolenbroek break;
68*00b67f09SDavid van Moolenbroek }
69*00b67f09SDavid van Moolenbroek exp_array++;
70*00b67f09SDavid van Moolenbroek actual_array++;
71*00b67f09SDavid van Moolenbroek }
72*00b67f09SDavid van Moolenbroek }
73*00b67f09SDavid van Moolenbroek
74*00b67f09SDavid van Moolenbroek return equal;
75*00b67f09SDavid van Moolenbroek }
76*00b67f09SDavid van Moolenbroek
77*00b67f09SDavid van Moolenbroek static
78*00b67f09SDavid van Moolenbroek void
check_equal_array(const char * const * exp_array,char ** actual_array)79*00b67f09SDavid van Moolenbroek check_equal_array(const char *const *exp_array, char **actual_array)
80*00b67f09SDavid van Moolenbroek {
81*00b67f09SDavid van Moolenbroek {
82*00b67f09SDavid van Moolenbroek const char *const *exp_ptr;
83*00b67f09SDavid van Moolenbroek printf("Expected arguments:");
84*00b67f09SDavid van Moolenbroek for (exp_ptr = exp_array; *exp_ptr != NULL; exp_ptr++)
85*00b67f09SDavid van Moolenbroek printf(" '%s'", *exp_ptr);
86*00b67f09SDavid van Moolenbroek printf("\n");
87*00b67f09SDavid van Moolenbroek }
88*00b67f09SDavid van Moolenbroek
89*00b67f09SDavid van Moolenbroek {
90*00b67f09SDavid van Moolenbroek char **actual_ptr;
91*00b67f09SDavid van Moolenbroek printf("Returned arguments:");
92*00b67f09SDavid van Moolenbroek for (actual_ptr = actual_array; *actual_ptr != NULL; actual_ptr++)
93*00b67f09SDavid van Moolenbroek printf(" '%s'", *actual_ptr);
94*00b67f09SDavid van Moolenbroek printf("\n");
95*00b67f09SDavid van Moolenbroek }
96*00b67f09SDavid van Moolenbroek
97*00b67f09SDavid van Moolenbroek if (!equal_arrays(exp_array, actual_array))
98*00b67f09SDavid van Moolenbroek atf_tc_fail_nonfatal("The constructed argv differs from the "
99*00b67f09SDavid van Moolenbroek "expected values");
100*00b67f09SDavid van Moolenbroek }
101*00b67f09SDavid van Moolenbroek
102*00b67f09SDavid van Moolenbroek static
103*00b67f09SDavid van Moolenbroek void
verbose_set_env(const char * var,const char * val)104*00b67f09SDavid van Moolenbroek verbose_set_env(const char *var, const char *val)
105*00b67f09SDavid van Moolenbroek {
106*00b67f09SDavid van Moolenbroek printf("Setting %s to '%s'\n", var, val);
107*00b67f09SDavid van Moolenbroek RE(atf_env_set(var, val));
108*00b67f09SDavid van Moolenbroek }
109*00b67f09SDavid van Moolenbroek
110*00b67f09SDavid van Moolenbroek /* ---------------------------------------------------------------------
111*00b67f09SDavid van Moolenbroek * Internal test cases.
112*00b67f09SDavid van Moolenbroek * --------------------------------------------------------------------- */
113*00b67f09SDavid van Moolenbroek
114*00b67f09SDavid van Moolenbroek ATF_TC(equal_arrays);
ATF_TC_HEAD(equal_arrays,tc)115*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(equal_arrays, tc)
116*00b67f09SDavid van Moolenbroek {
117*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "Tests the test case internal "
118*00b67f09SDavid van Moolenbroek "equal_arrays function");
119*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(equal_arrays,tc)120*00b67f09SDavid van Moolenbroek ATF_TC_BODY(equal_arrays, tc)
121*00b67f09SDavid van Moolenbroek {
122*00b67f09SDavid van Moolenbroek {
123*00b67f09SDavid van Moolenbroek const char *const exp[] = { NULL };
124*00b67f09SDavid van Moolenbroek char *actual[] = { NULL };
125*00b67f09SDavid van Moolenbroek
126*00b67f09SDavid van Moolenbroek ATF_CHECK(equal_arrays(exp, actual));
127*00b67f09SDavid van Moolenbroek }
128*00b67f09SDavid van Moolenbroek
129*00b67f09SDavid van Moolenbroek {
130*00b67f09SDavid van Moolenbroek const char *const exp[] = { NULL };
131*00b67f09SDavid van Moolenbroek char *actual[2] = { strdup("foo"), NULL };
132*00b67f09SDavid van Moolenbroek
133*00b67f09SDavid van Moolenbroek ATF_CHECK(!equal_arrays(exp, actual));
134*00b67f09SDavid van Moolenbroek free(actual[0]);
135*00b67f09SDavid van Moolenbroek }
136*00b67f09SDavid van Moolenbroek
137*00b67f09SDavid van Moolenbroek {
138*00b67f09SDavid van Moolenbroek const char *const exp[] = { "foo", NULL };
139*00b67f09SDavid van Moolenbroek char *actual[] = { NULL };
140*00b67f09SDavid van Moolenbroek
141*00b67f09SDavid van Moolenbroek ATF_CHECK(!equal_arrays(exp, actual));
142*00b67f09SDavid van Moolenbroek }
143*00b67f09SDavid van Moolenbroek
144*00b67f09SDavid van Moolenbroek {
145*00b67f09SDavid van Moolenbroek const char *const exp[] = { "foo", NULL };
146*00b67f09SDavid van Moolenbroek char *actual[2] = { strdup("foo"), NULL };
147*00b67f09SDavid van Moolenbroek
148*00b67f09SDavid van Moolenbroek ATF_CHECK(equal_arrays(exp, actual));
149*00b67f09SDavid van Moolenbroek free(actual[0]);
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_TC(c_o);
ATF_TC_HEAD(c_o,tc)158*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(c_o, tc)
159*00b67f09SDavid van Moolenbroek {
160*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "Tests the atf_build_c_o function");
161*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(c_o,tc)162*00b67f09SDavid van Moolenbroek ATF_TC_BODY(c_o, tc)
163*00b67f09SDavid van Moolenbroek {
164*00b67f09SDavid van Moolenbroek struct c_o_test *test;
165*00b67f09SDavid van Moolenbroek
166*00b67f09SDavid van Moolenbroek for (test = c_o_tests; test->expargv[0] != NULL; test++) {
167*00b67f09SDavid van Moolenbroek printf("> Test: %s\n", test->msg);
168*00b67f09SDavid van Moolenbroek
169*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CC", test->cc);
170*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CFLAGS", test->cflags);
171*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
172*00b67f09SDavid van Moolenbroek __atf_config_reinit();
173*00b67f09SDavid van Moolenbroek
174*00b67f09SDavid van Moolenbroek {
175*00b67f09SDavid van Moolenbroek char **argv;
176*00b67f09SDavid van Moolenbroek if (test->hasoptargs)
177*00b67f09SDavid van Moolenbroek RE(atf_build_c_o(test->sfile, test->ofile, test->optargs,
178*00b67f09SDavid van Moolenbroek &argv));
179*00b67f09SDavid van Moolenbroek else
180*00b67f09SDavid van Moolenbroek RE(atf_build_c_o(test->sfile, test->ofile, NULL, &argv));
181*00b67f09SDavid van Moolenbroek check_equal_array(test->expargv, argv);
182*00b67f09SDavid van Moolenbroek atf_utils_free_charpp(argv);
183*00b67f09SDavid van Moolenbroek }
184*00b67f09SDavid van Moolenbroek }
185*00b67f09SDavid van Moolenbroek }
186*00b67f09SDavid van Moolenbroek
187*00b67f09SDavid van Moolenbroek ATF_TC(cpp);
ATF_TC_HEAD(cpp,tc)188*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(cpp, tc)
189*00b67f09SDavid van Moolenbroek {
190*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "Tests the atf_build_cpp function");
191*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(cpp,tc)192*00b67f09SDavid van Moolenbroek ATF_TC_BODY(cpp, tc)
193*00b67f09SDavid van Moolenbroek {
194*00b67f09SDavid van Moolenbroek struct cpp_test *test;
195*00b67f09SDavid van Moolenbroek
196*00b67f09SDavid van Moolenbroek for (test = cpp_tests; test->expargv[0] != NULL; test++) {
197*00b67f09SDavid van Moolenbroek printf("> Test: %s\n", test->msg);
198*00b67f09SDavid van Moolenbroek
199*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CPP", test->cpp);
200*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
201*00b67f09SDavid van Moolenbroek __atf_config_reinit();
202*00b67f09SDavid van Moolenbroek
203*00b67f09SDavid van Moolenbroek {
204*00b67f09SDavid van Moolenbroek char **argv;
205*00b67f09SDavid van Moolenbroek if (test->hasoptargs)
206*00b67f09SDavid van Moolenbroek RE(atf_build_cpp(test->sfile, test->ofile, test->optargs,
207*00b67f09SDavid van Moolenbroek &argv));
208*00b67f09SDavid van Moolenbroek else
209*00b67f09SDavid van Moolenbroek RE(atf_build_cpp(test->sfile, test->ofile, NULL, &argv));
210*00b67f09SDavid van Moolenbroek check_equal_array(test->expargv, argv);
211*00b67f09SDavid van Moolenbroek atf_utils_free_charpp(argv);
212*00b67f09SDavid van Moolenbroek }
213*00b67f09SDavid van Moolenbroek }
214*00b67f09SDavid van Moolenbroek }
215*00b67f09SDavid van Moolenbroek
216*00b67f09SDavid van Moolenbroek ATF_TC(cxx_o);
ATF_TC_HEAD(cxx_o,tc)217*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(cxx_o, tc)
218*00b67f09SDavid van Moolenbroek {
219*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "Tests the atf_build_cxx_o function");
220*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(cxx_o,tc)221*00b67f09SDavid van Moolenbroek ATF_TC_BODY(cxx_o, tc)
222*00b67f09SDavid van Moolenbroek {
223*00b67f09SDavid van Moolenbroek struct cxx_o_test *test;
224*00b67f09SDavid van Moolenbroek
225*00b67f09SDavid van Moolenbroek for (test = cxx_o_tests; test->expargv[0] != NULL; test++) {
226*00b67f09SDavid van Moolenbroek printf("> Test: %s\n", test->msg);
227*00b67f09SDavid van Moolenbroek
228*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CXX", test->cxx);
229*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CXXFLAGS", test->cxxflags);
230*00b67f09SDavid van Moolenbroek verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
231*00b67f09SDavid van Moolenbroek __atf_config_reinit();
232*00b67f09SDavid van Moolenbroek
233*00b67f09SDavid van Moolenbroek {
234*00b67f09SDavid van Moolenbroek char **argv;
235*00b67f09SDavid van Moolenbroek if (test->hasoptargs)
236*00b67f09SDavid van Moolenbroek RE(atf_build_cxx_o(test->sfile, test->ofile, test->optargs,
237*00b67f09SDavid van Moolenbroek &argv));
238*00b67f09SDavid van Moolenbroek else
239*00b67f09SDavid van Moolenbroek RE(atf_build_cxx_o(test->sfile, test->ofile, NULL, &argv));
240*00b67f09SDavid van Moolenbroek check_equal_array(test->expargv, argv);
241*00b67f09SDavid van Moolenbroek atf_utils_free_charpp(argv);
242*00b67f09SDavid van Moolenbroek }
243*00b67f09SDavid van Moolenbroek }
244*00b67f09SDavid van Moolenbroek }
245*00b67f09SDavid van Moolenbroek
246*00b67f09SDavid van Moolenbroek /* ---------------------------------------------------------------------
247*00b67f09SDavid van Moolenbroek * Tests cases for the header file.
248*00b67f09SDavid van Moolenbroek * --------------------------------------------------------------------- */
249*00b67f09SDavid van Moolenbroek
250*00b67f09SDavid van Moolenbroek HEADER_TC(include, "atf-c/build.h");
251*00b67f09SDavid van Moolenbroek
252*00b67f09SDavid van Moolenbroek /* ---------------------------------------------------------------------
253*00b67f09SDavid van Moolenbroek * Main.
254*00b67f09SDavid van Moolenbroek * --------------------------------------------------------------------- */
255*00b67f09SDavid van Moolenbroek
ATF_TP_ADD_TCS(tp)256*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp)
257*00b67f09SDavid van Moolenbroek {
258*00b67f09SDavid van Moolenbroek /* Add the internal test cases. */
259*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, equal_arrays);
260*00b67f09SDavid van Moolenbroek
261*00b67f09SDavid van Moolenbroek /* Add the test cases for the free functions. */
262*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, c_o);
263*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, cpp);
264*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, cxx_o);
265*00b67f09SDavid van Moolenbroek
266*00b67f09SDavid van Moolenbroek /* Add the test cases for the header file. */
267*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, include);
268*00b67f09SDavid van Moolenbroek
269*00b67f09SDavid van Moolenbroek return atf_no_error();
270*00b67f09SDavid van Moolenbroek }
271