xref: /freebsd/contrib/kyua/engine/atf_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
1*b0d29bc4SBrooks Davis // Copyright 2014 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/atf.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <sys/stat.h>
33*b0d29bc4SBrooks Davis 
34*b0d29bc4SBrooks Davis #include <signal.h>
35*b0d29bc4SBrooks Davis }
36*b0d29bc4SBrooks Davis 
37*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
38*b0d29bc4SBrooks Davis 
39*b0d29bc4SBrooks Davis #include "engine/config.hpp"
40*b0d29bc4SBrooks Davis #include "engine/scheduler.hpp"
41*b0d29bc4SBrooks Davis #include "model/metadata.hpp"
42*b0d29bc4SBrooks Davis #include "model/test_case.hpp"
43*b0d29bc4SBrooks Davis #include "model/test_program_fwd.hpp"
44*b0d29bc4SBrooks Davis #include "model/test_result.hpp"
45*b0d29bc4SBrooks Davis #include "utils/config/tree.ipp"
46*b0d29bc4SBrooks Davis #include "utils/datetime.hpp"
47*b0d29bc4SBrooks Davis #include "utils/env.hpp"
48*b0d29bc4SBrooks Davis #include "utils/format/containers.ipp"
49*b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
50*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
51*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
52*b0d29bc4SBrooks Davis #include "utils/optional.ipp"
53*b0d29bc4SBrooks Davis #include "utils/stacktrace.hpp"
54*b0d29bc4SBrooks Davis #include "utils/test_utils.ipp"
55*b0d29bc4SBrooks Davis 
56*b0d29bc4SBrooks Davis namespace config = utils::config;
57*b0d29bc4SBrooks Davis namespace datetime = utils::datetime;
58*b0d29bc4SBrooks Davis namespace fs = utils::fs;
59*b0d29bc4SBrooks Davis namespace scheduler = engine::scheduler;
60*b0d29bc4SBrooks Davis 
61*b0d29bc4SBrooks Davis using utils::none;
62*b0d29bc4SBrooks Davis 
63*b0d29bc4SBrooks Davis 
64*b0d29bc4SBrooks Davis namespace {
65*b0d29bc4SBrooks Davis 
66*b0d29bc4SBrooks Davis 
67*b0d29bc4SBrooks Davis /// Lists the test cases associated with an ATF test program.
68*b0d29bc4SBrooks Davis ///
69*b0d29bc4SBrooks Davis /// \param program_name Basename of the test program to run.
70*b0d29bc4SBrooks Davis /// \param root Path to the base of the test suite.
71*b0d29bc4SBrooks Davis /// \param names_filter Whitespace-separated list of test cases that the helper
72*b0d29bc4SBrooks Davis ///     test program is allowed to expose.
73*b0d29bc4SBrooks Davis /// \param user_config User-provided configuration.
74*b0d29bc4SBrooks Davis ///
75*b0d29bc4SBrooks Davis /// \return The list of loaded test cases.
76*b0d29bc4SBrooks Davis static model::test_cases_map
list_one(const char * program_name,const fs::path & root,const char * names_filter=NULL,config::tree user_config=engine::empty_config ())77*b0d29bc4SBrooks Davis list_one(const char* program_name,
78*b0d29bc4SBrooks Davis          const fs::path& root,
79*b0d29bc4SBrooks Davis          const char* names_filter = NULL,
80*b0d29bc4SBrooks Davis          config::tree user_config = engine::empty_config())
81*b0d29bc4SBrooks Davis {
82*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
83*b0d29bc4SBrooks Davis 
84*b0d29bc4SBrooks Davis     const scheduler::lazy_test_program program(
85*b0d29bc4SBrooks Davis         "atf", fs::path(program_name), root, "the-suite",
86*b0d29bc4SBrooks Davis         model::metadata_builder().build(), user_config, handle);
87*b0d29bc4SBrooks Davis 
88*b0d29bc4SBrooks Davis     if (names_filter != NULL)
89*b0d29bc4SBrooks Davis         utils::setenv("TEST_CASES", names_filter);
90*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = handle.list_tests(
91*b0d29bc4SBrooks Davis         &program, user_config);
92*b0d29bc4SBrooks Davis 
93*b0d29bc4SBrooks Davis     handle.cleanup();
94*b0d29bc4SBrooks Davis 
95*b0d29bc4SBrooks Davis     return test_cases;
96*b0d29bc4SBrooks Davis }
97*b0d29bc4SBrooks Davis 
98*b0d29bc4SBrooks Davis 
99*b0d29bc4SBrooks Davis /// Runs a bogus test program and checks the error result.
100*b0d29bc4SBrooks Davis ///
101*b0d29bc4SBrooks Davis /// \param exp_error Expected error string to find.
102*b0d29bc4SBrooks Davis /// \param program_name Basename of the test program to run.
103*b0d29bc4SBrooks Davis /// \param root Path to the base of the test suite.
104*b0d29bc4SBrooks Davis /// \param names_filter Whitespace-separated list of test cases that the helper
105*b0d29bc4SBrooks Davis ///     test program is allowed to expose.
106*b0d29bc4SBrooks Davis static void
check_list_one_fail(const char * exp_error,const char * program_name,const fs::path & root,const char * names_filter=NULL)107*b0d29bc4SBrooks Davis check_list_one_fail(const char* exp_error,
108*b0d29bc4SBrooks Davis                     const char* program_name,
109*b0d29bc4SBrooks Davis                     const fs::path& root,
110*b0d29bc4SBrooks Davis                     const char* names_filter = NULL)
111*b0d29bc4SBrooks Davis {
112*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = list_one(
113*b0d29bc4SBrooks Davis         program_name, root, names_filter);
114*b0d29bc4SBrooks Davis 
115*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(1, test_cases.size());
116*b0d29bc4SBrooks Davis     const model::test_case& test_case = test_cases.begin()->second;
117*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("__test_cases_list__", test_case.name());
118*b0d29bc4SBrooks Davis     ATF_REQUIRE(test_case.fake_result());
119*b0d29bc4SBrooks Davis     ATF_REQUIRE_MATCH(exp_error,
120*b0d29bc4SBrooks Davis                       test_case.fake_result().get().reason());
121*b0d29bc4SBrooks Davis }
122*b0d29bc4SBrooks Davis 
123*b0d29bc4SBrooks Davis 
124*b0d29bc4SBrooks Davis /// Runs one ATF test program and checks its result.
125*b0d29bc4SBrooks Davis ///
126*b0d29bc4SBrooks Davis /// \param tc Pointer to the calling test case, to obtain srcdir.
127*b0d29bc4SBrooks Davis /// \param test_case_name Name of the "test case" to select from the helper
128*b0d29bc4SBrooks Davis ///     program.
129*b0d29bc4SBrooks Davis /// \param exp_result The expected result.
130*b0d29bc4SBrooks Davis /// \param user_config User-provided configuration.
131*b0d29bc4SBrooks Davis /// \param check_empty_output If true, verify that the output of the test is
132*b0d29bc4SBrooks Davis ///     silent.  This is just a hack to implement one of the test cases; we'd
133*b0d29bc4SBrooks Davis ///     easily have a nicer abstraction here...
134*b0d29bc4SBrooks Davis static void
run_one(const atf::tests::tc * tc,const char * test_case_name,const model::test_result & exp_result,config::tree user_config=engine::empty_config (),const bool check_empty_output=false)135*b0d29bc4SBrooks Davis run_one(const atf::tests::tc* tc, const char* test_case_name,
136*b0d29bc4SBrooks Davis         const model::test_result& exp_result,
137*b0d29bc4SBrooks Davis         config::tree user_config = engine::empty_config(),
138*b0d29bc4SBrooks Davis         const bool check_empty_output = false)
139*b0d29bc4SBrooks Davis {
140*b0d29bc4SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
141*b0d29bc4SBrooks Davis 
142*b0d29bc4SBrooks Davis     const model::test_program_ptr program(new scheduler::lazy_test_program(
143*b0d29bc4SBrooks Davis         "atf", fs::path("atf_helpers"), fs::path(tc->get_config_var("srcdir")),
144*b0d29bc4SBrooks Davis         "the-suite", model::metadata_builder().build(),
145*b0d29bc4SBrooks Davis         user_config, handle));
146*b0d29bc4SBrooks Davis 
147*b0d29bc4SBrooks Davis     (void)handle.spawn_test(program, test_case_name, user_config);
148*b0d29bc4SBrooks Davis 
149*b0d29bc4SBrooks Davis     scheduler::result_handle_ptr result_handle = handle.wait_any();
150*b0d29bc4SBrooks Davis     const scheduler::test_result_handle* test_result_handle =
151*b0d29bc4SBrooks Davis         dynamic_cast< const scheduler::test_result_handle* >(
152*b0d29bc4SBrooks Davis             result_handle.get());
153*b0d29bc4SBrooks Davis     atf::utils::cat_file(result_handle->stdout_file().str(), "stdout: ");
154*b0d29bc4SBrooks Davis     atf::utils::cat_file(result_handle->stderr_file().str(), "stderr: ");
155*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_result, test_result_handle->test_result());
156*b0d29bc4SBrooks Davis     if (check_empty_output) {
157*b0d29bc4SBrooks Davis         ATF_REQUIRE(atf::utils::compare_file(result_handle->stdout_file().str(),
158*b0d29bc4SBrooks Davis                                              ""));
159*b0d29bc4SBrooks Davis         ATF_REQUIRE(atf::utils::compare_file(result_handle->stderr_file().str(),
160*b0d29bc4SBrooks Davis                                              ""));
161*b0d29bc4SBrooks Davis     }
162*b0d29bc4SBrooks Davis     result_handle->cleanup();
163*b0d29bc4SBrooks Davis     result_handle.reset();
164*b0d29bc4SBrooks Davis 
165*b0d29bc4SBrooks Davis     handle.cleanup();
166*b0d29bc4SBrooks Davis }
167*b0d29bc4SBrooks Davis 
168*b0d29bc4SBrooks Davis 
169*b0d29bc4SBrooks Davis }  // anonymous namespace
170*b0d29bc4SBrooks Davis 
171*b0d29bc4SBrooks Davis 
172*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__ok);
ATF_TEST_CASE_BODY(list__ok)173*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__ok)
174*b0d29bc4SBrooks Davis {
175*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = list_one(
176*b0d29bc4SBrooks Davis         "atf_helpers", fs::path(get_config_var("srcdir")), "pass crash");
177*b0d29bc4SBrooks Davis 
178*b0d29bc4SBrooks Davis     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
179*b0d29bc4SBrooks Davis         .add("crash")
180*b0d29bc4SBrooks Davis         .add("pass", model::metadata_builder()
181*b0d29bc4SBrooks Davis              .set_description("Always-passing test case")
182*b0d29bc4SBrooks Davis              .build())
183*b0d29bc4SBrooks Davis         .build();
184*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
185*b0d29bc4SBrooks Davis }
186*b0d29bc4SBrooks Davis 
187*b0d29bc4SBrooks Davis 
188*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__configuration_variables);
ATF_TEST_CASE_BODY(list__configuration_variables)189*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__configuration_variables)
190*b0d29bc4SBrooks Davis {
191*b0d29bc4SBrooks Davis     config::tree user_config = engine::empty_config();
192*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.var1", "value1");
193*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.var2", "value2");
194*b0d29bc4SBrooks Davis 
195*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = list_one(
196*b0d29bc4SBrooks Davis         "atf_helpers", fs::path(get_config_var("srcdir")), "check_list_config",
197*b0d29bc4SBrooks Davis         user_config);
198*b0d29bc4SBrooks Davis 
199*b0d29bc4SBrooks Davis     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
200*b0d29bc4SBrooks Davis         .add("check_list_config", model::metadata_builder()
201*b0d29bc4SBrooks Davis              .set_description("Found: var1=value1 var2=value2")
202*b0d29bc4SBrooks Davis              .build())
203*b0d29bc4SBrooks Davis         .build();
204*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
205*b0d29bc4SBrooks Davis }
206*b0d29bc4SBrooks Davis 
207*b0d29bc4SBrooks Davis 
208*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__current_directory);
ATF_TEST_CASE_BODY(list__current_directory)209*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__current_directory)
210*b0d29bc4SBrooks Davis {
211*b0d29bc4SBrooks Davis     const fs::path helpers = fs::path(get_config_var("srcdir")) / "atf_helpers";
212*b0d29bc4SBrooks Davis     ATF_REQUIRE(::symlink(helpers.c_str(), "atf_helpers") != -1);
213*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = list_one(
214*b0d29bc4SBrooks Davis         "atf_helpers", fs::path("."), "pass");
215*b0d29bc4SBrooks Davis 
216*b0d29bc4SBrooks Davis     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
217*b0d29bc4SBrooks Davis         .add("pass", model::metadata_builder()
218*b0d29bc4SBrooks Davis              .set_description("Always-passing test case")
219*b0d29bc4SBrooks Davis              .build())
220*b0d29bc4SBrooks Davis         .build();
221*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
222*b0d29bc4SBrooks Davis }
223*b0d29bc4SBrooks Davis 
224*b0d29bc4SBrooks Davis 
225*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__relative_path);
ATF_TEST_CASE_BODY(list__relative_path)226*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__relative_path)
227*b0d29bc4SBrooks Davis {
228*b0d29bc4SBrooks Davis     const fs::path helpers = fs::path(get_config_var("srcdir")) / "atf_helpers";
229*b0d29bc4SBrooks Davis     ATF_REQUIRE(::mkdir("dir1", 0755) != -1);
230*b0d29bc4SBrooks Davis     ATF_REQUIRE(::mkdir("dir1/dir2", 0755) != -1);
231*b0d29bc4SBrooks Davis     ATF_REQUIRE(::symlink(helpers.c_str(), "dir1/dir2/atf_helpers") != -1);
232*b0d29bc4SBrooks Davis     const model::test_cases_map test_cases = list_one(
233*b0d29bc4SBrooks Davis         "dir2/atf_helpers", fs::path("dir1"), "pass");
234*b0d29bc4SBrooks Davis 
235*b0d29bc4SBrooks Davis     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
236*b0d29bc4SBrooks Davis         .add("pass", model::metadata_builder()
237*b0d29bc4SBrooks Davis              .set_description("Always-passing test case")
238*b0d29bc4SBrooks Davis              .build())
239*b0d29bc4SBrooks Davis         .build();
240*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
241*b0d29bc4SBrooks Davis }
242*b0d29bc4SBrooks Davis 
243*b0d29bc4SBrooks Davis 
244*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__missing_test_program);
ATF_TEST_CASE_BODY(list__missing_test_program)245*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__missing_test_program)
246*b0d29bc4SBrooks Davis {
247*b0d29bc4SBrooks Davis     check_list_one_fail("Cannot find test program", "non-existent",
248*b0d29bc4SBrooks Davis                         fs::current_path());
249*b0d29bc4SBrooks Davis }
250*b0d29bc4SBrooks Davis 
251*b0d29bc4SBrooks Davis 
252*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__not_a_test_program);
ATF_TEST_CASE_BODY(list__not_a_test_program)253*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__not_a_test_program)
254*b0d29bc4SBrooks Davis {
255*b0d29bc4SBrooks Davis     atf::utils::create_file("not-valid", "garbage\n");
256*b0d29bc4SBrooks Davis     ATF_REQUIRE(::chmod("not-valid", 0755) != -1);
257*b0d29bc4SBrooks Davis     check_list_one_fail("Invalid test program format", "not-valid",
258*b0d29bc4SBrooks Davis                         fs::current_path());
259*b0d29bc4SBrooks Davis }
260*b0d29bc4SBrooks Davis 
261*b0d29bc4SBrooks Davis 
262*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__no_permissions);
ATF_TEST_CASE_BODY(list__no_permissions)263*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__no_permissions)
264*b0d29bc4SBrooks Davis {
265*b0d29bc4SBrooks Davis     atf::utils::create_file("not-executable", "garbage\n");
266*b0d29bc4SBrooks Davis     check_list_one_fail("Permission denied to run test program",
267*b0d29bc4SBrooks Davis                         "not-executable", fs::current_path());
268*b0d29bc4SBrooks Davis }
269*b0d29bc4SBrooks Davis 
270*b0d29bc4SBrooks Davis 
271*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__abort);
ATF_TEST_CASE_BODY(list__abort)272*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__abort)
273*b0d29bc4SBrooks Davis {
274*b0d29bc4SBrooks Davis     check_list_one_fail("Test program received signal", "atf_helpers",
275*b0d29bc4SBrooks Davis                         fs::path(get_config_var("srcdir")),
276*b0d29bc4SBrooks Davis                         "crash_head");
277*b0d29bc4SBrooks Davis }
278*b0d29bc4SBrooks Davis 
279*b0d29bc4SBrooks Davis 
280*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__empty);
ATF_TEST_CASE_BODY(list__empty)281*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__empty)
282*b0d29bc4SBrooks Davis {
283*b0d29bc4SBrooks Davis     check_list_one_fail("No test cases", "atf_helpers",
284*b0d29bc4SBrooks Davis                         fs::path(get_config_var("srcdir")),
285*b0d29bc4SBrooks Davis                         "");
286*b0d29bc4SBrooks Davis }
287*b0d29bc4SBrooks Davis 
288*b0d29bc4SBrooks Davis 
289*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list__stderr_not_quiet);
ATF_TEST_CASE_BODY(list__stderr_not_quiet)290*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list__stderr_not_quiet)
291*b0d29bc4SBrooks Davis {
292*b0d29bc4SBrooks Davis     check_list_one_fail("Test case list wrote to stderr", "atf_helpers",
293*b0d29bc4SBrooks Davis                         fs::path(get_config_var("srcdir")),
294*b0d29bc4SBrooks Davis                         "output_in_list");
295*b0d29bc4SBrooks Davis }
296*b0d29bc4SBrooks Davis 
297*b0d29bc4SBrooks Davis 
298*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__passes);
ATF_TEST_CASE_BODY(test__body_only__passes)299*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_only__passes)
300*b0d29bc4SBrooks Davis {
301*b0d29bc4SBrooks Davis     const model::test_result exp_result(model::test_result_passed);
302*b0d29bc4SBrooks Davis     run_one(this, "pass", exp_result);
303*b0d29bc4SBrooks Davis }
304*b0d29bc4SBrooks Davis 
305*b0d29bc4SBrooks Davis 
306*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__crashes);
ATF_TEST_CASE_BODY(test__body_only__crashes)307*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_only__crashes)
308*b0d29bc4SBrooks Davis {
309*b0d29bc4SBrooks Davis     utils::prepare_coredump_test(this);
310*b0d29bc4SBrooks Davis 
311*b0d29bc4SBrooks Davis     const model::test_result exp_result(
312*b0d29bc4SBrooks Davis         model::test_result_broken,
313*b0d29bc4SBrooks Davis         F("Premature exit; test case received signal %s (core dumped)") %
314*b0d29bc4SBrooks Davis         SIGABRT);
315*b0d29bc4SBrooks Davis     run_one(this, "crash", exp_result);
316*b0d29bc4SBrooks Davis }
317*b0d29bc4SBrooks Davis 
318*b0d29bc4SBrooks Davis 
319*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__times_out);
ATF_TEST_CASE_BODY(test__body_only__times_out)320*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_only__times_out)
321*b0d29bc4SBrooks Davis {
322*b0d29bc4SBrooks Davis     config::tree user_config = engine::empty_config();
323*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.control_dir",
324*b0d29bc4SBrooks Davis                            fs::current_path().str());
325*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.timeout", "1");
326*b0d29bc4SBrooks Davis 
327*b0d29bc4SBrooks Davis     const model::test_result exp_result(
328*b0d29bc4SBrooks Davis         model::test_result_broken, "Test case body timed out");
329*b0d29bc4SBrooks Davis     run_one(this, "timeout_body", exp_result, user_config);
330*b0d29bc4SBrooks Davis 
331*b0d29bc4SBrooks Davis     ATF_REQUIRE(!atf::utils::file_exists("cookie"));
332*b0d29bc4SBrooks Davis }
333*b0d29bc4SBrooks Davis 
334*b0d29bc4SBrooks Davis 
335*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__configuration_variables);
ATF_TEST_CASE_BODY(test__body_only__configuration_variables)336*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_only__configuration_variables)
337*b0d29bc4SBrooks Davis {
338*b0d29bc4SBrooks Davis     config::tree user_config = engine::empty_config();
339*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.first", "some value");
340*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.second", "some other value");
341*b0d29bc4SBrooks Davis 
342*b0d29bc4SBrooks Davis     const model::test_result exp_result(model::test_result_passed);
343*b0d29bc4SBrooks Davis     run_one(this, "check_configuration_variables", exp_result, user_config);
344*b0d29bc4SBrooks Davis }
345*b0d29bc4SBrooks Davis 
346*b0d29bc4SBrooks Davis 
347*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__no_atf_run_warning);
ATF_TEST_CASE_BODY(test__body_only__no_atf_run_warning)348*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_only__no_atf_run_warning)
349*b0d29bc4SBrooks Davis {
350*b0d29bc4SBrooks Davis     const model::test_result exp_result(model::test_result_passed);
351*b0d29bc4SBrooks Davis     run_one(this, "pass", exp_result, engine::empty_config(), true);
352*b0d29bc4SBrooks Davis }
353*b0d29bc4SBrooks Davis 
354*b0d29bc4SBrooks Davis 
355*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_and_cleanup__body_times_out);
ATF_TEST_CASE_BODY(test__body_and_cleanup__body_times_out)356*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_and_cleanup__body_times_out)
357*b0d29bc4SBrooks Davis {
358*b0d29bc4SBrooks Davis     config::tree user_config = engine::empty_config();
359*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.control_dir",
360*b0d29bc4SBrooks Davis                            fs::current_path().str());
361*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.timeout", "1");
362*b0d29bc4SBrooks Davis 
363*b0d29bc4SBrooks Davis     const model::test_result exp_result(
364*b0d29bc4SBrooks Davis         model::test_result_broken, "Test case body timed out");
365*b0d29bc4SBrooks Davis     run_one(this, "timeout_body", exp_result, user_config);
366*b0d29bc4SBrooks Davis 
367*b0d29bc4SBrooks Davis     ATF_REQUIRE(!atf::utils::file_exists("cookie"));
368*b0d29bc4SBrooks Davis     ATF_REQUIRE(atf::utils::file_exists("cookie.cleanup"));
369*b0d29bc4SBrooks Davis }
370*b0d29bc4SBrooks Davis 
371*b0d29bc4SBrooks Davis 
372*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_and_cleanup__cleanup_crashes);
ATF_TEST_CASE_BODY(test__body_and_cleanup__cleanup_crashes)373*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_and_cleanup__cleanup_crashes)
374*b0d29bc4SBrooks Davis {
375*b0d29bc4SBrooks Davis     const model::test_result exp_result(
376*b0d29bc4SBrooks Davis         model::test_result_broken,
377*b0d29bc4SBrooks Davis         "Test case cleanup did not terminate successfully");
378*b0d29bc4SBrooks Davis     run_one(this, "crash_cleanup", exp_result);
379*b0d29bc4SBrooks Davis }
380*b0d29bc4SBrooks Davis 
381*b0d29bc4SBrooks Davis 
382*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_and_cleanup__cleanup_times_out);
ATF_TEST_CASE_BODY(test__body_and_cleanup__cleanup_times_out)383*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_and_cleanup__cleanup_times_out)
384*b0d29bc4SBrooks Davis {
385*b0d29bc4SBrooks Davis     config::tree user_config = engine::empty_config();
386*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.control_dir",
387*b0d29bc4SBrooks Davis                            fs::current_path().str());
388*b0d29bc4SBrooks Davis 
389*b0d29bc4SBrooks Davis     scheduler::cleanup_timeout = datetime::delta(1, 0);
390*b0d29bc4SBrooks Davis     const model::test_result exp_result(
391*b0d29bc4SBrooks Davis         model::test_result_broken, "Test case cleanup timed out");
392*b0d29bc4SBrooks Davis     run_one(this, "timeout_cleanup", exp_result, user_config);
393*b0d29bc4SBrooks Davis 
394*b0d29bc4SBrooks Davis     ATF_REQUIRE(!atf::utils::file_exists("cookie"));
395*b0d29bc4SBrooks Davis }
396*b0d29bc4SBrooks Davis 
397*b0d29bc4SBrooks Davis 
398*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_and_cleanup__expect_timeout);
ATF_TEST_CASE_BODY(test__body_and_cleanup__expect_timeout)399*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_and_cleanup__expect_timeout)
400*b0d29bc4SBrooks Davis {
401*b0d29bc4SBrooks Davis     config::tree user_config = engine::empty_config();
402*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.control_dir",
403*b0d29bc4SBrooks Davis                            fs::current_path().str());
404*b0d29bc4SBrooks Davis     user_config.set_string("test_suites.the-suite.timeout", "1");
405*b0d29bc4SBrooks Davis 
406*b0d29bc4SBrooks Davis     const model::test_result exp_result(
407*b0d29bc4SBrooks Davis         model::test_result_expected_failure, "Times out on purpose");
408*b0d29bc4SBrooks Davis     run_one(this, "expect_timeout", exp_result, user_config);
409*b0d29bc4SBrooks Davis 
410*b0d29bc4SBrooks Davis     ATF_REQUIRE(!atf::utils::file_exists("cookie"));
411*b0d29bc4SBrooks Davis     ATF_REQUIRE(atf::utils::file_exists("cookie.cleanup"));
412*b0d29bc4SBrooks Davis }
413*b0d29bc4SBrooks Davis 
414*b0d29bc4SBrooks Davis 
415*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(test__body_and_cleanup__shared_workdir);
ATF_TEST_CASE_BODY(test__body_and_cleanup__shared_workdir)416*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(test__body_and_cleanup__shared_workdir)
417*b0d29bc4SBrooks Davis {
418*b0d29bc4SBrooks Davis     const model::test_result exp_result(model::test_result_passed);
419*b0d29bc4SBrooks Davis     run_one(this, "shared_workdir", exp_result);
420*b0d29bc4SBrooks Davis }
421*b0d29bc4SBrooks Davis 
422*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)423*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
424*b0d29bc4SBrooks Davis {
425*b0d29bc4SBrooks Davis     scheduler::register_interface(
426*b0d29bc4SBrooks Davis         "atf", std::shared_ptr< scheduler::interface >(
427*b0d29bc4SBrooks Davis             new engine::atf_interface()));
428*b0d29bc4SBrooks Davis 
429*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__ok);
430*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__configuration_variables);
431*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__current_directory);
432*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__relative_path);
433*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__missing_test_program);
434*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__not_a_test_program);
435*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__no_permissions);
436*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__abort);
437*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__empty);
438*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, list__stderr_not_quiet);
439*b0d29bc4SBrooks Davis 
440*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_only__passes);
441*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_only__crashes);
442*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_only__times_out);
443*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_only__configuration_variables);
444*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_only__no_atf_run_warning);
445*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_and_cleanup__body_times_out);
446*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_and_cleanup__cleanup_crashes);
447*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_and_cleanup__cleanup_times_out);
448*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_and_cleanup__expect_timeout);
449*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, test__body_and_cleanup__shared_workdir);
450*b0d29bc4SBrooks Davis }
451