add shellspec golden harness for the legacy make engine

- spec/golden/cases.txt: 69 black-box cases (CLI wrapper mode and make
  include mode) run in a hermetic sandbox with a mocked docker
- spec/golden/expected/*.txt recorded from this engine (baseline)
- make test / test-golden / golden-record / lint dev targets
This commit is contained in:
Yann Autissier
2026-09-03 14:35:58 +02:00
parent e2e34d813e
commit 1d44a2ff32
102 changed files with 632 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
#!/bin/sh
# Mock docker for myos tests: logs every call, answers a few read-only queries deterministically.
[ -n "${MYOS_DOCKER_LOG:-}" ] && printf 'docker %s\n' "$*" >> "$MYOS_DOCKER_LOG"
case "$1 $2" in
"compose version") echo "${MOCK_COMPOSE_VERSION:-2.29.0}" ;;
"compose config") echo "# mock compose config" ;;
"compose ps") : ;;
"compose "*) : ;;
"info --format") echo "${MOCK_SWARM_STATE:-inactive}" ;;
"run --rm") case "$*" in *"uname -m"*) echo x86_64 ;; *"uname -s"*) echo Linux ;; *) : ;; esac ;;
"images -q") : ;;
"ps -q") : ;;
"network ls") : ;;
"volume ls") : ;;
"version --format") echo 29.0.0 ;;
*) : ;;
esac
exit 0
+4
View File
@@ -0,0 +1,4 @@
#!/bin/sh
[ -n "${MYOS_DOCKER_LOG:-}" ] && printf 'docker-compose %s\n' "$*" >> "$MYOS_DOCKER_LOG"
case "$1" in version) echo "${MOCK_COMPOSE_VERSION:-2.29.0}" ;; config) echo "# mock compose config" ;; *) : ;; esac
exit 0
+67
View File
@@ -0,0 +1,67 @@
#!/bin/sh
# Helpers shared by the golden recorder and the shellspec suites.
# myos_run_engine ENGINE WORKDIR ARGS... runs myos (legacy make engine or bin/myos CLI)
# in a hermetic environment and prints normalized stdout+stderr followed by "[exit N]".
MYOS_ROOT="${MYOS_ROOT:-$(cd "$(dirname "$0")/../.." 2>/dev/null && pwd)}"
SPEC_DIR="${SPEC_DIR:-$MYOS_ROOT/spec}"
# myos_sandbox FIXTURE -> prints a temp dir containing a copy of the fixture (wd/) and of the home fixture (home/)
myos_sandbox() {
_fixture=$1
_tmp=$(mktemp -d "${TMPDIR:-/tmp}/myos-spec.XXXXXX"); _tmp=$(cd "$_tmp" && pwd -P)
cp -R "$SPEC_DIR/fixtures/$_fixture" "$_tmp/wd"
cp -R "$SPEC_DIR/fixtures/home" "$_tmp/home"
printf '%s\n' "$_tmp"
}
# myos_hermetic_env SANDBOX -> prints the env(1) arguments for a hermetic run
myos_hermetic_env() {
printf '%s\n' \
"PATH=$SPEC_DIR/support/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
"HOME=$1/home" \
"USER=tester" "HOSTNAME=testhost" "DOMAIN=example.test" \
"DOCKER_MACHINE=x86_64" "DOCKER_SYSTEM=Linux" "DOCKER_SOCKET_LOCATION=/var/run/docker.sock" \
"DRYRUN=true" "TERM=dumb" "LANG=C" "LC_ALL=C" \
"MYOS_DOCKER_LOG=$1/docker.log"
}
# myos_normalize SANDBOX (stdin -> stdout)
myos_normalize() {
sed -e 's/\x1b\[[0-9;]*m//g' \
-e "s#$MYOS_ROOT#@MYOS@#g" \
-e "s#$1/wd#@WD@#g" \
-e "s#$1/home#@HOME@#g" \
-e "s#$1#@TMP@#g" \
-e 's#/[^ ]*/bin/make#make#g' \
-e 's/[[:space:]][[:space:]]*/ /g' \
-e 's/[[:space:]]*$//'
}
# myos_run_engine ENGINE SANDBOX ARGS...
# shellcheck disable=SC2046 # myos_hermetic_env output is meant to be word-split
myos_run_engine() {
_engine=$1; _sb=$2; shift 2
# "@make" as first arg = include mode: the project Makefile includes make/include.mk
# and make runs from the project dir (CURDIR = project). Same for both engines.
if [ "${1:-}" = "@make" ]; then
shift
_out=$(cd "$_sb/wd" && env -i $(myos_hermetic_env "$_sb") MYOS_CONF=/dev/null \
make -es MYOS="$MYOS_ROOT" "$@" 2>&1); _rc=$?
printf '%s\n[exit %s]\n' "$_out" "$_rc" | myos_normalize "$_sb"
return 0
fi
case $_engine in
legacy)
# what /usr/local/bin/myos does: env from system conf + MYOS=. WORKDIR=$PWD make -esC $MYOS
_out=$(cd "$_sb/wd" && env -i $(myos_hermetic_env "$_sb") \
make -esC "$MYOS_ROOT" MYOS=. WORKDIR="$_sb/wd" "$@" 2>&1); _rc=$?
;;
cli)
_out=$(cd "$_sb/wd" && env -i $(myos_hermetic_env "$_sb") MYOS_CONF=/dev/null \
"$MYOS_ROOT/bin/myos" -C "$_sb/wd" "$@" 2>&1); _rc=$?
;;
*) echo "unknown engine $_engine" >&2; return 2 ;;
esac
printf '%s\n[exit %s]\n' "$_out" "$_rc" | myos_normalize "$_sb"
}