fragattacks/tests/hwsim/vm/vm-run.sh
Jouni Malinen 3f33b3ad8c tests: Collect code coverage separately from each component in vm
Use a more robust design for collecting the gcov logs from the case
where test cases are run within a virtual machine. This generates a
writable-from-vm build tree for each component separately so that the
lcov and gcov can easily find the matching source code and data files.
In addition, prepare the reports automatically at the end of the
vm-run.sh --codecov execution.

Signed-hostap: Jouni Malinen <j@w1.fi>
2013-12-27 18:11:07 +02:00

149 lines
4.7 KiB
Bash
Executable File

#!/bin/bash
cd "$(dirname $0)"
if [ -z "$TESTDIR" ] ; then
TESTDIR=$(pwd)/../
fi
LOGS=/tmp/hwsim-test-logs
# increase the memory size if you want to run with valgrind, 512 MB works
MEMORY=128
# 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
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
KERNEL=$KERNELDIR/arch/x86_64/boot/bzImage
fi
CMD=$TESTDIR/vm/inside.sh
DATE=$(date +%s)
LOGDIR=$LOGS/$DATE
mkdir -p $LOGDIR
if [ "$1" = "--codecov" ]; then
shift
CODECOV=yes
DIR=$PWD
if [ -e /tmp/logs ]; then
echo "/tmp/logs exists - cannot prepare build trees"
exit 1
fi
mkdir /tmp/logs
echo "Preparing separate build trees for hostapd/wpa_supplicant"
cd ../../..
git archive --format=tar --prefix=hostap/ HEAD > /tmp/logs/hostap.tar
cd $DIR
cat ../../../wpa_supplicant/.config > /tmp/logs/wpa_supplicant.config
echo "CONFIG_CODE_COVERAGE=y" >> /tmp/logs/wpa_supplicant.config
cat ../../../hostapd/.config > /tmp/logs/hostapd.config
echo "CONFIG_CODE_COVERAGE=y" >> /tmp/logs/hostapd.config
cd /tmp/logs
tar xf hostap.tar
mv hostap alt-wpa_supplicant
mv wpa_supplicant.config alt-wpa_supplicant/wpa_supplicant/.config
tar xf hostap.tar
mv hostap alt-hostapd
cp hostapd.config alt-hostapd/hostapd/.config
tar xf hostap.tar
mv hostap alt-hostapd-as
mv hostapd.config alt-hostapd-as/hostapd/.config
rm hostap.tar
cd /tmp/logs/alt-wpa_supplicant/wpa_supplicant
echo "Building wpa_supplicant"
make -j8 > /dev/null
cd /tmp/logs/alt-hostapd/hostapd
echo "Building hostapd"
make -j8 hostapd > /dev/null
cd /tmp/logs/alt-hostapd-as/hostapd
echo "Building hostapd/hlr_auc_gw (AS)"
make -j8 hostapd hlr_auc_gw > /dev/null
cd $DIR
mv /tmp/logs/alt-wpa_supplicant $LOGDIR
mv /tmp/logs/alt-hostapd $LOGDIR
mv /tmp/logs/alt-hostapd-as $LOGDIR
else
CODECOV=no
fi
echo "Starting test run in a virtual machine"
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 \
-append "mac80211_hwsim.channels=$CHANNELS mac80211_hwsim.radios=5 init=$CMD testdir=$TESTDIR console=$KVMOUT root=/dev/root rootflags=trans=virtio,version=9p2000.u ro rootfstype=9p EPATH=$EPATH ARGS=$*"
if [ $CODECOV = "yes" ]; then
mv $LOGDIR/alt-wpa_supplicant /tmp/logs
mv $LOGDIR/alt-hostapd /tmp/logs
mv $LOGDIR/alt-hostapd-as /tmp/logs
echo "Generating code coverage report for wpa_supplicant"
cd /tmp/logs/alt-wpa_supplicant/wpa_supplicant
lcov -c -d .. > lcov.info 2> lcov.log
genhtml -t "wpa_supplicant hwsim test run $DATE" lcov.info --output-directory $LOGDIR/lcov-wpa_supplicant >> lcov.log 2>&1
mv lcov.info lcov.log $LOGDIR/lcov-wpa_supplicant
echo "Generating code coverage report for hostapd"
cd /tmp/logs/alt-hostapd/hostapd
lcov -c -d .. > lcov.info 2> lcov.log
genhtml -t "hostapd hwsim test run $DATE" lcov.info --output-directory $LOGDIR/lcov-hostapd >> lcov.log 2>&1
mv lcov.info lcov.log $LOGDIR/lcov-hostapd
echo "Generating code coverage report for hostapd/hlr_auc_gw (AS)"
cd /tmp/logs/alt-hostapd-as/hostapd
lcov -c -d .. > lcov.info 2> lcov.log
genhtml -t "hostapd/hlr_auc_gw (AS) hwsim test run $DATE" lcov.info --output-directory $LOGDIR/lcov-hostapd-as >> lcov.log 2>&1
mv lcov.info lcov.log $LOGDIR/lcov-hostapd-as
cd $DIR
rm -r /tmp/logs/alt-wpa_supplicant
rm -r /tmp/logs/alt-hostapd
rm -r /tmp/logs/alt-hostapd-as
rmdir /tmp/logs
fi
echo
echo "Test run completed"
echo "Logfiles are at $LOGDIR"
if [ $CODECOV = "yes" ]; then
echo "Code coverage reports:"
echo "wpa_supplicant: file://$LOGDIR/lcov-wpa_supplicant/index.html"
echo "hostapd: file://$LOGDIR/lcov-hostapd/index.html"
echo "hostapd/hlr_auc_gw (AS): file://$LOGDIR/lcov-hostapd-as/index.html"
fi