#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" TARGET_DIR="$ROOT/target/x86_64-lancer-none/debug" KERNEL_BIN="$TARGET_DIR/lancer-kernel" ISO_DIR="$ROOT/target/iso-integration" ISO_FILE="$ROOT/target/lancer-integration.iso" LIMINE_DIR="$ROOT/target/limine" OVMF_VARS="$ROOT/target/ovmf/OVMF_VARS_4M.fd" OVMF_CODE="/usr/share/OVMF/OVMF_CODE_4M.fd" NVME_DISK="$ROOT/target/nvme-integration.img" BOOT_MODULES=( "lancer-init:init" "lancer-serial-driver:serial" "lancer-nvme-driver:nvme" "lancer-lancerfs:lancerfs" "lancer-fstest:fstest" ) echo "=== Lancer Integration Tests ===" echo "Building workspace" cargo build --manifest-path "$ROOT/Cargo.toml" --workspace echo "Formatting NVMe disk image" rm -f "$NVME_DISK" cd /tmp cargo run --manifest-path "$ROOT/Cargo.toml" -p lancer-lancerfs --no-default-features --features host --target x86_64-unknown-linux-gnu --bin mkfs_host -- "$NVME_DISK" 64M cd "$ROOT" echo "Creating ISO" rm -rf "$ISO_DIR" mkdir -p "$ISO_DIR/boot/limine" "$ISO_DIR/EFI/BOOT" cp "$KERNEL_BIN" "$ISO_DIR/boot/kernel" for entry in "${BOOT_MODULES[@]}"; do bin="${entry%%:*}" name="${entry##*:}" src="$TARGET_DIR/${bin}" if [ -f "$src" ]; then cp "$src" "$ISO_DIR/boot/${name}" else echo "WARNING: binary $src not found, skipping" fi done cat > "$ISO_DIR/boot/limine/limine.conf" <<'LIMINEEOF' timeout: 0 serial: yes verbose: yes /Lancer Integration Test protocol: limine kernel_path: boot():/boot/kernel module_path: boot():/boot/init module_path: boot():/boot/serial module_path: boot():/boot/nvme module_path: boot():/boot/lancerfs module_path: boot():/boot/fstest LIMINEEOF cp "$LIMINE_DIR/limine-bios.sys" "$ISO_DIR/boot/limine/" cp "$LIMINE_DIR/limine-bios-cd.bin" "$ISO_DIR/boot/limine/" cp "$LIMINE_DIR/limine-uefi-cd.bin" "$ISO_DIR/boot/limine/" cp "$LIMINE_DIR/BOOTX64.EFI" "$ISO_DIR/EFI/BOOT/" cp "$LIMINE_DIR/BOOTIA32.EFI" "$ISO_DIR/EFI/BOOT/" xorriso -as mkisofs \ -b boot/limine/limine-bios-cd.bin \ -no-emul-boot -boot-load-size 4 -boot-info-table \ --efi-boot boot/limine/limine-uefi-cd.bin \ -efi-boot-part --efi-boot-image --protective-msdos-label \ "$ISO_DIR" -o "$ISO_FILE" "$LIMINE_DIR/limine" bios-install "$ISO_FILE" mkdir -p "$(dirname "$OVMF_VARS")" cp /usr/share/OVMF/OVMF_VARS_4M.fd "$OVMF_VARS" echo "Booting QEMU with NVMe + IOMMU" set +e timeout 120s qemu-system-x86_64 \ -M q35,accel=kvm:tcg,kernel-irqchip=split \ -cpu host \ -m 512M \ -drive if=pflash,format=raw,readonly=on,file="$OVMF_CODE" \ -drive if=pflash,format=raw,file="$OVMF_VARS" \ -cdrom "$ISO_FILE" \ -device intel-iommu,intremap=on,caching-mode=on \ -drive file="$NVME_DISK",if=none,id=nvm,format=raw \ -device nvme,serial=lancernvme,drive=nvm \ -serial stdio \ -display none \ -no-reboot \ -device isa-debug-exit,iobase=0x501,iosize=0x04 \ < /dev/null 2>&1 QEMU_EXIT=$? set -e case $QEMU_EXIT in 33) echo "" echo "INTEGRATION TESTS PASSED" exit 0 ;; 35) echo "" echo "INTEGRATION TESTS FAILED" exit 1 ;; 124|137) echo "" echo "TIMEOUT" exit 1 ;; *) echo "" echo "UNEXPECTED EXIT CODE: $QEMU_EXIT" exit 1 ;; esac