dte test coverage


Directory: ./
File: test/spawn.c
Date: 2025-07-19 20:13:10
Exec Total Coverage
Lines: 39 39 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 ErrorBuffer ebuf = {.print_to_stderr = false};
13 1 SpawnContext sc = {
14 .argv = args,
15 .input = STRING_VIEW("IN-"),
16 .outputs = {STRING_INIT, STRING_INIT},
17 .ebuf = &ebuf,
18 .lines = 32,
19 .columns = 120,
20 .quiet = true,
21 .actions = {
22 [STDIN_FILENO] = SPAWN_PIPE,
23 [STDOUT_FILENO] = SPAWN_PIPE,
24 [STDERR_FILENO] = SPAWN_PIPE,
25 },
26 };
27
28 1 static_assert(ARRAYLEN(sc.actions) == 3);
29 1 static_assert(ARRAYLEN(sc.outputs) == 2);
30
31 1 String *out = &sc.outputs[0];
32 1 String *err = &sc.outputs[1];
33 1 EXPECT_EQ(spawn(&sc), 0);
34 1 EXPECT_EQ(out->len, 7);
35 1 EXPECT_EQ(err->len, 4);
36 1 EXPECT_STREQ(string_borrow_cstring(out), "IN-OUT\n");
37 1 EXPECT_STREQ(string_borrow_cstring(err), "ERR\n");
38 1 EXPECT_EQ(string_clear(out), 7);
39 1 EXPECT_EQ(string_clear(err), 4);
40
41 1 sc.actions[STDIN_FILENO] = SPAWN_NULL;
42 1 sc.actions[STDERR_FILENO] = SPAWN_NULL;
43 1 EXPECT_EQ(spawn(&sc), 0);
44 1 EXPECT_EQ(out->len, 4);
45 1 EXPECT_EQ(err->len, 0);
46 1 EXPECT_STREQ(string_borrow_cstring(out), "OUT\n");
47 1 EXPECT_EQ(string_clear(out), 4);
48 1 EXPECT_EQ(string_clear(err), 0);
49
50 1 args[2] = "printf \"xyz $LINES $COLUMNS\"; exit 37";
51 1 EXPECT_EQ(spawn(&sc), 37);
52 1 EXPECT_EQ(out->len, 10);
53 1 EXPECT_EQ(err->len, 0);
54 1 EXPECT_STREQ(string_borrow_cstring(out), "xyz 32 120");
55 1 EXPECT_EQ(string_clear(out), 10);
56 1 EXPECT_EQ(string_clear(err), 0);
57
58 // Make sure zero-length input with one SPAWN_PIPE action
59 // doesn't deadlock
60 1 args[2] = "cat >/dev/null";
61 1 sc.input.length = 0;
62 1 sc.actions[STDIN_FILENO] = SPAWN_PIPE;
63 1 sc.actions[STDOUT_FILENO] = SPAWN_NULL;
64 1 sc.actions[STDERR_FILENO] = SPAWN_NULL;
65 1 EXPECT_EQ(spawn(&sc), 0);
66 1 string_free(out);
67 1 string_free(err);
68 1 }
69
70 static const TestEntry tests[] = {
71 TEST(test_spawn),
72 };
73
74 const TestGroup spawn_tests = TEST_GROUP(tests);
75