hostap/tests/hwsim/vm/vm-run.sh
Jouni Malinen 179279eb34 tests: Move VM starting delay control into parallel-vm.py
This is more efficient since we can now start only the necessary number
of VMs instead of always forcing all VMs to start with one second delay.
This can also control the starting delay by keeping at most two VMs
starting at a time instead of using the hardcoded one second wait for
each consecutive VM.

Signed-off-by: Jouni Malinen <j@w1.fi>
2019-12-27 16:03:50 +02:00

199 lines
4.3 KiB
Bash
Executable file

#!/bin/bash
cd "$(dirname $0)"
if [ -z "$TESTDIR" ] ; then
TESTDIR=$(pwd)/../
fi
if [ -n "$HWSIM_TEST_LOG_DIR" ] ; then
LOGS="$HWSIM_TEST_LOG_DIR"
else
LOGS=/tmp/hwsim-test-logs
fi
# increase the memory size if you want to run with valgrind, 512 MB works
MEMORY=256
# Some ubuntu systems (notably 12.04) have issues with this - since the guest
# mounts as read-only it should be safe to not specify ,readonly. Override in
# vm-config if needed (see below)
ROTAG=,readonly
# set this to ttyS0 to see kvm messages (if something doesn't work)
KVMOUT=ttyS1
# you can set EPATH if you need anything extra in $PATH inside the VM
#EPATH=/some/dir
# extra KVM arguments, e.g., -s for gdbserver
#KVMARGS=-s
# number of channels each hwsim device supports
CHANNELS=1
test -f vm-config && . vm-config
test -f ~/.wpas-vm-config && . ~/.wpas-vm-config
if [ -z "$KERNEL" ] && [ -z "$KERNELDIR" ] ; then
echo "You need to set a KERNEL or KERNELDIR (in the environment or vm-config)"
exit 2
fi
if [ -z "$KERNEL" ] ; then
if [ -e $KERNELDIR/arch/x86_64/boot/bzImage ]; then
KERNEL=$KERNELDIR/arch/x86_64/boot/bzImage
elif [ -e $KERNELDIR/linux ]; then
KERNEL=$KERNELDIR/linux
else
echo "No suitable kernel image found from KERNELDIR"
exit 2
fi
fi
if [ ! -e $KERNEL ]; then
echo "Kernel image not found: $KERNEL"
exit 2
fi
CMD=$TESTDIR/vm/inside.sh
unset RUN_TEST_ARGS
TIMESTAMP=$(date +%s)
DATE=$TIMESTAMP
CODECOV=no
TIMEWARP=0
TELNET_QEMU=
TELNET_ARG=0
CODECOV_DIR=
while [ "$1" != "" ]; do
case $1 in
--timestamp ) shift
TIMESTAMP=$1
shift
;;
--ext ) shift
DATE=$TIMESTAMP.$1
shift
;;
--codecov ) shift
CODECOV=yes
;;
--codecov_dir ) shift
CODECOV_DIR=$1
shift
;;
--timewrap ) shift
TIMEWARP=1
;;
--telnet ) shift
TELNET_ARG=1
TELNET_QEMU="-net nic,model=virtio -net user,id=telnet,restrict=on,net=172.16.0.0/24,hostfwd=tcp:127.0.0.1:$1-:23"
shift
;;
* )
RUN_TEST_ARGS="$RUN_TEST_ARGS$1 "
shift
;;
esac
done
LOGDIR=$LOGS/$DATE
mkdir -p $LOGDIR
rm -f $LOGS/latest
ln -s $LOGDIR $LOGS/latest
if [ -n "$CODECOV_DIR" ]; then
cp -a $CODECOV_DIR/alt-wpa_supplicant $LOGDIR
cp -a $CODECOV_DIR/alt-hostapd $LOGDIR
cp -a $CODECOV_DIR/alt-hostapd-as $LOGDIR
cp -a $CODECOV_DIR/alt-hlr_auc_gw $LOGDIR
elif [ $CODECOV = "yes" ]; then
./build-codecov.sh $LOGDIR || exit 1
else
CODECOV=no
fi
echo "Starting test run in a virtual machine"
if [ -x $KERNEL ]; then
unset KVM
else
KVM=kvm
for kvmprog in kvm qemu-kvm; do
if $kvmprog --version &> /dev/null; then
KVM=$kvmprog
break
fi
done
fi
argsfile=$(mktemp)
if [ $? -ne 0 ] ; then
exit 2
fi
function finish {
rm -f $argsfile
}
trap finish EXIT
echo "$RUN_TEST_ARGS" > $argsfile
A="mac80211_hwsim.support_p2p_device=0 "
A+="mac80211_hwsim.channels=$CHANNELS "
A+="mac80211_hwsim.radios=7 "
A+="cfg80211.dyndbg=+p "
A+="mac80211.dyndbg=+p "
A+="mac80211_hwsim.dyndbg=+p "
A+="init=$CMD "
A+="testdir=$TESTDIR "
A+="timewarp=$TIMEWARP "
A+="TELNET=$TELNET_ARG "
A+="EPATH=$EPATH "
A+="ARGS=$argsfile "
A+="console=$KVMOUT "
A+="ro"
if [ -z $KVM ]; then
$KERNEL \
mem=${MEMORY}M \
LOGDIR=$LOGDIR \
time-travel=inf-cpu \
$A \
root=none hostfs=/ rootfstype=hostfs rootflags=/ \
ssl0=fd:0,fd:1 \
ssl1=fd:100 \
ssl-non-raw \
100<>$LOGDIR/console 2>&1 | \
sed -u '0,/VM has started up/d'
else
$KVM \
-kernel $KERNEL \
-smp 4 \
$KVMARGS \
-m $MEMORY \
-nographic \
-fsdev local,security_model=none,id=fsdev-root,path=/$ROTAG \
-device virtio-9p-pci,id=fs-root,fsdev=fsdev-root,mount_tag=/dev/root \
-fsdev local,security_model=none,id=fsdev-logs,path="$LOGDIR",writeout=immediate \
-device virtio-9p-pci,id=fs-logs,fsdev=fsdev-logs,mount_tag=logshare \
-monitor null \
-serial stdio \
-serial file:$LOGDIR/console \
$TELNET_QEMU \
-append "$A root=/dev/root rootflags=trans=virtio,version=9p2000.u rootfstype=9p" | \
sed -u '0,/VM has started up/d'
fi
if [ $CODECOV = "yes" ]; then
echo "Preparing code coverage reports"
./process-codecov.sh $LOGDIR "" restore
./combine-codecov.sh $LOGDIR lcov
fi
echo
echo "Test run completed"
echo "Logfiles are at $LOGDIR ($LOGS/latest)"
if [ $CODECOV = "yes" ]; then
echo "Code coverage report:"
echo "file://$LOGDIR/lcov/index.html"
fi