xref: /minix3/external/bsd/bind/dist/unit/atf-src/atf-run/requirements_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) 2010 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 "atf-c++/config.hpp"
31*00b67f09SDavid van Moolenbroek #include "atf-c++/detail/text.hpp"
32*00b67f09SDavid van Moolenbroek #include "atf-c++/macros.hpp"
33*00b67f09SDavid van Moolenbroek 
34*00b67f09SDavid van Moolenbroek #include "requirements.hpp"
35*00b67f09SDavid van Moolenbroek #include "user.hpp"
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek namespace impl = atf::atf_run;
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
40*00b67f09SDavid van Moolenbroek // Auxiliary functions.
41*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek namespace {
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek const atf::tests::vars_map no_config;
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek void
do_check(const std::string & expected,const atf::tests::vars_map & metadata,const atf::tests::vars_map & config=no_config)48*00b67f09SDavid van Moolenbroek do_check(const std::string& expected, const atf::tests::vars_map& metadata,
49*00b67f09SDavid van Moolenbroek          const atf::tests::vars_map& config = no_config)
50*00b67f09SDavid van Moolenbroek {
51*00b67f09SDavid van Moolenbroek     const std::string actual = impl::check_requirements(metadata, config);
52*00b67f09SDavid van Moolenbroek     if (!atf::text::match(actual, expected))
53*00b67f09SDavid van Moolenbroek         ATF_FAIL("Requirements failure reason \"" + actual + "\" does not "
54*00b67f09SDavid van Moolenbroek                  "match \"" + expected + "\"");
55*00b67f09SDavid van Moolenbroek }
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek } // anonymous namespace
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
60*00b67f09SDavid van Moolenbroek // Tests for the require.arch metadata property.
61*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_arch_one_ok);
ATF_TEST_CASE_HEAD(require_arch_one_ok)64*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_arch_one_ok) {}
ATF_TEST_CASE_BODY(require_arch_one_ok)65*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_arch_one_ok) {
66*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
67*00b67f09SDavid van Moolenbroek     metadata["require.arch"] = atf::config::get("atf_arch");
68*00b67f09SDavid van Moolenbroek     do_check("", metadata);
69*00b67f09SDavid van Moolenbroek }
70*00b67f09SDavid van Moolenbroek 
71*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_arch_one_fail);
ATF_TEST_CASE_HEAD(require_arch_one_fail)72*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_arch_one_fail) {}
ATF_TEST_CASE_BODY(require_arch_one_fail)73*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_arch_one_fail) {
74*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
75*00b67f09SDavid van Moolenbroek     metadata["require.arch"] = "__fake_arch__";
76*00b67f09SDavid van Moolenbroek     do_check("Requires the '__fake_arch__' architecture", metadata);
77*00b67f09SDavid van Moolenbroek }
78*00b67f09SDavid van Moolenbroek 
79*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_arch_many_ok);
ATF_TEST_CASE_HEAD(require_arch_many_ok)80*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_arch_many_ok) {}
ATF_TEST_CASE_BODY(require_arch_many_ok)81*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_arch_many_ok) {
82*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
83*00b67f09SDavid van Moolenbroek     metadata["require.arch"] = "__foo__ " + atf::config::get("atf_arch") +
84*00b67f09SDavid van Moolenbroek         " __bar__";
85*00b67f09SDavid van Moolenbroek     do_check("", metadata);
86*00b67f09SDavid van Moolenbroek }
87*00b67f09SDavid van Moolenbroek 
88*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_arch_many_fail);
ATF_TEST_CASE_HEAD(require_arch_many_fail)89*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_arch_many_fail) {}
ATF_TEST_CASE_BODY(require_arch_many_fail)90*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_arch_many_fail) {
91*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
92*00b67f09SDavid van Moolenbroek     metadata["require.arch"] = "__foo__ __bar__ __baz__";
93*00b67f09SDavid van Moolenbroek     do_check("Requires one of the '__foo__ __bar__ __baz__' architectures",
94*00b67f09SDavid van Moolenbroek              metadata);
95*00b67f09SDavid van Moolenbroek }
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
98*00b67f09SDavid van Moolenbroek // Tests for the require.config metadata property.
99*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
100*00b67f09SDavid van Moolenbroek 
101*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_config_one_ok);
ATF_TEST_CASE_HEAD(require_config_one_ok)102*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_config_one_ok) {}
ATF_TEST_CASE_BODY(require_config_one_ok)103*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_config_one_ok) {
104*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata, config;
105*00b67f09SDavid van Moolenbroek     metadata["require.config"] = "var1";
106*00b67f09SDavid van Moolenbroek     config["var1"] = "some-value";
107*00b67f09SDavid van Moolenbroek     do_check("", metadata, config);
108*00b67f09SDavid van Moolenbroek }
109*00b67f09SDavid van Moolenbroek 
110*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_config_one_fail);
ATF_TEST_CASE_HEAD(require_config_one_fail)111*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_config_one_fail) {}
ATF_TEST_CASE_BODY(require_config_one_fail)112*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_config_one_fail) {
113*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata, config;
114*00b67f09SDavid van Moolenbroek     metadata["require.config"] = "var1";
115*00b67f09SDavid van Moolenbroek     do_check("Required configuration variable 'var1' not defined", metadata,
116*00b67f09SDavid van Moolenbroek              config);
117*00b67f09SDavid van Moolenbroek }
118*00b67f09SDavid van Moolenbroek 
119*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_config_many_ok);
ATF_TEST_CASE_HEAD(require_config_many_ok)120*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_config_many_ok) {}
ATF_TEST_CASE_BODY(require_config_many_ok)121*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_config_many_ok) {
122*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata, config;
123*00b67f09SDavid van Moolenbroek     metadata["require.config"] = "var1 var2 var3";
124*00b67f09SDavid van Moolenbroek     config["var1"] = "first-value";
125*00b67f09SDavid van Moolenbroek     config["var2"] = "second-value";
126*00b67f09SDavid van Moolenbroek     config["var3"] = "third-value";
127*00b67f09SDavid van Moolenbroek     do_check("", metadata, config);
128*00b67f09SDavid van Moolenbroek }
129*00b67f09SDavid van Moolenbroek 
130*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_config_many_fail);
ATF_TEST_CASE_HEAD(require_config_many_fail)131*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_config_many_fail) {}
ATF_TEST_CASE_BODY(require_config_many_fail)132*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_config_many_fail) {
133*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata, config;
134*00b67f09SDavid van Moolenbroek     metadata["require.config"] = "var1 var2 var3";
135*00b67f09SDavid van Moolenbroek     config["var1"] = "first-value";
136*00b67f09SDavid van Moolenbroek     config["var3"] = "third-value";
137*00b67f09SDavid van Moolenbroek     do_check("Required configuration variable 'var2' not defined", metadata,
138*00b67f09SDavid van Moolenbroek              config);
139*00b67f09SDavid van Moolenbroek }
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
142*00b67f09SDavid van Moolenbroek // Tests for the require.files metadata property.
143*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_ok);
ATF_TEST_CASE_BODY(require_files_one_ok)146*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_files_one_ok) {
147*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
148*00b67f09SDavid van Moolenbroek     metadata["require.files"] = "/bin/ls";
149*00b67f09SDavid van Moolenbroek     do_check("", metadata);
150*00b67f09SDavid van Moolenbroek }
151*00b67f09SDavid van Moolenbroek 
152*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_missing);
ATF_TEST_CASE_BODY(require_files_one_missing)153*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_files_one_missing) {
154*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
155*00b67f09SDavid van Moolenbroek     metadata["require.files"] = "/non-existent/foo";
156*00b67f09SDavid van Moolenbroek     do_check("Required file '/non-existent/foo' not found", metadata);
157*00b67f09SDavid van Moolenbroek }
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_fail);
ATF_TEST_CASE_BODY(require_files_one_fail)160*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_files_one_fail) {
161*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
162*00b67f09SDavid van Moolenbroek     metadata["require.files"] = "/bin/cp this-is-relative";
163*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW_RE(std::runtime_error, "Relative.*(this-is-relative)",
164*00b67f09SDavid van Moolenbroek                          impl::check_requirements(metadata, no_config));
165*00b67f09SDavid van Moolenbroek }
166*00b67f09SDavid van Moolenbroek 
167*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_ok);
ATF_TEST_CASE_BODY(require_files_many_ok)168*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_files_many_ok) {
169*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
170*00b67f09SDavid van Moolenbroek     metadata["require.files"] = "/bin/ls /bin/cp";
171*00b67f09SDavid van Moolenbroek     do_check("", metadata);
172*00b67f09SDavid van Moolenbroek }
173*00b67f09SDavid van Moolenbroek 
174*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_missing);
ATF_TEST_CASE_BODY(require_files_many_missing)175*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_files_many_missing) {
176*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
177*00b67f09SDavid van Moolenbroek     metadata["require.files"] = "/bin/ls /non-existent/bar /bin/cp";
178*00b67f09SDavid van Moolenbroek     do_check("Required file '/non-existent/bar' not found", metadata);
179*00b67f09SDavid van Moolenbroek }
180*00b67f09SDavid van Moolenbroek 
181*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_fail);
ATF_TEST_CASE_BODY(require_files_many_fail)182*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_files_many_fail) {
183*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
184*00b67f09SDavid van Moolenbroek     metadata["require.files"] = "/bin/cp also-relative";
185*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW_RE(std::runtime_error, "Relative.*(also-relative)",
186*00b67f09SDavid van Moolenbroek                          impl::check_requirements(metadata, no_config));
187*00b67f09SDavid van Moolenbroek }
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
190*00b67f09SDavid van Moolenbroek // Tests for the require.machine metadata property.
191*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_machine_one_ok);
ATF_TEST_CASE_HEAD(require_machine_one_ok)194*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_machine_one_ok) {}
ATF_TEST_CASE_BODY(require_machine_one_ok)195*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_machine_one_ok) {
196*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
197*00b67f09SDavid van Moolenbroek     metadata["require.machine"] = atf::config::get("atf_machine");
198*00b67f09SDavid van Moolenbroek     do_check("", metadata);
199*00b67f09SDavid van Moolenbroek }
200*00b67f09SDavid van Moolenbroek 
201*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_machine_one_fail);
ATF_TEST_CASE_HEAD(require_machine_one_fail)202*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_machine_one_fail) {}
ATF_TEST_CASE_BODY(require_machine_one_fail)203*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_machine_one_fail) {
204*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
205*00b67f09SDavid van Moolenbroek     metadata["require.machine"] = "__fake_machine__";
206*00b67f09SDavid van Moolenbroek     do_check("Requires the '__fake_machine__' machine type", metadata);
207*00b67f09SDavid van Moolenbroek }
208*00b67f09SDavid van Moolenbroek 
209*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_machine_many_ok);
ATF_TEST_CASE_HEAD(require_machine_many_ok)210*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_machine_many_ok) {}
ATF_TEST_CASE_BODY(require_machine_many_ok)211*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_machine_many_ok) {
212*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
213*00b67f09SDavid van Moolenbroek     metadata["require.machine"] = "__foo__ " + atf::config::get("atf_machine") +
214*00b67f09SDavid van Moolenbroek         " __bar__";
215*00b67f09SDavid van Moolenbroek     do_check("", metadata);
216*00b67f09SDavid van Moolenbroek }
217*00b67f09SDavid van Moolenbroek 
218*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_machine_many_fail);
ATF_TEST_CASE_HEAD(require_machine_many_fail)219*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_machine_many_fail) {}
ATF_TEST_CASE_BODY(require_machine_many_fail)220*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_machine_many_fail) {
221*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
222*00b67f09SDavid van Moolenbroek     metadata["require.machine"] = "__foo__ __bar__ __baz__";
223*00b67f09SDavid van Moolenbroek     do_check("Requires one of the '__foo__ __bar__ __baz__' machine types",
224*00b67f09SDavid van Moolenbroek              metadata);
225*00b67f09SDavid van Moolenbroek }
226*00b67f09SDavid van Moolenbroek 
227*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
228*00b67f09SDavid van Moolenbroek // Tests for the require.memory metadata property.
229*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
230*00b67f09SDavid van Moolenbroek 
231*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_memory_ok);
ATF_TEST_CASE_BODY(require_memory_ok)232*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_memory_ok) {
233*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
234*00b67f09SDavid van Moolenbroek     metadata["require.memory"] = "1m";
235*00b67f09SDavid van Moolenbroek     do_check("", metadata);
236*00b67f09SDavid van Moolenbroek }
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_memory_not_enough);
ATF_TEST_CASE_BODY(require_memory_not_enough)239*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_memory_not_enough) {
240*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
241*00b67f09SDavid van Moolenbroek     metadata["require.memory"] = "128t";
242*00b67f09SDavid van Moolenbroek #if defined(__APPLE__) || defined(__NetBSD__)
243*00b67f09SDavid van Moolenbroek     do_check("Not enough memory; needed 140737488355328, available [0-9]*",
244*00b67f09SDavid van Moolenbroek              metadata);
245*00b67f09SDavid van Moolenbroek #else
246*00b67f09SDavid van Moolenbroek     skip("Don't know how to check for the amount of physical memory");
247*00b67f09SDavid van Moolenbroek #endif
248*00b67f09SDavid van Moolenbroek }
249*00b67f09SDavid van Moolenbroek 
250*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_WITHOUT_HEAD(require_memory_fail);
ATF_TEST_CASE_BODY(require_memory_fail)251*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_memory_fail) {
252*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
253*00b67f09SDavid van Moolenbroek     metadata["require.memory"] = "foo";
254*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
255*00b67f09SDavid van Moolenbroek                       impl::check_requirements(metadata, no_config));
256*00b67f09SDavid van Moolenbroek }
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
259*00b67f09SDavid van Moolenbroek // Tests for the require.progs metadata property.
260*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_progs_one_ok);
ATF_TEST_CASE_HEAD(require_progs_one_ok)263*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_progs_one_ok) {}
ATF_TEST_CASE_BODY(require_progs_one_ok)264*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_progs_one_ok) {
265*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
266*00b67f09SDavid van Moolenbroek     metadata["require.progs"] = "cp";
267*00b67f09SDavid van Moolenbroek     do_check("", metadata);
268*00b67f09SDavid van Moolenbroek }
269*00b67f09SDavid van Moolenbroek 
270*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_progs_one_missing);
ATF_TEST_CASE_HEAD(require_progs_one_missing)271*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_progs_one_missing) {}
ATF_TEST_CASE_BODY(require_progs_one_missing)272*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_progs_one_missing) {
273*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
274*00b67f09SDavid van Moolenbroek     metadata["require.progs"] = "cp __non-existent__";
275*00b67f09SDavid van Moolenbroek     do_check("Required program '__non-existent__' not found in the PATH",
276*00b67f09SDavid van Moolenbroek              metadata);
277*00b67f09SDavid van Moolenbroek }
278*00b67f09SDavid van Moolenbroek 
279*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_progs_one_fail);
ATF_TEST_CASE_HEAD(require_progs_one_fail)280*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_progs_one_fail) {}
ATF_TEST_CASE_BODY(require_progs_one_fail)281*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_progs_one_fail) {
282*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
283*00b67f09SDavid van Moolenbroek     metadata["require.progs"] = "bin/cp";
284*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
285*00b67f09SDavid van Moolenbroek                     impl::check_requirements(metadata, no_config));
286*00b67f09SDavid van Moolenbroek }
287*00b67f09SDavid van Moolenbroek 
288*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_progs_many_ok);
ATF_TEST_CASE_HEAD(require_progs_many_ok)289*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_progs_many_ok) {}
ATF_TEST_CASE_BODY(require_progs_many_ok)290*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_progs_many_ok) {
291*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
292*00b67f09SDavid van Moolenbroek     metadata["require.progs"] = "cp ls mv";
293*00b67f09SDavid van Moolenbroek     do_check("", metadata);
294*00b67f09SDavid van Moolenbroek }
295*00b67f09SDavid van Moolenbroek 
296*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_progs_many_missing);
ATF_TEST_CASE_HEAD(require_progs_many_missing)297*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_progs_many_missing) {}
ATF_TEST_CASE_BODY(require_progs_many_missing)298*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_progs_many_missing) {
299*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
300*00b67f09SDavid van Moolenbroek     metadata["require.progs"] = "mv ls __foo__ cp";
301*00b67f09SDavid van Moolenbroek     do_check("Required program '__foo__' not found in the PATH", metadata);
302*00b67f09SDavid van Moolenbroek }
303*00b67f09SDavid van Moolenbroek 
304*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_progs_many_fail);
ATF_TEST_CASE_HEAD(require_progs_many_fail)305*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_progs_many_fail) {}
ATF_TEST_CASE_BODY(require_progs_many_fail)306*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_progs_many_fail) {
307*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
308*00b67f09SDavid van Moolenbroek     metadata["require.progs"] = "ls cp ../bin/cp";
309*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
310*00b67f09SDavid van Moolenbroek                     impl::check_requirements(metadata, no_config));
311*00b67f09SDavid van Moolenbroek }
312*00b67f09SDavid van Moolenbroek 
313*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
314*00b67f09SDavid van Moolenbroek // Tests for the require.user metadata property.
315*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
316*00b67f09SDavid van Moolenbroek 
317*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_user_root);
ATF_TEST_CASE_HEAD(require_user_root)318*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_user_root) {}
ATF_TEST_CASE_BODY(require_user_root)319*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_user_root) {
320*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
321*00b67f09SDavid van Moolenbroek     metadata["require.user"] = "root";
322*00b67f09SDavid van Moolenbroek     if (atf::atf_run::is_root())
323*00b67f09SDavid van Moolenbroek         do_check("", metadata);
324*00b67f09SDavid van Moolenbroek     else
325*00b67f09SDavid van Moolenbroek         do_check("Requires root privileges", metadata);
326*00b67f09SDavid van Moolenbroek }
327*00b67f09SDavid van Moolenbroek 
328*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_user_unprivileged);
ATF_TEST_CASE_HEAD(require_user_unprivileged)329*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_user_unprivileged) {}
ATF_TEST_CASE_BODY(require_user_unprivileged)330*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_user_unprivileged) {
331*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
332*00b67f09SDavid van Moolenbroek     metadata["require.user"] = "unprivileged";
333*00b67f09SDavid van Moolenbroek     if (atf::atf_run::is_root())
334*00b67f09SDavid van Moolenbroek         do_check("Requires an unprivileged user and the 'unprivileged-user' "
335*00b67f09SDavid van Moolenbroek                  "configuration variable is not set", metadata);
336*00b67f09SDavid van Moolenbroek     else
337*00b67f09SDavid van Moolenbroek         do_check("", metadata);
338*00b67f09SDavid van Moolenbroek }
339*00b67f09SDavid van Moolenbroek 
340*00b67f09SDavid van Moolenbroek ATF_TEST_CASE(require_user_fail);
ATF_TEST_CASE_HEAD(require_user_fail)341*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_HEAD(require_user_fail) {}
ATF_TEST_CASE_BODY(require_user_fail)342*00b67f09SDavid van Moolenbroek ATF_TEST_CASE_BODY(require_user_fail) {
343*00b67f09SDavid van Moolenbroek     atf::tests::vars_map metadata;
344*00b67f09SDavid van Moolenbroek     metadata["require.user"] = "nobody";
345*00b67f09SDavid van Moolenbroek     ATF_REQUIRE_THROW(std::runtime_error,
346*00b67f09SDavid van Moolenbroek                     impl::check_requirements(metadata, no_config));
347*00b67f09SDavid van Moolenbroek }
348*00b67f09SDavid van Moolenbroek 
349*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
350*00b67f09SDavid van Moolenbroek // Main.
351*00b67f09SDavid van Moolenbroek // -------------------------------------------------------------------------
352*00b67f09SDavid van Moolenbroek 
ATF_INIT_TEST_CASES(tcs)353*00b67f09SDavid van Moolenbroek ATF_INIT_TEST_CASES(tcs)
354*00b67f09SDavid van Moolenbroek {
355*00b67f09SDavid van Moolenbroek     // Add test cases for require.arch.
356*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_arch_one_ok);
357*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_arch_one_fail);
358*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_arch_many_ok);
359*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_arch_many_fail);
360*00b67f09SDavid van Moolenbroek 
361*00b67f09SDavid van Moolenbroek     // Add test cases for require.config.
362*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_config_one_ok);
363*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_config_one_fail);
364*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_config_many_ok);
365*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_config_many_fail);
366*00b67f09SDavid van Moolenbroek 
367*00b67f09SDavid van Moolenbroek     // Add test cases for require.files.
368*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_files_one_ok);
369*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_files_one_missing);
370*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_files_one_fail);
371*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_files_many_ok);
372*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_files_many_missing);
373*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_files_many_fail);
374*00b67f09SDavid van Moolenbroek 
375*00b67f09SDavid van Moolenbroek     // Add test cases for require.machine.
376*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_machine_one_ok);
377*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_machine_one_fail);
378*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_machine_many_ok);
379*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_machine_many_fail);
380*00b67f09SDavid van Moolenbroek 
381*00b67f09SDavid van Moolenbroek     // Add test cases for require.memory.
382*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_memory_ok);
383*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_memory_not_enough);
384*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_memory_fail);
385*00b67f09SDavid van Moolenbroek 
386*00b67f09SDavid van Moolenbroek     // Add test cases for require.progs.
387*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_progs_one_ok);
388*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_progs_one_missing);
389*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_progs_one_fail);
390*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_progs_many_ok);
391*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_progs_many_missing);
392*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_progs_many_fail);
393*00b67f09SDavid van Moolenbroek 
394*00b67f09SDavid van Moolenbroek     // Add test cases for require.user.
395*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_user_root);
396*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_user_unprivileged);
397*00b67f09SDavid van Moolenbroek     ATF_ADD_TEST_CASE(tcs, require_user_fail);
398*00b67f09SDavid van Moolenbroek }
399