#!/bin/sh
#
# RAUC qemu test runner script
#
# Executes the RAUC test suite in a safe qemu environment with simulated root
# privileges to emulate and test virtual devices such as block devices, NAND,
# etc.
#
# Usage:
#
# ./qemu-test <argument>
#
# Optional arguments:
#
#   passthrough       Enable passthrough of the host's CPU features
#   shell             Setup qemu test system and provide an interactive shell
#   system            Setup qemu dummy system that behaves like a target (without reboot!)
#   service-backtrace Run service under gdb and show backtrace on error
#   asan              Set environment variables to support address sanitizer
#   test=<test>       Run specified test (for use with git bisect)
#
# When no argument is given, the default test suite will be executed

set -e

rm -f qemu-test-ok

KERNEL_URL="https://github.com/jluebbe/linux/releases/download/rauc-test-20241015-1/bzImage"
KERNEL_SHA256SUM="1d645700187640c58ea3821e55723cfe1627b68fcf0f38706d7bdd93c71fa056"

check_kernel() {
  if test -f bzImage && echo "$KERNEL_SHA256SUM bzImage" | sha256sum --check --status; then
    return 0
  fi
  curl -L "$KERNEL_URL" -o bzImage.tmp
  if echo "$KERNEL_SHA256SUM bzImage.tmp" | sha256sum --check --status; then
    mv bzImage.tmp bzImage
  else
    echo "bad bzImage hash"
    return 1
  fi
}

check_kernel || exit 1

# make sure the tests are built
BUILD_DIR="build/"

if [ ! -d $BUILD_DIR ]; then
	echo "Could not find 'build/' dir. Run 'meson setup build'."
fi
ninja -C $BUILD_DIR

if [ -z "$QEMU_BIN" ]; then
  QEMU_BIN="qemu-system-x86_64"
fi

QEMU_ARGS=""
BOOTNAME="system0"
for x in "$@"; do
  if [ "$x" = "passthrough" ]; then
    QEMU_ARGS="$QEMU_ARGS -cpu host"
  elif [ "$x" = "system" ]; then
    BOOTNAME="A"
  fi
done

if test -w /dev/kvm; then
  QEMU_ARGS="$QEMU_ARGS -enable-kvm"
else
  echo "/dev/kvm is not accessible, using emulation"
fi

if test -f /usr/share/qemu/qboot.rom; then
  echo "found qboot, enabling"
  QEMU_ARGS="$QEMU_ARGS -bios /usr/share/qemu/qboot.rom"
fi

if "$QEMU_BIN" -device help | grep -q 'name "emmc"'; then
  echo "found emmc support, enabling"
  truncate -s 64M qemu-test-emmc.img
  QEMU_ARGS="$QEMU_ARGS -drive if=none,id=emmc-drive,file=qemu-test-emmc.img,format=raw"
  QEMU_ARGS="$QEMU_ARGS -device sdhci-pci"
  QEMU_ARGS="$QEMU_ARGS -device emmc,id=emmc0,drive=emmc-drive,boot-partition-size=1048576"
fi

$QEMU_BIN \
  $QEMU_ARGS \
  -machine q35 \
  -m 1G \
  -smp 2 \
  -kernel bzImage \
  -nographic -serial mon:stdio \
  -no-reboot \
  -virtfs local,id=rootfs,path=/,security_model=none,mount_tag=/dev/root,multidevs=remap \
  -nic user,model=virtio-net-pci \
  -append "loglevel=6 console=ttyS0 nandsim.id_bytes=0x20,0xa2,0x00,0x15 nandsim.parts=0x100 mtdram.total_size=32768 root=/dev/root rootfstype=9p rootflags=msize=16777216 rw init=$(pwd)/qemu-test-init rauc.slot=$BOOTNAME $*"

test -f qemu-test-ok
