#!/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:
#
#   coverage    Run with coverage report generation enabled
#   shell       Setup qemu test system and provide an interactive shell
#
# When no argument is given, the default test suite will be executed

set -e

rm -f qemu-test-ok

# TODO use virtfs with multidevs=remap on qemu 4.2
# https://github.com/qemu/qemu/commit/1a6ed33cc56997479bbe5b48337ff8da44585bd4

KERNEL_URL="https://github.com/jluebbe/linux/releases/download/rauc-test-20200519-1/bzImage"
KERNEL_SHA256SUM="8627a663bdf13e8665ad9087774a0461dc77c6f23f0f21246b384b7f5971639b"

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
make TESTS= check > /dev/null

qemu-system-x86_64 \
  -enable-kvm \
  -machine q35 \
  -m 256M \
  -smp 2 \
  -kernel bzImage \
  -nographic -serial mon:stdio \
  -no-reboot \
  -virtfs local,id=rootfs,path=/,security_model=none,mount_tag=/dev/root \
  -nic user,model=virtio-net-pci \
  -append "loglevel=6 console=ttyS0 nandsim.id_bytes=0x20,0xa2,0x00,0x15 nandsim.parts=0x100, root=/dev/root rootfstype=9p rw init=$(pwd)/qemu-test-init rauc.slot=system0 $*"

test -f qemu-test-ok
