1*b0d29bc4SBrooks Davis // Copyright 2012 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis // without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis
29*b0d29bc4SBrooks Davis #include "model/metadata.hpp"
30*b0d29bc4SBrooks Davis
31*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
32*b0d29bc4SBrooks Davis
33*b0d29bc4SBrooks Davis #include "engine/config.hpp"
34*b0d29bc4SBrooks Davis #include "engine/requirements.hpp"
35*b0d29bc4SBrooks Davis #include "utils/config/tree.ipp"
36*b0d29bc4SBrooks Davis #include "utils/env.hpp"
37*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
38*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
39*b0d29bc4SBrooks Davis #include "utils/memory.hpp"
40*b0d29bc4SBrooks Davis #include "utils/passwd.hpp"
41*b0d29bc4SBrooks Davis #include "utils/units.hpp"
42*b0d29bc4SBrooks Davis
43*b0d29bc4SBrooks Davis namespace config = utils::config;
44*b0d29bc4SBrooks Davis namespace fs = utils::fs;
45*b0d29bc4SBrooks Davis namespace passwd = utils::passwd;
46*b0d29bc4SBrooks Davis namespace units = utils::units;
47*b0d29bc4SBrooks Davis
48*b0d29bc4SBrooks Davis
49*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__none);
ATF_TEST_CASE_BODY(check_reqs__none)50*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__none)
51*b0d29bc4SBrooks Davis {
52*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder().build();
53*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "",
54*b0d29bc4SBrooks Davis fs::path(".")).empty());
55*b0d29bc4SBrooks Davis }
56*b0d29bc4SBrooks Davis
57*b0d29bc4SBrooks Davis
58*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__one_ok);
ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__one_ok)59*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__one_ok)
60*b0d29bc4SBrooks Davis {
61*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
62*b0d29bc4SBrooks Davis .add_allowed_architecture("x86_64")
63*b0d29bc4SBrooks Davis .build();
64*b0d29bc4SBrooks Davis
65*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
66*b0d29bc4SBrooks Davis user_config.set_string("architecture", "x86_64");
67*b0d29bc4SBrooks Davis user_config.set_string("platform", "");
68*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
69*b0d29bc4SBrooks Davis }
70*b0d29bc4SBrooks Davis
71*b0d29bc4SBrooks Davis
72*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__one_fail);
ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__one_fail)73*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__one_fail)
74*b0d29bc4SBrooks Davis {
75*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
76*b0d29bc4SBrooks Davis .add_allowed_architecture("x86_64")
77*b0d29bc4SBrooks Davis .build();
78*b0d29bc4SBrooks Davis
79*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
80*b0d29bc4SBrooks Davis user_config.set_string("architecture", "i386");
81*b0d29bc4SBrooks Davis user_config.set_string("platform", "");
82*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Current architecture 'i386' not supported",
83*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "", fs::path(".")));
84*b0d29bc4SBrooks Davis }
85*b0d29bc4SBrooks Davis
86*b0d29bc4SBrooks Davis
87*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__many_ok);
ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__many_ok)88*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__many_ok)
89*b0d29bc4SBrooks Davis {
90*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
91*b0d29bc4SBrooks Davis .add_allowed_architecture("x86_64")
92*b0d29bc4SBrooks Davis .add_allowed_architecture("i386")
93*b0d29bc4SBrooks Davis .add_allowed_architecture("powerpc")
94*b0d29bc4SBrooks Davis .build();
95*b0d29bc4SBrooks Davis
96*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
97*b0d29bc4SBrooks Davis user_config.set_string("architecture", "i386");
98*b0d29bc4SBrooks Davis user_config.set_string("platform", "");
99*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
100*b0d29bc4SBrooks Davis }
101*b0d29bc4SBrooks Davis
102*b0d29bc4SBrooks Davis
103*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_architectures__many_fail);
ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__many_fail)104*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_architectures__many_fail)
105*b0d29bc4SBrooks Davis {
106*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
107*b0d29bc4SBrooks Davis .add_allowed_architecture("x86_64")
108*b0d29bc4SBrooks Davis .add_allowed_architecture("i386")
109*b0d29bc4SBrooks Davis .add_allowed_architecture("powerpc")
110*b0d29bc4SBrooks Davis .build();
111*b0d29bc4SBrooks Davis
112*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
113*b0d29bc4SBrooks Davis user_config.set_string("architecture", "arm");
114*b0d29bc4SBrooks Davis user_config.set_string("platform", "");
115*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Current architecture 'arm' not supported",
116*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "", fs::path(".")));
117*b0d29bc4SBrooks Davis }
118*b0d29bc4SBrooks Davis
119*b0d29bc4SBrooks Davis
120*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__one_ok);
ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__one_ok)121*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__one_ok)
122*b0d29bc4SBrooks Davis {
123*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
124*b0d29bc4SBrooks Davis .add_allowed_platform("amd64")
125*b0d29bc4SBrooks Davis .build();
126*b0d29bc4SBrooks Davis
127*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
128*b0d29bc4SBrooks Davis user_config.set_string("architecture", "");
129*b0d29bc4SBrooks Davis user_config.set_string("platform", "amd64");
130*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
131*b0d29bc4SBrooks Davis }
132*b0d29bc4SBrooks Davis
133*b0d29bc4SBrooks Davis
134*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__one_fail);
ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__one_fail)135*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__one_fail)
136*b0d29bc4SBrooks Davis {
137*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
138*b0d29bc4SBrooks Davis .add_allowed_platform("amd64")
139*b0d29bc4SBrooks Davis .build();
140*b0d29bc4SBrooks Davis
141*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
142*b0d29bc4SBrooks Davis user_config.set_string("architecture", "");
143*b0d29bc4SBrooks Davis user_config.set_string("platform", "i386");
144*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Current platform 'i386' not supported",
145*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "", fs::path(".")));
146*b0d29bc4SBrooks Davis }
147*b0d29bc4SBrooks Davis
148*b0d29bc4SBrooks Davis
149*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__many_ok);
ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__many_ok)150*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__many_ok)
151*b0d29bc4SBrooks Davis {
152*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
153*b0d29bc4SBrooks Davis .add_allowed_platform("amd64")
154*b0d29bc4SBrooks Davis .add_allowed_platform("i386")
155*b0d29bc4SBrooks Davis .add_allowed_platform("macppc")
156*b0d29bc4SBrooks Davis .build();
157*b0d29bc4SBrooks Davis
158*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
159*b0d29bc4SBrooks Davis user_config.set_string("architecture", "");
160*b0d29bc4SBrooks Davis user_config.set_string("platform", "i386");
161*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
162*b0d29bc4SBrooks Davis }
163*b0d29bc4SBrooks Davis
164*b0d29bc4SBrooks Davis
165*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__allowed_platforms__many_fail);
ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__many_fail)166*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__allowed_platforms__many_fail)
167*b0d29bc4SBrooks Davis {
168*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
169*b0d29bc4SBrooks Davis .add_allowed_platform("amd64")
170*b0d29bc4SBrooks Davis .add_allowed_platform("i386")
171*b0d29bc4SBrooks Davis .add_allowed_platform("macppc")
172*b0d29bc4SBrooks Davis .build();
173*b0d29bc4SBrooks Davis
174*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
175*b0d29bc4SBrooks Davis user_config.set_string("architecture", "");
176*b0d29bc4SBrooks Davis user_config.set_string("platform", "shark");
177*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Current platform 'shark' not supported",
178*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "", fs::path(".")));
179*b0d29bc4SBrooks Davis }
180*b0d29bc4SBrooks Davis
181*b0d29bc4SBrooks Davis
182*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__one_ok);
ATF_TEST_CASE_BODY(check_reqs__required_configs__one_ok)183*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_configs__one_ok)
184*b0d29bc4SBrooks Davis {
185*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
186*b0d29bc4SBrooks Davis .add_required_config("my-var")
187*b0d29bc4SBrooks Davis .build();
188*b0d29bc4SBrooks Davis
189*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
190*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.aaa", "value1");
191*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.my-var", "value2");
192*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.zzz", "value3");
193*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "suite",
194*b0d29bc4SBrooks Davis fs::path(".")).empty());
195*b0d29bc4SBrooks Davis }
196*b0d29bc4SBrooks Davis
197*b0d29bc4SBrooks Davis
198*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__one_fail);
ATF_TEST_CASE_BODY(check_reqs__required_configs__one_fail)199*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_configs__one_fail)
200*b0d29bc4SBrooks Davis {
201*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
202*b0d29bc4SBrooks Davis .add_required_config("unprivileged_user")
203*b0d29bc4SBrooks Davis .build();
204*b0d29bc4SBrooks Davis
205*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
206*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.aaa", "value1");
207*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.my-var", "value2");
208*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.zzz", "value3");
209*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Required configuration property 'unprivileged_user' not "
210*b0d29bc4SBrooks Davis "defined",
211*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "suite",
212*b0d29bc4SBrooks Davis fs::path(".")));
213*b0d29bc4SBrooks Davis }
214*b0d29bc4SBrooks Davis
215*b0d29bc4SBrooks Davis
216*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__many_ok);
ATF_TEST_CASE_BODY(check_reqs__required_configs__many_ok)217*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_configs__many_ok)
218*b0d29bc4SBrooks Davis {
219*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
220*b0d29bc4SBrooks Davis .add_required_config("foo")
221*b0d29bc4SBrooks Davis .add_required_config("bar")
222*b0d29bc4SBrooks Davis .add_required_config("baz")
223*b0d29bc4SBrooks Davis .build();
224*b0d29bc4SBrooks Davis
225*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
226*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.aaa", "value1");
227*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.foo", "value2");
228*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.bar", "value3");
229*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.baz", "value4");
230*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.zzz", "value5");
231*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "suite",
232*b0d29bc4SBrooks Davis fs::path(".")).empty());
233*b0d29bc4SBrooks Davis }
234*b0d29bc4SBrooks Davis
235*b0d29bc4SBrooks Davis
236*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__many_fail);
ATF_TEST_CASE_BODY(check_reqs__required_configs__many_fail)237*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_configs__many_fail)
238*b0d29bc4SBrooks Davis {
239*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
240*b0d29bc4SBrooks Davis .add_required_config("foo")
241*b0d29bc4SBrooks Davis .add_required_config("bar")
242*b0d29bc4SBrooks Davis .add_required_config("baz")
243*b0d29bc4SBrooks Davis .build();
244*b0d29bc4SBrooks Davis
245*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
246*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.aaa", "value1");
247*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.foo", "value2");
248*b0d29bc4SBrooks Davis user_config.set_string("test_suites.suite.zzz", "value3");
249*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Required configuration property 'bar' not defined",
250*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "suite",
251*b0d29bc4SBrooks Davis fs::path(".")));
252*b0d29bc4SBrooks Davis }
253*b0d29bc4SBrooks Davis
254*b0d29bc4SBrooks Davis
255*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_configs__special);
ATF_TEST_CASE_BODY(check_reqs__required_configs__special)256*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_configs__special)
257*b0d29bc4SBrooks Davis {
258*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
259*b0d29bc4SBrooks Davis .add_required_config("unprivileged-user")
260*b0d29bc4SBrooks Davis .build();
261*b0d29bc4SBrooks Davis
262*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
263*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Required configuration property 'unprivileged-user' "
264*b0d29bc4SBrooks Davis "not defined",
265*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "", fs::path(".")));
266*b0d29bc4SBrooks Davis user_config.set< engine::user_node >(
267*b0d29bc4SBrooks Davis "unprivileged_user", passwd::user("foo", 1, 2));
268*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "foo",
269*b0d29bc4SBrooks Davis fs::path(".")).empty());
270*b0d29bc4SBrooks Davis }
271*b0d29bc4SBrooks Davis
272*b0d29bc4SBrooks Davis
273*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__root__ok);
ATF_TEST_CASE_BODY(check_reqs__required_user__root__ok)274*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_user__root__ok)
275*b0d29bc4SBrooks Davis {
276*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
277*b0d29bc4SBrooks Davis .set_required_user("root")
278*b0d29bc4SBrooks Davis .build();
279*b0d29bc4SBrooks Davis
280*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
281*b0d29bc4SBrooks Davis ATF_REQUIRE(!user_config.is_set("unprivileged_user"));
282*b0d29bc4SBrooks Davis
283*b0d29bc4SBrooks Davis passwd::set_current_user_for_testing(passwd::user("", 0, 1));
284*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
285*b0d29bc4SBrooks Davis }
286*b0d29bc4SBrooks Davis
287*b0d29bc4SBrooks Davis
288*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__root__fail);
ATF_TEST_CASE_BODY(check_reqs__required_user__root__fail)289*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_user__root__fail)
290*b0d29bc4SBrooks Davis {
291*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
292*b0d29bc4SBrooks Davis .set_required_user("root")
293*b0d29bc4SBrooks Davis .build();
294*b0d29bc4SBrooks Davis
295*b0d29bc4SBrooks Davis passwd::set_current_user_for_testing(passwd::user("", 123, 1));
296*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Requires root privileges",
297*b0d29bc4SBrooks Davis engine::check_reqs(md, engine::empty_config(), "",
298*b0d29bc4SBrooks Davis fs::path(".")));
299*b0d29bc4SBrooks Davis }
300*b0d29bc4SBrooks Davis
301*b0d29bc4SBrooks Davis
302*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__unprivileged__same);
ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__same)303*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__same)
304*b0d29bc4SBrooks Davis {
305*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
306*b0d29bc4SBrooks Davis .set_required_user("unprivileged")
307*b0d29bc4SBrooks Davis .build();
308*b0d29bc4SBrooks Davis
309*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
310*b0d29bc4SBrooks Davis ATF_REQUIRE(!user_config.is_set("unprivileged_user"));
311*b0d29bc4SBrooks Davis
312*b0d29bc4SBrooks Davis passwd::set_current_user_for_testing(passwd::user("", 123, 1));
313*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
314*b0d29bc4SBrooks Davis }
315*b0d29bc4SBrooks Davis
316*b0d29bc4SBrooks Davis
317*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__unprivileged__ok);
ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__ok)318*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__ok)
319*b0d29bc4SBrooks Davis {
320*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
321*b0d29bc4SBrooks Davis .set_required_user("unprivileged")
322*b0d29bc4SBrooks Davis .build();
323*b0d29bc4SBrooks Davis
324*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
325*b0d29bc4SBrooks Davis user_config.set< engine::user_node >(
326*b0d29bc4SBrooks Davis "unprivileged_user", passwd::user("", 123, 1));
327*b0d29bc4SBrooks Davis
328*b0d29bc4SBrooks Davis passwd::set_current_user_for_testing(passwd::user("", 0, 1));
329*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, user_config, "", fs::path(".")).empty());
330*b0d29bc4SBrooks Davis }
331*b0d29bc4SBrooks Davis
332*b0d29bc4SBrooks Davis
333*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_user__unprivileged__fail);
ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__fail)334*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_user__unprivileged__fail)
335*b0d29bc4SBrooks Davis {
336*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
337*b0d29bc4SBrooks Davis .set_required_user("unprivileged")
338*b0d29bc4SBrooks Davis .build();
339*b0d29bc4SBrooks Davis
340*b0d29bc4SBrooks Davis config::tree user_config = engine::default_config();
341*b0d29bc4SBrooks Davis ATF_REQUIRE(!user_config.is_set("unprivileged_user"));
342*b0d29bc4SBrooks Davis
343*b0d29bc4SBrooks Davis passwd::set_current_user_for_testing(passwd::user("", 0, 1));
344*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Requires.*unprivileged.*unprivileged-user",
345*b0d29bc4SBrooks Davis engine::check_reqs(md, user_config, "", fs::path(".")));
346*b0d29bc4SBrooks Davis }
347*b0d29bc4SBrooks Davis
348*b0d29bc4SBrooks Davis
349*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_disk_space__ok);
ATF_TEST_CASE_BODY(check_reqs__required_disk_space__ok)350*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_disk_space__ok)
351*b0d29bc4SBrooks Davis {
352*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
353*b0d29bc4SBrooks Davis .set_required_disk_space(units::bytes::parse("1m"))
354*b0d29bc4SBrooks Davis .build();
355*b0d29bc4SBrooks Davis
356*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "",
357*b0d29bc4SBrooks Davis fs::path(".")).empty());
358*b0d29bc4SBrooks Davis }
359*b0d29bc4SBrooks Davis
360*b0d29bc4SBrooks Davis
361*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_disk_space__fail);
ATF_TEST_CASE_BODY(check_reqs__required_disk_space__fail)362*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_disk_space__fail)
363*b0d29bc4SBrooks Davis {
364*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
365*b0d29bc4SBrooks Davis .set_required_disk_space(units::bytes::parse("1000t"))
366*b0d29bc4SBrooks Davis .build();
367*b0d29bc4SBrooks Davis
368*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Requires 1000.00T .*disk space",
369*b0d29bc4SBrooks Davis engine::check_reqs(md, engine::empty_config(), "",
370*b0d29bc4SBrooks Davis fs::path(".")));
371*b0d29bc4SBrooks Davis }
372*b0d29bc4SBrooks Davis
373*b0d29bc4SBrooks Davis
374*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_files__ok);
ATF_TEST_CASE_BODY(check_reqs__required_files__ok)375*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_files__ok)
376*b0d29bc4SBrooks Davis {
377*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
378*b0d29bc4SBrooks Davis .add_required_file(fs::current_path() / "test-file")
379*b0d29bc4SBrooks Davis .build();
380*b0d29bc4SBrooks Davis
381*b0d29bc4SBrooks Davis atf::utils::create_file("test-file", "");
382*b0d29bc4SBrooks Davis
383*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "",
384*b0d29bc4SBrooks Davis fs::path(".")).empty());
385*b0d29bc4SBrooks Davis }
386*b0d29bc4SBrooks Davis
387*b0d29bc4SBrooks Davis
388*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_files__fail);
ATF_TEST_CASE_BODY(check_reqs__required_files__fail)389*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_files__fail)
390*b0d29bc4SBrooks Davis {
391*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
392*b0d29bc4SBrooks Davis .add_required_file(fs::path("/non-existent/file"))
393*b0d29bc4SBrooks Davis .build();
394*b0d29bc4SBrooks Davis
395*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("'/non-existent/file' not found$",
396*b0d29bc4SBrooks Davis engine::check_reqs(md, engine::empty_config(), "",
397*b0d29bc4SBrooks Davis fs::path(".")));
398*b0d29bc4SBrooks Davis }
399*b0d29bc4SBrooks Davis
400*b0d29bc4SBrooks Davis
401*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_memory__ok);
ATF_TEST_CASE_BODY(check_reqs__required_memory__ok)402*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_memory__ok)
403*b0d29bc4SBrooks Davis {
404*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
405*b0d29bc4SBrooks Davis .set_required_memory(units::bytes::parse("1m"))
406*b0d29bc4SBrooks Davis .build();
407*b0d29bc4SBrooks Davis
408*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "",
409*b0d29bc4SBrooks Davis fs::path(".")).empty());
410*b0d29bc4SBrooks Davis }
411*b0d29bc4SBrooks Davis
412*b0d29bc4SBrooks Davis
413*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_memory__fail);
ATF_TEST_CASE_BODY(check_reqs__required_memory__fail)414*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_memory__fail)
415*b0d29bc4SBrooks Davis {
416*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
417*b0d29bc4SBrooks Davis .set_required_memory(units::bytes::parse("100t"))
418*b0d29bc4SBrooks Davis .build();
419*b0d29bc4SBrooks Davis
420*b0d29bc4SBrooks Davis if (utils::physical_memory() == 0)
421*b0d29bc4SBrooks Davis skip("Don't know how to query the amount of physical memory");
422*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("Requires 100.00T .*memory",
423*b0d29bc4SBrooks Davis engine::check_reqs(md, engine::empty_config(), "",
424*b0d29bc4SBrooks Davis fs::path(".")));
425*b0d29bc4SBrooks Davis }
426*b0d29bc4SBrooks Davis
427*b0d29bc4SBrooks Davis
428*b0d29bc4SBrooks Davis ATF_TEST_CASE(check_reqs__required_programs__ok);
ATF_TEST_CASE_HEAD(check_reqs__required_programs__ok)429*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(check_reqs__required_programs__ok)
430*b0d29bc4SBrooks Davis {
431*b0d29bc4SBrooks Davis set_md_var("require.progs", "/bin/ls /bin/mv");
432*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(check_reqs__required_programs__ok)433*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_programs__ok)
434*b0d29bc4SBrooks Davis {
435*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
436*b0d29bc4SBrooks Davis .add_required_program(fs::path("/bin/ls"))
437*b0d29bc4SBrooks Davis .add_required_program(fs::path("foo"))
438*b0d29bc4SBrooks Davis .add_required_program(fs::path("/bin/mv"))
439*b0d29bc4SBrooks Davis .build();
440*b0d29bc4SBrooks Davis
441*b0d29bc4SBrooks Davis fs::mkdir(fs::path("bin"), 0755);
442*b0d29bc4SBrooks Davis atf::utils::create_file("bin/foo", "");
443*b0d29bc4SBrooks Davis utils::setenv("PATH", (fs::current_path() / "bin").str());
444*b0d29bc4SBrooks Davis
445*b0d29bc4SBrooks Davis ATF_REQUIRE(engine::check_reqs(md, engine::empty_config(), "",
446*b0d29bc4SBrooks Davis fs::path(".")).empty());
447*b0d29bc4SBrooks Davis }
448*b0d29bc4SBrooks Davis
449*b0d29bc4SBrooks Davis
450*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_programs__fail_absolute);
ATF_TEST_CASE_BODY(check_reqs__required_programs__fail_absolute)451*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_programs__fail_absolute)
452*b0d29bc4SBrooks Davis {
453*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
454*b0d29bc4SBrooks Davis .add_required_program(fs::path("/non-existent/program"))
455*b0d29bc4SBrooks Davis .build();
456*b0d29bc4SBrooks Davis
457*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("'/non-existent/program' not found$",
458*b0d29bc4SBrooks Davis engine::check_reqs(md, engine::empty_config(), "",
459*b0d29bc4SBrooks Davis fs::path(".")));
460*b0d29bc4SBrooks Davis }
461*b0d29bc4SBrooks Davis
462*b0d29bc4SBrooks Davis
463*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(check_reqs__required_programs__fail_relative);
ATF_TEST_CASE_BODY(check_reqs__required_programs__fail_relative)464*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(check_reqs__required_programs__fail_relative)
465*b0d29bc4SBrooks Davis {
466*b0d29bc4SBrooks Davis const model::metadata md = model::metadata_builder()
467*b0d29bc4SBrooks Davis .add_required_program(fs::path("foo"))
468*b0d29bc4SBrooks Davis .add_required_program(fs::path("bar"))
469*b0d29bc4SBrooks Davis .build();
470*b0d29bc4SBrooks Davis
471*b0d29bc4SBrooks Davis fs::mkdir(fs::path("bin"), 0755);
472*b0d29bc4SBrooks Davis atf::utils::create_file("bin/foo", "");
473*b0d29bc4SBrooks Davis utils::setenv("PATH", (fs::current_path() / "bin").str());
474*b0d29bc4SBrooks Davis
475*b0d29bc4SBrooks Davis ATF_REQUIRE_MATCH("'bar' not found in PATH$",
476*b0d29bc4SBrooks Davis engine::check_reqs(md, engine::empty_config(), "",
477*b0d29bc4SBrooks Davis fs::path(".")));
478*b0d29bc4SBrooks Davis }
479*b0d29bc4SBrooks Davis
480*b0d29bc4SBrooks Davis
ATF_INIT_TEST_CASES(tcs)481*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
482*b0d29bc4SBrooks Davis {
483*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__none);
484*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__one_ok);
485*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__one_fail);
486*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__many_ok);
487*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_architectures__many_fail);
488*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__one_ok);
489*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__one_fail);
490*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__many_ok);
491*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__allowed_platforms__many_fail);
492*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__one_ok);
493*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__one_fail);
494*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__many_ok);
495*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__many_fail);
496*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_configs__special);
497*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__root__ok);
498*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__root__fail);
499*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__unprivileged__same);
500*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__unprivileged__ok);
501*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_user__unprivileged__fail);
502*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_disk_space__ok);
503*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_disk_space__fail);
504*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_files__ok);
505*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_files__fail);
506*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_memory__ok);
507*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_memory__fail);
508*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_programs__ok);
509*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_programs__fail_absolute);
510*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, check_reqs__required_programs__fail_relative);
511*b0d29bc4SBrooks Davis }
512