d52009bf02c1

add in-VM test runner and G-01/02/03 generations test; injects fresh nina, captures serial vs ground truth

time
2026-05-29 16:08 UTC · 4 months ago
machine
koh2
parent
07d8306ec610
2 files test/vm/run-in-vm.sh+65 −0test/vm/tests/gen.sh+42 −0
test/vm/run-in-vm.sh+65 −0
@@ -0,0 +1,65 @@1+#!/usr/bin/env bash2+# Run a test script inside a throwaway overlay of the golden image, injecting a3+# fresh nina binary so we test the latest build without rebaking the golden.4+# The script's serial output is captured (this command's stdout); the overlay is5+# discarded afterward, leaving the golden untouched.6+#7+# Usage: run-in-vm.sh <golden.qcow2> <nina-linux-binary> <test-script.sh>8+# Tunables via env: MEM_MB (2048), SMP (2), RUN_TIMEOUT (1800)9+set -euo pipefail10+11+GOLDEN="${1:?usage: run-in-vm.sh <golden.qcow2> <nina-bin> <test-script>}"12+NINA="${2:?need nina binary}"13+SCRIPT="${3:?need test script}"14+MEM_MB="${MEM_MB:-2048}"15+SMP="${SMP:-2}"16+RUN_TIMEOUT="${RUN_TIMEOUT:-1800}"17+for f in "$GOLDEN" "$NINA" "$SCRIPT"; do [ -f "$f" ] || { echo "missing: $f" >&2; exit 1; }; done18+19+work="$(mktemp -d)"20+trap 'rm -rf "$work"' EXIT21+seed="$work/seed"; mkdir -p "$seed"22+cp "$NINA" "$seed/nina"23+cp "$SCRIPT" "$seed/runtest.sh"24+SEED_ISO="$work/seed.iso"25+hdiutil makehybrid -quiet -iso -joliet -default-volume-name NINASEED -o "$SEED_ISO" "$seed"26+27+overlay="$work/overlay.qcow2"28+qemu-img create -f qcow2 -b "$(cd "$(dirname "$GOLDEN")" && pwd)/$(basename "$GOLDEN")" -F qcow2 "$overlay" >/dev/null29+echo "throwaway overlay: $overlay  (backing: $GOLDEN)"30+31+export RV_OVERLAY="$overlay" RV_SEED="$SEED_ISO" RV_MEM="$MEM_MB" RV_SMP="$SMP" RV_TIMEOUT="$RUN_TIMEOUT"32+33+expect -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)40+41+  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+    -nographic47+48+  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+'65+echo "=== overlay discarded; golden unchanged ==="

view file

test/vm/tests/gen.sh+42 −0
@@ -0,0 +1,42 @@1+#!/usr/bin/env sh2+# G-01/G-02/G-03 generations validation, run inside the VM. Prints nina's output3+# alongside ground-truth system-profile state so the host can judge pass/fail.4+# Ground truth uses the SYSTEM profile explicitly (-p), which is what5+# nixos-rebuild manages.6+set -u7+N=/root/nina8+9+sysgens() { nix-env -p /nix/var/nix/profiles/system --list-generations 2>/dev/null | wc -l | tr -d ' '; }10+syscur()  { readlink /nix/var/nix/profiles/system | sed -n 's/.*system-\([0-9][0-9]*\)-link/\1/p'; }11+12+echo "KILN_GEN_TEST_BEGIN"13+echo "GROUND before: sysgens=$(sysgens) syscur=$(syscur)"14+15+echo "### T-001 nina apply (expect exit 0, system generation increments)"16+$N apply; echo "T001_RC=$?"17+echo "GROUND after apply#1: sysgens=$(sysgens) syscur=$(syscur)"18+19+echo "### T-002 nina apply again (expect generation increments again)"20+$N apply; echo "T002_RC=$?"21+echo "GROUND after apply#2: sysgens=$(sysgens) syscur=$(syscur)"22+23+echo "### T-015 nina history (expect all system generations, current marked)"24+$N history; echo "HIST_RC=$?"25+26+echo "### T-017 nina gen current (expect current system generation number)"27+$N gen current; echo "GENCUR_RC=$?"28+29+echo "### T-010 nina back (expect system generation decrements)"30+$N back; echo "BACK_RC=$?"31+echo "GROUND after back: syscur=$(syscur)"32+33+echo "### T-012 nina go <syscur+1> (return forward)"34+TARGET=$(( $(syscur) + 1 ))35+$N go "$TARGET"; echo "GO_RC=$?"36+echo "GROUND after go $TARGET: syscur=$(syscur)"37+38+echo "### T-030 nina clean (expect exit 0, garbage collected)"39+$N clean; echo "CLEAN_RC=$?"40+echo "GROUND after clean: sysgens=$(sysgens)"41+42+echo "KILN_GEN_TEST_END"

view file