1*00b67f09SDavid van Moolenbroek //
2*00b67f09SDavid van Moolenbroek // Automated Testing Framework (atf)
3*00b67f09SDavid van Moolenbroek //
4*00b67f09SDavid van Moolenbroek // Copyright (c) 2007 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 "config.hpp"
34*00b67f09SDavid van Moolenbroek #include "macros.hpp"
35*00b67f09SDavid van Moolenbroek
36*00b67f09SDavid van Moolenbroek #include "detail/env.hpp"
37*00b67f09SDavid van Moolenbroek #include "detail/exceptions.hpp"
38*00b67f09SDavid van Moolenbroek #include "detail/test_helpers.hpp"
39*00b67f09SDavid van Moolenbroek
40*00b67f09SDavid van Moolenbroek static const char *test_value = "env-value";
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek static struct varnames {
43*00b67f09SDavid van Moolenbroek const char *lc;
44*00b67f09SDavid van Moolenbroek const char *uc;
45*00b67f09SDavid van Moolenbroek bool can_be_empty;
46*00b67f09SDavid van Moolenbroek } all_vars[] = {
47*00b67f09SDavid van Moolenbroek { "atf_arch", "ATF_ARCH", false },
48*00b67f09SDavid van Moolenbroek { "atf_build_cc", "ATF_BUILD_CC", false },
49*00b67f09SDavid van Moolenbroek { "atf_build_cflags", "ATF_BUILD_CFLAGS", true },
50*00b67f09SDavid van Moolenbroek { "atf_build_cpp", "ATF_BUILD_CPP", false },
51*00b67f09SDavid van Moolenbroek { "atf_build_cppflags", "ATF_BUILD_CPPFLAGS", true },
52*00b67f09SDavid van Moolenbroek { "atf_build_cxx", "ATF_BUILD_CXX", false },
53*00b67f09SDavid van Moolenbroek { "atf_build_cxxflags", "ATF_BUILD_CXXFLAGS", true },
54*00b67f09SDavid van Moolenbroek { "atf_confdir", "ATF_CONFDIR", false },
55*00b67f09SDavid van Moolenbroek { "atf_includedir", "ATF_INCLUDEDIR", false },
56*00b67f09SDavid van Moolenbroek { "atf_libdir", "ATF_LIBDIR", false },
57*00b67f09SDavid van Moolenbroek { "atf_libexecdir", "ATF_LIBEXECDIR", false },
58*00b67f09SDavid van Moolenbroek { "atf_machine", "ATF_MACHINE", false },
59*00b67f09SDavid van Moolenbroek { "atf_pkgdatadir", "ATF_PKGDATADIR", false },
60*00b67f09SDavid van Moolenbroek { "atf_shell", "ATF_SHELL", false },
61*00b67f09SDavid van Moolenbroek { "atf_workdir", "ATF_WORKDIR", false },
62*00b67f09SDavid van Moolenbroek { NULL, NULL, false }
63*00b67f09SDavid van Moolenbroek };
64*00b67f09SDavid van Moolenbroek
65*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
66*00b67f09SDavid van Moolenbroek // Auxiliary functions.
67*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
68*00b67f09SDavid van Moolenbroek
69*00b67f09SDavid van Moolenbroek namespace atf {
70*00b67f09SDavid van Moolenbroek namespace config {
71*00b67f09SDavid van Moolenbroek void __reinit(void);
72*00b67f09SDavid van Moolenbroek }
73*00b67f09SDavid van Moolenbroek }
74*00b67f09SDavid van Moolenbroek
75*00b67f09SDavid van Moolenbroek static
76*00b67f09SDavid van Moolenbroek void
set_env_var(const char * name,const char * val)77*00b67f09SDavid van Moolenbroek set_env_var(const char* name, const char* val)
78*00b67f09SDavid van Moolenbroek {
79*00b67f09SDavid van Moolenbroek try {
80*00b67f09SDavid van Moolenbroek atf::env::set(name, val);
81*00b67f09SDavid van Moolenbroek } catch (const atf::system_error&) {
82*00b67f09SDavid van Moolenbroek ATF_FAIL(std::string("set_env_var(") + name + ", " + val +
83*00b67f09SDavid van Moolenbroek ") failed");
84*00b67f09SDavid van Moolenbroek }
85*00b67f09SDavid van Moolenbroek }
86*00b67f09SDavid van Moolenbroek
87*00b67f09SDavid van Moolenbroek static
88*00b67f09SDavid van Moolenbroek void
unset_env_var(const char * name)89*00b67f09SDavid van Moolenbroek unset_env_var(const char* name)
90*00b67f09SDavid van Moolenbroek {
91*00b67f09SDavid van Moolenbroek try {
92*00b67f09SDavid van Moolenbroek atf::env::unset(name);
93*00b67f09SDavid van Moolenbroek } catch (const atf::system_error&) {
94*00b67f09SDavid van Moolenbroek ATF_FAIL(std::string("unset_env_var(") + name + ") failed");
95*00b67f09SDavid van Moolenbroek }
96*00b67f09SDavid van Moolenbroek }
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek static
99*00b67f09SDavid van Moolenbroek size_t
all_vars_count(void)100*00b67f09SDavid van Moolenbroek all_vars_count(void)
101*00b67f09SDavid van Moolenbroek {
102*00b67f09SDavid van Moolenbroek size_t count = 0;
103*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++)
104*00b67f09SDavid van Moolenbroek count++;
105*00b67f09SDavid van Moolenbroek return count;
106*00b67f09SDavid van Moolenbroek }
107*00b67f09SDavid van Moolenbroek
108*00b67f09SDavid van Moolenbroek static
109*00b67f09SDavid van Moolenbroek void
unset_all(void)110*00b67f09SDavid van Moolenbroek unset_all(void)
111*00b67f09SDavid van Moolenbroek {
112*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++)
113*00b67f09SDavid van Moolenbroek unset_env_var(v->uc);
114*00b67f09SDavid van Moolenbroek }
115*00b67f09SDavid van Moolenbroek
116*00b67f09SDavid van Moolenbroek static
117*00b67f09SDavid van Moolenbroek void
compare_one(const char * var,const char * expvalue)118*00b67f09SDavid van Moolenbroek compare_one(const char* var, const char* expvalue)
119*00b67f09SDavid van Moolenbroek {
120*00b67f09SDavid van Moolenbroek std::cout << "Checking that " << var << " is set to " << expvalue << "\n";
121*00b67f09SDavid van Moolenbroek
122*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++) {
123*00b67f09SDavid van Moolenbroek if (std::strcmp(v->lc, var) == 0)
124*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(atf::config::get(v->lc), test_value);
125*00b67f09SDavid van Moolenbroek else
126*00b67f09SDavid van Moolenbroek ATF_REQUIRE(atf::config::get(v->lc) != test_value);
127*00b67f09SDavid van Moolenbroek }
128*00b67f09SDavid van Moolenbroek }
129*00b67f09SDavid van Moolenbroek
130*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
131*00b67f09SDavid van Moolenbroek // Test cases for the free functions.
132*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
133*00b67f09SDavid van Moolenbroek
134*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(get);
ATF_TEST_CASE_HEAD(get)135*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(get)
136*00b67f09SDavid van Moolenbroek {
137*00b67f09SDavid van Moolenbroek set_md_var("descr", "Tests the config::get function");
138*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(get)139*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(get)
140*00b67f09SDavid van Moolenbroek {
141*00b67f09SDavid van Moolenbroek // Unset all known environment variables and make sure the built-in
142*00b67f09SDavid van Moolenbroek // values do not match the bogus value we will use for testing.
143*00b67f09SDavid van Moolenbroek unset_all();
144*00b67f09SDavid van Moolenbroek atf::config::__reinit();
145*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++)
146*00b67f09SDavid van Moolenbroek ATF_REQUIRE(atf::config::get(v->lc) != test_value);
147*00b67f09SDavid van Moolenbroek
148*00b67f09SDavid van Moolenbroek // Test the behavior of empty values.
149*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++) {
150*00b67f09SDavid van Moolenbroek unset_all();
151*00b67f09SDavid van Moolenbroek if (!atf::config::get(v->lc).empty()) {
152*00b67f09SDavid van Moolenbroek set_env_var(v->uc, "");
153*00b67f09SDavid van Moolenbroek atf::config::__reinit();
154*00b67f09SDavid van Moolenbroek if (v->can_be_empty)
155*00b67f09SDavid van Moolenbroek ATF_REQUIRE(atf::config::get(v->lc).empty());
156*00b67f09SDavid van Moolenbroek else
157*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::get(v->lc).empty());
158*00b67f09SDavid van Moolenbroek }
159*00b67f09SDavid van Moolenbroek }
160*00b67f09SDavid van Moolenbroek
161*00b67f09SDavid van Moolenbroek // Check if the ATF_ARCH variable is recognized.
162*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++) {
163*00b67f09SDavid van Moolenbroek unset_all();
164*00b67f09SDavid van Moolenbroek set_env_var(v->uc, test_value);
165*00b67f09SDavid van Moolenbroek atf::config::__reinit();
166*00b67f09SDavid van Moolenbroek compare_one(v->lc, test_value);
167*00b67f09SDavid van Moolenbroek }
168*00b67f09SDavid van Moolenbroek }
169*00b67f09SDavid van Moolenbroek
170*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(get_all);
ATF_TEST_CASE_HEAD(get_all)171*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(get_all)
172*00b67f09SDavid van Moolenbroek {
173*00b67f09SDavid van Moolenbroek set_md_var("descr", "Tests the config::get_all function");
174*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(get_all)175*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(get_all)
176*00b67f09SDavid van Moolenbroek {
177*00b67f09SDavid van Moolenbroek atf::config::__reinit();
178*00b67f09SDavid van Moolenbroek
179*00b67f09SDavid van Moolenbroek // Check that the valid variables, and only those, are returned.
180*00b67f09SDavid van Moolenbroek std::map< std::string, std::string > vars = atf::config::get_all();
181*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(vars.size(), all_vars_count());
182*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++)
183*00b67f09SDavid van Moolenbroek ATF_REQUIRE(vars.find(v->lc) != vars.end());
184*00b67f09SDavid van Moolenbroek }
185*00b67f09SDavid van Moolenbroek
186*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(has);
ATF_TEST_CASE_HEAD(has)187*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(has)
188*00b67f09SDavid van Moolenbroek {
189*00b67f09SDavid van Moolenbroek set_md_var("descr", "Tests the config::has function");
190*00b67f09SDavid van Moolenbroek }
ATF_TEST_CASE_BODY(has)191*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(has)
192*00b67f09SDavid van Moolenbroek {
193*00b67f09SDavid van Moolenbroek atf::config::__reinit();
194*00b67f09SDavid van Moolenbroek
195*00b67f09SDavid van Moolenbroek // Check for all the variables that must exist.
196*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++)
197*00b67f09SDavid van Moolenbroek ATF_REQUIRE(atf::config::has(v->lc));
198*00b67f09SDavid van Moolenbroek
199*00b67f09SDavid van Moolenbroek // Same as above, but using uppercase (which is incorrect).
200*00b67f09SDavid van Moolenbroek for (const struct varnames* v = all_vars; v->lc != NULL; v++)
201*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has(v->uc));
202*00b67f09SDavid van Moolenbroek
203*00b67f09SDavid van Moolenbroek // Check for some other variables that cannot exist.
204*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has("foo"));
205*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has("BAR"));
206*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has("atf_foo"));
207*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has("ATF_BAR"));
208*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has("atf_shel"));
209*00b67f09SDavid van Moolenbroek ATF_REQUIRE(!atf::config::has("atf_shells"));
210*00b67f09SDavid van Moolenbroek }
211*00b67f09SDavid van Moolenbroek
212*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
213*00b67f09SDavid van Moolenbroek // Tests cases for the header file.
214*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
215*00b67f09SDavid van Moolenbroek
216*00b67f09SDavid van Moolenbroek HEADER_TC(include, "atf-c++/config.hpp");
217*00b67f09SDavid van Moolenbroek
218*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
219*00b67f09SDavid van Moolenbroek // Main.
220*00b67f09SDavid van Moolenbroek // ------------------------------------------------------------------------
221*00b67f09SDavid van Moolenbroek
ATF_INIT_TEST_CASES(tcs)222*00b67f09SDavid van Moolenbroek ATF_INIT_TEST_CASES(tcs)
223*00b67f09SDavid van Moolenbroek {
224*00b67f09SDavid van Moolenbroek // Add the test cases for the free functions.
225*00b67f09SDavid van Moolenbroek ATF_ADD_TEST_CASE(tcs, has);
226*00b67f09SDavid van Moolenbroek ATF_ADD_TEST_CASE(tcs, get);
227*00b67f09SDavid van Moolenbroek ATF_ADD_TEST_CASE(tcs, get_all);
228*00b67f09SDavid van Moolenbroek
229*00b67f09SDavid van Moolenbroek // Add the test cases for the header file.
230*00b67f09SDavid van Moolenbroek ATF_ADD_TEST_CASE(tcs, include);
231*00b67f09SDavid van Moolenbroek }
232