#!/usr/bin/env nix-shell
#! nix-shell -v -i bash -p expect socat

# This is a test for liminix-rebuild. It's not a CI test because
# liminix-rebuild calls nix-build so won't run inside a derivation,
# meaning you have to remember to run it manually when changing
# liminix-rebuild

. tests/test-helpers.sh

set -e

while test -n "$1"; do
    case $1 in
	--fast)
	    FAST=true
	    ;;
	*)
	    ;;
    esac
    shift
done

here=$(pwd)/tests/min-copy-closure
top=$(pwd)

work=$(mktemp -d -t "test-lim-rebuild-XXXXXX")
echo $work
cd $work

deriv(){
    (cd $top && nix-build -I liminix-config=${here}/config-ext4.nix  --arg device "import ./devices/qemu-armv7l" -A $1 );
}

PATH=$(deriv pkgs.pkgsBuildBuild.min-copy-closure)/bin:$(deriv pkgs.pkgsBuildBuild.run-liminix-vm)/bin:$PATH

rootfs=$(deriv outputs.rootfs)
kernel=$(deriv outputs.zimage)
uboot=$(deriv outputs.u-boot)

test -d ./vm && rm -rf vm
mkdir ./vm

cat ${rootfs} > rootfs

truncate -s 32M rootfs
resize2fs rootfs

dd if=rootfs of=disk-image bs=512 seek=4 conv=sync
echo '4,-,L,*' | sfdisk disk-image

run-liminix-vm --background vm  \
	       --command-line "console=ttyAMA0 panic=10 oops=panic loglevel=8 root=/dev/vda1 rootfstype=ext4" \
	       --phram-address 0x50000000 --arch arm \
	       --lan "user,hostfwd=tcp::2022-:22" \
	       --flag -append --flag "root=/dev/vda1" --flag -hda \
	       --flag disk-image $kernel /dev/null

expect ${here}/wait-until-ready.expect
echo "READY"

touch known_hosts
export SSH_COMMAND="ssh -o UserKnownHostsFile=${work}/known_hosts -o StrictHostKeyChecking=no -p 2022 -i ${here}/id"

if test -n "$FAST"; then
    (cd ${top} && liminix-rebuild --fast root@localhost -I liminix-config=${here}/with-figlet.nix  --argstr deviceName qemu-armv7l)
    cd ${work} && expect $here/wait-for-soft-restart.expect
else
    (cd ${top} && liminix-rebuild root@localhost -I liminix-config=${here}/with-figlet.nix  --arg device "import ./devices/qemu-armv7l")
    cd ${work} && expect $here/wait-for-reboot.expect
fi

cd / ; rm -rf $work