123456789set -euo pipefail1011GOLDEN="${1:?usage: run-in-vm.sh <golden.qcow2> <nina-bin> <test-script>}"12NINA="${2:?need nina binary}"13SCRIPT="${3:?need test script}"14MEM_MB="${MEM_MB:-2048}"15SMP="${SMP:-2}"16RUN_TIMEOUT="${RUN_TIMEOUT:-1800}"17for f in "$GOLDEN" "$NINA" "$SCRIPT"; do [ -f "$f" ] || { echo "missing: $f" >&2; exit 1; }; done1819work="$(mktemp -d)"20trap 'rm -rf "$work"' EXIT21seed="$work/seed"; mkdir -p "$seed"22cp "$NINA" "$seed/nina"23cp "$SCRIPT" "$seed/runtest.sh"24SEED_ISO="$work/seed.iso"25hdiutil makehybrid -quiet -iso -joliet -default-volume-name NINASEED -o "$SEED_ISO" "$seed"2627overlay="$work/overlay.qcow2"28qemu-img create -f qcow2 -b "$(cd "$(dirname "$GOLDEN")" && pwd)/$(basename "$GOLDEN")" -F qcow2 "$overlay" >/dev/null29echo "throwaway overlay: $overlay (backing: $GOLDEN)"3031export RV_OVERLAY="$overlay" RV_SEED="$SEED_ISO" RV_MEM="$MEM_MB" RV_SMP="$SMP" RV_TIMEOUT="$RUN_TIMEOUT"3233expect -c '34 set timeout 60035 set overlay $env(RV_OVERLAY)36 set seed $env(RV_SEED)37 set mem $env(RV_MEM)38 set smp $env(RV_SMP)39 set runto $env(RV_TIMEOUT)4041 spawn qemu-system-x86_64 \42 -machine q35 -accel tcg -cpu max -smp $smp -m $mem \43 -drive file=$overlay,if=virtio,format=qcow2 \44 -drive file=$seed,media=cdrom,readonly=on \45 -netdev user,id=n0 -device virtio-net-pci,netdev=n0 \46 -nographic4748 expect {49 timeout { puts "\n!! no autologin on serial"; exit 2 }50 "automatic login" {}51 }52 sleep 653 send "mkdir -p /mnt-seed && mount /dev/sr0 /mnt-seed && install -m755 /mnt-seed/nina /root/nina && echo KILN_RUN_BEGIN\r"54 expect { timeout { puts "\n!! seed/nina setup failed"; exit 3 } "KILN_RUN_BEGIN" {} }55 send "sh /mnt-seed/runtest.sh; echo KILN_RUN_END_RC=\$?\r"56 set timeout $runto57 expect {58 timeout { puts "\n!! test script timed out"; exit 4 }59 -re {KILN_RUN_END_RC=[0-9]+} {}60 }61 send "poweroff\r"62 set timeout 12063 expect eof64'65echo "=== overlay discarded; golden unchanged ==="