xref: /freebsd/contrib/kyua/engine/googletest_test.cpp (revision eb8f69902f7de8012a31a85db2f88a54584f81af)
1*eb8f6990SEnji Cooper // Copyright 2024 The Kyua Authors.
2*eb8f6990SEnji Cooper // All rights reserved.
3*eb8f6990SEnji Cooper //
4*eb8f6990SEnji Cooper // Redistribution and use in source and binary forms, with or without
5*eb8f6990SEnji Cooper // modification, are permitted provided that the following conditions are
6*eb8f6990SEnji Cooper // met:
7*eb8f6990SEnji Cooper //
8*eb8f6990SEnji Cooper // * Redistributions of source code must retain the above copyright
9*eb8f6990SEnji Cooper //   notice, this list of conditions and the following disclaimer.
10*eb8f6990SEnji Cooper // * Redistributions in binary form must reproduce the above copyright
11*eb8f6990SEnji Cooper //   notice, this list of conditions and the following disclaimer in the
12*eb8f6990SEnji Cooper //   documentation and/or other materials provided with the distribution.
13*eb8f6990SEnji Cooper // * Neither the name of Google Inc. nor the names of its contributors
14*eb8f6990SEnji Cooper //   may be used to endorse or promote products derived from this software
15*eb8f6990SEnji Cooper //   without specific prior written permission.
16*eb8f6990SEnji Cooper //
17*eb8f6990SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*eb8f6990SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*eb8f6990SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*eb8f6990SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*eb8f6990SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*eb8f6990SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*eb8f6990SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*eb8f6990SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*eb8f6990SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*eb8f6990SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*eb8f6990SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*eb8f6990SEnji Cooper 
29*eb8f6990SEnji Cooper #include "engine/googletest.hpp"
30*eb8f6990SEnji Cooper 
31*eb8f6990SEnji Cooper extern "C" {
32*eb8f6990SEnji Cooper #include <sys/stat.h>
33*eb8f6990SEnji Cooper 
34*eb8f6990SEnji Cooper #include <signal.h>
35*eb8f6990SEnji Cooper }
36*eb8f6990SEnji Cooper 
37*eb8f6990SEnji Cooper #include <atf-c++.hpp>
38*eb8f6990SEnji Cooper 
39*eb8f6990SEnji Cooper #include "engine/config.hpp"
40*eb8f6990SEnji Cooper #include "engine/scheduler.hpp"
41*eb8f6990SEnji Cooper #include "model/metadata.hpp"
42*eb8f6990SEnji Cooper #include "model/test_case.hpp"
43*eb8f6990SEnji Cooper #include "model/test_program_fwd.hpp"
44*eb8f6990SEnji Cooper #include "model/test_result.hpp"
45*eb8f6990SEnji Cooper #include "utils/config/tree.ipp"
46*eb8f6990SEnji Cooper #include "utils/datetime.hpp"
47*eb8f6990SEnji Cooper #include "utils/env.hpp"
48*eb8f6990SEnji Cooper #include "utils/format/containers.ipp"
49*eb8f6990SEnji Cooper #include "utils/format/macros.hpp"
50*eb8f6990SEnji Cooper #include "utils/fs/operations.hpp"
51*eb8f6990SEnji Cooper #include "utils/fs/path.hpp"
52*eb8f6990SEnji Cooper #include "utils/optional.ipp"
53*eb8f6990SEnji Cooper #include "utils/stacktrace.hpp"
54*eb8f6990SEnji Cooper #include "utils/test_utils.ipp"
55*eb8f6990SEnji Cooper 
56*eb8f6990SEnji Cooper namespace config = utils::config;
57*eb8f6990SEnji Cooper namespace datetime = utils::datetime;
58*eb8f6990SEnji Cooper namespace fs = utils::fs;
59*eb8f6990SEnji Cooper namespace scheduler = engine::scheduler;
60*eb8f6990SEnji Cooper 
61*eb8f6990SEnji Cooper using utils::none;
62*eb8f6990SEnji Cooper 
63*eb8f6990SEnji Cooper 
64*eb8f6990SEnji Cooper namespace {
65*eb8f6990SEnji Cooper 
66*eb8f6990SEnji Cooper 
67*eb8f6990SEnji Cooper /// Prefix for all testcases.
68*eb8f6990SEnji Cooper const std::string test_suite = "Suite.";
69*eb8f6990SEnji Cooper 
70*eb8f6990SEnji Cooper 
71*eb8f6990SEnji Cooper /// Runs one googletest test program and checks its result.
72*eb8f6990SEnji Cooper ///
73*eb8f6990SEnji Cooper /// \param program_name Basename of the test program to run.
74*eb8f6990SEnji Cooper /// \param root Path to the base of the test suite.
75*eb8f6990SEnji Cooper /// \param user_config User-provided configuration.
76*eb8f6990SEnji Cooper ///
77*eb8f6990SEnji Cooper /// \return The list of loaded test cases.
78*eb8f6990SEnji Cooper static model::test_cases_map
79*eb8f6990SEnji Cooper list(const char* program_name,
80*eb8f6990SEnji Cooper      const fs::path& root,
81*eb8f6990SEnji Cooper      config::tree user_config = engine::empty_config())
82*eb8f6990SEnji Cooper {
83*eb8f6990SEnji Cooper     scheduler::scheduler_handle handle = scheduler::setup();
84*eb8f6990SEnji Cooper 
85*eb8f6990SEnji Cooper     const scheduler::lazy_test_program program(
86*eb8f6990SEnji Cooper         "googletest", fs::path(program_name), root, "the-suite",
87*eb8f6990SEnji Cooper         model::metadata_builder().build(), user_config, handle);
88*eb8f6990SEnji Cooper 
89*eb8f6990SEnji Cooper     const model::test_cases_map test_cases = handle.list_tests(
90*eb8f6990SEnji Cooper         &program, user_config);
91*eb8f6990SEnji Cooper 
92*eb8f6990SEnji Cooper     handle.cleanup();
93*eb8f6990SEnji Cooper 
94*eb8f6990SEnji Cooper     return test_cases;
95*eb8f6990SEnji Cooper }
96*eb8f6990SEnji Cooper 
97*eb8f6990SEnji Cooper 
98*eb8f6990SEnji Cooper /// Runs a bogus test program and checks the error result.
99*eb8f6990SEnji Cooper ///
100*eb8f6990SEnji Cooper /// \param exp_error Expected error string to find.
101*eb8f6990SEnji Cooper /// \param program_name Basename of the test program to run.
102*eb8f6990SEnji Cooper /// \param root Path to the base of the test suite.
103*eb8f6990SEnji Cooper static void
104*eb8f6990SEnji Cooper check_list_fail(const char* exp_error,
105*eb8f6990SEnji Cooper                 const char* program_name,
106*eb8f6990SEnji Cooper                 const fs::path& root)
107*eb8f6990SEnji Cooper {
108*eb8f6990SEnji Cooper     const model::test_cases_map test_cases = list(
109*eb8f6990SEnji Cooper         program_name, root);
110*eb8f6990SEnji Cooper 
111*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(1, test_cases.size());
112*eb8f6990SEnji Cooper     const model::test_case& test_case = test_cases.begin()->second;
113*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ("__test_cases_list__", test_case.name());
114*eb8f6990SEnji Cooper     ATF_REQUIRE(test_case.fake_result());
115*eb8f6990SEnji Cooper     ATF_REQUIRE_MATCH(exp_error,
116*eb8f6990SEnji Cooper                       test_case.fake_result().get().reason());
117*eb8f6990SEnji Cooper }
118*eb8f6990SEnji Cooper 
119*eb8f6990SEnji Cooper 
120*eb8f6990SEnji Cooper /// Runs one googletest test program and checks its result.
121*eb8f6990SEnji Cooper ///
122*eb8f6990SEnji Cooper /// \param tc Pointer to the calling test case, to obtain srcdir.
123*eb8f6990SEnji Cooper /// \param test_case_name Name of the "test case" to select from the helper
124*eb8f6990SEnji Cooper ///     program.
125*eb8f6990SEnji Cooper /// \param exp_result The expected result.
126*eb8f6990SEnji Cooper /// \param metadata The test case metadata.
127*eb8f6990SEnji Cooper /// \param user_config User-provided configuration.
128*eb8f6990SEnji Cooper static void
129*eb8f6990SEnji Cooper run_one(const atf::tests::tc* tc, const char* test_case_name,
130*eb8f6990SEnji Cooper         const model::test_result& exp_result,
131*eb8f6990SEnji Cooper         const model::metadata& metadata = model::metadata_builder().build(),
132*eb8f6990SEnji Cooper         config::tree user_config = engine::empty_config())
133*eb8f6990SEnji Cooper {
134*eb8f6990SEnji Cooper     scheduler::scheduler_handle handle = scheduler::setup();
135*eb8f6990SEnji Cooper 
136*eb8f6990SEnji Cooper     const std::string test_name = test_suite + std::string(test_case_name);
137*eb8f6990SEnji Cooper 
138*eb8f6990SEnji Cooper     const model::test_program_ptr program(new scheduler::lazy_test_program(
139*eb8f6990SEnji Cooper         "googletest", fs::path("googletest_helpers"),
140*eb8f6990SEnji Cooper         fs::path(tc->get_config_var("srcdir")),
141*eb8f6990SEnji Cooper         "the-suite", metadata, user_config, handle));
142*eb8f6990SEnji Cooper 
143*eb8f6990SEnji Cooper     (void)handle.spawn_test(program, test_name.c_str(), user_config);
144*eb8f6990SEnji Cooper 
145*eb8f6990SEnji Cooper     scheduler::result_handle_ptr result_handle = handle.wait_any();
146*eb8f6990SEnji Cooper     const scheduler::test_result_handle* test_result_handle =
147*eb8f6990SEnji Cooper         dynamic_cast< const scheduler::test_result_handle* >(
148*eb8f6990SEnji Cooper             result_handle.get());
149*eb8f6990SEnji Cooper     atf::utils::cat_file(result_handle->stdout_file().str(), "stdout: ");
150*eb8f6990SEnji Cooper     atf::utils::cat_file(result_handle->stderr_file().str(), "stderr: ");
151*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(exp_result, test_result_handle->test_result());
152*eb8f6990SEnji Cooper     result_handle->cleanup();
153*eb8f6990SEnji Cooper     result_handle.reset();
154*eb8f6990SEnji Cooper 
155*eb8f6990SEnji Cooper     handle.cleanup();
156*eb8f6990SEnji Cooper }
157*eb8f6990SEnji Cooper 
158*eb8f6990SEnji Cooper 
159*eb8f6990SEnji Cooper }  // anonymous namespace
160*eb8f6990SEnji Cooper 
161*eb8f6990SEnji Cooper 
162*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__ok);
163*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__ok)
164*eb8f6990SEnji Cooper {
165*eb8f6990SEnji Cooper     const model::test_cases_map test_cases = list(
166*eb8f6990SEnji Cooper         "googletest_helpers", fs::path(get_config_var("srcdir")));
167*eb8f6990SEnji Cooper 
168*eb8f6990SEnji Cooper     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
169*eb8f6990SEnji Cooper         .add(test_suite + "check_configuration_variables")
170*eb8f6990SEnji Cooper         .add(test_suite + "crash")
171*eb8f6990SEnji Cooper         .add(test_suite + "fail")
172*eb8f6990SEnji Cooper         .add(test_suite + "pass")
173*eb8f6990SEnji Cooper         .add(test_suite + "pass_but_exit_failure")
174*eb8f6990SEnji Cooper         .add(test_suite + "timeout", model::metadata_builder()
175*eb8f6990SEnji Cooper              .build())
176*eb8f6990SEnji Cooper         .build();
177*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
178*eb8f6990SEnji Cooper }
179*eb8f6990SEnji Cooper 
180*eb8f6990SEnji Cooper 
181*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__current_directory);
182*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__current_directory)
183*eb8f6990SEnji Cooper {
184*eb8f6990SEnji Cooper     const fs::path helpers =
185*eb8f6990SEnji Cooper         fs::path(get_config_var("srcdir")) / "googletest_helpers";
186*eb8f6990SEnji Cooper     ATF_REQUIRE(::symlink(helpers.c_str(), "googletest_helpers") != -1);
187*eb8f6990SEnji Cooper     const model::test_cases_map test_cases = list(
188*eb8f6990SEnji Cooper         "googletest_helpers", fs::path("."));
189*eb8f6990SEnji Cooper 
190*eb8f6990SEnji Cooper     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
191*eb8f6990SEnji Cooper         .add(test_suite + "check_configuration_variables")
192*eb8f6990SEnji Cooper         .add(test_suite + "crash")
193*eb8f6990SEnji Cooper         .add(test_suite + "fail")
194*eb8f6990SEnji Cooper         .add(test_suite + "pass")
195*eb8f6990SEnji Cooper         .add(test_suite + "pass_but_exit_failure")
196*eb8f6990SEnji Cooper         .add(test_suite + "timeout", model::metadata_builder()
197*eb8f6990SEnji Cooper              .build())
198*eb8f6990SEnji Cooper         .build();
199*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
200*eb8f6990SEnji Cooper }
201*eb8f6990SEnji Cooper 
202*eb8f6990SEnji Cooper 
203*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__relative_path);
204*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__relative_path)
205*eb8f6990SEnji Cooper {
206*eb8f6990SEnji Cooper     const fs::path helpers =
207*eb8f6990SEnji Cooper         fs::path(get_config_var("srcdir")) / "googletest_helpers";
208*eb8f6990SEnji Cooper     ATF_REQUIRE(::mkdir("dir1", 0755) != -1);
209*eb8f6990SEnji Cooper     ATF_REQUIRE(::mkdir("dir1/dir2", 0755) != -1);
210*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(::symlink(helpers.c_str(),
211*eb8f6990SEnji Cooper                    "dir1/dir2/googletest_helpers"), 0);
212*eb8f6990SEnji Cooper     const model::test_cases_map test_cases = list(
213*eb8f6990SEnji Cooper         "dir2/googletest_helpers", fs::path("dir1"));
214*eb8f6990SEnji Cooper 
215*eb8f6990SEnji Cooper     const model::test_cases_map exp_test_cases = model::test_cases_map_builder()
216*eb8f6990SEnji Cooper         .add(test_suite + "check_configuration_variables")
217*eb8f6990SEnji Cooper         .add(test_suite + "crash")
218*eb8f6990SEnji Cooper         .add(test_suite + "fail")
219*eb8f6990SEnji Cooper         .add(test_suite + "pass")
220*eb8f6990SEnji Cooper         .add(test_suite + "pass_but_exit_failure")
221*eb8f6990SEnji Cooper         .add(test_suite + "timeout", model::metadata_builder()
222*eb8f6990SEnji Cooper              .build())
223*eb8f6990SEnji Cooper         .build();
224*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(exp_test_cases, test_cases);
225*eb8f6990SEnji Cooper }
226*eb8f6990SEnji Cooper 
227*eb8f6990SEnji Cooper 
228*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__missing_test_program);
229*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__missing_test_program)
230*eb8f6990SEnji Cooper {
231*eb8f6990SEnji Cooper     check_list_fail("Cannot find test program", "non-existent",
232*eb8f6990SEnji Cooper                     fs::current_path());
233*eb8f6990SEnji Cooper }
234*eb8f6990SEnji Cooper 
235*eb8f6990SEnji Cooper 
236*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__not_a_test_program);
237*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__not_a_test_program)
238*eb8f6990SEnji Cooper {
239*eb8f6990SEnji Cooper     atf::utils::create_file("not-valid", "garbage\n");
240*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(::chmod("not-valid", 0755), 0);
241*eb8f6990SEnji Cooper     check_list_fail("Invalid test program format", "not-valid",
242*eb8f6990SEnji Cooper                     fs::current_path());
243*eb8f6990SEnji Cooper }
244*eb8f6990SEnji Cooper 
245*eb8f6990SEnji Cooper 
246*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__no_permissions);
247*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__no_permissions)
248*eb8f6990SEnji Cooper {
249*eb8f6990SEnji Cooper     atf::utils::create_file("not-executable", "garbage\n");
250*eb8f6990SEnji Cooper     check_list_fail("Permission denied to run test program",
251*eb8f6990SEnji Cooper                     "not-executable", fs::current_path());
252*eb8f6990SEnji Cooper }
253*eb8f6990SEnji Cooper 
254*eb8f6990SEnji Cooper 
255*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__abort);
256*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__abort)
257*eb8f6990SEnji Cooper {
258*eb8f6990SEnji Cooper     atf::utils::create_file("kills_self", "#!/bin/sh\nkill -2 $$\n");
259*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(::chmod("kills_self", 0755), 0);
260*eb8f6990SEnji Cooper     check_list_fail("Test program received signal", "kills_self",
261*eb8f6990SEnji Cooper                     fs::current_path());
262*eb8f6990SEnji Cooper }
263*eb8f6990SEnji Cooper 
264*eb8f6990SEnji Cooper 
265*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(list__empty);
266*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(list__empty)
267*eb8f6990SEnji Cooper {
268*eb8f6990SEnji Cooper     atf::utils::create_file("empty_list", "#!/bin/sh\n");
269*eb8f6990SEnji Cooper     ATF_REQUIRE_EQ(::chmod("empty_list", 0755), 0);
270*eb8f6990SEnji Cooper     check_list_fail("No test cases", "empty_list", fs::current_path());
271*eb8f6990SEnji Cooper }
272*eb8f6990SEnji Cooper 
273*eb8f6990SEnji Cooper 
274*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__passes);
275*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(test__body_only__passes)
276*eb8f6990SEnji Cooper {
277*eb8f6990SEnji Cooper     const model::test_result exp_result(model::test_result_passed);
278*eb8f6990SEnji Cooper     run_one(this, "pass", exp_result);
279*eb8f6990SEnji Cooper }
280*eb8f6990SEnji Cooper 
281*eb8f6990SEnji Cooper 
282*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__fails);
283*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(test__body_only__fails)
284*eb8f6990SEnji Cooper {
285*eb8f6990SEnji Cooper     const std::string failure_message = (
286*eb8f6990SEnji Cooper "gtest_macros_demo.cc:4: Failure\n"
287*eb8f6990SEnji Cooper "Failed\n"
288*eb8f6990SEnji Cooper "with a reason\n"
289*eb8f6990SEnji Cooper );
290*eb8f6990SEnji Cooper     const model::test_result exp_result(model::test_result_failed,
291*eb8f6990SEnji Cooper        failure_message);
292*eb8f6990SEnji Cooper     run_one(this, "fail", exp_result);
293*eb8f6990SEnji Cooper }
294*eb8f6990SEnji Cooper 
295*eb8f6990SEnji Cooper 
296*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__crashes);
297*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(test__body_only__crashes)
298*eb8f6990SEnji Cooper {
299*eb8f6990SEnji Cooper     utils::prepare_coredump_test(this);
300*eb8f6990SEnji Cooper 
301*eb8f6990SEnji Cooper     const model::test_result exp_result(
302*eb8f6990SEnji Cooper         model::test_result_broken,
303*eb8f6990SEnji Cooper         F("Error: Premature exit. Test case received signal %s (core dumped)") %
304*eb8f6990SEnji Cooper         SIGABRT);
305*eb8f6990SEnji Cooper     run_one(this, "crash", exp_result);
306*eb8f6990SEnji Cooper }
307*eb8f6990SEnji Cooper 
308*eb8f6990SEnji Cooper 
309*eb8f6990SEnji Cooper ATF_TEST_CASE(test__body_only__times_out);
310*eb8f6990SEnji Cooper ATF_TEST_CASE_HEAD(test__body_only__times_out)
311*eb8f6990SEnji Cooper {
312*eb8f6990SEnji Cooper     set_md_var("timeout", "60");
313*eb8f6990SEnji Cooper }
314*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(test__body_only__times_out)
315*eb8f6990SEnji Cooper {
316*eb8f6990SEnji Cooper     config::tree user_config = engine::empty_config();
317*eb8f6990SEnji Cooper     utils::setenv("CONTROL_DIR", fs::current_path().str());
318*eb8f6990SEnji Cooper     const model::metadata metadata = model::metadata_builder()
319*eb8f6990SEnji Cooper         .set_timeout(datetime::delta(1, 0)).build();
320*eb8f6990SEnji Cooper     const model::test_result exp_result(
321*eb8f6990SEnji Cooper         model::test_result_broken, "Test case body timed out");
322*eb8f6990SEnji Cooper     run_one(this, "timeout", exp_result, metadata, user_config);
323*eb8f6990SEnji Cooper 
324*eb8f6990SEnji Cooper     ATF_REQUIRE(!atf::utils::file_exists("cookie"));
325*eb8f6990SEnji Cooper }
326*eb8f6990SEnji Cooper 
327*eb8f6990SEnji Cooper 
328*eb8f6990SEnji Cooper ATF_TEST_CASE_WITHOUT_HEAD(test__body_only__configuration_variables);
329*eb8f6990SEnji Cooper ATF_TEST_CASE_BODY(test__body_only__configuration_variables)
330*eb8f6990SEnji Cooper {
331*eb8f6990SEnji Cooper     config::tree user_config = engine::empty_config();
332*eb8f6990SEnji Cooper     user_config.set_string("test_suites.the-suite.first", "some value");
333*eb8f6990SEnji Cooper     user_config.set_string("test_suites.the-suite.second", "some other value");
334*eb8f6990SEnji Cooper 
335*eb8f6990SEnji Cooper     const model::test_result exp_result(model::test_result_passed);
336*eb8f6990SEnji Cooper     run_one(this, "check_configuration_variables", exp_result,
337*eb8f6990SEnji Cooper             model::metadata_builder().build(), user_config);
338*eb8f6990SEnji Cooper }
339*eb8f6990SEnji Cooper 
340*eb8f6990SEnji Cooper 
341*eb8f6990SEnji Cooper ATF_INIT_TEST_CASES(tcs)
342*eb8f6990SEnji Cooper {
343*eb8f6990SEnji Cooper     scheduler::register_interface(
344*eb8f6990SEnji Cooper         "googletest", std::shared_ptr< scheduler::interface >(
345*eb8f6990SEnji Cooper             new engine::googletest_interface()));
346*eb8f6990SEnji Cooper 
347*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__ok);
348*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__current_directory);
349*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__relative_path);
350*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__missing_test_program);
351*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__not_a_test_program);
352*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__no_permissions);
353*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__abort);
354*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, list__empty);
355*eb8f6990SEnji Cooper 
356*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, test__body_only__passes);
357*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, test__body_only__fails);
358*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, test__body_only__crashes);
359*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, test__body_only__times_out);
360*eb8f6990SEnji Cooper     ATF_ADD_TEST_CASE(tcs, test__body_only__configuration_variables);
361*eb8f6990SEnji Cooper }
362