#!/usr/bin/env bash # # scripts/tests/test-disk.sh — full automated data-disk round trip. # # Builds, stages the system image, boots QEMU headless, drives the shell # via the monitor (ls / mkdir / echo WRITING / cat / poweroff), then # verifies the results with mtools and fsck. # # Usage: # ./scripts/tests/test-disk.sh reuse the existing image # ./scripts/tests/test-disk.sh --fresh reformat + reseed first # # Env: SYSTEM_IMG, OVMF, QEMU (see scripts/lib.sh) # set -euo pipefail TNAME="disk" # shellcheck source=../lib.sh source "$(dirname "$0")/../lib.sh" FRESH=0 [ "${1:-}" = "--fresh" ] && FRESH=1 STAMP="$(date +%s)" echo "==> 1/6 build (kernel + bins)" build_all echo "==> 2/6 stage system image" if [ "$FRESH" -eq 1 ]; then stage_image --force; else stage_image; fi echo "==> 3/6 boot QEMU (headless)" test_boot sleep 1 # Volumes mount under /disk// where UID = "LABEL-SERIAL" (e.g. # RSDOS-5BD1E55F). Discover it from the boot log so the test works on # any image without knowing the serial in advance. VOL_UID="$(grep -a 'fat: mounted' "$LOG" | sed -n 's/.*at \/disk\/\([^ )]*\).*/\1/p' | head -1)" [ -n "$VOL_UID" ] || fail "no FAT32 volume was mounted (look for 'fat: mounted' in the log)" echo " mounted volume UID: $VOL_UID" echo "==> 4/6 drive the shell (ls / mkdir / echo WRITING / cat / poweroff)" # The filename is deliberately >13 chars so the FAT LFN path gets # multi-entry entries (they're stored last-first on disk). TESTFILE="disk-test-$STAMP.txt" sendkeys \ "ls /disk" \ "mkdir /disk/$VOL_UID/sub" \ "echo disk-test-$STAMP WRITING /disk/$VOL_UID/sub/$TESTFILE" \ "cat /disk/$VOL_UID/sub/$TESTFILE" \ "poweroff" echo "==> 5/6 wait for shutdown" wait_qemu_exit 30 || fail "QEMU did not exit after poweroff" echo "==> 6/6 verify" grep -a "disk-test-$STAMP" "$LOG" >/dev/null || fail "cat output missing from serial log" if ! fsck.fat -n "$SYSTEM_IMG" >/tmp/rsdos-fsck.out 2>&1; then fail "fsck.fat reports problems: $(tail -3 /tmp/rsdos-fsck.out)" fi MT="$(mtype -i "$SYSTEM_IMG" "::/sub/$TESTFILE" 2>/dev/null || true)" [ "$MT" = "disk-test-$STAMP" ] || fail "mtype mismatch: got '$MT'" echo "" echo "PASS — disk round trip OK (fsck clean, file survived poweroff)" echo " image: $SYSTEM_IMG" echo " volume: /disk/$VOL_UID" echo " written: /disk/$VOL_UID/sub/$TESTFILE = \"disk-test-$STAMP\""