xref: /netbsd-src/external/bsd/kyua-cli/dist/cli/config_test.cpp (revision 6b3a42af15b5e090c339512c790dd68f3d11a9d8)
1*6b3a42afSjmmv // Copyright 2011 Google Inc.
2*6b3a42afSjmmv // All rights reserved.
3*6b3a42afSjmmv //
4*6b3a42afSjmmv // Redistribution and use in source and binary forms, with or without
5*6b3a42afSjmmv // modification, are permitted provided that the following conditions are
6*6b3a42afSjmmv // met:
7*6b3a42afSjmmv //
8*6b3a42afSjmmv // * Redistributions of source code must retain the above copyright
9*6b3a42afSjmmv //   notice, this list of conditions and the following disclaimer.
10*6b3a42afSjmmv // * Redistributions in binary form must reproduce the above copyright
11*6b3a42afSjmmv //   notice, this list of conditions and the following disclaimer in the
12*6b3a42afSjmmv //   documentation and/or other materials provided with the distribution.
13*6b3a42afSjmmv // * Neither the name of Google Inc. nor the names of its contributors
14*6b3a42afSjmmv //   may be used to endorse or promote products derived from this software
15*6b3a42afSjmmv //   without specific prior written permission.
16*6b3a42afSjmmv //
17*6b3a42afSjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*6b3a42afSjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*6b3a42afSjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*6b3a42afSjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*6b3a42afSjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*6b3a42afSjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*6b3a42afSjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*6b3a42afSjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*6b3a42afSjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*6b3a42afSjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*6b3a42afSjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*6b3a42afSjmmv 
29*6b3a42afSjmmv #include "cli/config.hpp"
30*6b3a42afSjmmv 
31*6b3a42afSjmmv #include <atf-c++.hpp>
32*6b3a42afSjmmv 
33*6b3a42afSjmmv #include "engine/config.hpp"
34*6b3a42afSjmmv #include "engine/exceptions.hpp"
35*6b3a42afSjmmv #include "utils/env.hpp"
36*6b3a42afSjmmv #include "utils/format/macros.hpp"
37*6b3a42afSjmmv #include "utils/fs/operations.hpp"
38*6b3a42afSjmmv #include "utils/fs/path.hpp"
39*6b3a42afSjmmv 
40*6b3a42afSjmmv namespace cmdline = utils::cmdline;
41*6b3a42afSjmmv namespace config = utils::config;
42*6b3a42afSjmmv namespace fs = utils::fs;
43*6b3a42afSjmmv 
44*6b3a42afSjmmv 
45*6b3a42afSjmmv namespace {
46*6b3a42afSjmmv 
47*6b3a42afSjmmv 
48*6b3a42afSjmmv /// Creates a configuration file for testing purposes.
49*6b3a42afSjmmv ///
50*6b3a42afSjmmv /// To ensure that the loaded file is the one created by this function, use
51*6b3a42afSjmmv /// validate_mock_config().
52*6b3a42afSjmmv ///
53*6b3a42afSjmmv /// \param name The name of the configuration file to create.
54*6b3a42afSjmmv /// \param cookie The magic value to set in the configuration file, or NULL if a
55*6b3a42afSjmmv ///     broken configuration file is desired.
56*6b3a42afSjmmv static void
create_mock_config(const char * name,const char * cookie)57*6b3a42afSjmmv create_mock_config(const char* name, const char* cookie)
58*6b3a42afSjmmv {
59*6b3a42afSjmmv     if (cookie != NULL) {
60*6b3a42afSjmmv         atf::utils::create_file(
61*6b3a42afSjmmv             name,
62*6b3a42afSjmmv             F("syntax(2)\n"
63*6b3a42afSjmmv               "test_suites.suite.magic_value = '%s'\n") % cookie);
64*6b3a42afSjmmv     } else {
65*6b3a42afSjmmv         atf::utils::create_file(name, "syntax(200)\n");
66*6b3a42afSjmmv     }
67*6b3a42afSjmmv }
68*6b3a42afSjmmv 
69*6b3a42afSjmmv 
70*6b3a42afSjmmv /// Creates an invalid system configuration.
71*6b3a42afSjmmv ///
72*6b3a42afSjmmv /// \param cookie The magic value to set in the configuration file, or NULL if a
73*6b3a42afSjmmv ///     broken configuration file is desired.
74*6b3a42afSjmmv static void
mock_system_config(const char * cookie)75*6b3a42afSjmmv mock_system_config(const char* cookie)
76*6b3a42afSjmmv {
77*6b3a42afSjmmv     fs::mkdir(fs::path("system-dir"), 0755);
78*6b3a42afSjmmv     utils::setenv("KYUA_CONFDIR", (fs::current_path() / "system-dir").str());
79*6b3a42afSjmmv     create_mock_config("system-dir/kyua.conf", cookie);
80*6b3a42afSjmmv }
81*6b3a42afSjmmv 
82*6b3a42afSjmmv 
83*6b3a42afSjmmv /// Creates an invalid user configuration.
84*6b3a42afSjmmv ///
85*6b3a42afSjmmv /// \param cookie The magic value to set in the configuration file, or NULL if a
86*6b3a42afSjmmv ///     broken configuration file is desired.
87*6b3a42afSjmmv static void
mock_user_config(const char * cookie)88*6b3a42afSjmmv mock_user_config(const char* cookie)
89*6b3a42afSjmmv {
90*6b3a42afSjmmv     fs::mkdir(fs::path("user-dir"), 0755);
91*6b3a42afSjmmv     fs::mkdir(fs::path("user-dir/.kyua"), 0755);
92*6b3a42afSjmmv     utils::setenv("HOME", (fs::current_path() / "user-dir").str());
93*6b3a42afSjmmv     create_mock_config("user-dir/.kyua/kyua.conf", cookie);
94*6b3a42afSjmmv }
95*6b3a42afSjmmv 
96*6b3a42afSjmmv 
97*6b3a42afSjmmv /// Ensures that a loaded configuration was created with create_mock_config().
98*6b3a42afSjmmv ///
99*6b3a42afSjmmv /// \param user_config The configuration to validate.
100*6b3a42afSjmmv /// \param cookie The magic value to expect in the configuration file.
101*6b3a42afSjmmv static void
validate_mock_config(const config::tree & user_config,const char * cookie)102*6b3a42afSjmmv validate_mock_config(const config::tree& user_config, const char* cookie)
103*6b3a42afSjmmv {
104*6b3a42afSjmmv     const config::properties_map& properties = user_config.all_properties(
105*6b3a42afSjmmv         "test_suites.suite", true);
106*6b3a42afSjmmv     const config::properties_map::const_iterator iter =
107*6b3a42afSjmmv         properties.find("magic_value");
108*6b3a42afSjmmv     ATF_REQUIRE(iter != properties.end());
109*6b3a42afSjmmv     ATF_REQUIRE_EQ(cookie, (*iter).second);
110*6b3a42afSjmmv }
111*6b3a42afSjmmv 
112*6b3a42afSjmmv 
113*6b3a42afSjmmv /// Ensures that two configuration trees are equal.
114*6b3a42afSjmmv ///
115*6b3a42afSjmmv /// \param exp_tree The expected configuration tree.
116*6b3a42afSjmmv /// \param actual_tree The configuration tree being validated against exp_tree.
117*6b3a42afSjmmv static void
require_eq(const config::tree & exp_tree,const config::tree & actual_tree)118*6b3a42afSjmmv require_eq(const config::tree& exp_tree, const config::tree& actual_tree)
119*6b3a42afSjmmv {
120*6b3a42afSjmmv     ATF_REQUIRE(exp_tree.all_properties() == actual_tree.all_properties());
121*6b3a42afSjmmv }
122*6b3a42afSjmmv 
123*6b3a42afSjmmv 
124*6b3a42afSjmmv }  // anonymous namespace
125*6b3a42afSjmmv 
126*6b3a42afSjmmv 
127*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__none);
ATF_TEST_CASE_BODY(load_config__none)128*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__none)
129*6b3a42afSjmmv {
130*6b3a42afSjmmv     utils::setenv("KYUA_CONFDIR", "/the/system/does/not/exist");
131*6b3a42afSjmmv     utils::setenv("HOME", "/the/user/does/not/exist");
132*6b3a42afSjmmv 
133*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
134*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
135*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
136*6b3a42afSjmmv 
137*6b3a42afSjmmv     require_eq(engine::default_config(),
138*6b3a42afSjmmv                cli::load_config(mock_cmdline, true));
139*6b3a42afSjmmv }
140*6b3a42afSjmmv 
141*6b3a42afSjmmv 
142*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__explicit__ok);
ATF_TEST_CASE_BODY(load_config__explicit__ok)143*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__explicit__ok)
144*6b3a42afSjmmv {
145*6b3a42afSjmmv     mock_system_config(NULL);
146*6b3a42afSjmmv     mock_user_config(NULL);
147*6b3a42afSjmmv 
148*6b3a42afSjmmv     create_mock_config("test-file", "hello");
149*6b3a42afSjmmv 
150*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
151*6b3a42afSjmmv     options["config"].push_back("test-file");
152*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
153*6b3a42afSjmmv 
154*6b3a42afSjmmv     const config::tree user_config = cli::load_config(mock_cmdline, true);
155*6b3a42afSjmmv     validate_mock_config(user_config, "hello");
156*6b3a42afSjmmv }
157*6b3a42afSjmmv 
158*6b3a42afSjmmv 
159*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__explicit__disable);
ATF_TEST_CASE_BODY(load_config__explicit__disable)160*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__explicit__disable)
161*6b3a42afSjmmv {
162*6b3a42afSjmmv     mock_system_config(NULL);
163*6b3a42afSjmmv     mock_user_config(NULL);
164*6b3a42afSjmmv 
165*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
166*6b3a42afSjmmv     options["config"].push_back("none");
167*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
168*6b3a42afSjmmv 
169*6b3a42afSjmmv     require_eq(engine::default_config(),
170*6b3a42afSjmmv                cli::load_config(mock_cmdline, true));
171*6b3a42afSjmmv }
172*6b3a42afSjmmv 
173*6b3a42afSjmmv 
174*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__explicit__fail);
ATF_TEST_CASE_BODY(load_config__explicit__fail)175*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__explicit__fail)
176*6b3a42afSjmmv {
177*6b3a42afSjmmv     mock_system_config("ok1");
178*6b3a42afSjmmv     mock_user_config("ok2");
179*6b3a42afSjmmv 
180*6b3a42afSjmmv     create_mock_config("test-file", NULL);
181*6b3a42afSjmmv 
182*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
183*6b3a42afSjmmv     options["config"].push_back("test-file");
184*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
185*6b3a42afSjmmv 
186*6b3a42afSjmmv     ATF_REQUIRE_THROW_RE(engine::error, "200",
187*6b3a42afSjmmv                          cli::load_config(mock_cmdline, true));
188*6b3a42afSjmmv 
189*6b3a42afSjmmv     const config::tree config = cli::load_config(mock_cmdline, false);
190*6b3a42afSjmmv     require_eq(engine::default_config(), config);
191*6b3a42afSjmmv }
192*6b3a42afSjmmv 
193*6b3a42afSjmmv 
194*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__user__ok);
ATF_TEST_CASE_BODY(load_config__user__ok)195*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__user__ok)
196*6b3a42afSjmmv {
197*6b3a42afSjmmv     mock_system_config(NULL);
198*6b3a42afSjmmv     mock_user_config("I am the user config");
199*6b3a42afSjmmv 
200*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
201*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
202*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
203*6b3a42afSjmmv 
204*6b3a42afSjmmv     const config::tree user_config = cli::load_config(mock_cmdline, true);
205*6b3a42afSjmmv     validate_mock_config(user_config, "I am the user config");
206*6b3a42afSjmmv }
207*6b3a42afSjmmv 
208*6b3a42afSjmmv 
209*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__user__fail);
ATF_TEST_CASE_BODY(load_config__user__fail)210*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__user__fail)
211*6b3a42afSjmmv {
212*6b3a42afSjmmv     mock_system_config("valid");
213*6b3a42afSjmmv     mock_user_config(NULL);
214*6b3a42afSjmmv 
215*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
216*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
217*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
218*6b3a42afSjmmv 
219*6b3a42afSjmmv     ATF_REQUIRE_THROW_RE(engine::error, "200",
220*6b3a42afSjmmv                          cli::load_config(mock_cmdline, true));
221*6b3a42afSjmmv 
222*6b3a42afSjmmv     const config::tree config = cli::load_config(mock_cmdline, false);
223*6b3a42afSjmmv     require_eq(engine::default_config(), config);
224*6b3a42afSjmmv }
225*6b3a42afSjmmv 
226*6b3a42afSjmmv 
227*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__user__bad_home);
ATF_TEST_CASE_BODY(load_config__user__bad_home)228*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__user__bad_home)
229*6b3a42afSjmmv {
230*6b3a42afSjmmv     mock_system_config("Fallback system config");
231*6b3a42afSjmmv     utils::setenv("HOME", "");
232*6b3a42afSjmmv 
233*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
234*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
235*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
236*6b3a42afSjmmv 
237*6b3a42afSjmmv     const config::tree user_config = cli::load_config(mock_cmdline, true);
238*6b3a42afSjmmv     validate_mock_config(user_config, "Fallback system config");
239*6b3a42afSjmmv }
240*6b3a42afSjmmv 
241*6b3a42afSjmmv 
242*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__system__ok);
ATF_TEST_CASE_BODY(load_config__system__ok)243*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__system__ok)
244*6b3a42afSjmmv {
245*6b3a42afSjmmv     mock_system_config("I am the system config");
246*6b3a42afSjmmv     utils::setenv("HOME", "/the/user/does/not/exist");
247*6b3a42afSjmmv 
248*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
249*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
250*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
251*6b3a42afSjmmv 
252*6b3a42afSjmmv     const config::tree user_config = cli::load_config(mock_cmdline, true);
253*6b3a42afSjmmv     validate_mock_config(user_config, "I am the system config");
254*6b3a42afSjmmv }
255*6b3a42afSjmmv 
256*6b3a42afSjmmv 
257*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__system__fail);
ATF_TEST_CASE_BODY(load_config__system__fail)258*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__system__fail)
259*6b3a42afSjmmv {
260*6b3a42afSjmmv     mock_system_config(NULL);
261*6b3a42afSjmmv     utils::setenv("HOME", "/the/user/does/not/exist");
262*6b3a42afSjmmv 
263*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
264*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
265*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
266*6b3a42afSjmmv 
267*6b3a42afSjmmv     ATF_REQUIRE_THROW_RE(engine::error, "200",
268*6b3a42afSjmmv                          cli::load_config(mock_cmdline, true));
269*6b3a42afSjmmv 
270*6b3a42afSjmmv     const config::tree config = cli::load_config(mock_cmdline, false);
271*6b3a42afSjmmv     require_eq(engine::default_config(), config);
272*6b3a42afSjmmv }
273*6b3a42afSjmmv 
274*6b3a42afSjmmv 
275*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__overrides__no);
ATF_TEST_CASE_BODY(load_config__overrides__no)276*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__overrides__no)
277*6b3a42afSjmmv {
278*6b3a42afSjmmv     utils::setenv("KYUA_CONFDIR", fs::current_path().str());
279*6b3a42afSjmmv 
280*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
281*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
282*6b3a42afSjmmv     options["variable"].push_back("architecture=1");
283*6b3a42afSjmmv     options["variable"].push_back("platform=2");
284*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
285*6b3a42afSjmmv 
286*6b3a42afSjmmv     const config::tree user_config = cli::load_config(mock_cmdline, true);
287*6b3a42afSjmmv     ATF_REQUIRE_EQ("1",
288*6b3a42afSjmmv                    user_config.lookup< config::string_node >("architecture"));
289*6b3a42afSjmmv     ATF_REQUIRE_EQ("2",
290*6b3a42afSjmmv                    user_config.lookup< config::string_node >("platform"));
291*6b3a42afSjmmv }
292*6b3a42afSjmmv 
293*6b3a42afSjmmv 
294*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__overrides__yes);
ATF_TEST_CASE_BODY(load_config__overrides__yes)295*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__overrides__yes)
296*6b3a42afSjmmv {
297*6b3a42afSjmmv     atf::utils::create_file(
298*6b3a42afSjmmv         "config",
299*6b3a42afSjmmv         "syntax(2)\n"
300*6b3a42afSjmmv         "architecture = 'do not see me'\n"
301*6b3a42afSjmmv         "platform = 'see me'\n");
302*6b3a42afSjmmv 
303*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
304*6b3a42afSjmmv     options["config"].push_back("config");
305*6b3a42afSjmmv     options["variable"].push_back("architecture=overriden");
306*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
307*6b3a42afSjmmv 
308*6b3a42afSjmmv     const config::tree user_config = cli::load_config(mock_cmdline, true);
309*6b3a42afSjmmv     ATF_REQUIRE_EQ("overriden",
310*6b3a42afSjmmv                    user_config.lookup< config::string_node >("architecture"));
311*6b3a42afSjmmv     ATF_REQUIRE_EQ("see me",
312*6b3a42afSjmmv                    user_config.lookup< config::string_node >("platform"));
313*6b3a42afSjmmv }
314*6b3a42afSjmmv 
315*6b3a42afSjmmv 
316*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(load_config__overrides__fail);
ATF_TEST_CASE_BODY(load_config__overrides__fail)317*6b3a42afSjmmv ATF_TEST_CASE_BODY(load_config__overrides__fail)
318*6b3a42afSjmmv {
319*6b3a42afSjmmv     utils::setenv("KYUA_CONFDIR", fs::current_path().str());
320*6b3a42afSjmmv 
321*6b3a42afSjmmv     std::map< std::string, std::vector< std::string > > options;
322*6b3a42afSjmmv     options["config"].push_back(cli::config_option.default_value());
323*6b3a42afSjmmv     options["variable"].push_back(".a=d");
324*6b3a42afSjmmv     const cmdline::parsed_cmdline mock_cmdline(options, cmdline::args_vector());
325*6b3a42afSjmmv 
326*6b3a42afSjmmv     ATF_REQUIRE_THROW_RE(engine::error, "Empty component in key.*'\\.a'",
327*6b3a42afSjmmv                          cli::load_config(mock_cmdline, true));
328*6b3a42afSjmmv 
329*6b3a42afSjmmv     const config::tree config = cli::load_config(mock_cmdline, false);
330*6b3a42afSjmmv     require_eq(engine::default_config(), config);
331*6b3a42afSjmmv }
332*6b3a42afSjmmv 
333*6b3a42afSjmmv 
ATF_INIT_TEST_CASES(tcs)334*6b3a42afSjmmv ATF_INIT_TEST_CASES(tcs)
335*6b3a42afSjmmv {
336*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__none);
337*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__explicit__ok);
338*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__explicit__disable);
339*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__explicit__fail);
340*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__user__ok);
341*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__user__fail);
342*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__user__bad_home);
343*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__system__ok);
344*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__system__fail);
345*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__overrides__no);
346*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__overrides__yes);
347*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, load_config__overrides__fail);
348*6b3a42afSjmmv }
349