xref: /src/contrib/kyua/examples/syntax_test.cpp (revision b0d29bc47dba79f6f38e67eabadfb4b32ffd9390)
108334c51SBrooks Davis // Copyright 2011 The Kyua Authors.
208334c51SBrooks Davis // All rights reserved.
308334c51SBrooks Davis //
408334c51SBrooks Davis // Redistribution and use in source and binary forms, with or without
508334c51SBrooks Davis // modification, are permitted provided that the following conditions are
608334c51SBrooks Davis // met:
708334c51SBrooks Davis //
808334c51SBrooks Davis // * Redistributions of source code must retain the above copyright
908334c51SBrooks Davis //   notice, this list of conditions and the following disclaimer.
1008334c51SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
1108334c51SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
1208334c51SBrooks Davis //   documentation and/or other materials provided with the distribution.
1308334c51SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
1408334c51SBrooks Davis //   may be used to endorse or promote products derived from this software
1508334c51SBrooks Davis //   without specific prior written permission.
1608334c51SBrooks Davis //
1708334c51SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1808334c51SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1908334c51SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2008334c51SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2108334c51SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2208334c51SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2308334c51SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2408334c51SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2508334c51SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2608334c51SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2708334c51SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2808334c51SBrooks Davis 
2908334c51SBrooks Davis extern "C" {
3008334c51SBrooks Davis #include <unistd.h>
3108334c51SBrooks Davis }
3208334c51SBrooks Davis 
3308334c51SBrooks Davis #include <atf-c++.hpp>
3408334c51SBrooks Davis 
3508334c51SBrooks Davis #include "engine/config.hpp"
3608334c51SBrooks Davis #include "engine/kyuafile.hpp"
3708334c51SBrooks Davis #include "engine/plain.hpp"
3808334c51SBrooks Davis #include "engine/scheduler.hpp"
3908334c51SBrooks Davis #include "model/metadata.hpp"
4008334c51SBrooks Davis #include "model/test_program.hpp"
4108334c51SBrooks Davis #include "utils/config/tree.ipp"
4208334c51SBrooks Davis #include "utils/env.hpp"
4308334c51SBrooks Davis #include "utils/fs/operations.hpp"
4408334c51SBrooks Davis #include "utils/fs/path.hpp"
4508334c51SBrooks Davis #include "utils/logging/operations.hpp"
4608334c51SBrooks Davis #include "utils/optional.ipp"
4708334c51SBrooks Davis #include "utils/passwd.hpp"
4808334c51SBrooks Davis 
4908334c51SBrooks Davis namespace config = utils::config;
5008334c51SBrooks Davis namespace fs = utils::fs;
5108334c51SBrooks Davis namespace passwd = utils::passwd;
5208334c51SBrooks Davis namespace scheduler = engine::scheduler;
5308334c51SBrooks Davis 
5408334c51SBrooks Davis using utils::none;
5508334c51SBrooks Davis 
5608334c51SBrooks Davis 
5708334c51SBrooks Davis namespace {
5808334c51SBrooks Davis 
5908334c51SBrooks Davis 
6008334c51SBrooks Davis /// Gets the path to an example file.
6108334c51SBrooks Davis ///
6208334c51SBrooks Davis /// \param name The name of the example file.
6308334c51SBrooks Davis ///
6408334c51SBrooks Davis /// \return A path to the desired example file.  This can either be inside the
6508334c51SBrooks Davis /// source tree before installing Kyua or in the target installation directory
6608334c51SBrooks Davis /// after installation.
6708334c51SBrooks Davis static fs::path
example_file(const char * name)6808334c51SBrooks Davis example_file(const char* name)
6908334c51SBrooks Davis {
7008334c51SBrooks Davis     const fs::path examplesdir(utils::getenv_with_default(
7108334c51SBrooks Davis         "KYUA_EXAMPLESDIR", KYUA_EXAMPLESDIR));
7208334c51SBrooks Davis     return examplesdir / name;
7308334c51SBrooks Davis }
7408334c51SBrooks Davis 
7508334c51SBrooks Davis 
7608334c51SBrooks Davis }  // anonymous namespace
7708334c51SBrooks Davis 
7808334c51SBrooks Davis 
7908334c51SBrooks Davis ATF_TEST_CASE(kyua_conf);
ATF_TEST_CASE_HEAD(kyua_conf)8008334c51SBrooks Davis ATF_TEST_CASE_HEAD(kyua_conf)
8108334c51SBrooks Davis {
8208334c51SBrooks Davis     utils::logging::set_inmemory();
8308334c51SBrooks Davis     set_md_var("require.files", example_file("kyua.conf").str());
8408334c51SBrooks Davis }
ATF_TEST_CASE_BODY(kyua_conf)8508334c51SBrooks Davis ATF_TEST_CASE_BODY(kyua_conf)
8608334c51SBrooks Davis {
8708334c51SBrooks Davis     std::vector< passwd::user > users;
8808334c51SBrooks Davis     users.push_back(passwd::user("nobody", 1, 2));
8908334c51SBrooks Davis     passwd::set_mock_users_for_testing(users);
9008334c51SBrooks Davis 
9108334c51SBrooks Davis     const config::tree user_config = engine::load_config(
9208334c51SBrooks Davis         example_file("kyua.conf"));
9308334c51SBrooks Davis 
9408334c51SBrooks Davis     ATF_REQUIRE_EQ(
9508334c51SBrooks Davis         "x86_64",
9608334c51SBrooks Davis         user_config.lookup< config::string_node >("architecture"));
9708334c51SBrooks Davis     ATF_REQUIRE_EQ(
9808334c51SBrooks Davis         16,
9908334c51SBrooks Davis         user_config.lookup< config::positive_int_node >("parallelism"));
10008334c51SBrooks Davis     ATF_REQUIRE_EQ(
10108334c51SBrooks Davis         "amd64",
10208334c51SBrooks Davis         user_config.lookup< config::string_node >("platform"));
10308334c51SBrooks Davis 
10408334c51SBrooks Davis     ATF_REQUIRE_EQ(
10508334c51SBrooks Davis         "nobody",
10608334c51SBrooks Davis         user_config.lookup< engine::user_node >("unprivileged_user").name);
10708334c51SBrooks Davis 
10808334c51SBrooks Davis     config::properties_map exp_test_suites;
10908334c51SBrooks Davis     exp_test_suites["test_suites.kyua.run_coredump_tests"] = "false";
11008334c51SBrooks Davis     exp_test_suites["test_suites.FreeBSD.iterations"] = "1000";
11108334c51SBrooks Davis     exp_test_suites["test_suites.FreeBSD.run_old_tests"] = "false";
11208334c51SBrooks Davis     exp_test_suites["test_suites.NetBSD.file_systems"] = "ffs lfs ext2fs";
11308334c51SBrooks Davis     exp_test_suites["test_suites.NetBSD.iterations"] = "100";
11408334c51SBrooks Davis     exp_test_suites["test_suites.NetBSD.run_broken_tests"] = "true";
11508334c51SBrooks Davis     ATF_REQUIRE(exp_test_suites == user_config.all_properties("test_suites"));
11608334c51SBrooks Davis }
11708334c51SBrooks Davis 
11808334c51SBrooks Davis 
11908334c51SBrooks Davis ATF_TEST_CASE(kyuafile_top__no_matches);
ATF_TEST_CASE_HEAD(kyuafile_top__no_matches)12008334c51SBrooks Davis ATF_TEST_CASE_HEAD(kyuafile_top__no_matches)
12108334c51SBrooks Davis {
12208334c51SBrooks Davis     utils::logging::set_inmemory();
12308334c51SBrooks Davis     set_md_var("require.files", example_file("Kyuafile.top").str());
12408334c51SBrooks Davis }
ATF_TEST_CASE_BODY(kyuafile_top__no_matches)12508334c51SBrooks Davis ATF_TEST_CASE_BODY(kyuafile_top__no_matches)
12608334c51SBrooks Davis {
12708334c51SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
12808334c51SBrooks Davis 
12908334c51SBrooks Davis     fs::mkdir(fs::path("root"), 0755);
13008334c51SBrooks Davis     const fs::path source_path = example_file("Kyuafile.top");
13108334c51SBrooks Davis     ATF_REQUIRE(::symlink(source_path.c_str(), "root/Kyuafile") != -1);
13208334c51SBrooks Davis 
13308334c51SBrooks Davis     atf::utils::create_file("root/file", "");
13408334c51SBrooks Davis     fs::mkdir(fs::path("root/subdir"), 0755);
13508334c51SBrooks Davis 
13608334c51SBrooks Davis     const engine::kyuafile kyuafile = engine::kyuafile::load(
13708334c51SBrooks Davis         fs::path("root/Kyuafile"), none, engine::default_config(), handle);
13808334c51SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), kyuafile.source_root());
13908334c51SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), kyuafile.build_root());
14008334c51SBrooks Davis     ATF_REQUIRE(kyuafile.test_programs().empty());
14108334c51SBrooks Davis 
14208334c51SBrooks Davis     handle.cleanup();
14308334c51SBrooks Davis }
14408334c51SBrooks Davis 
14508334c51SBrooks Davis 
14608334c51SBrooks Davis ATF_TEST_CASE(kyuafile_top__some_matches);
ATF_TEST_CASE_HEAD(kyuafile_top__some_matches)14708334c51SBrooks Davis ATF_TEST_CASE_HEAD(kyuafile_top__some_matches)
14808334c51SBrooks Davis {
14908334c51SBrooks Davis     utils::logging::set_inmemory();
15008334c51SBrooks Davis     set_md_var("require.files", example_file("Kyuafile.top").str());
15108334c51SBrooks Davis }
ATF_TEST_CASE_BODY(kyuafile_top__some_matches)15208334c51SBrooks Davis ATF_TEST_CASE_BODY(kyuafile_top__some_matches)
15308334c51SBrooks Davis {
15408334c51SBrooks Davis     scheduler::scheduler_handle handle = scheduler::setup();
15508334c51SBrooks Davis 
15608334c51SBrooks Davis     fs::mkdir(fs::path("root"), 0755);
15708334c51SBrooks Davis     const fs::path source_path = example_file("Kyuafile.top");
15808334c51SBrooks Davis     ATF_REQUIRE(::symlink(source_path.c_str(), "root/Kyuafile") != -1);
15908334c51SBrooks Davis 
16008334c51SBrooks Davis     atf::utils::create_file("root/file", "");
16108334c51SBrooks Davis 
16208334c51SBrooks Davis     fs::mkdir(fs::path("root/subdir1"), 0755);
16308334c51SBrooks Davis     atf::utils::create_file("root/subdir1/Kyuafile",
16408334c51SBrooks Davis                             "syntax(2)\n"
16508334c51SBrooks Davis                             "plain_test_program{name='a', test_suite='b'}\n");
16608334c51SBrooks Davis     atf::utils::create_file("root/subdir1/a", "");
16708334c51SBrooks Davis 
16808334c51SBrooks Davis     fs::mkdir(fs::path("root/subdir2"), 0755);
16908334c51SBrooks Davis     atf::utils::create_file("root/subdir2/Kyuafile",
17008334c51SBrooks Davis                             "syntax(2)\n"
17108334c51SBrooks Davis                             "plain_test_program{name='c', test_suite='d'}\n");
17208334c51SBrooks Davis     atf::utils::create_file("root/subdir2/c", "");
17308334c51SBrooks Davis     atf::utils::create_file("root/subdir2/Kyuafile.etc", "invalid");
17408334c51SBrooks Davis 
17508334c51SBrooks Davis     const engine::kyuafile kyuafile = engine::kyuafile::load(
17608334c51SBrooks Davis         fs::path("root/Kyuafile"), none, engine::default_config(), handle);
17708334c51SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), kyuafile.source_root());
17808334c51SBrooks Davis     ATF_REQUIRE_EQ(fs::path("root"), kyuafile.build_root());
17908334c51SBrooks Davis 
18008334c51SBrooks Davis     const model::test_program exp_test_program_a = model::test_program_builder(
18108334c51SBrooks Davis         "plain", fs::path("subdir1/a"), fs::path("root").to_absolute(), "b")
18208334c51SBrooks Davis         .add_test_case("main")
18308334c51SBrooks Davis         .build();
18408334c51SBrooks Davis     const model::test_program exp_test_program_c = model::test_program_builder(
18508334c51SBrooks Davis         "plain", fs::path("subdir2/c"), fs::path("root").to_absolute(), "d")
18608334c51SBrooks Davis         .add_test_case("main")
18708334c51SBrooks Davis         .build();
18808334c51SBrooks Davis 
18908334c51SBrooks Davis     ATF_REQUIRE_EQ(2, kyuafile.test_programs().size());
19008334c51SBrooks Davis     ATF_REQUIRE((exp_test_program_a == *kyuafile.test_programs()[0] &&
19108334c51SBrooks Davis                  exp_test_program_c == *kyuafile.test_programs()[1])
19208334c51SBrooks Davis                 ||
19308334c51SBrooks Davis                 (exp_test_program_a == *kyuafile.test_programs()[1] &&
19408334c51SBrooks Davis                  exp_test_program_c == *kyuafile.test_programs()[0]));
19508334c51SBrooks Davis 
19608334c51SBrooks Davis     handle.cleanup();
19708334c51SBrooks Davis }
19808334c51SBrooks Davis 
19908334c51SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)20008334c51SBrooks Davis ATF_INIT_TEST_CASES(tcs)
20108334c51SBrooks Davis {
20208334c51SBrooks Davis     scheduler::register_interface(
20308334c51SBrooks Davis         "plain", std::shared_ptr< scheduler::interface >(
20408334c51SBrooks Davis             new engine::plain_interface()));
20508334c51SBrooks Davis 
20608334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyua_conf);
20708334c51SBrooks Davis 
20808334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile_top__no_matches);
20908334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, kyuafile_top__some_matches);
21008334c51SBrooks Davis }
211