1*b0d29bc4SBrooks Davis // Copyright 2010 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 "engine/kyuafile.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <unistd.h>
33*b0d29bc4SBrooks Davis }
34*b0d29bc4SBrooks Davis 
35*b0d29bc4SBrooks Davis #include <stdexcept>
36*b0d29bc4SBrooks Davis #include <typeinfo>
37*b0d29bc4SBrooks Davis 
38*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
39*b0d29bc4SBrooks Davis #include <lutok/operations.hpp>
40*b0d29bc4SBrooks Davis #include <lutok/state.ipp>
41*b0d29bc4SBrooks Davis #include <lutok/test_utils.hpp>
42*b0d29bc4SBrooks Davis 
43*b0d29bc4SBrooks Davis #include "engine/atf.hpp"
44*b0d29bc4SBrooks Davis #include "engine/exceptions.hpp"
45*b0d29bc4SBrooks Davis #include "engine/plain.hpp"
46*b0d29bc4SBrooks Davis #include "engine/scheduler.hpp"
47*b0d29bc4SBrooks Davis #include "engine/tap.hpp"
48*b0d29bc4SBrooks Davis #include "model/metadata.hpp"
49*b0d29bc4SBrooks Davis #include "model/test_program.hpp"
50*b0d29bc4SBrooks Davis #include "utils/config/tree.ipp"
51*b0d29bc4SBrooks Davis #include "utils/datetime.hpp"
52*b0d29bc4SBrooks Davis #include "utils/env.hpp"
53*b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
54*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
55*b0d29bc4SBrooks Davis #include "utils/optional.ipp"
56*b0d29bc4SBrooks Davis 
57*b0d29bc4SBrooks Davis namespace config = utils::config;
58*b0d29bc4SBrooks Davis namespace datetime = utils::datetime;
59*b0d29bc4SBrooks Davis namespace fs = utils::fs;
60*b0d29bc4SBrooks Davis namespace scheduler = engine::scheduler;
61*b0d29bc4SBrooks Davis 
62*b0d29bc4SBrooks Davis using utils::none;
63*b0d29bc4SBrooks Davis 
64*b0d29bc4SBrooks Davis 
65*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__empty);
ATF_TEST_CASE_BODY(kyuafile__load__empty)66*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__empty)
67*b0d29bc4SBrooks Davis {
68*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
69*b0d29bc4SBrooks Davis 
70*b0d29bc4SBrooks Davis     atf::utils::create_file("config", "syntax(2)\n");
71*b0d29bc4SBrooks Davis 
72*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
73*b0d29bc4SBrooks Davis         fs::path("config"), none, config::tree(), handle);
74*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.source_root());
75*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.build_root());
76*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(0, suite.test_programs().size());
77*b0d29bc4SBrooks Davis 
78*b0d29bc4SBrooks Davis     handle.cleanup();
79*b0d29bc4SBrooks Davis }
80*b0d29bc4SBrooks Davis 
81*b0d29bc4SBrooks Davis 
82*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__real_interfaces);
ATF_TEST_CASE_BODY(kyuafile__load__real_interfaces)83*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__real_interfaces)
84*b0d29bc4SBrooks Davis {
85*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
86*b0d29bc4SBrooks Davis 
87*b0d29bc4SBrooks Davis     atf::utils::create_file(
88*b0d29bc4SBrooks Davis         "config",
89*b0d29bc4SBrooks Davis         "syntax(2)\n"
90*b0d29bc4SBrooks Davis         "test_suite('one-suite')\n"
91*b0d29bc4SBrooks Davis         "atf_test_program{name='1st'}\n"
92*b0d29bc4SBrooks Davis         "atf_test_program{name='2nd', test_suite='first'}\n"
93*b0d29bc4SBrooks Davis         "plain_test_program{name='3rd'}\n"
94*b0d29bc4SBrooks Davis         "tap_test_program{name='4th', test_suite='second'}\n"
95*b0d29bc4SBrooks Davis         "include('dir/config')\n");
96*b0d29bc4SBrooks Davis 
97*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("dir"), 0755);
98*b0d29bc4SBrooks Davis     atf::utils::create_file(
99*b0d29bc4SBrooks Davis         "dir/config",
100*b0d29bc4SBrooks Davis         "syntax(2)\n"
101*b0d29bc4SBrooks Davis         "atf_test_program{name='1st', test_suite='other-suite'}\n"
102*b0d29bc4SBrooks Davis         "include('subdir/config')\n");
103*b0d29bc4SBrooks Davis 
104*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("dir/subdir"), 0755);
105*b0d29bc4SBrooks Davis     atf::utils::create_file(
106*b0d29bc4SBrooks Davis         "dir/subdir/config",
107*b0d29bc4SBrooks Davis         "syntax(2)\n"
108*b0d29bc4SBrooks Davis         "atf_test_program{name='5th', test_suite='last-suite'}\n");
109*b0d29bc4SBrooks Davis 
110*b0d29bc4SBrooks Davis     atf::utils::create_file("1st", "");
111*b0d29bc4SBrooks Davis     atf::utils::create_file("2nd", "");
112*b0d29bc4SBrooks Davis     atf::utils::create_file("3rd", "");
113*b0d29bc4SBrooks Davis     atf::utils::create_file("4th", "");
114*b0d29bc4SBrooks Davis     atf::utils::create_file("dir/1st", "");
115*b0d29bc4SBrooks Davis     atf::utils::create_file("dir/subdir/5th", "");
116*b0d29bc4SBrooks Davis 
117*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
118*b0d29bc4SBrooks Davis         fs::path("config"), none, config::tree(), handle);
119*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.source_root());
120*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.build_root());
121*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(6, suite.test_programs().size());
122*b0d29bc4SBrooks Davis 
123*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("atf", suite.test_programs()[0]->interface_name());
124*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("1st"), suite.test_programs()[0]->relative_path());
125*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("one-suite", suite.test_programs()[0]->test_suite_name());
126*b0d29bc4SBrooks Davis 
127*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("atf", suite.test_programs()[1]->interface_name());
128*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("2nd"), suite.test_programs()[1]->relative_path());
129*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first", suite.test_programs()[1]->test_suite_name());
130*b0d29bc4SBrooks Davis 
131*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("plain", suite.test_programs()[2]->interface_name());
132*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("3rd"), suite.test_programs()[2]->relative_path());
133*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("one-suite", suite.test_programs()[2]->test_suite_name());
134*b0d29bc4SBrooks Davis 
135*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("tap", suite.test_programs()[3]->interface_name());
136*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("4th"), suite.test_programs()[3]->relative_path());
137*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("second", suite.test_programs()[3]->test_suite_name());
138*b0d29bc4SBrooks Davis 
139*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("atf", suite.test_programs()[4]->interface_name());
140*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("dir/1st"),
141*b0d29bc4SBrooks Davis                    suite.test_programs()[4]->relative_path());
142*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("other-suite", suite.test_programs()[4]->test_suite_name());
143*b0d29bc4SBrooks Davis 
144*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("atf", suite.test_programs()[5]->interface_name());
145*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("dir/subdir/5th"),
146*b0d29bc4SBrooks Davis                    suite.test_programs()[5]->relative_path());
147*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("last-suite", suite.test_programs()[5]->test_suite_name());
148*b0d29bc4SBrooks Davis 
149*b0d29bc4SBrooks Davis     handle.cleanup();
150*b0d29bc4SBrooks Davis }
151*b0d29bc4SBrooks Davis 
152*b0d29bc4SBrooks Davis 
153*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__mock_interfaces);
ATF_TEST_CASE_BODY(kyuafile__load__mock_interfaces)154*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__mock_interfaces)
155*b0d29bc4SBrooks Davis {
156*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
157*b0d29bc4SBrooks Davis 
158*b0d29bc4SBrooks Davis     std::shared_ptr< scheduler::interface > mock_interface(
159*b0d29bc4SBrooks Davis         new engine::plain_interface());
160*b0d29bc4SBrooks Davis 
161*b0d29bc4SBrooks Davis     scheduler::register_interface("some", mock_interface);
162*b0d29bc4SBrooks Davis     scheduler::register_interface("random", mock_interface);
163*b0d29bc4SBrooks Davis     scheduler::register_interface("names", mock_interface);
164*b0d29bc4SBrooks Davis 
165*b0d29bc4SBrooks Davis     atf::utils::create_file(
166*b0d29bc4SBrooks Davis         "config",
167*b0d29bc4SBrooks Davis         "syntax(2)\n"
168*b0d29bc4SBrooks Davis         "test_suite('one-suite')\n"
169*b0d29bc4SBrooks Davis         "some_test_program{name='1st'}\n"
170*b0d29bc4SBrooks Davis         "random_test_program{name='2nd'}\n"
171*b0d29bc4SBrooks Davis         "names_test_program{name='3rd'}\n");
172*b0d29bc4SBrooks Davis 
173*b0d29bc4SBrooks Davis     atf::utils::create_file("1st", "");
174*b0d29bc4SBrooks Davis     atf::utils::create_file("2nd", "");
175*b0d29bc4SBrooks Davis     atf::utils::create_file("3rd", "");
176*b0d29bc4SBrooks Davis 
177*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
178*b0d29bc4SBrooks Davis         fs::path("config"), none, config::tree(), handle);
179*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.source_root());
180*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.build_root());
181*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, suite.test_programs().size());
182*b0d29bc4SBrooks Davis 
183*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("some", suite.test_programs()[0]->interface_name());
184*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("1st"), suite.test_programs()[0]->relative_path());
185*b0d29bc4SBrooks Davis 
186*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("random", suite.test_programs()[1]->interface_name());
187*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("2nd"), suite.test_programs()[1]->relative_path());
188*b0d29bc4SBrooks Davis 
189*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("names", suite.test_programs()[2]->interface_name());
190*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("3rd"), suite.test_programs()[2]->relative_path());
191*b0d29bc4SBrooks Davis 
192*b0d29bc4SBrooks Davis     handle.cleanup();
193*b0d29bc4SBrooks Davis }
194*b0d29bc4SBrooks Davis 
195*b0d29bc4SBrooks Davis 
196*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__metadata);
ATF_TEST_CASE_BODY(kyuafile__load__metadata)197*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__metadata)
198*b0d29bc4SBrooks Davis {
199*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
200*b0d29bc4SBrooks Davis 
201*b0d29bc4SBrooks Davis     atf::utils::create_file(
202*b0d29bc4SBrooks Davis         "config",
203*b0d29bc4SBrooks Davis         "syntax(2)\n"
204*b0d29bc4SBrooks Davis         "atf_test_program{name='1st', test_suite='first',"
205*b0d29bc4SBrooks Davis         " allowed_architectures='amd64 i386', timeout=15}\n"
206*b0d29bc4SBrooks Davis         "plain_test_program{name='2nd', test_suite='second',"
207*b0d29bc4SBrooks Davis         " required_files='foo /bar//baz', required_user='root',"
208*b0d29bc4SBrooks Davis         " ['custom.a-number']=123, ['custom.a-bool']=true}\n");
209*b0d29bc4SBrooks Davis     atf::utils::create_file("1st", "");
210*b0d29bc4SBrooks Davis     atf::utils::create_file("2nd", "");
211*b0d29bc4SBrooks Davis 
212*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
213*b0d29bc4SBrooks Davis         fs::path("config"), none, config::tree(), handle);
214*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(2, suite.test_programs().size());
215*b0d29bc4SBrooks Davis 
216*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("atf", suite.test_programs()[0]->interface_name());
217*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("1st"), suite.test_programs()[0]->relative_path());
218*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first", suite.test_programs()[0]->test_suite_name());
219*b0d29bc4SBrooks Davis     const model::metadata md1 = model::metadata_builder()
220*b0d29bc4SBrooks Davis         .add_allowed_architecture("amd64")
221*b0d29bc4SBrooks Davis         .add_allowed_architecture("i386")
222*b0d29bc4SBrooks Davis         .set_timeout(datetime::delta(15, 0))
223*b0d29bc4SBrooks Davis         .build();
224*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(md1, suite.test_programs()[0]->get_metadata());
225*b0d29bc4SBrooks Davis 
226*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("plain", suite.test_programs()[1]->interface_name());
227*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("2nd"), suite.test_programs()[1]->relative_path());
228*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("second", suite.test_programs()[1]->test_suite_name());
229*b0d29bc4SBrooks Davis     const model::metadata md2 = model::metadata_builder()
230*b0d29bc4SBrooks Davis         .add_required_file(fs::path("foo"))
231*b0d29bc4SBrooks Davis         .add_required_file(fs::path("/bar/baz"))
232*b0d29bc4SBrooks Davis         .add_custom("a-bool", "true")
233*b0d29bc4SBrooks Davis         .add_custom("a-number", "123")
234*b0d29bc4SBrooks Davis         .set_required_user("root")
235*b0d29bc4SBrooks Davis         .build();
236*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(md2, suite.test_programs()[1]->get_metadata());
237*b0d29bc4SBrooks Davis 
238*b0d29bc4SBrooks Davis     handle.cleanup();
239*b0d29bc4SBrooks Davis }
240*b0d29bc4SBrooks Davis 
241*b0d29bc4SBrooks Davis 
242*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__current_directory);
ATF_TEST_CASE_BODY(kyuafile__load__current_directory)243*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__current_directory)
244*b0d29bc4SBrooks Davis {
245*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
246*b0d29bc4SBrooks Davis 
247*b0d29bc4SBrooks Davis     atf::utils::create_file(
248*b0d29bc4SBrooks Davis         "config",
249*b0d29bc4SBrooks Davis         "syntax(2)\n"
250*b0d29bc4SBrooks Davis         "atf_test_program{name='one', test_suite='first'}\n"
251*b0d29bc4SBrooks Davis         "include('config2')\n");
252*b0d29bc4SBrooks Davis 
253*b0d29bc4SBrooks Davis     atf::utils::create_file(
254*b0d29bc4SBrooks Davis         "config2",
255*b0d29bc4SBrooks Davis         "syntax(2)\n"
256*b0d29bc4SBrooks Davis         "test_suite('second')\n"
257*b0d29bc4SBrooks Davis         "atf_test_program{name='two'}\n");
258*b0d29bc4SBrooks Davis 
259*b0d29bc4SBrooks Davis     atf::utils::create_file("one", "");
260*b0d29bc4SBrooks Davis     atf::utils::create_file("two", "");
261*b0d29bc4SBrooks Davis 
262*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
263*b0d29bc4SBrooks Davis         fs::path("config"), none, config::tree(), handle);
264*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.source_root());
265*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.build_root());
266*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(2, suite.test_programs().size());
267*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("one"), suite.test_programs()[0]->relative_path());
268*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first", suite.test_programs()[0]->test_suite_name());
269*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("two"),
270*b0d29bc4SBrooks Davis                    suite.test_programs()[1]->relative_path());
271*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("second", suite.test_programs()[1]->test_suite_name());
272*b0d29bc4SBrooks Davis 
273*b0d29bc4SBrooks Davis     handle.cleanup();
274*b0d29bc4SBrooks Davis }
275*b0d29bc4SBrooks Davis 
276*b0d29bc4SBrooks Davis 
277*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__other_directory);
ATF_TEST_CASE_BODY(kyuafile__load__other_directory)278*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__other_directory)
279*b0d29bc4SBrooks Davis {
280*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
281*b0d29bc4SBrooks Davis 
282*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("root"), 0755);
283*b0d29bc4SBrooks Davis     atf::utils::create_file(
284*b0d29bc4SBrooks Davis         "root/config",
285*b0d29bc4SBrooks Davis         "syntax(2)\n"
286*b0d29bc4SBrooks Davis         "test_suite('abc')\n"
287*b0d29bc4SBrooks Davis         "atf_test_program{name='one'}\n"
288*b0d29bc4SBrooks Davis         "include('dir/config')\n");
289*b0d29bc4SBrooks Davis 
290*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("root/dir"), 0755);
291*b0d29bc4SBrooks Davis     atf::utils::create_file(
292*b0d29bc4SBrooks Davis         "root/dir/config",
293*b0d29bc4SBrooks Davis         "syntax(2)\n"
294*b0d29bc4SBrooks Davis         "test_suite('foo')\n"
295*b0d29bc4SBrooks Davis         "atf_test_program{name='two', test_suite='def'}\n"
296*b0d29bc4SBrooks Davis         "atf_test_program{name='three'}\n");
297*b0d29bc4SBrooks Davis 
298*b0d29bc4SBrooks Davis     atf::utils::create_file("root/one", "");
299*b0d29bc4SBrooks Davis     atf::utils::create_file("root/dir/two", "");
300*b0d29bc4SBrooks Davis     atf::utils::create_file("root/dir/three", "");
301*b0d29bc4SBrooks Davis 
302*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
303*b0d29bc4SBrooks Davis         fs::path("root/config"), none, config::tree(), handle);
304*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), suite.source_root());
305*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), suite.build_root());
306*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, suite.test_programs().size());
307*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("one"), suite.test_programs()[0]->relative_path());
308*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("abc", suite.test_programs()[0]->test_suite_name());
309*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("dir/two"),
310*b0d29bc4SBrooks Davis                    suite.test_programs()[1]->relative_path());
311*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("def", suite.test_programs()[1]->test_suite_name());
312*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("dir/three"),
313*b0d29bc4SBrooks Davis                    suite.test_programs()[2]->relative_path());
314*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo", suite.test_programs()[2]->test_suite_name());
315*b0d29bc4SBrooks Davis 
316*b0d29bc4SBrooks Davis     handle.cleanup();
317*b0d29bc4SBrooks Davis }
318*b0d29bc4SBrooks Davis 
319*b0d29bc4SBrooks Davis 
320*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__build_directory);
ATF_TEST_CASE_BODY(kyuafile__load__build_directory)321*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__build_directory)
322*b0d29bc4SBrooks Davis {
323*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
324*b0d29bc4SBrooks Davis 
325*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("srcdir"), 0755);
326*b0d29bc4SBrooks Davis     atf::utils::create_file(
327*b0d29bc4SBrooks Davis         "srcdir/config",
328*b0d29bc4SBrooks Davis         "syntax(2)\n"
329*b0d29bc4SBrooks Davis         "test_suite('abc')\n"
330*b0d29bc4SBrooks Davis         "atf_test_program{name='one'}\n"
331*b0d29bc4SBrooks Davis         "include('dir/config')\n");
332*b0d29bc4SBrooks Davis 
333*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("srcdir/dir"), 0755);
334*b0d29bc4SBrooks Davis     atf::utils::create_file(
335*b0d29bc4SBrooks Davis         "srcdir/dir/config",
336*b0d29bc4SBrooks Davis         "syntax(2)\n"
337*b0d29bc4SBrooks Davis         "test_suite('foo')\n"
338*b0d29bc4SBrooks Davis         "atf_test_program{name='two', test_suite='def'}\n"
339*b0d29bc4SBrooks Davis         "atf_test_program{name='three'}\n");
340*b0d29bc4SBrooks Davis 
341*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("builddir"), 0755);
342*b0d29bc4SBrooks Davis     atf::utils::create_file("builddir/one", "");
343*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("builddir/dir"), 0755);
344*b0d29bc4SBrooks Davis     atf::utils::create_file("builddir/dir/two", "");
345*b0d29bc4SBrooks Davis     atf::utils::create_file("builddir/dir/three", "");
346*b0d29bc4SBrooks Davis 
347*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
348*b0d29bc4SBrooks Davis         fs::path("srcdir/config"), utils::make_optional(fs::path("builddir")),
349*b0d29bc4SBrooks Davis         config::tree(), handle);
350*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("srcdir"), suite.source_root());
351*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("builddir"), suite.build_root());
352*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(3, suite.test_programs().size());
353*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("builddir/one").to_absolute(),
354*b0d29bc4SBrooks Davis                    suite.test_programs()[0]->absolute_path());
355*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("one"), suite.test_programs()[0]->relative_path());
356*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("abc", suite.test_programs()[0]->test_suite_name());
357*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("builddir/dir/two").to_absolute(),
358*b0d29bc4SBrooks Davis                    suite.test_programs()[1]->absolute_path());
359*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("dir/two"),
360*b0d29bc4SBrooks Davis                    suite.test_programs()[1]->relative_path());
361*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("def", suite.test_programs()[1]->test_suite_name());
362*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("builddir/dir/three").to_absolute(),
363*b0d29bc4SBrooks Davis                    suite.test_programs()[2]->absolute_path());
364*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("dir/three"),
365*b0d29bc4SBrooks Davis                    suite.test_programs()[2]->relative_path());
366*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("foo", suite.test_programs()[2]->test_suite_name());
367*b0d29bc4SBrooks Davis 
368*b0d29bc4SBrooks Davis     handle.cleanup();
369*b0d29bc4SBrooks Davis }
370*b0d29bc4SBrooks Davis 
371*b0d29bc4SBrooks Davis 
372*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__absolute_paths_are_stable);
ATF_TEST_CASE_BODY(kyuafile__load__absolute_paths_are_stable)373*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__absolute_paths_are_stable)
374*b0d29bc4SBrooks Davis {
375*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
376*b0d29bc4SBrooks Davis 
377*b0d29bc4SBrooks Davis     atf::utils::create_file(
378*b0d29bc4SBrooks Davis         "config",
379*b0d29bc4SBrooks Davis         "syntax(2)\n"
380*b0d29bc4SBrooks Davis         "atf_test_program{name='one', test_suite='first'}\n");
381*b0d29bc4SBrooks Davis     atf::utils::create_file("one", "");
382*b0d29bc4SBrooks Davis 
383*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
384*b0d29bc4SBrooks Davis         fs::path("config"), none, config::tree(), handle);
385*b0d29bc4SBrooks Davis 
386*b0d29bc4SBrooks Davis     const fs::path previous_dir = fs::current_path();
387*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("other"), 0755);
388*b0d29bc4SBrooks Davis     // Change the directory.  We want later calls to absolute_path() on the test
389*b0d29bc4SBrooks Davis     // programs to return references to previous_dir instead.
390*b0d29bc4SBrooks Davis     ATF_REQUIRE(::chdir("other") != -1);
391*b0d29bc4SBrooks Davis 
392*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.source_root());
393*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("."), suite.build_root());
394*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, suite.test_programs().size());
395*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(previous_dir / "one",
396*b0d29bc4SBrooks Davis                    suite.test_programs()[0]->absolute_path());
397*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::path("one"), suite.test_programs()[0]->relative_path());
398*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("first", suite.test_programs()[0]->test_suite_name());
399*b0d29bc4SBrooks Davis 
400*b0d29bc4SBrooks Davis     handle.cleanup();
401*b0d29bc4SBrooks Davis }
402*b0d29bc4SBrooks Davis 
403*b0d29bc4SBrooks Davis 
404*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__fs_calls_are_relative);
ATF_TEST_CASE_BODY(kyuafile__load__fs_calls_are_relative)405*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__fs_calls_are_relative)
406*b0d29bc4SBrooks Davis {
407*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
408*b0d29bc4SBrooks Davis 
409*b0d29bc4SBrooks Davis     atf::utils::create_file(
410*b0d29bc4SBrooks Davis         "Kyuafile",
411*b0d29bc4SBrooks Davis         "syntax(2)\n"
412*b0d29bc4SBrooks Davis         "if fs.exists('one') then\n"
413*b0d29bc4SBrooks Davis         "    plain_test_program{name='one', test_suite='first'}\n"
414*b0d29bc4SBrooks Davis         "end\n"
415*b0d29bc4SBrooks Davis         "if fs.exists('two') then\n"
416*b0d29bc4SBrooks Davis         "    plain_test_program{name='two', test_suite='first'}\n"
417*b0d29bc4SBrooks Davis         "end\n"
418*b0d29bc4SBrooks Davis         "include('dir/Kyuafile')\n");
419*b0d29bc4SBrooks Davis     atf::utils::create_file("one", "");
420*b0d29bc4SBrooks Davis     fs::mkdir(fs::path("dir"), 0755);
421*b0d29bc4SBrooks Davis     atf::utils::create_file(
422*b0d29bc4SBrooks Davis         "dir/Kyuafile",
423*b0d29bc4SBrooks Davis         "syntax(2)\n"
424*b0d29bc4SBrooks Davis         "if fs.exists('one') then\n"
425*b0d29bc4SBrooks Davis         "    plain_test_program{name='one', test_suite='first'}\n"
426*b0d29bc4SBrooks Davis         "end\n"
427*b0d29bc4SBrooks Davis         "if fs.exists('two') then\n"
428*b0d29bc4SBrooks Davis         "    plain_test_program{name='two', test_suite='first'}\n"
429*b0d29bc4SBrooks Davis         "end\n");
430*b0d29bc4SBrooks Davis     atf::utils::create_file("dir/two", "");
431*b0d29bc4SBrooks Davis 
432*b0d29bc4SBrooks Davis     const engine::kyuafile suite = engine::kyuafile::load(
433*b0d29bc4SBrooks Davis         fs::path("Kyuafile"), none, config::tree(), handle);
434*b0d29bc4SBrooks Davis 
435*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(2, suite.test_programs().size());
436*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::current_path() / "one",
437*b0d29bc4SBrooks Davis                    suite.test_programs()[0]->absolute_path());
438*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(fs::current_path() / "dir/two",
439*b0d29bc4SBrooks Davis                    suite.test_programs()[1]->absolute_path());
440*b0d29bc4SBrooks Davis 
441*b0d29bc4SBrooks Davis     handle.cleanup();
442*b0d29bc4SBrooks Davis }
443*b0d29bc4SBrooks Davis 
444*b0d29bc4SBrooks Davis 
445*b0d29bc4SBrooks Davis /// Verifies that load raises a load_error on a given input.
446*b0d29bc4SBrooks Davis ///
447*b0d29bc4SBrooks Davis /// \param file Name of the file to load.
448*b0d29bc4SBrooks Davis /// \param regex Expression to match on load_error's contents.
449*b0d29bc4SBrooks Davis static void
do_load_error_test(const char * file,const char * regex)450*b0d29bc4SBrooks Davis do_load_error_test(const char* file, const char* regex)
451*b0d29bc4SBrooks Davis {
452*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
453*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(engine::load_error, regex,
454*b0d29bc4SBrooks Davis                          engine::kyuafile::load(fs::path(file), none,
455*b0d29bc4SBrooks Davis                                                 config::tree(), handle));
456*b0d29bc4SBrooks Davis     handle.cleanup();
457*b0d29bc4SBrooks Davis }
458*b0d29bc4SBrooks Davis 
459*b0d29bc4SBrooks Davis 
460*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__test_program_not_basename);
ATF_TEST_CASE_BODY(kyuafile__load__test_program_not_basename)461*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__test_program_not_basename)
462*b0d29bc4SBrooks Davis {
463*b0d29bc4SBrooks Davis     atf::utils::create_file(
464*b0d29bc4SBrooks Davis         "config",
465*b0d29bc4SBrooks Davis         "syntax(2)\n"
466*b0d29bc4SBrooks Davis         "test_suite('abc')\n"
467*b0d29bc4SBrooks Davis         "atf_test_program{name='one'}\n"
468*b0d29bc4SBrooks Davis         "atf_test_program{name='./ls'}\n");
469*b0d29bc4SBrooks Davis 
470*b0d29bc4SBrooks Davis     atf::utils::create_file("one", "");
471*b0d29bc4SBrooks Davis     do_load_error_test("config", "./ls.*path components");
472*b0d29bc4SBrooks Davis }
473*b0d29bc4SBrooks Davis 
474*b0d29bc4SBrooks Davis 
475*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__lua_error);
ATF_TEST_CASE_BODY(kyuafile__load__lua_error)476*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__lua_error)
477*b0d29bc4SBrooks Davis {
478*b0d29bc4SBrooks Davis     atf::utils::create_file("config", "this syntax is invalid\n");
479*b0d29bc4SBrooks Davis 
480*b0d29bc4SBrooks Davis     do_load_error_test("config", ".*");
481*b0d29bc4SBrooks Davis }
482*b0d29bc4SBrooks Davis 
483*b0d29bc4SBrooks Davis 
484*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__syntax__not_called);
ATF_TEST_CASE_BODY(kyuafile__load__syntax__not_called)485*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__syntax__not_called)
486*b0d29bc4SBrooks Davis {
487*b0d29bc4SBrooks Davis     atf::utils::create_file("config", "");
488*b0d29bc4SBrooks Davis 
489*b0d29bc4SBrooks Davis     do_load_error_test("config", "syntax.* never called");
490*b0d29bc4SBrooks Davis }
491*b0d29bc4SBrooks Davis 
492*b0d29bc4SBrooks Davis 
493*b0d29bc4SBrooks Davis 
494*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__syntax__deprecated_format);
ATF_TEST_CASE_BODY(kyuafile__load__syntax__deprecated_format)495*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__syntax__deprecated_format)
496*b0d29bc4SBrooks Davis {
497*b0d29bc4SBrooks Davis     atf::utils::create_file("config", "syntax('foo', 1)\n");
498*b0d29bc4SBrooks Davis     do_load_error_test("config", "must be 'kyuafile'");
499*b0d29bc4SBrooks Davis 
500*b0d29bc4SBrooks Davis     atf::utils::create_file("config", "syntax('config', 2)\n");
501*b0d29bc4SBrooks Davis     do_load_error_test("config", "only takes one argument");
502*b0d29bc4SBrooks Davis }
503*b0d29bc4SBrooks Davis 
504*b0d29bc4SBrooks Davis 
505*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__syntax__twice);
ATF_TEST_CASE_BODY(kyuafile__load__syntax__twice)506*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__syntax__twice)
507*b0d29bc4SBrooks Davis {
508*b0d29bc4SBrooks Davis     atf::utils::create_file(
509*b0d29bc4SBrooks Davis         "config",
510*b0d29bc4SBrooks Davis         "syntax(2)\n"
511*b0d29bc4SBrooks Davis         "syntax(2)\n");
512*b0d29bc4SBrooks Davis 
513*b0d29bc4SBrooks Davis     do_load_error_test("config", "Can only call syntax.* once");
514*b0d29bc4SBrooks Davis }
515*b0d29bc4SBrooks Davis 
516*b0d29bc4SBrooks Davis 
517*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__syntax__bad_version);
ATF_TEST_CASE_BODY(kyuafile__load__syntax__bad_version)518*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__syntax__bad_version)
519*b0d29bc4SBrooks Davis {
520*b0d29bc4SBrooks Davis     atf::utils::create_file("config", "syntax(12)\n");
521*b0d29bc4SBrooks Davis 
522*b0d29bc4SBrooks Davis     do_load_error_test("config", "Unsupported file version 12");
523*b0d29bc4SBrooks Davis }
524*b0d29bc4SBrooks Davis 
525*b0d29bc4SBrooks Davis 
526*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__test_suite__missing);
ATF_TEST_CASE_BODY(kyuafile__load__test_suite__missing)527*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__test_suite__missing)
528*b0d29bc4SBrooks Davis {
529*b0d29bc4SBrooks Davis     atf::utils::create_file(
530*b0d29bc4SBrooks Davis         "config",
531*b0d29bc4SBrooks Davis         "syntax(2)\n"
532*b0d29bc4SBrooks Davis         "plain_test_program{name='one'}");
533*b0d29bc4SBrooks Davis 
534*b0d29bc4SBrooks Davis     atf::utils::create_file("one", "");
535*b0d29bc4SBrooks Davis 
536*b0d29bc4SBrooks Davis     do_load_error_test("config", "No test suite defined");
537*b0d29bc4SBrooks Davis }
538*b0d29bc4SBrooks Davis 
539*b0d29bc4SBrooks Davis 
540*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__test_suite__twice);
ATF_TEST_CASE_BODY(kyuafile__load__test_suite__twice)541*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__test_suite__twice)
542*b0d29bc4SBrooks Davis {
543*b0d29bc4SBrooks Davis     atf::utils::create_file(
544*b0d29bc4SBrooks Davis         "config",
545*b0d29bc4SBrooks Davis         "syntax(2)\n"
546*b0d29bc4SBrooks Davis         "test_suite('foo')\n"
547*b0d29bc4SBrooks Davis         "test_suite('bar')\n");
548*b0d29bc4SBrooks Davis 
549*b0d29bc4SBrooks Davis     do_load_error_test("config", "Can only call test_suite.* once");
550*b0d29bc4SBrooks Davis }
551*b0d29bc4SBrooks Davis 
552*b0d29bc4SBrooks Davis 
553*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__missing_file);
ATF_TEST_CASE_BODY(kyuafile__load__missing_file)554*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__missing_file)
555*b0d29bc4SBrooks Davis {
556*b0d29bc4SBrooks Davis     do_load_error_test("missing", "Load of 'missing' failed");
557*b0d29bc4SBrooks Davis }
558*b0d29bc4SBrooks Davis 
559*b0d29bc4SBrooks Davis 
560*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(kyuafile__load__missing_test_program);
ATF_TEST_CASE_BODY(kyuafile__load__missing_test_program)561*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(kyuafile__load__missing_test_program)
562*b0d29bc4SBrooks Davis {
563*b0d29bc4SBrooks Davis     atf::utils::create_file(
564*b0d29bc4SBrooks Davis         "config",
565*b0d29bc4SBrooks Davis         "syntax(2)\n"
566*b0d29bc4SBrooks Davis         "atf_test_program{name='one', test_suite='first'}\n"
567*b0d29bc4SBrooks Davis         "atf_test_program{name='two', test_suite='first'}\n");
568*b0d29bc4SBrooks Davis 
569*b0d29bc4SBrooks Davis     atf::utils::create_file("one", "");
570*b0d29bc4SBrooks Davis 
571*b0d29bc4SBrooks Davis     do_load_error_test("config", "Non-existent.*'two'");
572*b0d29bc4SBrooks Davis }
573*b0d29bc4SBrooks Davis 
574*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)575*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
576*b0d29bc4SBrooks Davis {
577*b0d29bc4SBrooks Davis     scheduler::register_interface(
578*b0d29bc4SBrooks Davis         "atf", std::shared_ptr< scheduler::interface >(
579*b0d29bc4SBrooks Davis             new engine::atf_interface()));
580*b0d29bc4SBrooks Davis     scheduler::register_interface(
581*b0d29bc4SBrooks Davis         "plain", std::shared_ptr< scheduler::interface >(
582*b0d29bc4SBrooks Davis             new engine::plain_interface()));
583*b0d29bc4SBrooks Davis     scheduler::register_interface(
584*b0d29bc4SBrooks Davis         "tap", std::shared_ptr< scheduler::interface >(
585*b0d29bc4SBrooks Davis             new engine::tap_interface()));
586*b0d29bc4SBrooks Davis 
587*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__empty);
588*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__real_interfaces);
589*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__mock_interfaces);
590*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__metadata);
591*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__current_directory);
592*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__other_directory);
593*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__build_directory);
594*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__absolute_paths_are_stable);
595*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__fs_calls_are_relative);
596*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__test_program_not_basename);
597*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__lua_error);
598*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__syntax__not_called);
599*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__syntax__deprecated_format);
600*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__syntax__twice);
601*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__syntax__bad_version);
602*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__test_suite__missing);
603*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__test_suite__twice);
604*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__missing_file);
605*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile__load__missing_test_program);
606*b0d29bc4SBrooks Davis }
607