Files
bfe-core1106-sdk/tests/mk-bootimg/run-probe-tests.sh
NoahandClaude Opus 5 f0204f2b53 Fix mkimage -B probe defeated by pipefail
The probe piped the candidate binary into grep to look for -B support.
mkimage with no arguments prints usage and exits non-zero, and this script
runs under `set -euo pipefail`, so the pipeline reported failure even when
grep matched. Every candidate was rejected and the script failed closed with
"no mkimage on PATH supports -B" while a capable mkimage 2025.01 sat first
on PATH, making it impossible to build a boot.img at all.

Neutralise the probed command's exit status before the pipe. Sentinel
comments now bracket the probe so the new regression test extracts and
exercises the shipping code rather than a copy of it.

Closes #17

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T2D2KtdgwbhbF6Mo64eUrn
2026-09-04 17:06:54 -06:00

71 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
# Regression tests for the mkimage capability probe in build/mk-bootimg.sh.
#
# Guards issue #17: the probe ran the candidate binary and piped it into grep.
# mkimage with no arguments prints usage and exits non-zero, and mk-bootimg.sh
# runs under `set -euo pipefail`, so the pipeline reported failure even when
# grep matched. Every mkimage was rejected and the script failed closed with
# "no mkimage on PATH supports -B" while a capable mkimage sat first on PATH.
#
# The probe is extracted verbatim from mk-bootimg.sh between its sentinel
# comments, so these tests exercise the shipping code rather than a copy.
set -uo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
SCRIPT="$HERE/../../build/mk-bootimg.sh"
PROBE="$(mktemp)"; TMP="$(mktemp -d)"
trap 'rm -rf "$PROBE" "$TMP"' EXIT
sed -n '/^# >>> mkimage-probe/,/^# <<< mkimage-probe/p' "$SCRIPT" > "$PROBE"
grep -q 'MKIMAGE=' "$PROBE" || { echo "FAIL: probe not extracted (sentinels missing)"; exit 1; }
# The probe needs grep on PATH, but the real /usr/bin must stay off it or the
# host's own mkimage would answer these tests. Give it a directory holding
# nothing but grep.
mkdir -p "$TMP/util"
ln -s "$(command -v grep)" "$TMP/util/grep"
# A faithful stand-in for real mkimage: usage on stderr, non-zero exit.
mk_fake() { # mk_fake <dir> <supports-B:0|1>
mkdir -p "$1"
{ echo '#!/bin/sh'
echo 'echo "Usage: mkimage [-T type] -l image" >&2'
[ "$2" = 1 ] && echo 'echo " -B => align size in hex for FIT structure and header" >&2'
echo 'exit 1'
} > "$1/mkimage"
chmod +x "$1/mkimage"
}
fails=0
check() { # check <name> <expected-basename-or-empty> <dir...>
local name="$1" want="$2"; shift 2
local path=""; for d in "$@"; do path="$path${path:+:}$d"; done
path="$path${path:+:}$TMP/util"
local got
# /bin/bash by absolute path: a PATH holding only the fixture dirs cannot
# locate the interpreter itself.
got="$(TEST_PATH="$path" PROBE="$PROBE" /bin/bash -c \
'set -euo pipefail; PATH="$TEST_PATH"; . "$PROBE"; echo "${MKIMAGE:-}"' 2>/dev/null)"
got="${got##*/}"
if [ "$got" = "$want" ]; then
echo "PASS: $name"
else
echo "FAIL: $name (wanted '${want:-<none>}', got '${got:-<none>}')"
fails=$((fails + 1))
fi
}
mk_fake "$TMP/good" 1
mk_fake "$TMP/old" 0
# The regression itself: a capable mkimage that exits non-zero must be accepted.
check "capable mkimage accepted despite non-zero exit" mkimage "$TMP/good"
# The guarantee the FATAL message depends on: no false positives.
check "mkimage without -B rejected" "" "$TMP/old"
# PATH order decides, and an incapable earlier entry must not stop the scan.
check "scan continues past an incapable mkimage" mkimage "$TMP/old" "$TMP/good"
check "no mkimage anywhere selects nothing" "" "$TMP/none"
[ "$fails" -eq 0 ] && echo "All mk-bootimg probe tests passed." || echo "$fails test(s) failed."
exit "$fails"