dte test coverage


Directory: ./
File: test/spawn.c
Date: 2024-12-21 16:03:22
Exec Total Coverage
Lines: 38 38 100.0%
Functions: 1 1 100.0%
Branches: 0 0 -%

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