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