#!/bin/bash
set -e -o pipefail

exec 3>&2 2>&1

ISO_TO_TEST="/usr/lib/ipxe/ipxe.iso"

arch=$1
medium=$2

echo "Testing ipxe.iso on $arch, emulated as $medium"

iso_file="${AUTOPKGTEST_TMP}/ipxe.iso"

. debian/tests/qemu-cmd

QEMU_CMD+=(-blockdev driver=raw,node-name=img,file.driver=file,file.filename="${iso_file}")
QEMU_CMD+=(-device virtio-scsi-pci,id=scsi)
QEMU_CMD+=(-device scsi-${medium},id=medium,bus=scsi.0,drive=img,bootindex=1)

cp -v "${ISO_TO_TEST}" "$iso_file"

TFTP_DIR="${AUTOPKGTEST_TMP}/tftp"

mkdir -p "${TFTP_DIR}"
cat > "${TFTP_DIR}/boot.ipxe" <<EOF
#!ipxe
iseq \${version:hex}: $(echo -n "${DEB_VERSION}" | xxd -p | fold -w 2 | tr '\n' ':') && echo IPXE_TEST_DEAD_BEEF ||
sleep 1
echo IPXE_TEST_END_END
sleep 1000000
EOF

QEMU_CMD+=(-device virtio-net-pci,netdev=net0,id=net0,romfile=)
QEMU_CMD+=(-netdev user,id=net0,tftp="${TFTP_DIR}",bootfile=boot.ipxe)

expect -- - "${QEMU_CMD[@]}"<< 'EOF'
set timeout 120

proc abort {msg} {
  set ferr [open "/dev/fd/3" "w"]
  puts $ferr $msg
  close $ferr
  exit 0
}

spawn {*}$argv

expect {
    "*IPXE_TEST_DEAD_BEEF"  {}
    eof                     {abort "VM terminates unexpectedly"}
    timeout                 {abort "Timeout"}
    "*No bootable device"   {abort "Cannot Boot iPXE"}
    "*Shell>"               {abort "Cannot Boot iPXE"}
    "*IPXE_TEST_END_END"    {abort "Cannot Boot iPXE"}
}
expect {
    eof                     {abort "VM terminates unexpectedly"}
    timeout                 {abort "Timeout"}
    "*IPXE_TEST_END_END"    {}
}
exit 0
EOF
printf '\x1b[!p\n'

rm -f "$iso_file"
