tests: Add --codecov support to parallel-vm.py

This allows code coverage report to be generated must faster with the
help of parallel VMs executing test cases.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2014-12-20 00:51:55 +02:00
parent 42ce1a27e0
commit e0cccf26a4
5 changed files with 155 additions and 58 deletions

57
tests/hwsim/vm/build-codecov.sh Executable file
View file

@ -0,0 +1,57 @@
#!/bin/bash
LOGDIR=$1
DIR=$PWD
TMPDIR=/tmp/logs
if [ -e $TMPDIR ]; then
echo "$TMPDIR exists - cannot prepare build trees"
exit 1
fi
mkdir $TMPDIR
echo "Preparing separate build trees for hostapd/wpa_supplicant"
cd ../../..
git archive --format=tar --prefix=hostap/ HEAD > $TMPDIR/hostap.tar
cd $DIR
cat ../../../wpa_supplicant/.config > $TMPDIR/wpa_supplicant.config
echo "CONFIG_CODE_COVERAGE=y" >> $TMPDIR/wpa_supplicant.config
cat ../../../hostapd/.config > $TMPDIR/hostapd.config
echo "CONFIG_CODE_COVERAGE=y" >> $TMPDIR/hostapd.config
cd $TMPDIR
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
cp hostapd.config alt-hostapd-as/hostapd/.config
tar xf hostap.tar
mv hostap alt-hlr_auc_gw
mv hostapd.config alt-hlr_auc_gw/hostapd/.config
rm hostap.tar
cd $TMPDIR/alt-wpa_supplicant/wpa_supplicant
echo "Building wpa_supplicant"
make -j8 > /dev/null
cd $TMPDIR/alt-hostapd/hostapd
echo "Building hostapd"
make -j8 hostapd > /dev/null
cd $TMPDIR/alt-hostapd-as/hostapd
echo "Building hostapd (AS)"
make -j8 hostapd > /dev/null
cd $TMPDIR/alt-hlr_auc_gw/hostapd
echo "Building hlr_auc_gw"
make -j8 hlr_auc_gw > /dev/null
cd $DIR
mv $TMPDIR/alt-wpa_supplicant $LOGDIR
mv $TMPDIR/alt-hostapd $LOGDIR
mv $TMPDIR/alt-hostapd-as $LOGDIR
mv $TMPDIR/alt-hlr_auc_gw $LOGDIR

View file

@ -0,0 +1,23 @@
#!/bin/bash
LOGDIR=$1
TMPDIR=/tmp/logs
mv $LOGDIR/alt-* $TMPDIR
cd $TMPDIR
args=""
for i in lcov-*.info-*; do
args="$args -a $i"
done
lcov $args -o $LOGDIR/combined.info > $LOGDIR/combined-lcov.log 2>&1
cd $LOGDIR
genhtml -t "wpa_supplicant/hostapd combined for hwsim test run $(date +%s)" combined.info --output-directory . > lcov.log 2>&1
rm -r /tmp/logs/alt-wpa_supplicant
rm -r /tmp/logs/alt-hostapd
rm -r /tmp/logs/alt-hostapd-as
rm -r /tmp/logs/alt-hlr_auc_gw
rm /tmp/logs/lcov-*info-*
rmdir /tmp/logs

View file

@ -126,20 +126,38 @@ def main():
global tests global tests
if len(sys.argv) < 2: if len(sys.argv) < 2:
sys.exit("Usage: %s <number of VMs> [params..]" % sys.argv[0]) sys.exit("Usage: %s <number of VMs> [--codecov] [params..]" % sys.argv[0])
num_servers = int(sys.argv[1]) num_servers = int(sys.argv[1])
if num_servers < 1: if num_servers < 1:
sys.exit("Too small number of VMs") sys.exit("Too small number of VMs")
timestamp = int(time.time())
if len(sys.argv) > 2 and sys.argv[2] == "--codecov":
idx = 3
print "Code coverage - build separate binaries"
logdir = "/tmp/hwsim-test-logs/" + str(timestamp)
os.makedirs(logdir)
subprocess.check_call(['./build-codecov.sh', logdir])
codecov_args = ['--codecov_dir', logdir]
codecov = True
else:
idx = 2
codecov_args = []
codecov = False
tests = [] tests = []
cmd = [ '../run-tests.py', '-L' ] + sys.argv[2:] cmd = [ '../run-tests.py', '-L' ] + sys.argv[idx:]
lst = subprocess.Popen(cmd, stdout=subprocess.PIPE) lst = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for l in lst.stdout.readlines(): for l in lst.stdout.readlines():
name = l.split(' ')[0] name = l.split(' ')[0]
tests.append(name) tests.append(name)
if len(tests) == 0: if len(tests) == 0:
sys.exit("No test cases selected") sys.exit("No test cases selected")
extra_args = [x for x in sys.argv[2:] if x not in tests] if '-f' in sys.argv[idx:]:
extra_args = sys.argv[idx:]
else:
extra_args = [x for x in sys.argv[idx:] if x not in tests]
dir = '/tmp/hwsim-test-logs' dir = '/tmp/hwsim-test-logs'
try: try:
@ -147,13 +165,12 @@ def main():
except: except:
pass pass
timestamp = int(time.time())
vm = {} vm = {}
for i in range(0, num_servers): for i in range(0, num_servers):
print("\rStarting virtual machine {}/{}".format(i + 1, num_servers)), print("\rStarting virtual machine {}/{}".format(i + 1, num_servers)),
cmd = ['./vm-run.sh', '--timestamp', str(timestamp), cmd = ['./vm-run.sh', '--timestamp', str(timestamp),
'--ext', 'srv.%d' % (i + 1), '--ext', 'srv.%d' % (i + 1),
'-i'] + extra_args '-i'] + codecov_args + extra_args
vm[i] = {} vm[i] = {}
vm[i]['proc'] = subprocess.Popen(cmd, vm[i]['proc'] = subprocess.Popen(cmd,
stdin=subprocess.PIPE, stdin=subprocess.PIPE,
@ -189,5 +206,14 @@ def main():
if "Kernel panic" in f.read(): if "Kernel panic" in f.read():
print "Kernel panic in " + log print "Kernel panic in " + log
if codecov:
print "Code coverage - preparing report"
for i in range(num_servers):
subprocess.check_call(['./process-codecov.sh',
logdir + ".srv.%d" % (i + 1),
str(i)])
subprocess.check_call(['./combine-codecov.sh', logdir])
print "file://%s/index.html" % logdir
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View file

@ -0,0 +1,31 @@
#!/bin/bash
LOGDIR=$1
POSTFIX=$2
DIR=$PWD
TMPDIR=/tmp/logs
mv $LOGDIR/alt-wpa_supplicant $TMPDIR
mv $LOGDIR/alt-hostapd $TMPDIR
mv $LOGDIR/alt-hostapd-as $TMPDIR
mv $LOGDIR/alt-hlr_auc_gw $TMPDIR
cd $TMPDIR/alt-wpa_supplicant/wpa_supplicant
lcov -c -d .. 2> lcov.log | sed s%SF:/tmp/logs/alt-[^/]*/%SF:/tmp/logs/alt-wpa_supplicant/% > $TMPDIR/lcov-wpa_supplicant.info-$POSTFIX &
cd $TMPDIR/alt-hostapd/hostapd
lcov -c -d .. 2> lcov.log | sed s%SF:/tmp/logs/alt-[^/]*/%SF:/tmp/logs/alt-wpa_supplicant/% > $TMPDIR/lcov-hostapd.info-$POSTFIX &
cd $TMPDIR/alt-hostapd-as/hostapd
lcov -c -d .. 2> lcov.log | sed s%SF:/tmp/logs/alt-[^/]*/%SF:/tmp/logs/alt-wpa_supplicant/% > $TMPDIR/lcov-hostapd-as.info-$POSTFIX &
cd $TMPDIR/alt-hlr_auc_gw/hostapd
lcov -c -d .. 2> lcov.log | sed s%SF:/tmp/logs/alt-[^/]*/%SF:/tmp/logs/alt-wpa_supplicant/% > $TMPDIR/lcov-hlr_auc_gw.info-$POSTFIX &
wait
cd $DIR
rm -r $TMPDIR/alt-wpa_supplicant
rm -r $TMPDIR/alt-hostapd
rm -r $TMPDIR/alt-hostapd-as
rm -r $TMPDIR/alt-hlr_auc_gw

View file

@ -47,6 +47,7 @@ TIMESTAMP=$(date +%s)
DATE=$TIMESTAMP DATE=$TIMESTAMP
CODECOV=no CODECOV=no
TIMEWARP=0 TIMEWARP=0
CODECOV_DIR=
while [ "$1" != "" ]; do while [ "$1" != "" ]; do
case $1 in case $1 in
--timestamp ) shift --timestamp ) shift
@ -60,6 +61,10 @@ while [ "$1" != "" ]; do
--codecov ) shift --codecov ) shift
CODECOV=yes CODECOV=yes
;; ;;
--codecov_dir ) shift
CODECOV_DIR=$1
shift
;;
--timewrap ) shift --timewrap ) shift
TIMEWARP=1 TIMEWARP=1
;; ;;
@ -73,59 +78,13 @@ done
LOGDIR=$LOGS/$DATE LOGDIR=$LOGS/$DATE
mkdir -p $LOGDIR mkdir -p $LOGDIR
if [ $CODECOV = "yes" ]; then if [ -n "$CODECOV_DIR" ]; then
DIR=$PWD cp -a $CODECOV_DIR/alt-wpa_supplicant $LOGDIR
if [ -e /tmp/logs ]; then cp -a $CODECOV_DIR/alt-hostapd $LOGDIR
echo "/tmp/logs exists - cannot prepare build trees" cp -a $CODECOV_DIR/alt-hostapd-as $LOGDIR
exit 1 cp -a $CODECOV_DIR/alt-hlr_auc_gw $LOGDIR
fi elif [ $CODECOV = "yes" ]; then
mkdir /tmp/logs ./build-codecov.sh $LOGDIR || exit 1
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
cp hostapd.config alt-hostapd-as/hostapd/.config
tar xf hostap.tar
mv hostap alt-hlr_auc_gw
mv hostapd.config alt-hlr_auc_gw/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 (AS)"
make -j8 hostapd > /dev/null
cd /tmp/logs/alt-hlr_auc_gw/hostapd
echo "Building hlr_auc_gw"
make -j8 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
mv /tmp/logs/alt-hlr_auc_gw $LOGDIR
else else
CODECOV=no CODECOV=no
fi fi
@ -143,6 +102,7 @@ kvm \
-append "mac80211_hwsim.support_p2p_device=0 mac80211_hwsim.channels=$CHANNELS mac80211_hwsim.radios=6 init=$CMD testdir=$TESTDIR timewarp=$TIMEWARP console=$KVMOUT root=/dev/root rootflags=trans=virtio,version=9p2000.u ro rootfstype=9p EPATH=$EPATH ARGS=$RUN_TEST_ARGS" -append "mac80211_hwsim.support_p2p_device=0 mac80211_hwsim.channels=$CHANNELS mac80211_hwsim.radios=6 init=$CMD testdir=$TESTDIR timewarp=$TIMEWARP console=$KVMOUT root=/dev/root rootflags=trans=virtio,version=9p2000.u ro rootfstype=9p EPATH=$EPATH ARGS=$RUN_TEST_ARGS"
if [ $CODECOV = "yes" ]; then if [ $CODECOV = "yes" ]; then
DIR=$PWD
mv $LOGDIR/alt-wpa_supplicant /tmp/logs mv $LOGDIR/alt-wpa_supplicant /tmp/logs
mv $LOGDIR/alt-hostapd /tmp/logs mv $LOGDIR/alt-hostapd /tmp/logs
mv $LOGDIR/alt-hostapd-as /tmp/logs mv $LOGDIR/alt-hostapd-as /tmp/logs