1*d780102eSjmmv //
2*d780102eSjmmv // Automated Testing Framework (atf)
3*d780102eSjmmv //
4*d780102eSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*d780102eSjmmv // All rights reserved.
6*d780102eSjmmv //
7*d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8*d780102eSjmmv // modification, are permitted provided that the following conditions
9*d780102eSjmmv // are met:
10*d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11*d780102eSjmmv // notice, this list of conditions and the following disclaimer.
12*d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13*d780102eSjmmv // notice, this list of conditions and the following disclaimer in the
14*d780102eSjmmv // documentation and/or other materials provided with the distribution.
15*d780102eSjmmv //
16*d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*d780102eSjmmv //
29*d780102eSjmmv
30*d780102eSjmmv #include <cstring>
31*d780102eSjmmv #include <iostream>
32*d780102eSjmmv
33*d780102eSjmmv #include <atf-c++.hpp>
34*d780102eSjmmv
35*d780102eSjmmv #include "config.hpp"
36*d780102eSjmmv #include "env.hpp"
37*d780102eSjmmv #include "exceptions.hpp"
38*d780102eSjmmv
39*d780102eSjmmv static const char *test_value = "env-value";
40*d780102eSjmmv
41*d780102eSjmmv static struct varnames {
42*d780102eSjmmv const char *lc;
43*d780102eSjmmv const char *uc;
44*d780102eSjmmv bool can_be_empty;
45*d780102eSjmmv } all_vars[] = {
46*d780102eSjmmv { "atf_arch", "ATF_ARCH", false },
47*d780102eSjmmv { "atf_build_cc", "ATF_BUILD_CC", false },
48*d780102eSjmmv { "atf_build_cflags", "ATF_BUILD_CFLAGS", true },
49*d780102eSjmmv { "atf_build_cpp", "ATF_BUILD_CPP", false },
50*d780102eSjmmv { "atf_build_cppflags", "ATF_BUILD_CPPFLAGS", true },
51*d780102eSjmmv { "atf_build_cxx", "ATF_BUILD_CXX", false },
52*d780102eSjmmv { "atf_build_cxxflags", "ATF_BUILD_CXXFLAGS", true },
53*d780102eSjmmv { "atf_confdir", "ATF_CONFDIR", false },
54*d780102eSjmmv { "atf_includedir", "ATF_INCLUDEDIR", false },
55*d780102eSjmmv { "atf_libdir", "ATF_LIBDIR", false },
56*d780102eSjmmv { "atf_libexecdir", "ATF_LIBEXECDIR", false },
57*d780102eSjmmv { "atf_machine", "ATF_MACHINE", false },
58*d780102eSjmmv { "atf_pkgdatadir", "ATF_PKGDATADIR", false },
59*d780102eSjmmv { "atf_shell", "ATF_SHELL", false },
60*d780102eSjmmv { "atf_workdir", "ATF_WORKDIR", false },
61*d780102eSjmmv { NULL, NULL, false }
62*d780102eSjmmv };
63*d780102eSjmmv
64*d780102eSjmmv // ------------------------------------------------------------------------
65*d780102eSjmmv // Auxiliary functions.
66*d780102eSjmmv // ------------------------------------------------------------------------
67*d780102eSjmmv
68*d780102eSjmmv namespace tools {
69*d780102eSjmmv namespace config {
70*d780102eSjmmv void __reinit(void);
71*d780102eSjmmv }
72*d780102eSjmmv }
73*d780102eSjmmv
74*d780102eSjmmv static
75*d780102eSjmmv void
set_env_var(const char * name,const char * val)76*d780102eSjmmv set_env_var(const char* name, const char* val)
77*d780102eSjmmv {
78*d780102eSjmmv try {
79*d780102eSjmmv tools::env::set(name, val);
80*d780102eSjmmv } catch (const tools::system_error&) {
81*d780102eSjmmv ATF_FAIL(std::string("set_env_var(") + name + ", " + val +
82*d780102eSjmmv ") failed");
83*d780102eSjmmv }
84*d780102eSjmmv }
85*d780102eSjmmv
86*d780102eSjmmv static
87*d780102eSjmmv void
unset_env_var(const char * name)88*d780102eSjmmv unset_env_var(const char* name)
89*d780102eSjmmv {
90*d780102eSjmmv try {
91*d780102eSjmmv tools::env::unset(name);
92*d780102eSjmmv } catch (const tools::system_error&) {
93*d780102eSjmmv ATF_FAIL(std::string("unset_env_var(") + name + ") failed");
94*d780102eSjmmv }
95*d780102eSjmmv }
96*d780102eSjmmv
97*d780102eSjmmv static
98*d780102eSjmmv size_t
all_vars_count(void)99*d780102eSjmmv all_vars_count(void)
100*d780102eSjmmv {
101*d780102eSjmmv size_t count = 0;
102*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++)
103*d780102eSjmmv count++;
104*d780102eSjmmv return count;
105*d780102eSjmmv }
106*d780102eSjmmv
107*d780102eSjmmv static
108*d780102eSjmmv void
unset_all(void)109*d780102eSjmmv unset_all(void)
110*d780102eSjmmv {
111*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++)
112*d780102eSjmmv unset_env_var(v->uc);
113*d780102eSjmmv }
114*d780102eSjmmv
115*d780102eSjmmv static
116*d780102eSjmmv void
compare_one(const char * var,const char * expvalue)117*d780102eSjmmv compare_one(const char* var, const char* expvalue)
118*d780102eSjmmv {
119*d780102eSjmmv std::cout << "Checking that " << var << " is set to " << expvalue << "\n";
120*d780102eSjmmv
121*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) {
122*d780102eSjmmv if (std::strcmp(v->lc, var) == 0)
123*d780102eSjmmv ATF_REQUIRE_EQ(tools::config::get(v->lc), test_value);
124*d780102eSjmmv else
125*d780102eSjmmv ATF_REQUIRE(tools::config::get(v->lc) != test_value);
126*d780102eSjmmv }
127*d780102eSjmmv }
128*d780102eSjmmv
129*d780102eSjmmv // ------------------------------------------------------------------------
130*d780102eSjmmv // Test cases for the free functions.
131*d780102eSjmmv // ------------------------------------------------------------------------
132*d780102eSjmmv
133*d780102eSjmmv ATF_TEST_CASE(get);
ATF_TEST_CASE_HEAD(get)134*d780102eSjmmv ATF_TEST_CASE_HEAD(get)
135*d780102eSjmmv {
136*d780102eSjmmv set_md_var("descr", "Tests the config::get function");
137*d780102eSjmmv }
ATF_TEST_CASE_BODY(get)138*d780102eSjmmv ATF_TEST_CASE_BODY(get)
139*d780102eSjmmv {
140*d780102eSjmmv // Unset all known environment variables and make sure the built-in
141*d780102eSjmmv // values do not match the bogus value we will use for testing.
142*d780102eSjmmv unset_all();
143*d780102eSjmmv tools::config::__reinit();
144*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++)
145*d780102eSjmmv ATF_REQUIRE(tools::config::get(v->lc) != test_value);
146*d780102eSjmmv
147*d780102eSjmmv // Test the behavior of empty values.
148*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) {
149*d780102eSjmmv unset_all();
150*d780102eSjmmv if (!tools::config::get(v->lc).empty()) {
151*d780102eSjmmv set_env_var(v->uc, "");
152*d780102eSjmmv tools::config::__reinit();
153*d780102eSjmmv if (v->can_be_empty)
154*d780102eSjmmv ATF_REQUIRE(tools::config::get(v->lc).empty());
155*d780102eSjmmv else
156*d780102eSjmmv ATF_REQUIRE(!tools::config::get(v->lc).empty());
157*d780102eSjmmv }
158*d780102eSjmmv }
159*d780102eSjmmv
160*d780102eSjmmv // Check if the ATF_ARCH variable is recognized.
161*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++) {
162*d780102eSjmmv unset_all();
163*d780102eSjmmv set_env_var(v->uc, test_value);
164*d780102eSjmmv tools::config::__reinit();
165*d780102eSjmmv compare_one(v->lc, test_value);
166*d780102eSjmmv }
167*d780102eSjmmv }
168*d780102eSjmmv
169*d780102eSjmmv ATF_TEST_CASE(get_all);
ATF_TEST_CASE_HEAD(get_all)170*d780102eSjmmv ATF_TEST_CASE_HEAD(get_all)
171*d780102eSjmmv {
172*d780102eSjmmv set_md_var("descr", "Tests the config::get_all function");
173*d780102eSjmmv }
ATF_TEST_CASE_BODY(get_all)174*d780102eSjmmv ATF_TEST_CASE_BODY(get_all)
175*d780102eSjmmv {
176*d780102eSjmmv tools::config::__reinit();
177*d780102eSjmmv
178*d780102eSjmmv // Check that the valid variables, and only those, are returned.
179*d780102eSjmmv std::map< std::string, std::string > vars = tools::config::get_all();
180*d780102eSjmmv ATF_REQUIRE_EQ(vars.size(), all_vars_count());
181*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++)
182*d780102eSjmmv ATF_REQUIRE(vars.find(v->lc) != vars.end());
183*d780102eSjmmv }
184*d780102eSjmmv
185*d780102eSjmmv ATF_TEST_CASE(has);
ATF_TEST_CASE_HEAD(has)186*d780102eSjmmv ATF_TEST_CASE_HEAD(has)
187*d780102eSjmmv {
188*d780102eSjmmv set_md_var("descr", "Tests the config::has function");
189*d780102eSjmmv }
ATF_TEST_CASE_BODY(has)190*d780102eSjmmv ATF_TEST_CASE_BODY(has)
191*d780102eSjmmv {
192*d780102eSjmmv tools::config::__reinit();
193*d780102eSjmmv
194*d780102eSjmmv // Check for all the variables that must exist.
195*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++)
196*d780102eSjmmv ATF_REQUIRE(tools::config::has(v->lc));
197*d780102eSjmmv
198*d780102eSjmmv // Same as above, but using uppercase (which is incorrect).
199*d780102eSjmmv for (const struct varnames* v = all_vars; v->lc != NULL; v++)
200*d780102eSjmmv ATF_REQUIRE(!tools::config::has(v->uc));
201*d780102eSjmmv
202*d780102eSjmmv // Check for some other variables that cannot exist.
203*d780102eSjmmv ATF_REQUIRE(!tools::config::has("foo"));
204*d780102eSjmmv ATF_REQUIRE(!tools::config::has("BAR"));
205*d780102eSjmmv ATF_REQUIRE(!tools::config::has("atf_foo"));
206*d780102eSjmmv ATF_REQUIRE(!tools::config::has("ATF_BAR"));
207*d780102eSjmmv ATF_REQUIRE(!tools::config::has("atf_shel"));
208*d780102eSjmmv ATF_REQUIRE(!tools::config::has("atf_shells"));
209*d780102eSjmmv }
210*d780102eSjmmv
211*d780102eSjmmv // ------------------------------------------------------------------------
212*d780102eSjmmv // Main.
213*d780102eSjmmv // ------------------------------------------------------------------------
214*d780102eSjmmv
ATF_INIT_TEST_CASES(tcs)215*d780102eSjmmv ATF_INIT_TEST_CASES(tcs)
216*d780102eSjmmv {
217*d780102eSjmmv // Add the test cases for the free functions.
218*d780102eSjmmv ATF_ADD_TEST_CASE(tcs, has);
219*d780102eSjmmv ATF_ADD_TEST_CASE(tcs, get);
220*d780102eSjmmv ATF_ADD_TEST_CASE(tcs, get_all);
221*d780102eSjmmv }
222