diff options
author | Slava Pestov <sp@daterainc.com> | 2014-06-05 14:55:15 -0700 |
---|---|---|
committer | Slava Pestov <sp@daterainc.com> | 2014-06-06 10:52:39 -0700 |
commit | 5778d4d4bd6e8e6b1e896b313561c2efa79b7621 (patch) | |
tree | d80ad1c93caeb840b6f59e04737de792d1f9a1df | |
parent | 2cd083c9f1ac7e423a5e9697eedaebbaaeb700f8 (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-x | ktest | 125 | ||||
-rw-r--r-- | rc.testwrapper | 14 | ||||
-rwxr-xr-x | tests/bcache/bcache.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcache_flash_dev.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcache_multi.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcache_reboot.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcache_register.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcache_tier.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcache_xfs.ktest | 2 | ||||
-rwxr-xr-x | tests/bcache/bcachefs.ktest | 2 | ||||
-rwxr-xr-x | tests/ext4.ktest | 2 | ||||
-rwxr-xr-x | tests/ktest.ktest | 2 | ||||
-rwxr-xr-x | tests/success.ktest | 2 | ||||
-rw-r--r-- | tests/test-libs.sh | 7 | ||||
-rwxr-xr-x | tests/xfs.ktest | 2 |
15 files changed, 83 insertions, 87 deletions
@@ -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 } |