xref: /minix3/external/bsd/bind/dist/unit/atf-src/atf-c++/config_test.cpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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