summaryrefslogtreecommitdiff
path: root/corebinutils/sh/tests/test.sh
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"