From 192b312c977974680516e699c187d285f74ee8e0 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 8 Feb 2019 10:43:38 -0500 Subject: [PATCH 1/3] Fix coverage script. It was looking for object files made with the old automake directorations, but those changed when we split up our libraries. Fixes bug 29435; bugfix on 0.3.5.1-alpha. --- changes/ticket29435 | 3 +++ scripts/test/coverage | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 changes/ticket29435 diff --git a/changes/ticket29435 b/changes/ticket29435 new file mode 100644 index 0000000000..d48ae98e4b --- /dev/null +++ b/changes/ticket29435 @@ -0,0 +1,3 @@ + o Minor bugfixes (testing): + - Fix our gcov wrapper script to look for object files at the + correct locations. Fixes bug 29435; bugfix on 0.3.5.1-alpha. diff --git a/scripts/test/coverage b/scripts/test/coverage index 59d468ee1e..b6e17abe25 100755 --- a/scripts/test/coverage +++ b/scripts/test/coverage @@ -13,8 +13,8 @@ for fn in src/core/*/*.c src/feature/*/*.c src/app/*/*.c src/lib/*/*.c; do F=`echo $BN | sed -e 's/\.c$//;'` GC="${BN}.gcov" # Figure out the object file names - ONS=`echo ${DN}/src_*-${F}.o` - ONS_WILDCARD_LITERAL="${DN}/src_*-${F}.o" + ONS=$(echo "${DN}"/*testing_a-"${F}".o) + ONS_WILDCARD_LITERAL="${DN}/*testing_a-${F}.o" # If the wildcard didn't expand, no files if [ "$ONS" != "${ONS_WILDCARD_LITERAL}" ] then From f4c76661d1bb49a47829c6999a07c1de63b55cc9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 8 Feb 2019 11:21:09 -0500 Subject: [PATCH 2/3] Add a script to check for coverage nondeterminism Closes ticket 29436. --- changes/ticket29436 | 4 +++ scripts/test/cov-test-determinism.sh | 48 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 changes/ticket29436 create mode 100755 scripts/test/cov-test-determinism.sh diff --git a/changes/ticket29436 b/changes/ticket29436 new file mode 100644 index 0000000000..025be619e5 --- /dev/null +++ b/changes/ticket29436 @@ -0,0 +1,4 @@ + o Minor features (testing): + - We now have a script, cov-test-determinism.sh, to identify places + where our unit test coverage has become nondeterministic. + Closes ticket 29436. diff --git a/scripts/test/cov-test-determinism.sh b/scripts/test/cov-test-determinism.sh new file mode 100755 index 0000000000..3b4f372e04 --- /dev/null +++ b/scripts/test/cov-test-determinism.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# To use this script, build Tor with coverage enabled, and then say: +# ./scripts/test/cov-test-determinism.sh run +# +# Let it run for a long time so it can run the tests over and over. It +# will put their coverage outputs in coverage-raw/coverage-*/. +# +# Then say: +# ./scripts/test/cov-test-determinism.sh check +# +# It will diff the other coverage outputs to the first one, and put their +# diffs in coverage-raw/diff-coverage-*. + +run=0 +check=0 + +if test "$1" = run; then + run=1 +elif test "$1" = check; then + check=1 +else + echo "First use 'run' with this script, then use 'check'." + exit 1 +fi + +if test "$run" = 1; then + while true; do + make reset-gcov + CD=coverage-raw/coverage-$(date +%s) + make -j5 check + mkdir -p "$CD" + ./scripts/test/coverage "$CD" + done +fi + +if test "$check" = 1; then + cd coverage-raw || exit 1 + + FIRST="$(find . -name "coverage-*" -type d | head -1)" + rm -f A + ln -sf "$FIRST" A + for dir in coverage-*; do + rm -f B + ln -sf "$dir" B + ../scripts/test/cov-diff A B > "diff-$dir" + done +fi From a036c0187a7938718a1056f45ca95ddbca744b49 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 8 Feb 2019 11:22:55 -0500 Subject: [PATCH 3/3] cov-diff: better handle the case where a file stops having coverage --- scripts/test/cov-diff | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/test/cov-diff b/scripts/test/cov-diff index f3ca856888..8751800966 100755 --- a/scripts/test/cov-diff +++ b/scripts/test/cov-diff @@ -16,6 +16,5 @@ for B in "$DIRB"/*; do fi perl -pe 's/^\s*\!*\d+(\*?):/ 1$1:/; s/^([^:]+:)[\d\s]+:/$1/; s/^ *-:(Runs|Programs):.*//;' "$B" > "$B.tmp" diff -u "$A.tmp" "$B.tmp" |perl -pe 's/^((?:\+\+\+|---)(?:.*tmp))\s+.*/$1/;' - rm "$A.tmp" "$B.tmp" + rm -f "$A.tmp" "$B.tmp" done -