summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSlava Pestov <sp@daterainc.com>2014-06-05 14:55:15 -0700
committerSlava Pestov <sp@daterainc.com>2014-06-06 10:52:39 -0700
commit5778d4d4bd6e8e6b1e896b313561c2efa79b7621 (patch)
treed80ad1c93caeb840b6f59e04737de792d1f9a1df
parent2cd083c9f1ac7e423a5e9697eedaebbaaeb700f8 (diff)
ktest: code coverage support
- To enable gcov in the kernel, pass -c flag to 'ktest run' - If gcov is enabled in the kernel, copy output to host via 9p - 'ktest run -c' generates HTML coverage report at the end, do 'ktest lcov' to re-generate for whatever reason - We no longer want the tests to print 'TEST SUCCESS' since this prevents rc.testwrapper from running code after the 'main' function. Move the 'TEST SUCCESS' printout to rc.testwrapper. This is safe since everything runs with 'set -e'. Change-Id: I1654b009e466558de6ecc8af8c9ad3347e66897b
-rwxr-xr-xktest125
-rw-r--r--rc.testwrapper14
-rwxr-xr-xtests/bcache/bcache.ktest2
-rwxr-xr-xtests/bcache/bcache_flash_dev.ktest2
-rwxr-xr-xtests/bcache/bcache_multi.ktest2
-rwxr-xr-xtests/bcache/bcache_reboot.ktest2
-rwxr-xr-xtests/bcache/bcache_register.ktest2
-rwxr-xr-xtests/bcache/bcache_tier.ktest2
-rwxr-xr-xtests/bcache/bcache_xfs.ktest2
-rwxr-xr-xtests/bcache/bcachefs.ktest2
-rwxr-xr-xtests/ext4.ktest2
-rwxr-xr-xtests/ktest.ktest2
-rwxr-xr-xtests/success.ktest2
-rw-r--r--tests/test-libs.sh7
-rwxr-xr-xtests/xfs.ktest2
15 files changed, 83 insertions, 87 deletions
diff --git a/ktest b/ktest
index 9daa835..226e562 100755
--- a/ktest
+++ b/ktest
@@ -50,6 +50,8 @@ TIMEOUT="" # kills test after $TIMEOUT seconds
# defaults: 0
BUILD=1 # if set to 1, kernel will build
# ignored with: -K (sets to 0)
+COVERAGE=0 # if set to 1, kernel will be built with
+ # coverage enabled (only if -K is not set)
INTERACTIVE=0 # if set to 1, timeout is ignored completely
# sets with: -I
NJOBS=$((`grep ^processor /proc/cpuinfo |wc -l` * 2))
@@ -79,36 +81,39 @@ fi
CMD="cmd_$1"
shift
-while getopts "IhKb:k:i:j:w:vx" arg; do
+while getopts "IhKcb:k:i:j:w:vx" arg; do
case $arg in
- h)
- usage
- exit 0
- ;;
- k)
- KERNEL_SOURCE=`realpath "$OPTARG"`
- ;;
- K)
- BUILD=""
- ;;
- i)
- IMG=$OPTARG
- ;;
- b)
- KERNEL_OUTPUT=$OPTARG
- ;;
- j)
- NJOBS=$OPTARG
- ;;
- I)
- INTERACTIVE=1
- ;;
- w)
- WORK_DIR=$OPTARG
- ;;
- x)
- set -x
- ;;
+ h)
+ usage
+ exit 0
+ ;;
+ k)
+ KERNEL_SOURCE=`realpath "$OPTARG"`
+ ;;
+ K)
+ BUILD=""
+ ;;
+ c)
+ COVERAGE=1
+ ;;
+ i)
+ IMG=$OPTARG
+ ;;
+ b)
+ KERNEL_OUTPUT=$OPTARG
+ ;;
+ j)
+ NJOBS=$OPTARG
+ ;;
+ I)
+ INTERACTIVE=1
+ ;;
+ w)
+ WORK_DIR=$OPTARG
+ ;;
+ x)
+ set -x
+ ;;
esac
done
shift $(( OPTIND - 1 ))
@@ -338,6 +343,11 @@ prepare_vm()
_KERNEL_CONFIG_REQUIRE=""
genisoimage_sudo=""
+ if [ "$COVERAGE" = 1 ]; then
+ _KERNEL_CONFIG_REQUIRE+="GCOV_KERNEL"
+ _KERNEL_CONFIG_REQUIRE+=",GCOV_FORMAT_AUTODETECT"
+ fi
+
mkdir -p $WORK_DIR
build_file_list $@
@@ -360,6 +370,26 @@ prepare_vm()
rm -rf $WORK_DIR/$LOG_INTERNAL/*
}
+run_lcov()
+{
+ checkdep lcov
+
+ gcov_dir=$WORK_DIR/$LOG_INTERNAL/gcov
+ info=$WORK_DIR/gcov.info
+ html=$WORK_DIR/gcov.html
+
+ echo "If lcov fails, run this:"
+ echo " sudo yum install perl-Digest-MD5"
+ echo
+
+ lcov --directory "$gcov_dir" --capture --output-file "$info"
+ genhtml --output-directory "$html" "$info"
+
+ echo
+ echo "LCOV report:"
+ echo file://$html/index.html
+}
+
cmd_boot()
{
prepare_vm
@@ -405,6 +435,10 @@ cmd_run()
# prevent qemu from seeing the terminal via stdout and mucking with tty
# settings
$vmstart_command|cat
+
+ if [ "$COVERAGE" = 1 ]; then
+ run_lcov
+ fi
else
[ -p "$WORK_DIR/output" ] || mkfifo "$WORK_DIR/output"
@@ -418,6 +452,10 @@ cmd_run()
$VMSTART stop `cat $WORK_DIR/id`
+ if [ "$COVERAGE" = 1 ]; then
+ run_lcov
+ fi
+
exit $err
fi
}
@@ -447,30 +485,6 @@ cmd_mon()
exec $VMSTART mon `cat $WORK_DIR/id`
}
-cmd_lcov()
-{
- checkdep lcov
-
- gcov_in=/sys/kernel/debug/gcov/`realpath $KERNEL_OUTPUT`
- gcov_out=$WORK_DIR/gcov
- info=$WORK_DIR/gcov.info
- html=$WORK_DIR/gcov.html
-
- mkdir -p $gcov_out
-
- cmd_ssh mkdir -p /tmp/gcov
- cmd_ssh cp -a "$gcov_in/*" /tmp/gcov
- cmd_ssh "(cd /tmp/gcov; tar cf - .)" \
- |(cd "$gcov_out"; tar xf -)
-
- lcov --directory "$gcov_out" --capture --output-file $info
- genhtml --output-directory $html $info
-
- echo
- echo "LCOV report:"
- echo file://$html/index.html
-}
-
cmd_oldconfig()
{
do_make oldconfig
@@ -496,9 +510,10 @@ usage()
echo " options:"
echo " -x bash debug statements"
echo " -k kernel source dir"
- echo " -b bld directory for kernel (default: kernel_source/.ktest)"
- echo " -w work director (default: kernel build directory)"
+ echo " -b build directory for kernel (default: kernel_source/.ktest)"
+ echo " -w work directory (default: kernel build directory)"
echo " -K don't build kernel (run cmd only)"
+ echo " -c enable coverage (only valid without -K)"
echo " -i VM root filesystem image (run cmd only)"
echo " -j j option to make (run cmd only)"
echo " -I disable timeout and VM stop on pass/fail (run cmd only)"
diff --git a/rc.testwrapper b/rc.testwrapper
index 4bbe95d..7435272 100644
--- a/rc.testwrapper
+++ b/rc.testwrapper
@@ -62,6 +62,15 @@ config-timeout()
. rc.test
+finish_test()
+{
+ # Code coverage
+ gcov_dir=/sys/kernel/debug/gcov
+ test -d $gcov_dir && cp -dR $gcov_dir $LOGDIR
+
+ umount $LOGDIR
+}
+
# We can't just do 'main || echo "TEST FAILED"' because
# 'set -o errexit' is disabled in the first half of a ||,
# and there is no way to re-enable it. However, ERR is
@@ -79,12 +88,13 @@ failure()
done > $LOGDIR/sysfs.txt
echo "done"
- umount $LOGDIR
+ finish_test
echo TEST FAILED
}
trap failure ERR
main
-umount $LOGDIR
+finish_test
+echo "TEST SUCCESS"
exit 0
diff --git a/tests/bcache/bcache.ktest b/tests/bcache/bcache.ktest
index 8264fa2..5606a7d 100755
--- a/tests/bcache/bcache.ktest
+++ b/tests/bcache/bcache.ktest
@@ -21,6 +21,4 @@ main()
setup_bcache
test_stress
stop_bcache
-
- test_success
}
diff --git a/tests/bcache/bcache_flash_dev.ktest b/tests/bcache/bcache_flash_dev.ktest
index f5c9ec0..e5e5246 100755
--- a/tests/bcache/bcache_flash_dev.ktest
+++ b/tests/bcache/bcache_flash_dev.ktest
@@ -22,6 +22,4 @@ main()
setup_flash_volume 1400M
test_stress
stop_bcache
-
- test_success
}
diff --git a/tests/bcache/bcache_multi.ktest b/tests/bcache/bcache_multi.ktest
index 398c6ae..1c52a88 100755
--- a/tests/bcache/bcache_multi.ktest
+++ b/tests/bcache/bcache_multi.ktest
@@ -25,6 +25,4 @@ main()
test_stress
stop_bcache
-
- test_success
}
diff --git a/tests/bcache/bcache_reboot.ktest b/tests/bcache/bcache_reboot.ktest
index 4ea02ff..8493d41 100755
--- a/tests/bcache/bcache_reboot.ktest
+++ b/tests/bcache/bcache_reboot.ktest
@@ -22,8 +22,6 @@ main()
if echo /dev/vda > /sys/fs/bcache/register; then
echo /dev/vdb > /sys/fs/bcache/register
-
- test_success
else
setup_bcache
setup_flash_volume 1600M
diff --git a/tests/bcache/bcache_register.ktest b/tests/bcache/bcache_register.ktest
index cc390b5..7f8f06a 100755
--- a/tests/bcache/bcache_register.ktest
+++ b/tests/bcache/bcache_register.ktest
@@ -46,6 +46,4 @@ main()
echo "we should only have one extent device"
[ "$(ls /dev/bcache_extent* | wc -l)" -eq "1" ]
-
- test_success
}
diff --git a/tests/bcache/bcache_tier.ktest b/tests/bcache/bcache_tier.ktest
index f4e7546..10adfe4 100755
--- a/tests/bcache/bcache_tier.ktest
+++ b/tests/bcache/bcache_tier.ktest
@@ -22,6 +22,4 @@ main()
setup_flash_volume 1600M
test_stress
stop_bcache
-
- test_success
}
diff --git a/tests/bcache/bcache_xfs.ktest b/tests/bcache/bcache_xfs.ktest
index 1180725..e3cffa4 100755
--- a/tests/bcache/bcache_xfs.ktest
+++ b/tests/bcache/bcache_xfs.ktest
@@ -22,6 +22,4 @@ main()
setup_bcache
test_stress
stop_bcache
-
- test_success
}
diff --git a/tests/bcache/bcachefs.ktest b/tests/bcache/bcachefs.ktest
index 3743fc7..f709d9c 100755
--- a/tests/bcache/bcachefs.ktest
+++ b/tests/bcache/bcachefs.ktest
@@ -31,6 +31,4 @@ main()
#test_stress
test_fsx
-
- test_success
}
diff --git a/tests/ext4.ktest b/tests/ext4.ktest
index 26eccad..b48277a 100755
--- a/tests/ext4.ktest
+++ b/tests/ext4.ktest
@@ -18,6 +18,4 @@ main()
setup_blkdev
test_stress
-
- test_success
}
diff --git a/tests/ktest.ktest b/tests/ktest.ktest
index 1664044..547169a 100755
--- a/tests/ktest.ktest
+++ b/tests/ktest.ktest
@@ -11,7 +11,5 @@ main()
exit 1
# this sleep must be killed via an ssh into the vm,
# if not the test has failed
- else
- echo TEST SUCCESS
fi
}
diff --git a/tests/success.ktest b/tests/success.ktest
index 779cd88..1742d7b 100755
--- a/tests/success.ktest
+++ b/tests/success.ktest
@@ -8,5 +8,5 @@ config-timeout 20
main()
{
- test_success
+ true
}
diff --git a/tests/test-libs.sh b/tests/test-libs.sh
index da79b5d..c3cfcf4 100644
--- a/tests/test-libs.sh
+++ b/tests/test-libs.sh
@@ -6,13 +6,6 @@
require-bin make-bcache
require-kernel-config MD,BCACHE,BCACHE_DEBUG,CLOSURE_DEBUG
-#
-# Signal to ktest that test has completed successfully.
-#
-test_success() {
- echo "TEST SUCCESS"
-}
-
export PS4='+`basename ${BASH_SOURCE[0]}`:${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}()}+ '
# Wait for an IP or IPv6 address to show
diff --git a/tests/xfs.ktest b/tests/xfs.ktest
index de4110d..20027fc 100755
--- a/tests/xfs.ktest
+++ b/tests/xfs.ktest
@@ -19,6 +19,4 @@ main()
setup_blkdev
test_stress
-
- test_success
}