File: test_edge_cases.sh

package info (click to toggle)
mini-init-asm 0.3.1%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 372 kB
  • sloc: asm: 3,733; sh: 693; makefile: 85
file content (142 lines) | stat: -rwxr-xr-x 3,782 bytes parent folder | download | duplicates (2)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env bash
set -euo pipefail
# Integration tests for edge cases: rapid signal bursts, orphaned processes

BIN="${1:-./build/mini-init-amd64}"

echo "[test] Edge case integration tests"

# Test 1: Rapid signal bursts (send multiple TERM signals quickly)
echo "[test] 1) Rapid signal bursts (TERM x5)"
EP_GRACE_SECONDS=5 "$BIN" -v -- /bin/sh -c 'trap "exit 0" TERM; sleep 1000' &
pid=$!
sleep 0.5
# Send 5 TERM signals rapidly
for _ in {1..5}; do
    kill -TERM "$pid" 2>/dev/null || true
    sleep 0.1
done
set +e
wait "$pid"
wait_rc=$?
set -e
echo "[test] rc=$wait_rc"
test "$wait_rc" -eq 0 || {
    echo "FAIL: Rapid signal bursts not handled correctly"
    exit 1
}

# Test 2: Orphaned process (child forks grandchild, parent exits)
echo "[test] 2) Orphaned process handling"
orphan_script=$(
  cat <<'EOF'
# Fork a background process that will become orphaned
(sleep 2; echo "orphan done"; exit 42) &
orphan_pid=$!
# Exit immediately, leaving the orphan
exit 0
EOF
)
EP_SUBREAPER=1 "$BIN" -v -- /bin/sh -c "$orphan_script" &
init_pid=$!
set +e
wait "$init_pid"
init_rc=$?
set -e
echo "[test] init rc=$init_rc"
# Note: even in subreaper mode, this init exits when the main child exits; subreaper only affects adoption/reaping.
test "$init_rc" -eq 0 || {
    echo "FAIL: Orphaned process not handled"
    exit 1
}

# Test 3: Multiple rapid signals of different types
echo "[test] 3) Mixed rapid signals (TERM, INT, HUP)"
EP_GRACE_SECONDS=5 "$BIN" -v -- /bin/sh -c 'trap "exit 0" TERM INT HUP; sleep 1000' &
pid=$!
sleep 0.5
kill -TERM "$pid" 2>/dev/null || true
sleep 0.1
kill -INT "$pid" 2>/dev/null || true
sleep 0.1
kill -HUP "$pid" 2>/dev/null || true
set +e
wait "$pid"
wait_rc=$?
set -e
echo "[test] rc=$wait_rc"
test "$wait_rc" -eq 0 || {
    echo "FAIL: Mixed rapid signals not handled"
    exit 1
}

# Test 4: Signal during grace period (should not escalate)
echo "[test] 4) Signal during grace period"
EP_GRACE_SECONDS=3 "$BIN" -v -- /bin/sh -c 'trap "exit 0" TERM; sleep 1000' &
pid=$!
sleep 0.5
kill -TERM "$pid" 2>/dev/null || true
sleep 1
# Send another TERM during grace period
kill -TERM "$pid" 2>/dev/null || true
set +e
wait "$pid"
wait_rc=$?
set -e
echo "[test] rc=$wait_rc"
test "$wait_rc" -eq 0 || {
    echo "FAIL: Signal during grace period not handled"
    exit 1
}

# Test 5: Child exits immediately after signal (opportunistic reap)
echo "[test] 5) Child exits immediately after signal"
EP_GRACE_SECONDS=5 "$BIN" -v -- /bin/sh -c 'trap "exit 0" TERM; sleep 1000' &
pid=$!
sleep 0.5
kill -TERM "$pid" 2>/dev/null || true
set +e
wait "$pid"
wait_rc=$?
set -e
echo "[test] rc=$wait_rc"
test "$wait_rc" -eq 0 || {
    echo "FAIL: Immediate exit after signal not handled"
    exit 1
}

echo "[test] 6) Main-child exit amid many other zombies (reap correctness)"
set +e
zombies_script=$(
  cat <<'EOF'
# Spawn many short-lived children that may still be zombies when the parent exits.
i=0
while [ "$i" -lt 200 ]; do
  (exit 0) &
  i=$((i+1))
done
exit 42
EOF
)
EP_GRACE_SECONDS=5 timeout 5 "$BIN" -v -- /bin/sh -c "$zombies_script" >/dev/null 2>&1
wait_rc=$?
set -e
echo "[test] rc=$wait_rc"
test "$wait_rc" -eq 42 || {
    echo "FAIL: Expected init to exit 42 (main child), got $wait_rc"
    exit 1
}

echo "[test] 7) Invalid numeric env values warn (verbose)"
EP_GRACE_SECONDS=1x "$BIN" -v -- /bin/sh -c 'exit 0' 2>&1 | grep -q "invalid EP_GRACE_SECONDS" || {
    echo "FAIL: Expected warning for invalid EP_GRACE_SECONDS"
    exit 1
}

echo "[test] 8) Overlarge grace seconds clamps (verbose)"
EP_GRACE_SECONDS=9223372036854775808 "$BIN" -v -- /bin/sh -c 'exit 0' 2>&1 | grep -q "EP_GRACE_SECONDS too large; clamping" || {
    echo "FAIL: Expected clamp warning for overlarge EP_GRACE_SECONDS"
    exit 1
}

echo "[test] All edge case tests passed"