From 56283c947acd56f18c1068405da9b1ed7802db5a Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Thu, 11 May 2017 15:53:22 +0200 Subject: [PATCH] improve coverage creation --- .travis.yml | 2 +- build.sh | 9 ++++++--- coverage.sh | 20 +++++--------------- coverage_more.sh | 24 ++++++++++++++++++++++++ makefile | 22 +++++++++++++++------- testme.sh | 39 ++++++++++++++++++++++----------------- 6 files changed, 73 insertions(+), 43 deletions(-) create mode 100755 coverage_more.sh diff --git a/.travis.yml b/.travis.yml index 1117067..6c79e17 100644 --- a/.travis.yml +++ b/.travis.yml @@ -90,7 +90,7 @@ addons: - libtommath-dev before_script: - sudo apt-get update -qq - - sudo pip install cpp-coveralls + - sudo gem install coveralls-lcov after_failure: - cat test_std.txt - cat test_err.txt diff --git a/build.sh b/build.sh index 94f27bf..590fc44 100755 --- a/build.sh +++ b/build.sh @@ -42,11 +42,14 @@ if [ -a test ] && [ -f test ] && [ -x test ]; then fi fi -lcov_opts="--capture --no-external --directory src -q" -lcov_out=$(echo coverage_$1_$2_$3 | tr ' -=+' '_')".info" if [ -a testok.txt ] && [ -f testok.txt ]; then - [ "$LTC_COVERAGE" != "" ] && lcov $lcov_opts --output-file $lcov_out + if [ "$LTC_COVERAGE" != "" ]; then + ./coverage_more.sh > test_coverage_more.txt || exit 1 + lcov_opts="--capture --no-external --directory src -q" + lcov_out=$(echo coverage_$1_$2_$3 | tr ' -=+' '_')".info" + lcov $lcov_opts --output-file $lcov_out + fi exit 0 fi exit 1 diff --git a/coverage.sh b/coverage.sh index a17c97d..6686b44 100755 --- a/coverage.sh +++ b/coverage.sh @@ -20,7 +20,7 @@ fi # output version bash printinfo.sh -bash build.sh " $1" " $2" " $3 COVERAGE=1" "$4 -fprofile-arcs -ftest-coverage " "$5 -lgcov" +bash build.sh " $1" " $2" " $3 COVERAGE=1" "$4" "$5" if [ -a testok.txt ] && [ -f testok.txt ]; then echo else @@ -29,24 +29,14 @@ else exit 1 fi -./sizes -./constants - -for i in $(for j in $(echo $(./hashsum -h | tail -n +3)); do echo $j; done | sort); do echo -n "$i: " && ./hashsum -a $i testprof/test.key ; done > hashsum_tv.txt -difftroubles=$(diff -i -w -B hashsum_tv.txt notes/hashsum_tv.txt | grep '^<') || true -if [ -n "$difftroubles" ]; then - echo "FAILURE: hashsum_tv.tx" - diff -i -w -B hashsum_tv.txt notes/hashsum_tv.txt - echo "hashsum failed" && rm -f testok.txt && exit 1 -else - echo "hashsum okay" -fi +./coverage_more.sh > test_coverage_more.txt || { rm -f testok.txt && exit 1 ; } +make lcov-single # if this was executed as './coverage.sh ...' create coverage locally if [[ "${0%% *}" == "./${0##*/}" ]]; then - make lcov-single + make lcov-html else - cpp-coveralls -e 'demos/' -e 'testprof/' -e 'notes/' -e 'src/headers/' + coveralls-lcov coverage.info fi exit 0 diff --git a/coverage_more.sh b/coverage_more.sh new file mode 100755 index 0000000..c7eabab --- /dev/null +++ b/coverage_more.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +set -e + +./sizes +./constants + +for i in $(for j in $(echo $(./hashsum -h | tail -n +3)); do echo $j; done | sort); do echo -n "$i: " && ./hashsum -a $i testprof/test.key ; done > hashsum_tv.txt +difftroubles=$(diff -i -w -B hashsum_tv.txt notes/hashsum_tv.txt | grep '^<') || true +if [ -n "$difftroubles" ]; then + echo "FAILURE: hashsum_tv.tx" + diff -i -w -B hashsum_tv.txt notes/hashsum_tv.txt + echo "hashsum failed" + exit 1 +else + echo "hashsum okay" +fi + + +exit 0 + +# $Source$ +# $Revision$ +# $Date$ diff --git a/makefile b/makefile index fd0ea19..aa569a4 100644 --- a/makefile +++ b/makefile @@ -34,6 +34,12 @@ endif include makefile_include.mk +ifeq ($(COVERAGE),1) +all_test: LIB_PRE = -Wl,--whole-archive +all_test: LIB_POST = -Wl,--no-whole-archive +CFLAGS += -fprofile-arcs -ftest-coverage +EXTRALIBS += -lgcov +endif #AES comes in two flavours... enc+dec and enc src/ciphers/aes/aes_enc.o: src/ciphers/aes/aes.c src/ciphers/aes/aes_tab.c @@ -88,10 +94,6 @@ endef $(foreach demo, $(strip $(DEMOS)), $(eval $(call DEMO_template,$(demo)))) -ifeq ($(COVERAGE),1) -all_test: LIB_PRE = -Wl,--whole-archive -all_test: LIB_POST = -Wl,--no-whole-archive -endif #This rule installs the library and the header files. This must be run #as root in order to have a high enough permission to write to the correct @@ -117,14 +119,20 @@ cleancov-clean: rm -f `find . -type f -name "*.info" | xargs` rm -rf coverage/ +# merges all coverage_*.info files into coverage.info +coverage.info: + lcov `find -name 'coverage_*.info' -exec echo -n " -a {}" \;` -o coverage.info + # generates html output from all coverage_*.info files -lcov: - lcov `find -name 'coverage_*.info' -exec echo -n " -a {}" \;` -o coverage.info -q 2>/dev/null +lcov-html: coverage.info genhtml coverage.info --output-directory coverage -q # combines all necessary steps to create the coverage from a single testrun with e.g. # CFLAGS="-DUSE_LTM -DLTM_DESC -I../libtommath" EXTRALIBS="../libtommath/libtommath.a" make coverage -j9 -lcov-single: | cleancov-clean lcov-single-create lcov +lcov-single: + $(MAKE) cleancov-clean + $(MAKE) lcov-single-create + $(MAKE) coverage.info #make the code coverage of the library diff --git a/testme.sh b/testme.sh index c1b3c23..3f1605b 100755 --- a/testme.sh +++ b/testme.sh @@ -3,7 +3,8 @@ if [ $# -lt 3 ] then echo "usage is: ${0##*/} " - echo "e.g. \"${0##*/} \"makefile -j3\" \"-DUSE_LTM -DLTM_DESC -I/path/to/libtommath\" /path/to/libtommath/libtommath.a\"" + echo "e.g. \"${0##*/} \"makefile -j9\" \"-DUSE_LTM -DLTM_DESC -I../libtommath\" ../libtommath/libtommath.a\"" + echo "to create aggregate coverage: pre-pend with LTC_COVERAGE=1" exit -1 fi @@ -13,53 +14,57 @@ echo "date="`date` # check sources bash check_source.sh "CHECK_SOURCES" " " "$1" "$2" "$3" || exit 1 +mk="$1" + +[ "$LTC_COVERAGE" != "" ] && mk="$mk COVERAGE=1" + # stock build -bash run.sh "STOCK" " " "$1" "$2" "$3" || exit 1 +bash run.sh "STOCK" " " "$mk" "$2" "$3" || exit 1 # EASY build -bash run.sh "EASY" "-DLTC_EASY" "$1" "$2" "$3" || exit 1 +bash run.sh "EASY" "-DLTC_EASY" "$mk" "$2" "$3" || exit 1 # SMALL code -bash run.sh "SMALL" "-DLTC_SMALL_CODE" "$1" "$2" "$3" || exit 1 +bash run.sh "SMALL" "-DLTC_SMALL_CODE" "$mk" "$2" "$3" || exit 1 # NOTABLES -bash run.sh "NOTABLES" "-DLTC_NO_TABLES" "$1" "$2" "$3" || exit 1 +bash run.sh "NOTABLES" "-DLTC_NO_TABLES" "$mk" "$2" "$3" || exit 1 # SMALL+NOTABLES -bash run.sh "SMALL+NOTABLES" "-DLTC_SMALL_CODE -DLTC_NO_TABLES" "$1" "$2" "$3" || exit 1 +bash run.sh "SMALL+NOTABLES" "-DLTC_SMALL_CODE -DLTC_NO_TABLES" "$mk" "$2" "$3" || exit 1 # CLEANSTACK -bash run.sh "CLEANSTACK" "-DLTC_CLEAN_STACK" "$1" "$2" "$3" || exit 1 +bash run.sh "CLEANSTACK" "-DLTC_CLEAN_STACK" "$mk" "$2" "$3" || exit 1 # CLEANSTACK + SMALL -bash run.sh "CLEANSTACK+SMALL" "-DLTC_SMALL_CODE -DLTC_CLEAN_STACK" "$1" "$2" "$3" || exit 1 +bash run.sh "CLEANSTACK+SMALL" "-DLTC_SMALL_CODE -DLTC_CLEAN_STACK" "$mk" "$2" "$3" || exit 1 # CLEANSTACK + NOTABLES -bash run.sh "CLEANSTACK+NOTABLES" "-DLTC_NO_TABLES -DLTC_CLEAN_STACK" "$1" "$2" "$3" || exit 1 +bash run.sh "CLEANSTACK+NOTABLES" "-DLTC_NO_TABLES -DLTC_CLEAN_STACK" "$mk" "$2" "$3" || exit 1 # CLEANSTACK + NOTABLES + SMALL -bash run.sh "CLEANSTACK+NOTABLES+SMALL" "-DLTC_NO_TABLES -DLTC_CLEAN_STACK -DLTC_SMALL_CODE" "$1" "$2" "$3" || exit 1 +bash run.sh "CLEANSTACK+NOTABLES+SMALL" "-DLTC_NO_TABLES -DLTC_CLEAN_STACK -DLTC_SMALL_CODE" "$mk" "$2" "$3" || exit 1 # NO_FAST -bash run.sh "NO_FAST" "-DLTC_NO_FAST" "$1" "$2" "$3" || exit 1 +bash run.sh "NO_FAST" "-DLTC_NO_FAST" "$mk" "$2" "$3" || exit 1 # NO_FAST + NOTABLES -bash run.sh "NO_FAST+NOTABLES" "-DLTC_NO_FAST -DLTC_NO_TABLES" "$1" "$2" "$3" || exit 1 +bash run.sh "NO_FAST+NOTABLES" "-DLTC_NO_FAST -DLTC_NO_TABLES" "$mk" "$2" "$3" || exit 1 # NO_ASM -bash run.sh "NO_ASM" "-DLTC_NO_ASM" "$1" "$2" "$3" || exit 1 +bash run.sh "NO_ASM" "-DLTC_NO_ASM" "$mk" "$2" "$3" || exit 1 # NO_TIMING_RESISTANCE -bash run.sh "NO_TIMING_RESISTANCE" "-DLTC_NO_ECC_TIMING_RESISTANT -DLTC_NO_RSA_BLINDING" "$1" "$2" "$3" || exit 1 +bash run.sh "NO_TIMING_RESISTANCE" "-DLTC_NO_ECC_TIMING_RESISTANT -DLTC_NO_RSA_BLINDING" "$mk" "$2" "$3" || exit 1 # CLEANSTACK+NOTABLES+SMALL+NO_ASM+NO_TIMING_RESISTANCE -bash run.sh "CLEANSTACK+NOTABLES+SMALL+NO_ASM+NO_TIMING_RESISTANCE" "-DLTC_CLEAN_STACK -DLTC_NO_TABLES -DLTC_SMALL_CODE -DLTC_NO_ECC_TIMING_RESISTANT -DLTC_NO_RSA_BLINDING" "$1" "$2" "$3" || exit 1 +bash run.sh "CLEANSTACK+NOTABLES+SMALL+NO_ASM+NO_TIMING_RESISTANCE" "-DLTC_CLEAN_STACK -DLTC_NO_TABLES -DLTC_SMALL_CODE -DLTC_NO_ECC_TIMING_RESISTANT -DLTC_NO_RSA_BLINDING" "$mk" "$2" "$3" || exit 1 # test build with no testing -bash testbuild.sh "NOTEST" "-DLTC_NO_TEST" "$1" "$2" "$3" || exit 1 +bash testbuild.sh "NOTEST" "-DLTC_NO_TEST" "$mk" "$2" "$3" || exit 1 # test build with no file routines -bash testbuild.sh "NOFILE" "-DLTC_NO_FILE" "$1" "$2" "$3" || exit 1 +bash testbuild.sh "NOFILE" "-DLTC_NO_FILE" "$mk" "$2" "$3" || exit 1 # $Source$ # $Revision$