From 75c6b5fee029ec95e7e45e18525e3e78b9616f48 Mon Sep 17 00:00:00 2001 From: Lexi Winter Date: Sat, 21 Jun 2025 15:23:05 +0100 Subject: add spawn --- tests/CMakeLists.txt | 1 + tests/spawn.cc | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 tests/spawn.cc (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 13974aa..abeab88 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,6 +10,7 @@ add_executable(nihil.test guard.cc next_word.cc skipws.cc + spawn.cc tabulate.cc) target_link_libraries(nihil.test PRIVATE diff --git a/tests/spawn.cc b/tests/spawn.cc new file mode 100644 index 0000000..455223e --- /dev/null +++ b/tests/spawn.cc @@ -0,0 +1,65 @@ +/* + * This source code is released into the public domain. + */ + +#include + +import nihil; + +TEST_CASE("spawn: system", "[spawn]") { + using namespace nihil; + auto output = std::string(); + auto result = spawn(shell("x=1; echo $x"), + capture(stdout_fileno, output)).wait(); + + REQUIRE(result.okay()); + REQUIRE(output == "1\n"); +} + +TEST_CASE("spawn: execv", "[spawn]") { + using namespace nihil; + auto output = std::string(); + auto args = argv::from_args({"sh", "-c", "x=1; echo $x"}); + auto result = spawn(execv("/bin/sh", std::move(args)), + capture(stdout_fileno, output)).wait(); + + REQUIRE(result.okay()); + REQUIRE(output == "1\n"); +} + +TEST_CASE("spawn: execvp", "[spawn]") { + using namespace nihil; + auto output = std::string(); + auto args = argv::from_args({"sh", "-c", "x=1; echo $x"}); + auto result = spawn(execvp("sh", std::move(args)), + capture(stdout_fileno, output)).wait(); + + REQUIRE(result.okay()); + REQUIRE(output == "1\n"); +} + +TEST_CASE("spawn: execl", "[spawn]") { + using namespace nihil; + auto output = std::string(); + auto result = spawn(execl("/bin/sh", "sh", "-c", "x=1; echo $x"), + capture(stdout_fileno, output)).wait(); + + REQUIRE(result.okay()); + REQUIRE(output == "1\n"); +} + +TEST_CASE("spawn: execlp", "[spawn]") { + using namespace nihil; + auto output = std::string(); + auto result = spawn(execlp("sh", "sh", "-c", "x=1; echo $x"), + capture(stdout_fileno, output)).wait(); + + REQUIRE(result.okay()); + REQUIRE(output == "1\n"); +} + +TEST_CASE("spawn: execlp failure", "[spawn]") { + using namespace nihil; + REQUIRE_THROWS_AS(execlp("lfjail_nonesuch_executable", "x"), + executable_not_found); +} -- cgit v1.2.3