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