xref: /minix3/external/bsd/atf/dist/tools/requirements_test.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc //
2*0a6a1f1dSLionel Sambuc // Automated Testing Framework (atf)
3*0a6a1f1dSLionel Sambuc //
4*0a6a1f1dSLionel Sambuc // Copyright (c) 2010 The NetBSD Foundation, Inc.
5*0a6a1f1dSLionel Sambuc // All rights reserved.
6*0a6a1f1dSLionel Sambuc //
7*0a6a1f1dSLionel Sambuc // Redistribution and use in source and binary forms, with or without
8*0a6a1f1dSLionel Sambuc // modification, are permitted provided that the following conditions
9*0a6a1f1dSLionel Sambuc // are met:
10*0a6a1f1dSLionel Sambuc // 1. Redistributions of source code must retain the above copyright
11*0a6a1f1dSLionel Sambuc //    notice, this list of conditions and the following disclaimer.
12*0a6a1f1dSLionel Sambuc // 2. Redistributions in binary form must reproduce the above copyright
13*0a6a1f1dSLionel Sambuc //    notice, this list of conditions and the following disclaimer in the
14*0a6a1f1dSLionel Sambuc //    documentation and/or other materials provided with the distribution.
15*0a6a1f1dSLionel Sambuc //
16*0a6a1f1dSLionel Sambuc // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*0a6a1f1dSLionel Sambuc // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*0a6a1f1dSLionel Sambuc // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*0a6a1f1dSLionel Sambuc // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*0a6a1f1dSLionel Sambuc // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*0a6a1f1dSLionel Sambuc // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*0a6a1f1dSLionel Sambuc // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*0a6a1f1dSLionel Sambuc // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*0a6a1f1dSLionel Sambuc // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*0a6a1f1dSLionel Sambuc // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*0a6a1f1dSLionel Sambuc // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*0a6a1f1dSLionel Sambuc // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*0a6a1f1dSLionel Sambuc //
29*0a6a1f1dSLionel Sambuc 
30*0a6a1f1dSLionel Sambuc #include <atf-c++.hpp>
31*0a6a1f1dSLionel Sambuc 
32*0a6a1f1dSLionel Sambuc #include "config.hpp"
33*0a6a1f1dSLionel Sambuc #include "requirements.hpp"
34*0a6a1f1dSLionel Sambuc #include "text.hpp"
35*0a6a1f1dSLionel Sambuc #include "user.hpp"
36*0a6a1f1dSLionel Sambuc 
37*0a6a1f1dSLionel Sambuc namespace impl = tools;
38*0a6a1f1dSLionel Sambuc 
39*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
40*0a6a1f1dSLionel Sambuc // Auxiliary functions.
41*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
42*0a6a1f1dSLionel Sambuc 
43*0a6a1f1dSLionel Sambuc namespace {
44*0a6a1f1dSLionel Sambuc 
45*0a6a1f1dSLionel Sambuc typedef std::map< std::string, std::string > vars_map;
46*0a6a1f1dSLionel Sambuc 
47*0a6a1f1dSLionel Sambuc const vars_map no_config;
48*0a6a1f1dSLionel Sambuc 
49*0a6a1f1dSLionel Sambuc void
do_check(const std::string & expected,const vars_map & metadata,const vars_map & config=no_config)50*0a6a1f1dSLionel Sambuc do_check(const std::string& expected, const vars_map& metadata,
51*0a6a1f1dSLionel Sambuc          const vars_map& config = no_config)
52*0a6a1f1dSLionel Sambuc {
53*0a6a1f1dSLionel Sambuc     const std::string actual = impl::check_requirements(metadata, config);
54*0a6a1f1dSLionel Sambuc     if (!tools::text::match(actual, expected))
55*0a6a1f1dSLionel Sambuc         ATF_FAIL("Requirements failure reason \"" + actual + "\" does not "
56*0a6a1f1dSLionel Sambuc                  "match \"" + expected + "\"");
57*0a6a1f1dSLionel Sambuc }
58*0a6a1f1dSLionel Sambuc 
59*0a6a1f1dSLionel Sambuc } // anonymous namespace
60*0a6a1f1dSLionel Sambuc 
61*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
62*0a6a1f1dSLionel Sambuc // Tests for the require.arch metadata property.
63*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
64*0a6a1f1dSLionel Sambuc 
65*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_arch_one_ok);
ATF_TEST_CASE_HEAD(require_arch_one_ok)66*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_arch_one_ok) {}
ATF_TEST_CASE_BODY(require_arch_one_ok)67*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_arch_one_ok) {
68*0a6a1f1dSLionel Sambuc     vars_map metadata;
69*0a6a1f1dSLionel Sambuc     metadata["require.arch"] = tools::config::get("atf_arch");
70*0a6a1f1dSLionel Sambuc     do_check("", metadata);
71*0a6a1f1dSLionel Sambuc }
72*0a6a1f1dSLionel Sambuc 
73*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_arch_one_fail);
ATF_TEST_CASE_HEAD(require_arch_one_fail)74*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_arch_one_fail) {}
ATF_TEST_CASE_BODY(require_arch_one_fail)75*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_arch_one_fail) {
76*0a6a1f1dSLionel Sambuc     vars_map metadata;
77*0a6a1f1dSLionel Sambuc     metadata["require.arch"] = "__fake_arch__";
78*0a6a1f1dSLionel Sambuc     do_check("Requires the '__fake_arch__' architecture", metadata);
79*0a6a1f1dSLionel Sambuc }
80*0a6a1f1dSLionel Sambuc 
81*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_arch_many_ok);
ATF_TEST_CASE_HEAD(require_arch_many_ok)82*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_arch_many_ok) {}
ATF_TEST_CASE_BODY(require_arch_many_ok)83*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_arch_many_ok) {
84*0a6a1f1dSLionel Sambuc     vars_map metadata;
85*0a6a1f1dSLionel Sambuc     metadata["require.arch"] = "__foo__ " + tools::config::get("atf_arch") +
86*0a6a1f1dSLionel Sambuc         " __bar__";
87*0a6a1f1dSLionel Sambuc     do_check("", metadata);
88*0a6a1f1dSLionel Sambuc }
89*0a6a1f1dSLionel Sambuc 
90*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_arch_many_fail);
ATF_TEST_CASE_HEAD(require_arch_many_fail)91*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_arch_many_fail) {}
ATF_TEST_CASE_BODY(require_arch_many_fail)92*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_arch_many_fail) {
93*0a6a1f1dSLionel Sambuc     vars_map metadata;
94*0a6a1f1dSLionel Sambuc     metadata["require.arch"] = "__foo__ __bar__ __baz__";
95*0a6a1f1dSLionel Sambuc     do_check("Requires one of the '__foo__ __bar__ __baz__' architectures",
96*0a6a1f1dSLionel Sambuc              metadata);
97*0a6a1f1dSLionel Sambuc }
98*0a6a1f1dSLionel Sambuc 
99*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
100*0a6a1f1dSLionel Sambuc // Tests for the require.config metadata property.
101*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
102*0a6a1f1dSLionel Sambuc 
103*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_config_one_ok);
ATF_TEST_CASE_HEAD(require_config_one_ok)104*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_config_one_ok) {}
ATF_TEST_CASE_BODY(require_config_one_ok)105*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_config_one_ok) {
106*0a6a1f1dSLionel Sambuc     vars_map metadata, config;
107*0a6a1f1dSLionel Sambuc     metadata["require.config"] = "var1";
108*0a6a1f1dSLionel Sambuc     config["var1"] = "some-value";
109*0a6a1f1dSLionel Sambuc     do_check("", metadata, config);
110*0a6a1f1dSLionel Sambuc }
111*0a6a1f1dSLionel Sambuc 
112*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_config_one_fail);
ATF_TEST_CASE_HEAD(require_config_one_fail)113*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_config_one_fail) {}
ATF_TEST_CASE_BODY(require_config_one_fail)114*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_config_one_fail) {
115*0a6a1f1dSLionel Sambuc     vars_map metadata, config;
116*0a6a1f1dSLionel Sambuc     metadata["require.config"] = "var1";
117*0a6a1f1dSLionel Sambuc     do_check("Required configuration variable 'var1' not defined", metadata,
118*0a6a1f1dSLionel Sambuc              config);
119*0a6a1f1dSLionel Sambuc }
120*0a6a1f1dSLionel Sambuc 
121*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_config_many_ok);
ATF_TEST_CASE_HEAD(require_config_many_ok)122*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_config_many_ok) {}
ATF_TEST_CASE_BODY(require_config_many_ok)123*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_config_many_ok) {
124*0a6a1f1dSLionel Sambuc     vars_map metadata, config;
125*0a6a1f1dSLionel Sambuc     metadata["require.config"] = "var1 var2 var3";
126*0a6a1f1dSLionel Sambuc     config["var1"] = "first-value";
127*0a6a1f1dSLionel Sambuc     config["var2"] = "second-value";
128*0a6a1f1dSLionel Sambuc     config["var3"] = "third-value";
129*0a6a1f1dSLionel Sambuc     do_check("", metadata, config);
130*0a6a1f1dSLionel Sambuc }
131*0a6a1f1dSLionel Sambuc 
132*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_config_many_fail);
ATF_TEST_CASE_HEAD(require_config_many_fail)133*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_config_many_fail) {}
ATF_TEST_CASE_BODY(require_config_many_fail)134*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_config_many_fail) {
135*0a6a1f1dSLionel Sambuc     vars_map metadata, config;
136*0a6a1f1dSLionel Sambuc     metadata["require.config"] = "var1 var2 var3";
137*0a6a1f1dSLionel Sambuc     config["var1"] = "first-value";
138*0a6a1f1dSLionel Sambuc     config["var3"] = "third-value";
139*0a6a1f1dSLionel Sambuc     do_check("Required configuration variable 'var2' not defined", metadata,
140*0a6a1f1dSLionel Sambuc              config);
141*0a6a1f1dSLionel Sambuc }
142*0a6a1f1dSLionel Sambuc 
143*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
144*0a6a1f1dSLionel Sambuc // Tests for the require.files metadata property.
145*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
146*0a6a1f1dSLionel Sambuc 
147*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_ok);
ATF_TEST_CASE_BODY(require_files_one_ok)148*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_files_one_ok) {
149*0a6a1f1dSLionel Sambuc     vars_map metadata;
150*0a6a1f1dSLionel Sambuc     metadata["require.files"] = "/bin/ls";
151*0a6a1f1dSLionel Sambuc     do_check("", metadata);
152*0a6a1f1dSLionel Sambuc }
153*0a6a1f1dSLionel Sambuc 
154*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_missing);
ATF_TEST_CASE_BODY(require_files_one_missing)155*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_files_one_missing) {
156*0a6a1f1dSLionel Sambuc     vars_map metadata;
157*0a6a1f1dSLionel Sambuc     metadata["require.files"] = "/non-existent/foo";
158*0a6a1f1dSLionel Sambuc     do_check("Required file '/non-existent/foo' not found", metadata);
159*0a6a1f1dSLionel Sambuc }
160*0a6a1f1dSLionel Sambuc 
161*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_fail);
ATF_TEST_CASE_BODY(require_files_one_fail)162*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_files_one_fail) {
163*0a6a1f1dSLionel Sambuc     vars_map metadata;
164*0a6a1f1dSLionel Sambuc     metadata["require.files"] = "/bin/cp this-is-relative";
165*0a6a1f1dSLionel Sambuc     ATF_REQUIRE_THROW_RE(std::runtime_error, "Relative.*(this-is-relative)",
166*0a6a1f1dSLionel Sambuc                          impl::check_requirements(metadata, no_config));
167*0a6a1f1dSLionel Sambuc }
168*0a6a1f1dSLionel Sambuc 
169*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_ok);
ATF_TEST_CASE_BODY(require_files_many_ok)170*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_files_many_ok) {
171*0a6a1f1dSLionel Sambuc     vars_map metadata;
172*0a6a1f1dSLionel Sambuc     metadata["require.files"] = "/bin/ls /bin/cp";
173*0a6a1f1dSLionel Sambuc     do_check("", metadata);
174*0a6a1f1dSLionel Sambuc }
175*0a6a1f1dSLionel Sambuc 
176*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_missing);
ATF_TEST_CASE_BODY(require_files_many_missing)177*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_files_many_missing) {
178*0a6a1f1dSLionel Sambuc     vars_map metadata;
179*0a6a1f1dSLionel Sambuc     metadata["require.files"] = "/bin/ls /non-existent/bar /bin/cp";
180*0a6a1f1dSLionel Sambuc     do_check("Required file '/non-existent/bar' not found", metadata);
181*0a6a1f1dSLionel Sambuc }
182*0a6a1f1dSLionel Sambuc 
183*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_fail);
ATF_TEST_CASE_BODY(require_files_many_fail)184*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_files_many_fail) {
185*0a6a1f1dSLionel Sambuc     vars_map metadata;
186*0a6a1f1dSLionel Sambuc     metadata["require.files"] = "/bin/cp also-relative";
187*0a6a1f1dSLionel Sambuc     ATF_REQUIRE_THROW_RE(std::runtime_error, "Relative.*(also-relative)",
188*0a6a1f1dSLionel Sambuc                          impl::check_requirements(metadata, no_config));
189*0a6a1f1dSLionel Sambuc }
190*0a6a1f1dSLionel Sambuc 
191*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
192*0a6a1f1dSLionel Sambuc // Tests for the require.machine metadata property.
193*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
194*0a6a1f1dSLionel Sambuc 
195*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_machine_one_ok);
ATF_TEST_CASE_HEAD(require_machine_one_ok)196*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_machine_one_ok) {}
ATF_TEST_CASE_BODY(require_machine_one_ok)197*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_machine_one_ok) {
198*0a6a1f1dSLionel Sambuc     vars_map metadata;
199*0a6a1f1dSLionel Sambuc     metadata["require.machine"] = tools::config::get("atf_machine");
200*0a6a1f1dSLionel Sambuc     do_check("", metadata);
201*0a6a1f1dSLionel Sambuc }
202*0a6a1f1dSLionel Sambuc 
203*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_machine_one_fail);
ATF_TEST_CASE_HEAD(require_machine_one_fail)204*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_machine_one_fail) {}
ATF_TEST_CASE_BODY(require_machine_one_fail)205*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_machine_one_fail) {
206*0a6a1f1dSLionel Sambuc     vars_map metadata;
207*0a6a1f1dSLionel Sambuc     metadata["require.machine"] = "__fake_machine__";
208*0a6a1f1dSLionel Sambuc     do_check("Requires the '__fake_machine__' machine type", metadata);
209*0a6a1f1dSLionel Sambuc }
210*0a6a1f1dSLionel Sambuc 
211*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_machine_many_ok);
ATF_TEST_CASE_HEAD(require_machine_many_ok)212*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_machine_many_ok) {}
ATF_TEST_CASE_BODY(require_machine_many_ok)213*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_machine_many_ok) {
214*0a6a1f1dSLionel Sambuc     vars_map metadata;
215*0a6a1f1dSLionel Sambuc     metadata["require.machine"] = "__foo__ " +
216*0a6a1f1dSLionel Sambuc         tools::config::get("atf_machine") + " __bar__";
217*0a6a1f1dSLionel Sambuc     do_check("", metadata);
218*0a6a1f1dSLionel Sambuc }
219*0a6a1f1dSLionel Sambuc 
220*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_machine_many_fail);
ATF_TEST_CASE_HEAD(require_machine_many_fail)221*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_machine_many_fail) {}
ATF_TEST_CASE_BODY(require_machine_many_fail)222*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_machine_many_fail) {
223*0a6a1f1dSLionel Sambuc     vars_map metadata;
224*0a6a1f1dSLionel Sambuc     metadata["require.machine"] = "__foo__ __bar__ __baz__";
225*0a6a1f1dSLionel Sambuc     do_check("Requires one of the '__foo__ __bar__ __baz__' machine types",
226*0a6a1f1dSLionel Sambuc              metadata);
227*0a6a1f1dSLionel Sambuc }
228*0a6a1f1dSLionel Sambuc 
229*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
230*0a6a1f1dSLionel Sambuc // Tests for the require.memory metadata property.
231*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
232*0a6a1f1dSLionel Sambuc 
233*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_memory_ok);
ATF_TEST_CASE_BODY(require_memory_ok)234*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_memory_ok) {
235*0a6a1f1dSLionel Sambuc     vars_map metadata;
236*0a6a1f1dSLionel Sambuc     metadata["require.memory"] = "1m";
237*0a6a1f1dSLionel Sambuc     do_check("", metadata);
238*0a6a1f1dSLionel Sambuc }
239*0a6a1f1dSLionel Sambuc 
240*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_memory_not_enough);
ATF_TEST_CASE_BODY(require_memory_not_enough)241*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_memory_not_enough) {
242*0a6a1f1dSLionel Sambuc     vars_map metadata;
243*0a6a1f1dSLionel Sambuc     metadata["require.memory"] = "128t";
244*0a6a1f1dSLionel Sambuc     do_check("Not enough memory; needed 140737488355328, available [0-9]*",
245*0a6a1f1dSLionel Sambuc              metadata);
246*0a6a1f1dSLionel Sambuc }
247*0a6a1f1dSLionel Sambuc 
248*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_WITHOUT_HEAD(require_memory_fail);
ATF_TEST_CASE_BODY(require_memory_fail)249*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_memory_fail) {
250*0a6a1f1dSLionel Sambuc     vars_map metadata;
251*0a6a1f1dSLionel Sambuc     metadata["require.memory"] = "foo";
252*0a6a1f1dSLionel Sambuc     ATF_REQUIRE_THROW(std::runtime_error,
253*0a6a1f1dSLionel Sambuc                       impl::check_requirements(metadata, no_config));
254*0a6a1f1dSLionel Sambuc }
255*0a6a1f1dSLionel Sambuc 
256*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
257*0a6a1f1dSLionel Sambuc // Tests for the require.progs metadata property.
258*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
259*0a6a1f1dSLionel Sambuc 
260*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_progs_one_ok);
ATF_TEST_CASE_HEAD(require_progs_one_ok)261*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_progs_one_ok) {}
ATF_TEST_CASE_BODY(require_progs_one_ok)262*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_progs_one_ok) {
263*0a6a1f1dSLionel Sambuc     vars_map metadata;
264*0a6a1f1dSLionel Sambuc     metadata["require.progs"] = "cp";
265*0a6a1f1dSLionel Sambuc     do_check("", metadata);
266*0a6a1f1dSLionel Sambuc }
267*0a6a1f1dSLionel Sambuc 
268*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_progs_one_missing);
ATF_TEST_CASE_HEAD(require_progs_one_missing)269*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_progs_one_missing) {}
ATF_TEST_CASE_BODY(require_progs_one_missing)270*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_progs_one_missing) {
271*0a6a1f1dSLionel Sambuc     vars_map metadata;
272*0a6a1f1dSLionel Sambuc     metadata["require.progs"] = "cp __non-existent__";
273*0a6a1f1dSLionel Sambuc     do_check("Required program '__non-existent__' not found in the PATH",
274*0a6a1f1dSLionel Sambuc              metadata);
275*0a6a1f1dSLionel Sambuc }
276*0a6a1f1dSLionel Sambuc 
277*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_progs_one_fail);
ATF_TEST_CASE_HEAD(require_progs_one_fail)278*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_progs_one_fail) {}
ATF_TEST_CASE_BODY(require_progs_one_fail)279*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_progs_one_fail) {
280*0a6a1f1dSLionel Sambuc     vars_map metadata;
281*0a6a1f1dSLionel Sambuc     metadata["require.progs"] = "bin/cp";
282*0a6a1f1dSLionel Sambuc     ATF_REQUIRE_THROW(std::runtime_error,
283*0a6a1f1dSLionel Sambuc                     impl::check_requirements(metadata, no_config));
284*0a6a1f1dSLionel Sambuc }
285*0a6a1f1dSLionel Sambuc 
286*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_progs_many_ok);
ATF_TEST_CASE_HEAD(require_progs_many_ok)287*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_progs_many_ok) {}
ATF_TEST_CASE_BODY(require_progs_many_ok)288*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_progs_many_ok) {
289*0a6a1f1dSLionel Sambuc     vars_map metadata;
290*0a6a1f1dSLionel Sambuc     metadata["require.progs"] = "cp ls mv";
291*0a6a1f1dSLionel Sambuc     do_check("", metadata);
292*0a6a1f1dSLionel Sambuc }
293*0a6a1f1dSLionel Sambuc 
294*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_progs_many_missing);
ATF_TEST_CASE_HEAD(require_progs_many_missing)295*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_progs_many_missing) {}
ATF_TEST_CASE_BODY(require_progs_many_missing)296*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_progs_many_missing) {
297*0a6a1f1dSLionel Sambuc     vars_map metadata;
298*0a6a1f1dSLionel Sambuc     metadata["require.progs"] = "mv ls __foo__ cp";
299*0a6a1f1dSLionel Sambuc     do_check("Required program '__foo__' not found in the PATH", metadata);
300*0a6a1f1dSLionel Sambuc }
301*0a6a1f1dSLionel Sambuc 
302*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_progs_many_fail);
ATF_TEST_CASE_HEAD(require_progs_many_fail)303*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_progs_many_fail) {}
ATF_TEST_CASE_BODY(require_progs_many_fail)304*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_progs_many_fail) {
305*0a6a1f1dSLionel Sambuc     vars_map metadata;
306*0a6a1f1dSLionel Sambuc     metadata["require.progs"] = "ls cp ../bin/cp";
307*0a6a1f1dSLionel Sambuc     ATF_REQUIRE_THROW(std::runtime_error,
308*0a6a1f1dSLionel Sambuc                     impl::check_requirements(metadata, no_config));
309*0a6a1f1dSLionel Sambuc }
310*0a6a1f1dSLionel Sambuc 
311*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
312*0a6a1f1dSLionel Sambuc // Tests for the require.user metadata property.
313*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
314*0a6a1f1dSLionel Sambuc 
315*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_user_root);
ATF_TEST_CASE_HEAD(require_user_root)316*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_user_root) {}
ATF_TEST_CASE_BODY(require_user_root)317*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_user_root) {
318*0a6a1f1dSLionel Sambuc     vars_map metadata;
319*0a6a1f1dSLionel Sambuc     metadata["require.user"] = "root";
320*0a6a1f1dSLionel Sambuc     if (tools::user::is_root())
321*0a6a1f1dSLionel Sambuc         do_check("", metadata);
322*0a6a1f1dSLionel Sambuc     else
323*0a6a1f1dSLionel Sambuc         do_check("Requires root privileges", metadata);
324*0a6a1f1dSLionel Sambuc }
325*0a6a1f1dSLionel Sambuc 
326*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_user_unprivileged);
ATF_TEST_CASE_HEAD(require_user_unprivileged)327*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_user_unprivileged) {}
ATF_TEST_CASE_BODY(require_user_unprivileged)328*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_user_unprivileged) {
329*0a6a1f1dSLionel Sambuc     vars_map metadata;
330*0a6a1f1dSLionel Sambuc     metadata["require.user"] = "unprivileged";
331*0a6a1f1dSLionel Sambuc     if (tools::user::is_root())
332*0a6a1f1dSLionel Sambuc         do_check("Requires an unprivileged user and the 'unprivileged-user' "
333*0a6a1f1dSLionel Sambuc                  "configuration variable is not set", metadata);
334*0a6a1f1dSLionel Sambuc     else
335*0a6a1f1dSLionel Sambuc         do_check("", metadata);
336*0a6a1f1dSLionel Sambuc }
337*0a6a1f1dSLionel Sambuc 
338*0a6a1f1dSLionel Sambuc ATF_TEST_CASE(require_user_fail);
ATF_TEST_CASE_HEAD(require_user_fail)339*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_HEAD(require_user_fail) {}
ATF_TEST_CASE_BODY(require_user_fail)340*0a6a1f1dSLionel Sambuc ATF_TEST_CASE_BODY(require_user_fail) {
341*0a6a1f1dSLionel Sambuc     vars_map metadata;
342*0a6a1f1dSLionel Sambuc     metadata["require.user"] = "nobody";
343*0a6a1f1dSLionel Sambuc     ATF_REQUIRE_THROW(std::runtime_error,
344*0a6a1f1dSLionel Sambuc                     impl::check_requirements(metadata, no_config));
345*0a6a1f1dSLionel Sambuc }
346*0a6a1f1dSLionel Sambuc 
347*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
348*0a6a1f1dSLionel Sambuc // Main.
349*0a6a1f1dSLionel Sambuc // -------------------------------------------------------------------------
350*0a6a1f1dSLionel Sambuc 
ATF_INIT_TEST_CASES(tcs)351*0a6a1f1dSLionel Sambuc ATF_INIT_TEST_CASES(tcs)
352*0a6a1f1dSLionel Sambuc {
353*0a6a1f1dSLionel Sambuc     // Add test cases for require.arch.
354*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_arch_one_ok);
355*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_arch_one_fail);
356*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_arch_many_ok);
357*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_arch_many_fail);
358*0a6a1f1dSLionel Sambuc 
359*0a6a1f1dSLionel Sambuc     // Add test cases for require.config.
360*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_config_one_ok);
361*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_config_one_fail);
362*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_config_many_ok);
363*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_config_many_fail);
364*0a6a1f1dSLionel Sambuc 
365*0a6a1f1dSLionel Sambuc     // Add test cases for require.files.
366*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_files_one_ok);
367*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_files_one_missing);
368*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_files_one_fail);
369*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_files_many_ok);
370*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_files_many_missing);
371*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_files_many_fail);
372*0a6a1f1dSLionel Sambuc 
373*0a6a1f1dSLionel Sambuc     // Add test cases for require.machine.
374*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_machine_one_ok);
375*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_machine_one_fail);
376*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_machine_many_ok);
377*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_machine_many_fail);
378*0a6a1f1dSLionel Sambuc 
379*0a6a1f1dSLionel Sambuc     // Add test cases for require.memory.
380*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_memory_ok);
381*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_memory_not_enough);
382*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_memory_fail);
383*0a6a1f1dSLionel Sambuc 
384*0a6a1f1dSLionel Sambuc     // Add test cases for require.progs.
385*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_progs_one_ok);
386*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_progs_one_missing);
387*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_progs_one_fail);
388*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_progs_many_ok);
389*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_progs_many_missing);
390*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_progs_many_fail);
391*0a6a1f1dSLionel Sambuc 
392*0a6a1f1dSLionel Sambuc     // Add test cases for require.user.
393*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_user_root);
394*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_user_unprivileged);
395*0a6a1f1dSLionel Sambuc     ATF_ADD_TEST_CASE(tcs, require_user_fail);
396*0a6a1f1dSLionel Sambuc }
397