1240116Smarcel//
2240116Smarcel// Automated Testing Framework (atf)
3240116Smarcel//
4240116Smarcel// Copyright (c) 2009 The NetBSD Foundation, Inc.
5240116Smarcel// All rights reserved.
6240116Smarcel//
7240116Smarcel// Redistribution and use in source and binary forms, with or without
8240116Smarcel// modification, are permitted provided that the following conditions
9240116Smarcel// are met:
10240116Smarcel// 1. Redistributions of source code must retain the above copyright
11240116Smarcel//    notice, this list of conditions and the following disclaimer.
12240116Smarcel// 2. Redistributions in binary form must reproduce the above copyright
13240116Smarcel//    notice, this list of conditions and the following disclaimer in the
14240116Smarcel//    documentation and/or other materials provided with the distribution.
15240116Smarcel//
16240116Smarcel// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17240116Smarcel// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18240116Smarcel// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19240116Smarcel// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20240116Smarcel// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21240116Smarcel// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22240116Smarcel// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23240116Smarcel// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24240116Smarcel// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25240116Smarcel// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26240116Smarcel// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27240116Smarcel// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28240116Smarcel//
29240116Smarcel
30240116Smarcel#include <cstring>
31240116Smarcel#include <iostream>
32240116Smarcel
33240116Smarcel#include "../atf-c/h_build.h"
34240116Smarcel
35240116Smarcel#include "build.hpp"
36240116Smarcel#include "config.hpp"
37240116Smarcel#include "macros.hpp"
38240116Smarcel
39240116Smarcel#include "detail/env.hpp"
40240116Smarcel#include "detail/process.hpp"
41240116Smarcel#include "detail/test_helpers.hpp"
42240116Smarcel
43240116Smarcel// ------------------------------------------------------------------------
44240116Smarcel// Auxiliary functions.
45240116Smarcel// ------------------------------------------------------------------------
46240116Smarcel
47240116Smarcelnamespace atf {
48240116Smarcel    namespace config {
49240116Smarcel        void __reinit(void);
50240116Smarcel    }
51240116Smarcel}
52240116Smarcel
53240116Smarceltemplate< class C >
54240116Smarcelvoid
55240116Smarcelprint_col(const char* prefix, const C& c)
56240116Smarcel{
57240116Smarcel    std::cout << prefix << ":";
58240116Smarcel    for (typename C::const_iterator iter = c.begin(); iter != c.end();
59240116Smarcel         iter++)
60240116Smarcel        std::cout << " '" << *iter << "'";
61240116Smarcel    std::cout << "\n";
62240116Smarcel}
63240116Smarcel
64240116Smarcelstatic
65240116Smarcelvoid
66240116Smarcelprint_array(const char* prefix, const char* const* a)
67240116Smarcel{
68240116Smarcel    std::cout << prefix << ":";
69240116Smarcel    for (; *a != NULL; a++)
70240116Smarcel        std::cout << " '" << *a << "'";
71240116Smarcel    std::cout << "\n";
72240116Smarcel}
73240116Smarcel
74240116Smarcelstatic
75240116Smarcelvoid
76240116Smarcelverbose_set_env(const char *var, const char *val)
77240116Smarcel{
78240116Smarcel    std::cout << "Setting " << var << " to '" << val << "'\n";
79240116Smarcel    atf::env::set(var, val);
80240116Smarcel}
81240116Smarcel
82240116Smarcelstatic
83240116Smarcelbool
84240116Smarcelequal_argvs(const atf::process::argv_array& aa, const char* const* array)
85240116Smarcel{
86240116Smarcel    bool equal = true;
87240116Smarcel
88240116Smarcel    atf::process::argv_array::size_type i = 0;
89240116Smarcel    while (equal && (i < aa.size() && array[i] != NULL)) {
90240116Smarcel        if (std::strcmp(aa[i], array[i]) != 0)
91240116Smarcel            equal = false;
92240116Smarcel        else
93240116Smarcel            i++;
94240116Smarcel    }
95240116Smarcel
96240116Smarcel    if (equal && (i < aa.size() || array[i] != NULL))
97240116Smarcel        equal = false;
98240116Smarcel
99240116Smarcel    return equal;
100240116Smarcel}
101240116Smarcel
102240116Smarcelstatic
103240116Smarcelvoid
104240116Smarcelcheck_equal_argvs(const atf::process::argv_array& aa, const char* const* array)
105240116Smarcel{
106240116Smarcel    print_array("Expected arguments", array);
107240116Smarcel    print_col("Arguments returned", aa);
108240116Smarcel
109240116Smarcel    if (!equal_argvs(aa, array))
110240116Smarcel        ATF_FAIL("The constructed argv differs from the expected values");
111240116Smarcel}
112240116Smarcel
113240116Smarcel// ------------------------------------------------------------------------
114240116Smarcel// Internal test cases.
115240116Smarcel// ------------------------------------------------------------------------
116240116Smarcel
117240116SmarcelATF_TEST_CASE(equal_argvs);
118240116SmarcelATF_TEST_CASE_HEAD(equal_argvs)
119240116Smarcel{
120240116Smarcel    set_md_var("descr", "Tests the test case internal equal_argvs function");
121240116Smarcel}
122240116SmarcelATF_TEST_CASE_BODY(equal_argvs)
123240116Smarcel{
124240116Smarcel    {
125240116Smarcel        const char* const array[] = { NULL };
126240116Smarcel        const char* const argv[] = { NULL };
127240116Smarcel
128240116Smarcel        ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array));
129240116Smarcel    }
130240116Smarcel
131240116Smarcel    {
132240116Smarcel        const char* const array[] = { NULL };
133240116Smarcel        const char* const argv[] = { "foo", NULL };
134240116Smarcel
135240116Smarcel        ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array));
136240116Smarcel    }
137240116Smarcel
138240116Smarcel    {
139240116Smarcel        const char* const array[] = { "foo", NULL };
140240116Smarcel        const char* const argv[] = { NULL };
141240116Smarcel
142240116Smarcel        ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array));
143240116Smarcel    }
144240116Smarcel
145240116Smarcel    {
146240116Smarcel        const char* const array[] = { "foo", NULL };
147240116Smarcel        const char* const argv[] = { "foo", NULL };
148240116Smarcel
149240116Smarcel        ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array));
150240116Smarcel    }
151240116Smarcel}
152240116Smarcel
153240116Smarcel// ------------------------------------------------------------------------
154240116Smarcel// Test cases for the free functions.
155240116Smarcel// ------------------------------------------------------------------------
156240116Smarcel
157240116SmarcelATF_TEST_CASE(c_o);
158240116SmarcelATF_TEST_CASE_HEAD(c_o)
159240116Smarcel{
160240116Smarcel    set_md_var("descr", "Tests the c_o function");
161240116Smarcel}
162240116SmarcelATF_TEST_CASE_BODY(c_o)
163240116Smarcel{
164240116Smarcel    for (struct c_o_test* test = c_o_tests; test->expargv[0] != NULL;
165240116Smarcel         test++) {
166240116Smarcel        std::cout << "> Test: " << test->msg << "\n";
167240116Smarcel
168240116Smarcel        verbose_set_env("ATF_BUILD_CC", test->cc);
169240116Smarcel        verbose_set_env("ATF_BUILD_CFLAGS", test->cflags);
170240116Smarcel        verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
171240116Smarcel        atf::config::__reinit();
172240116Smarcel
173240116Smarcel        atf::process::argv_array argv =
174240116Smarcel            atf::build::c_o(test->sfile, test->ofile,
175240116Smarcel                            atf::process::argv_array(test->optargs));
176240116Smarcel        check_equal_argvs(argv, test->expargv);
177240116Smarcel    }
178240116Smarcel}
179240116Smarcel
180240116SmarcelATF_TEST_CASE(cpp);
181240116SmarcelATF_TEST_CASE_HEAD(cpp)
182240116Smarcel{
183240116Smarcel    set_md_var("descr", "Tests the cpp function");
184240116Smarcel}
185240116SmarcelATF_TEST_CASE_BODY(cpp)
186240116Smarcel{
187240116Smarcel    for (struct cpp_test* test = cpp_tests; test->expargv[0] != NULL;
188240116Smarcel         test++) {
189240116Smarcel        std::cout << "> Test: " << test->msg << "\n";
190240116Smarcel
191240116Smarcel        verbose_set_env("ATF_BUILD_CPP", test->cpp);
192240116Smarcel        verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
193240116Smarcel        atf::config::__reinit();
194240116Smarcel
195240116Smarcel        atf::process::argv_array argv =
196240116Smarcel            atf::build::cpp(test->sfile, test->ofile,
197240116Smarcel                            atf::process::argv_array(test->optargs));
198240116Smarcel        check_equal_argvs(argv, test->expargv);
199240116Smarcel    }
200240116Smarcel}
201240116Smarcel
202240116SmarcelATF_TEST_CASE(cxx_o);
203240116SmarcelATF_TEST_CASE_HEAD(cxx_o)
204240116Smarcel{
205240116Smarcel    set_md_var("descr", "Tests the cxx_o function");
206240116Smarcel}
207240116SmarcelATF_TEST_CASE_BODY(cxx_o)
208240116Smarcel{
209240116Smarcel    for (struct cxx_o_test* test = cxx_o_tests; test->expargv[0] != NULL;
210240116Smarcel         test++) {
211240116Smarcel        std::cout << "> Test: " << test->msg << "\n";
212240116Smarcel
213240116Smarcel        verbose_set_env("ATF_BUILD_CXX", test->cxx);
214240116Smarcel        verbose_set_env("ATF_BUILD_CXXFLAGS", test->cxxflags);
215240116Smarcel        verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags);
216240116Smarcel        atf::config::__reinit();
217240116Smarcel
218240116Smarcel        atf::process::argv_array argv =
219240116Smarcel            atf::build::cxx_o(test->sfile, test->ofile,
220240116Smarcel                              atf::process::argv_array(test->optargs));
221240116Smarcel        check_equal_argvs(argv, test->expargv);
222240116Smarcel    }
223240116Smarcel}
224240116Smarcel
225240116Smarcel// ------------------------------------------------------------------------
226240116Smarcel// Tests cases for the header file.
227240116Smarcel// ------------------------------------------------------------------------
228240116Smarcel
229240116SmarcelHEADER_TC(include, "atf-c++/build.hpp");
230240116Smarcel
231240116Smarcel// ------------------------------------------------------------------------
232240116Smarcel// Main.
233240116Smarcel// ------------------------------------------------------------------------
234240116Smarcel
235240116SmarcelATF_INIT_TEST_CASES(tcs)
236240116Smarcel{
237240116Smarcel    // Add the internal test cases.
238240116Smarcel    ATF_ADD_TEST_CASE(tcs, equal_argvs);
239240116Smarcel
240240116Smarcel    // Add the test cases for the free functions.
241240116Smarcel    ATF_ADD_TEST_CASE(tcs, c_o);
242240116Smarcel    ATF_ADD_TEST_CASE(tcs, cpp);
243240116Smarcel    ATF_ADD_TEST_CASE(tcs, cxx_o);
244240116Smarcel
245240116Smarcel    // Add the test cases for the header file.
246240116Smarcel    ATF_ADD_TEST_CASE(tcs, include);
247240116Smarcel}
248