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