blob: 36613a663f9c9087f8344769a121d42406b36fee (
plain)
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
|
#!/bin/sh
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2026 Project Tick. All rights reserved.
set -eu
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
TEST_ROOT="$ROOT/tests"
SH_BIN=${SH_BIN:-"$ROOT/out/sh"}
SH_RUNNER=${SH_RUNNER:-}
TMPDIR=${TMPDIR:-/tmp}
WORKDIR=$(mktemp -d "$TMPDIR/sh-test.XXXXXX")
trap 'rm -rf "$WORKDIR"' EXIT INT TERM
SKIP_CASES='
parameters/mail1.0
parameters/mail2.0
'
fail() {
printf '%s\n' "FAIL: $1" >&2
exit 1
}
should_skip() {
case "
$SKIP_CASES
" in
*"
$1
"*) return 0 ;;
esac
return 1
}
assert_eq() {
name=$1
expected_file=$2
actual_file=$3
if ! cmp -s "$expected_file" "$actual_file"; then
printf '%s\n' "FAIL: $name" >&2
printf '%s\n' "--- expected ---" >&2
cat "$expected_file" >&2
printf '\n%s\n' "--- actual ---" >&2
cat "$actual_file" >&2
printf '\n' >&2
exit 1
fi
}
[ -x "$SH_BIN" ] || fail "missing binary: $SH_BIN"
export SH="$SH_BIN"
export LC_ALL=C
export PATH=/bin:/usr/bin
cases_run=0
cases_skipped=0
case_list="$WORKDIR/cases.list"
find "$TEST_ROOT" -type f \
! -name '*.stdout' \
! -name '*.stderr' \
! -name 'test.sh' \
! -name 'functional_test.sh' \
| sed "s#^$TEST_ROOT/##" \
| sort >"$case_list"
while IFS= read -r rel; do
case_name=${rel##*/}
case $case_name in
*.[0-9]*)
:
;;
*)
continue
;;
esac
if should_skip "$rel"; then
cases_skipped=$((cases_skipped + 1))
printf '%s\n' "SKIP $rel"
continue
fi
status_expected=${case_name##*.}
stdout_expected="$TEST_ROOT/$rel.stdout"
stderr_expected="$TEST_ROOT/$rel.stderr"
safe_name=$(printf '%s' "$rel" | tr '/\n' '__')
stdout_actual="$WORKDIR/$safe_name.stdout"
stderr_actual="$WORKDIR/$safe_name.stderr"
case_workdir="$WORKDIR/$safe_name.wd"
mkdir -p "$case_workdir"
(
cd "$case_workdir"
set +e
if [ -n "$SH_RUNNER" ]; then
"$SH_RUNNER" "$SH_BIN" "$TEST_ROOT/$rel" >"$stdout_actual" 2>"$stderr_actual"
else
"$SH_BIN" "$TEST_ROOT/$rel" >"$stdout_actual" 2>"$stderr_actual"
fi
rc=$?
set -e
[ "$rc" -eq "$status_expected" ] || {
printf '%s\n' "FAIL: $rel exit $rc expected $status_expected" >&2
exit 1
}
) || exit 1
if [ -f "$stdout_expected" ]; then
assert_eq "$rel stdout" "$stdout_expected" "$stdout_actual"
else
[ ! -s "$stdout_actual" ] || fail "$rel unexpected stdout"
fi
if [ -f "$stderr_expected" ]; then
assert_eq "$rel stderr" "$stderr_expected" "$stderr_actual"
else
[ ! -s "$stderr_actual" ] || fail "$rel unexpected stderr"
fi
cases_run=$((cases_run + 1))
printf '%s\n' "PASS $rel"
done <"$case_list"
printf '%s\n' "PASS: ran $cases_run cases, skipped $cases_skipped"
|