sortix-mirror/build-aux/smoketest.sh
Jonas 'Sortie' Termansen 917722cf70 Add display server.
This change adds the display(1) graphical user interface and desktop
environment with basic windowing support and the graphical terminal(1)
emulator along with integrations in chkblayout(1), chvideomode(1),
sysinstall(8), sysupgrade(8), as well as the games and ports.

Adopt the Aurora procedural wallpaper in display(1) and login(8).

Remove the obsolete dispd.

Juhani contributed keyboard and video mode APIs to the display protocol
and other miscellaneous changes.

dzwdz contributed the initial functioning window buttons, improved title
bar, window tiling, and minor bug fixes

Co-authored-by: Juhani Krekelä <juhani@krekelä.fi>
Co-authored-by: dzwdz <kg67199@gmail.com>
2023-06-24 00:43:36 +02:00

218 lines
5.1 KiB
Bash
Executable file

#!/bin/sh
# Copyright (c) 2022 Jonas 'Sortie' Termansen.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# smoketest.sh
# Test an .iso release boots and passes rudimentary tests.
set -e
unset display
display="-display none"
unset enable_kvm
unset host
unset hostname
hostname=smoketest
unset iso
unset port
unset qemu
unset vm_root
dashdash=
previous_option=
for argument do
if [ -n "$previous_option" ]; then
eval $previous_option=\$argument
previous_option=
continue
fi
case $argument in
*=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
*=) parameter= ;;
*) parameter=yes ;;
esac
case $dashdash$argument in
--) dashdash=yes ;;
--display=*) display=$parameter ;;
--display) previous_option=display ;;
--enable-kvm) enable_kvm=-enable-kvm ;;
--host=*) host=$parameter ;;
--host) previous_option=host ;;
--hostname=*) hostname=$parameter ;;
--hostname) previous_option=hostname ;;
--iso=*) iso=$parameter ;;
--iso) previous_option=iso ;;
--port=*) port=$parameter ;;
--port) previous_option=port ;;
--qemu=*) qemu=$parameter ;;
--qemu) previous_option=qemu ;;
--vm-root=*) vm_root=$parameter ;;
--vm-root) previous_option=vm_root ;;
-*) echo "$0: unrecognized option $argument" >&2
exit 1 ;;
*)
echo "$0: unexpected extra operand $argument" >&2
exit 1
;;
esac
done
if [ -n "$previous_option" ]; then
echo "$0: option '$argument' requires an argument" >&2
exit 1
fi
if [ -z "$host" ]; then
echo "$0: error: No --host was specified" >&2
exit 1
fi
if [ -z "$iso" ]; then
echo "$0: error: No --iso was specified" >&2
exit 1
fi
iso=$(realpath -- "$iso")
if [ -z "$port" ]; then
echo "$0: error: No --port was specified" >&2
exit 1
fi
if [ -z "$qemu" ]; then
case "$host" in
i[3456]86-*) qemu=qemu-system-i386;;
x86_64-*) qemu=qemu-system-x86_64;;
*) echo "$0: error: Unable to detect qemu program for: $HOST" >&2
exit 1
esac
fi
set -x
unset tmpdir
# Reclaim a persistent VM directory (if any) and kill any leaked processes.
if [ -n "$vm_root" ]; then
unset tmpdir
export TMPDIR="$vm_root/$hostname"
mkdir -p -- "$TMPDIR"
if [ -e "$TMPDIR/pid" ]; then
kill -KILL "$(cat "$TMPDIR/pid")" || true
fi
rm -rf -- "$TMPDIR"/*
# Otherwise use a temporary directory that will be deleted upon completion.
else
export TMPDIR=$(mktemp -d -t "$hostname.vm.XXXXXXXXX")
tmpdir="$TMPDIR"
fi
# On exit, power off the virtual machine and clean up the working directory.
unset vmpid
cleanup_tmpdir() {
if [ -n "$vmpid" ]; then
kill -KILL $vmpid || true
fi
rm -f "$TMPDIR/pid"
if [ -n "$tmpdir" ]; then
rm -rf -- "$tmpdir"
elif [ -n "$TMPDIR" ]; then
rm -rf -- "$TMPDIR"/*
fi
}
trap cleanup_tmpdir EXIT HUP INT QUIT
cd "$TMPDIR"
# Configure the ssh authentication and enabling sshd.
ssh-keygen -f id_rsa -N ''
rm -rf liveconfig bootconfig
tix-iso-liveconfig \
--hostname="$hostname" \
--root-ssh-authorized-keys=id_rsa.pub \
--sshd-keygen \
--sshd-key-known-hosts-file=sortix.iso.known_hosts \
--sshd-key-known-hosts-hosts='localhost 127.0.0.1' \
liveconfig
mkdir -p liveconfig/etc liveconfig/etc/init
cat > liveconfig/etc/init/local << EOF
require sshd optional
EOF
tix-iso-bootconfig \
--random-seed \
--timeout=0 \
--disable-gui \
--liveconfig=liveconfig \
bootconfig
mkdir -p bootconfig/boot/grub
cat >> bootconfig/boot/grub/hooks.cfg << EOF
select_ports_set_no
port_binutils=true
port_dash=true
port_gcc=true
port_grep=true
port_make=true
port_sed=true
port_ssh=true
EOF
tix-iso-add "$iso" bootconfig -o sortix.iso
# Spawn the virtual machine in the background.
$qemu \
$enable_kvm \
-name "$hostname" \
-nodefaults \
$display \
-m 256 \
-vga std \
-boot d \
-cdrom sortix.iso \
-device e1000,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp:127.0.0.1:$port-:22 &
vmpid=$!
echo $vmpid > pid
# Wait for the virtual machine to boot to sshd.
do_ssh() {
ssh \
-i id_rsa \
-oUserKnownHostsFile=sortix.iso.known_hosts \
-oConnectionAttempts=30 \
-p $port \
root@localhost \
"$@"
}
retries=30
while true; do
if ! do_ssh 'uname -a'; then
if [ $retries = 1 ]; then
exit 1
fi
sleep 1
if ! kill -WINCH "$vmpid"; then
unset vmpid
rm -f "$TMPDIR/pid"
exit 1
fi
retries=$(expr $retries - 1)
continue
fi
break
done
# Test for smoke.
do_ssh 'regress'
do_ssh 'cd /src/editor && make'
do_ssh '! grep -Ei "failed|exited unsuccessfully" /var/log/init.log'
do_ssh 'memstat -a && df -h'