aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.posix/test.spawn.cc
blob: c5b4f533e316e47f7d4a174f10113af93bb1d51e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * This source code is released into the public domain.
 */

#include <catch2/catch_test_macros.hpp>

import nihil.posix;

TEST_CASE("spawn: execv", "[spawn]") {
	using namespace nihil;

	auto args = argv({"sh", "-c", "x=1; echo $x"});
	auto exec = execv("/bin/sh", std::move(args));

	auto output = std::string();
	auto capture = make_capture(stdout_fileno, output);
	REQUIRE(capture);

	auto proc = spawn(exec, *capture);
	REQUIRE(proc);

	auto status = std::move(*proc).wait();
	if (!status)
		FAIL(to_string(status.error()));

	REQUIRE(status->okay());
	REQUIRE(output == "1\n");
}

TEST_CASE("spawn: execvp", "[spawn]") {
	using namespace nihil;

	auto args = argv({"sh", "-c", "x=1; echo $x"});
	auto exec = execvp("sh", std::move(args));
	REQUIRE(exec);

	auto output = std::string();
	auto capture = make_capture(stdout_fileno, output);
	REQUIRE(capture);

	auto proc = spawn(*exec, *capture);
	REQUIRE(proc);

	auto status = std::move(*proc).wait();
	REQUIRE(status);

	REQUIRE(status->okay());
	REQUIRE(output == "1\n");
}


TEST_CASE("spawn: execlp", "[spawn]") {
	using namespace nihil;

	auto exec = execlp("sh", "sh", "-c", "x=1; echo $x");
	REQUIRE(exec);

	auto output = std::string();
	auto capture = make_capture(stdout_fileno, output);
	REQUIRE(capture);

	auto proc = spawn(*exec, *capture);
	REQUIRE(proc);

	auto status = std::move(*proc).wait();
	REQUIRE(status);

	REQUIRE(status->okay());
	REQUIRE(output == "1\n");
}

TEST_CASE("spawn: execlp failure", "[spawn]") {
	using namespace nihil;

	auto exec = execlp("nihil_no_such_executable", "x");
	REQUIRE(!exec);
}