You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.9 KiB
102 lines
2.9 KiB
#!/bin/bash
|
|
|
|
set -eu -o pipefail
|
|
|
|
usage_information() {
|
|
local PN
|
|
PN="$(basename "$0")"
|
|
|
|
echo "${PN}: tool to boot an ISO, generate a screenshot of the system,"
|
|
echo "and optionally compare the screenshot against a reference image"
|
|
echo
|
|
echo "Usage: ${PN} <filename.iso> <screenshot.jpg> [<screenshot_compare.jpg>]" >&2
|
|
echo
|
|
echo "Usage examples:
|
|
|
|
${PN} ./sip_provider_mr7.5.1.iso /tmp/screenshot.jpg
|
|
|
|
${PN} ./sip_provider_mr7.5.1.iso /tmp/memtest.jpg ./t/screenshots/01-memtest.jpg
|
|
"
|
|
}
|
|
|
|
if [ $# -lt 2 ] ; then
|
|
usage_information >&2
|
|
exit 1
|
|
fi
|
|
|
|
ISO="$1"
|
|
SCREENSHOT="$2"
|
|
|
|
if [ -n "${3:-}" ] ; then
|
|
SCREENSHOT_COMPARE="$3"
|
|
fi
|
|
|
|
QEMU_MONITOR=$(mktemp -t iso-tester-qemu.XXXXXXXXXX)
|
|
SCREENDUMP=$(mktemp -t iso-tester-screen.XXXXXXXXXX)
|
|
|
|
send_command() {
|
|
echo "$*" | socat - UNIX-CONNECT:"${QEMU_MONITOR}"
|
|
# this is necessary to give the system some time to execute it before receiving the next command
|
|
sleep 0.1
|
|
}
|
|
|
|
if [[ ! -x "$(which qemu-system-x86_64)" ]] || [[ ! -x "$(which socat)" ]] || [[ ! -x "$(which convert)" ]]; then
|
|
# only install tools automatically inside docker environment
|
|
if [ -e /.dockerinit ] || [ -e /.dockerenv ] ; then
|
|
apt-get update
|
|
apt-get install --assume-yes --no-install-recommends socat qemu-system-x86 imagemagick
|
|
else
|
|
echo "Please make sure to have socat qemu-system-x86 imagemagick available, not automatically installing them." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
qemu-system-x86_64 -display none -monitor unix:"${QEMU_MONITOR}",server,nowait -boot order=d -m 128 -cdrom "${ISO}" &
|
|
PID=$!
|
|
echo "qemu process running as PID $PID"
|
|
|
|
# ensure the qemu process is ready for receiving commands
|
|
sleep 1
|
|
|
|
send_command "sendkey down"
|
|
send_command "sendkey down"
|
|
send_command "sendkey down"
|
|
send_command "sendkey down"
|
|
send_command "sendkey down"
|
|
send_command "sendkey down"
|
|
send_command "sendkey ret"
|
|
send_command "sendkey down"
|
|
send_command "sendkey ret"
|
|
send_command "screendump ${SCREENDUMP}"
|
|
send_command "quit"
|
|
|
|
rm -f "${QEMU_MONITOR}"
|
|
|
|
if ! [ -f "${SCREENDUMP}" ] ; then
|
|
echo "Failed to generated screenshot file, bailing out." >&2
|
|
kill "$PID" || true
|
|
exit 1
|
|
fi
|
|
|
|
convert "${SCREENDUMP}" "${SCREENSHOT}"
|
|
echo "Generated screenshot file ${SCREENSHOT}"
|
|
rm -f "${SCREENDUMP}"
|
|
|
|
if ! [ -x ./screenshot-compare ] ; then
|
|
wget -O ./screenshot-compare https://deb.sipwise.com/files/screenshot-compare
|
|
chmod 755 ./screenshot-compare
|
|
fi
|
|
|
|
mkdir -p reports
|
|
if [ -n "${SCREENSHOT_COMPARE:-}" ] ; then
|
|
echo "Comparing ${SCREENSHOT} against ${SCREENSHOT_COMPARE}"
|
|
if ./screenshot-compare "${SCREENSHOT}" "${SCREENSHOT_COMPARE}" ; then
|
|
echo "Looks like ${SCREENSHOT} and ${SCREENSHOT_COMPARE} are looking similar enough."
|
|
echo "1..0" > ./reports/screenshot.tap
|
|
else
|
|
echo "Looks like ${SCREENSHOT} and ${SCREENSHOT_COMPARE} are NOT looking similar enough."
|
|
echo "1..1" > ./reports/screenshot.tap
|
|
echo "not ok 1 ${SCREENSHOT} and ${SCREENSHOT_COMPARE} don't look similar enough" >> ./reports/screenshot.tap
|
|
fi
|
|
fi
|