aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.posix/test_spawn.cc
blob: da321ffca0ec32bcb723bd12ee2704ef6e308365 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 * This source code is released into the public domain.
 */

#include <catch2/catch_test_macros.hpp>

import nihil.posix;

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

	auto exec = shell("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: execv", "[spawn]") {
	using namespace nihil;

	auto args = argv({"sh", "-c", "x=1; echo $x"});
	auto exec = execv("/bin/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: 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: execl", "[spawn]") {
	using namespace nihil;

	auto exec = execl("/bin/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", "[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);
}