diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2022-03-07 18:23:53 +0100 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2022-03-08 13:46:08 +0100 |
commit | 28abe1bf4d8c16af92e1ef3dc1f267399f0690b9 (patch) | |
tree | a88380091984fdabe288caffb0dc814543a613d5 /test/buildtool/system | |
parent | 6f44f11a9a063d2f8f10a99c3531325e0fabead8 (diff) | |
download | justbuild-28abe1bf4d8c16af92e1ef3dc1f267399f0690b9.tar.gz |
SystemCommand: Move to new module "src/buildtool/system"
Diffstat (limited to 'test/buildtool/system')
-rw-r--r-- | test/buildtool/system/TARGETS | 13 | ||||
-rw-r--r-- | test/buildtool/system/system_command.test.cpp | 115 |
2 files changed, 128 insertions, 0 deletions
diff --git a/test/buildtool/system/TARGETS b/test/buildtool/system/TARGETS new file mode 100644 index 00000000..97101bae --- /dev/null +++ b/test/buildtool/system/TARGETS @@ -0,0 +1,13 @@ +{ "system_command": + { "type": ["@", "rules", "CC/test", "test"] + , "name": ["system_command"] + , "srcs": ["system_command.test.cpp"] + , "deps": + [ ["@", "catch2", "", "catch2"] + , ["test", "catch-main"] + , ["src/buildtool/system", "system_command"] + ] + , "stage": ["test", "buildtool", "system"] + } +, "TESTS": {"type": "install", "tainted": ["test"], "deps": ["system_command"]} +} diff --git a/test/buildtool/system/system_command.test.cpp b/test/buildtool/system/system_command.test.cpp new file mode 100644 index 00000000..6b3777ee --- /dev/null +++ b/test/buildtool/system/system_command.test.cpp @@ -0,0 +1,115 @@ +#include <cstdlib> +#include <iostream> + +#include "catch2/catch.hpp" +#include "src/buildtool/system/system_command.hpp" + +namespace { +[[nodiscard]] auto GetTestDir() -> std::filesystem::path { + auto* tmp_dir = std::getenv("TEST_TMPDIR"); + if (tmp_dir != nullptr) { + return tmp_dir; + } + return FileSystemManager::GetCurrentDirectory() / + "test/buildtool/file_system"; +} +} // namespace + +TEST_CASE("SystemCommand", "[filesystem]") { + using Catch::Matchers::Contains; + using Catch::Matchers::StartsWith; + + std::string name{"ExecutorTest"}; + SystemCommand system{name}; + + auto const testdir = GetTestDir(); + + SECTION("empty command") { + auto tmpdir = testdir / "empty"; + REQUIRE(FileSystemManager::CreateDirectoryExclusive(tmpdir)); + auto output = system.Execute( + {}, {}, FileSystemManager::GetCurrentDirectory(), tmpdir); + CHECK(not output.has_value()); + } + + SECTION("simple command, no arguments, no env variables") { + auto tmpdir = testdir / "simple_noargs"; + REQUIRE(FileSystemManager::CreateDirectoryExclusive(tmpdir)); + auto output = system.Execute( + {"echo"}, {}, FileSystemManager::GetCurrentDirectory(), tmpdir); + REQUIRE(output.has_value()); + CHECK(output->return_value == 0); + CHECK(*FileSystemManager::ReadFile(output->stdout_file) == "\n"); + CHECK(FileSystemManager::ReadFile(output->stderr_file)->empty()); + } + + SECTION( + "simple command, env variables are expanded only when wrapped with " + "/bin/sh") { + auto tmpdir = testdir / "simple_env0"; + REQUIRE(FileSystemManager::CreateDirectoryExclusive(tmpdir)); + auto output = system.Execute({"echo", "${MY_MESSAGE}"}, + {{"MY_MESSAGE", "hello"}}, + FileSystemManager::GetCurrentDirectory(), + tmpdir); + REQUIRE(output.has_value()); + CHECK(output->return_value == 0); + CHECK(*FileSystemManager::ReadFile(output->stdout_file) == + "${MY_MESSAGE}\n"); + CHECK(FileSystemManager::ReadFile(output->stderr_file)->empty()); + + tmpdir = testdir / "simple_env1"; + REQUIRE(FileSystemManager::CreateDirectoryExclusive(tmpdir)); + auto output_wrapped = + system.Execute({"/bin/sh", "-c", "set -e\necho ${MY_MESSAGE}"}, + {{"MY_MESSAGE", "hello"}}, + FileSystemManager::GetCurrentDirectory(), + tmpdir); + REQUIRE(output_wrapped.has_value()); + CHECK(output_wrapped->return_value == 0); + CHECK(*FileSystemManager::ReadFile(output_wrapped->stdout_file) == + "hello\n"); + CHECK( + FileSystemManager::ReadFile(output_wrapped->stderr_file)->empty()); + } + + SECTION("executable, producing std output, std error and return value") { + auto tmpdir = testdir / "exe_output"; + REQUIRE(FileSystemManager::CreateDirectoryExclusive(tmpdir)); + auto output = system.Execute( + {"/bin/sh", + "-c", + "set -e\necho this is stdout; echo this is stderr >&2; exit 5"}, + {}, + FileSystemManager::GetCurrentDirectory(), + tmpdir); + REQUIRE(output.has_value()); + CHECK(output->return_value == 5); + CHECK(*FileSystemManager::ReadFile(output->stdout_file) == + "this is stdout\n"); + CHECK(*FileSystemManager::ReadFile(output->stderr_file) == + "this is stderr\n"); + } + + SECTION( + "executable dependent on env, producing std output, std error and " + "return value") { + auto tmpdir = testdir / "exe_output_from_env"; + REQUIRE(FileSystemManager::CreateDirectoryExclusive(tmpdir)); + std::string const stdout = "this is stdout from env var"; + std::string const stderr = "this is stderr from env var"; + auto output = system.Execute( + {"/bin/sh", + "-c", + "set -e\necho ${MY_STDOUT}; echo ${MY_STDERR} >&2; exit 5"}, + {{"MY_STDOUT", stdout}, {"MY_STDERR", stderr}}, + FileSystemManager::GetCurrentDirectory(), + tmpdir); + REQUIRE(output.has_value()); + CHECK(output->return_value == 5); + CHECK(*FileSystemManager::ReadFile(output->stdout_file) == + stdout + '\n'); + CHECK(*FileSystemManager::ReadFile(output->stderr_file) == + stderr + '\n'); + } +} |