# test/ Test harnesses for veilor-os ISO builds. ## Files | File | Purpose | |------|---------| | `run-vm.sh` | Manual smoke test — boot the latest ISO interactively in QEMU/KVM. SSH key injection via cloud-init seed + monitor sendkey fallback for live-image login. | | `auto-install.sh` | **Autonomous** end-to-end install test. Boots ISO, drives the gum installer via QEMU monitor `sendkey`, waits for anaconda to finish + reboot, SSHs into the installed system, runs validation checklist. Prints PASS/FAIL summary. | | `auto-install-keymap.sh` | Sourced helper. Provides `km_send_str`, `km_send_chord`, `km_send_key`, `km_screendump`, `km_wait_socket`, etc. Reusable by other automation. | | `boot-checklist.md` | Manual post-install checklist (run on a real spare laptop). | ## Running the autonomous installer test ```sh ./test/auto-install.sh build/out/veilor-os-*.iso ``` Hardcoded inputs (deterministic — do not edit during a test run): - Disk: first `/dev/vda` (the only disk in QEMU) - Hostname: `veilor` (installer hardcoded since v0.5.4) - LUKS passphrase: `testpass1234` - Admin password: `adminpass1234` - Locale: `en_GB.UTF-8` Expected runtime: 20–30 minutes wall clock (anaconda dominates). ### Outputs - `/tmp/veilor-auto-install.log` — full driver log - `/tmp/veilor-auto-install-NN-.png` — milestone screenshots - `/tmp/veilor-auto-install-final-ssh.txt` — final SSH session capture (uname/lsblk/cmdline/failed units) ### Exit codes - `0` — all validation checks passed - `1` — any failure (anaconda crashed, SSH never came up, validation check failed) - `2` — preflight failure (missing tool, bad ISO arg, missing OVMF) ### Prerequisites - `qemu-system-x86_64`, `qemu-img`, `socat`, `ssh`, `ssh-keygen` - `edk2-ovmf` (OVMF UEFI firmware at `/usr/share/edk2/ovmf/OVMF_{CODE,VARS}.fd`) - `mkisofs` or `xorriso` (for cloud-init seed ISO; harness falls back to TTY1 driving if seed cannot be built or cloud-init does not run on the installed system) - `convert` from ImageMagick (optional — converts PPM screendumps to PNG; harness keeps PPM if absent) - KVM access (`/dev/kvm` readable by the user) ### What it validates Post-install on the booted system: - `/etc/os-release` → `NAME=veilor-os` - `hostnamectl --static` → `veilor` - `systemctl is-active` → `active` for `sshd fail2ban usbguard tuned auditd firewalld chronyd sddm` - `getenforce` → `Enforcing` (preferred) or `Permissive` (acceptable for v0.5.x) - `lsblk -f` shows `crypto_LUKS` + `btrfs` - `/etc/crypttab` has a LUKS entry - `getent passwd admin` returns the user - `/usr/local/bin/{veilor-power,veilor-doctor,veilor-update}` are present and executable - `/proc/cmdline` contains `init_on_alloc=1` ### Troubleshooting - **Stuck at boot banner**: ISO didn't autostart `veilor-installer` on tty1. Check `serial.log` and `auto-install-vm-NN-*.png` screenshots. The harness aborts after 5 minutes of identical screen frames. - **SSH never up**: cloud-init may not have run on the installed system (no `cidata` mount). The harness falls back to TTY1 driving — typing the LUKS passphrase, logging in as admin, and hand-injecting the SSH key. If both paths fail, validation cannot proceed. - **`screendump` produces unreadable PPM**: install ImageMagick (`dnf install ImageMagick`) so the harness converts to PNG.