Line |
Branch |
Exec |
Source |
1 |
|
|
#include <unistd.h> |
2 |
|
|
#include "test.h" |
3 |
|
|
#include "spawn.h" |
4 |
|
|
|
5 |
|
1 |
static void test_spawn(TestContext *ctx) |
6 |
|
|
{ |
7 |
|
1 |
static const char *args[] = { |
8 |
|
|
"sh", "-c", "cat; echo OUT; echo ERR >&2", |
9 |
|
|
NULL |
10 |
|
|
}; |
11 |
|
|
|
12 |
|
1 |
SpawnContext sc = { |
13 |
|
|
.argv = args, |
14 |
|
|
.input = STRING_VIEW("IN-"), |
15 |
|
|
.outputs = {STRING_INIT, STRING_INIT}, |
16 |
|
|
.quiet = true, |
17 |
|
|
.actions = { |
18 |
|
|
[STDIN_FILENO] = SPAWN_PIPE, |
19 |
|
|
[STDOUT_FILENO] = SPAWN_PIPE, |
20 |
|
|
[STDERR_FILENO] = SPAWN_PIPE, |
21 |
|
|
}, |
22 |
|
|
}; |
23 |
|
|
|
24 |
|
1 |
static_assert(ARRAYLEN(sc.actions) == 3); |
25 |
|
1 |
static_assert(ARRAYLEN(sc.outputs) == 2); |
26 |
|
|
|
27 |
|
1 |
String *out = &sc.outputs[0]; |
28 |
|
1 |
String *err = &sc.outputs[1]; |
29 |
|
1 |
EXPECT_EQ(spawn(&sc), 0); |
30 |
|
1 |
EXPECT_EQ(out->len, 7); |
31 |
|
1 |
EXPECT_EQ(err->len, 4); |
32 |
|
1 |
EXPECT_STREQ(string_borrow_cstring(out), "IN-OUT\n"); |
33 |
|
1 |
EXPECT_STREQ(string_borrow_cstring(err), "ERR\n"); |
34 |
|
1 |
EXPECT_EQ(string_clear(out), 7); |
35 |
|
1 |
EXPECT_EQ(string_clear(err), 4); |
36 |
|
|
|
37 |
|
1 |
sc.actions[STDIN_FILENO] = SPAWN_NULL; |
38 |
|
1 |
sc.actions[STDERR_FILENO] = SPAWN_NULL; |
39 |
|
1 |
EXPECT_EQ(spawn(&sc), 0); |
40 |
|
1 |
EXPECT_EQ(out->len, 4); |
41 |
|
1 |
EXPECT_EQ(err->len, 0); |
42 |
|
1 |
EXPECT_STREQ(string_borrow_cstring(out), "OUT\n"); |
43 |
|
1 |
EXPECT_EQ(string_clear(out), 4); |
44 |
|
1 |
EXPECT_EQ(string_clear(err), 0); |
45 |
|
|
|
46 |
|
1 |
args[2] = "printf 'xyz 123'; exit 37"; |
47 |
|
1 |
EXPECT_EQ(spawn(&sc), 37); |
48 |
|
1 |
EXPECT_EQ(out->len, 7); |
49 |
|
1 |
EXPECT_EQ(err->len, 0); |
50 |
|
1 |
EXPECT_STREQ(string_borrow_cstring(out), "xyz 123"); |
51 |
|
1 |
EXPECT_EQ(string_clear(out), 7); |
52 |
|
1 |
EXPECT_EQ(string_clear(err), 0); |
53 |
|
|
|
54 |
|
|
// Make sure zero-length input with one SPAWN_PIPE action |
55 |
|
|
// doesn't deadlock |
56 |
|
1 |
args[2] = "cat >/dev/null"; |
57 |
|
1 |
sc.input.length = 0; |
58 |
|
1 |
sc.actions[STDIN_FILENO] = SPAWN_PIPE; |
59 |
|
1 |
sc.actions[STDOUT_FILENO] = SPAWN_NULL; |
60 |
|
1 |
sc.actions[STDERR_FILENO] = SPAWN_NULL; |
61 |
|
1 |
EXPECT_EQ(spawn(&sc), 0); |
62 |
|
1 |
string_free(out); |
63 |
|
1 |
string_free(err); |
64 |
|
1 |
} |
65 |
|
|
|
66 |
|
|
static const TestEntry tests[] = { |
67 |
|
|
TEST(test_spawn), |
68 |
|
|
}; |
69 |
|
|
|
70 |
|
|
const TestGroup spawn_tests = TEST_GROUP(tests); |
71 |
|
|
|