Files
Python3-Win9x/scripts/vc6-probe.test.sh
T

108 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Regression tests for scripts/vc6-probe.sh.
#
# Covers the two failure modes that made the probe's exit status and
# output untrustworthy:
# 1. strip_prefix() must remove a literal Windows-style path prefix
# (backslash-separated) from probe output. A naive sed/glob
# pattern silently no-ops on this because `\h`, `\u`, etc. are
# consumed as escapes instead of literal characters.
# 2. The reported exit status must be cl.exe's real status even
# though its output passes through `grep` and `strip_prefix` in a
# pipeline.
#
# Part 2 additionally runs the real probe against a deliberately
# broken translation unit when wine + MSVC600 are available, so the
# check exercises the actual pipeline, not just the helper functions.
#
# Usage: scripts/vc6-probe.test.sh
set -u
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PROBE="$REPO_ROOT/scripts/vc6-probe.sh"
fail=0
pass() { echo "ok - $1"; }
bad() { echo "not ok - $1"; fail=1; }
# --- unit test: strip_prefix removes a literal backslash-heavy prefix ---
# shellcheck source=scripts/vc6-probe.sh
source "$PROBE"
prefix='Z:\home\ubuntu\projects\python-win9x\'
input="Z:\\home\\ubuntu\\projects\\python-win9x\\cpython\\Programs\\python.c(1) : error C2061"
expected="cpython\\Programs\\python.c(1) : error C2061"
actual="$(printf '%s\n' "$input" | strip_prefix "$prefix")"
if [ "$actual" = "$expected" ]; then
pass "strip_prefix removes literal backslash-separated prefix"
else
bad "strip_prefix removes literal backslash-separated prefix (got: [$actual], want: [$expected])"
fi
# A line that does not start with the prefix must be passed through
# unchanged (no partial/garbled matches).
input2="unrelated line with no prefix"
actual2="$(printf '%s\n' "$input2" | strip_prefix "$prefix")"
if [ "$actual2" = "$input2" ]; then
pass "strip_prefix leaves non-matching lines untouched"
else
bad "strip_prefix leaves non-matching lines untouched (got: [$actual2])"
fi
# --- unit test: pipeline exit status reflects the first command, not
# grep/sed-equivalent downstream stages ---
fake_failure() { return 7; }
fake_failure 2>&1 | grep -v '^nomatch' | strip_prefix "$prefix" >/dev/null
status="${PIPESTATUS[0]}"
if [ "$status" -eq 7 ]; then
pass "PIPESTATUS[0] reports the producing command's exit status through the filter pipeline"
else
bad "PIPESTATUS[0] reports the producing command's exit status through the filter pipeline (got: $status)"
fi
# --- integration test: run the real probe against a broken translation
# unit, when the toolchain is actually available. Skipped (not
# failed) otherwise, since CI/dev boxes without wine+MSVC600
# cannot exercise this. ---
MSVC600_ROOT="${MSVC600_ROOT:-$REPO_ROOT/MSVC600}"
if command -v wine >/dev/null 2>&1 && [ -e "$MSVC600_ROOT/VC98/Bin/CL.EXE" ]; then
BAD_SRC="$REPO_ROOT/cpython/Programs/_vc6_probe_test_bad.c"
printf 'this is not valid C !!! ###\n' > "$BAD_SRC"
trap 'rm -f "$BAD_SRC"' EXIT
out="$("$PROBE" cpython/Programs/_vc6_probe_test_bad.c 2>&1)"
real_status=$?
if [ "$real_status" -ne 0 ]; then
pass "probe reports nonzero exit for a broken translation unit"
else
bad "probe reports nonzero exit for a broken translation unit (got: $real_status)"
fi
if printf '%s' "$out" | grep -q 'error C'; then
pass "probe output surfaces the compiler diagnostic"
else
bad "probe output surfaces the compiler diagnostic"
fi
if printf '%s' "$out" | grep -q 'Z:\\home'; then
bad "probe output leaks an unstripped absolute Wine path"
else
pass "probe output does not leak an unstripped absolute Wine path"
fi
else
echo "skip - wine/MSVC600 not available; skipping live probe integration check"
fi
if [ "$fail" -ne 0 ]; then
echo "FAILED"
exit 1
fi
echo "ALL TESTS PASSED"