Commit d827b11b by Patrick Steinhardt

tests: execute leak checker via CTest directly

Right now, we have an awful hack in our test CI setup that extracts the
test command from CTest's output and then prepends the leak checker.
This is dependent on non-machine-parseable output from CMake and also
breaks on various ocassions, like for example when we have spaces in the
current path or when the path contains backslashes. Both conditions may
easily be triggered on Win32 systems, and in fact they do break our
Azure Pipelines builds.

Remove the awful hack in favour of a new CMake build option
"USE_LEAK_CHECKER". If specifying e.g. "-DUSE_LEAK_CHECKER=valgrind",
then we will set up all tests to be run under valgrind. Like this, we
can again simply execute ctest without needing to rely on evil sourcery.
parent fe3b5da3
...@@ -57,6 +57,7 @@ OPTION(USE_HTTPS "Enable HTTPS support. Can be set to a specific backend" ON) ...@@ -57,6 +57,7 @@ OPTION(USE_HTTPS "Enable HTTPS support. Can be set to a specific backend" ON)
OPTION(USE_SHA1 "Enable SHA1. Can be set to CollisionDetection(ON)/HTTPS/Generic" ON) OPTION(USE_SHA1 "Enable SHA1. Can be set to CollisionDetection(ON)/HTTPS/Generic" ON)
OPTION(USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF) OPTION(USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF)
OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)" OFF) OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)" OFF)
OPTION(USE_LEAK_CHECKER "Run tests with leak checker" OFF)
OPTION(VALGRIND "Configure build for valgrind" OFF) OPTION(VALGRIND "Configure build for valgrind" OFF)
OPTION(DEBUG_POOL "Enable debug pool allocator" OFF) OPTION(DEBUG_POOL "Enable debug pool allocator" OFF)
OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF) OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF)
......
...@@ -16,8 +16,7 @@ jobs: ...@@ -16,8 +16,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=gcc CC=gcc
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
- job: linux_amd64_trusty_gcc_mbedtls - job: linux_amd64_trusty_gcc_mbedtls
displayName: 'Linux (amd64; Trusty; GCC; mbedTLS)' displayName: 'Linux (amd64; Trusty; GCC; mbedTLS)'
...@@ -29,8 +28,7 @@ jobs: ...@@ -29,8 +28,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=gcc CC=gcc
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
- job: linux_amd64_trusty_clang_openssl - job: linux_amd64_trusty_clang_openssl
displayName: 'Linux (amd64; Trusty; Clang; OpenSSL)' displayName: 'Linux (amd64; Trusty; Clang; OpenSSL)'
...@@ -42,8 +40,7 @@ jobs: ...@@ -42,8 +40,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=clang CC=clang
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
- job: linux_amd64_trusty_clang_mbedtls - job: linux_amd64_trusty_clang_mbedtls
displayName: 'Linux (amd64; Trusty; Clang; mbedTLS)' displayName: 'Linux (amd64; Trusty; Clang; mbedTLS)'
...@@ -55,8 +52,7 @@ jobs: ...@@ -55,8 +52,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=clang CC=clang
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
- job: macos - job: macos
displayName: 'macOS' displayName: 'macOS'
...@@ -70,8 +66,7 @@ jobs: ...@@ -70,8 +66,7 @@ jobs:
environmentVariables: environmentVariables:
TMPDIR: $(Agent.TempDirectory) TMPDIR: $(Agent.TempDirectory)
PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
LEAK_CHECK: leaks CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=leaks
CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON
SKIP_SSH_TESTS: true SKIP_SSH_TESTS: true
- job: windows_vs_amd64 - job: windows_vs_amd64
......
...@@ -12,8 +12,7 @@ jobs: ...@@ -12,8 +12,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=gcc CC=gcc
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
RUN_INVASIVE_TESTS=true RUN_INVASIVE_TESTS=true
- job: linux_amd64_trusty_gcc_mbedtls - job: linux_amd64_trusty_gcc_mbedtls
...@@ -26,8 +25,7 @@ jobs: ...@@ -26,8 +25,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=gcc CC=gcc
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
RUN_INVASIVE_TESTS=true RUN_INVASIVE_TESTS=true
- job: linux_amd64_trusty_clang_openssl - job: linux_amd64_trusty_clang_openssl
...@@ -40,8 +38,7 @@ jobs: ...@@ -40,8 +38,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=clang CC=clang
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
RUN_INVASIVE_TESTS=true RUN_INVASIVE_TESTS=true
- job: linux_amd64_trusty_clang_mbedtls - job: linux_amd64_trusty_clang_mbedtls
...@@ -54,8 +51,7 @@ jobs: ...@@ -54,8 +51,7 @@ jobs:
imageName: 'libgit2/trusty-amd64:latest' imageName: 'libgit2/trusty-amd64:latest'
environmentVariables: | environmentVariables: |
CC=clang CC=clang
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
RUN_INVASIVE_TESTS=true RUN_INVASIVE_TESTS=true
- job: macos - job: macos
...@@ -70,8 +66,7 @@ jobs: ...@@ -70,8 +66,7 @@ jobs:
environmentVariables: environmentVariables:
TMPDIR: $(Agent.TempDirectory) TMPDIR: $(Agent.TempDirectory)
PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
LEAK_CHECK: leaks CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=leaks
CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON
RUN_INVASIVE_TESTS: true RUN_INVASIVE_TESTS: true
SKIP_SSH_TESTS: true SKIP_SSH_TESTS: true
...@@ -139,8 +134,7 @@ jobs: ...@@ -139,8 +134,7 @@ jobs:
imageName: 'libgit2/bionic-x86:latest' imageName: 'libgit2/bionic-x86:latest'
environmentVariables: | environmentVariables: |
CC=gcc CC=gcc
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
RUN_INVASIVE_TESTS=true RUN_INVASIVE_TESTS=true
- job: linux_x86_bionic_clang_openssl - job: linux_x86_bionic_clang_openssl
...@@ -154,8 +148,7 @@ jobs: ...@@ -154,8 +148,7 @@ jobs:
imageName: 'libgit2/bionic-x86:latest' imageName: 'libgit2/bionic-x86:latest'
environmentVariables: | environmentVariables: |
CC=clang CC=clang
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
LEAK_CHECK=valgrind
RUN_INVASIVE_TESTS=true RUN_INVASIVE_TESTS=true
- job: linux_arm32_bionic_gcc_openssl - job: linux_arm32_bionic_gcc_openssl
......
...@@ -13,9 +13,6 @@ USER=${USER:-$(whoami)} ...@@ -13,9 +13,6 @@ USER=${USER:-$(whoami)}
SUCCESS=1 SUCCESS=1
VALGRIND="valgrind --leak-check=full --show-reachable=yes --error-exitcode=125 --num-callers=50 --suppressions=\"$SOURCE_DIR/libgit2_clar.supp\""
LEAKS="MallocStackLogging=1 MallocScribble=1 MallocLogFile=/dev/null CLAR_AT_EXIT=\"leaks -quiet \$PPID\""
cleanup() { cleanup() {
echo "Cleaning up..." echo "Cleaning up..."
...@@ -32,29 +29,7 @@ cleanup() { ...@@ -32,29 +29,7 @@ cleanup() {
echo "Done." echo "Done."
} }
# Ask ctest what it would run if we were to invoke it directly. This lets
# us manage the test configuration in a single place (tests/CMakeLists.txt)
# instead of running clar here as well. But it allows us to wrap our test
# harness with a leak checker like valgrind. Append the option to write
# JUnit-style XML files.
run_test() { run_test() {
TEST_CMD=$(ctest -N -V -R "^${1}$" | sed -n 's/^[0-9]*: Test command: //p')
if [ -z "$TEST_CMD" ]; then
echo "Could not find tests: $1"
exit 1
fi
TEST_CMD="${TEST_CMD} -r${BUILD_DIR}/results_${1}.xml"
if [ "$LEAK_CHECK" = "valgrind" ]; then
RUNNER="$VALGRIND $TEST_CMD"
elif [ "$LEAK_CHECK" = "leaks" ]; then
RUNNER="$LEAKS $TEST_CMD"
else
RUNNER="$TEST_CMD"
fi
if [[ "$GITTEST_FLAKY_RETRY" > 0 ]]; then if [[ "$GITTEST_FLAKY_RETRY" > 0 ]]; then
ATTEMPTS_REMAIN=$GITTEST_FLAKY_RETRY ATTEMPTS_REMAIN=$GITTEST_FLAKY_RETRY
else else
...@@ -70,7 +45,8 @@ run_test() { ...@@ -70,7 +45,8 @@ run_test() {
fi fi
RETURN_CODE=0 RETURN_CODE=0
eval $RUNNER || RETURN_CODE=$? && true
CLAR_SUMMARY="${BUILD_DIR}/results_${1}.xml" ctest -V -R "^${1}$" || RETURN_CODE=$? && true
if [ "$RETURN_CODE" -eq 0 ]; then if [ "$RETURN_CODE" -eq 0 ]; then
break break
......
#!/bin/sh
export MallocStackLogging=1
export MallocScribble=1
export MallocLogFile=/dev/null
export CLAR_AT_EXIT="leaks -quiet \$PPID"
exec "$@"
#!/bin/bash
exec valgrind --leak-check=full --show-reachable=yes --error-exitcode=125 --num-callers=50 --suppressions="$(dirname "${BASH_SOURCE[0]}")/valgrind.supp" "$@"
...@@ -57,9 +57,17 @@ IF (MSVC_IDE) ...@@ -57,9 +57,17 @@ IF (MSVC_IDE)
SET_SOURCE_FILES_PROPERTIES("precompiled.c" COMPILE_FLAGS "/Ycprecompiled.h") SET_SOURCE_FILES_PROPERTIES("precompiled.c" COMPILE_FLAGS "/Ycprecompiled.h")
ENDIF () ENDIF ()
ADD_TEST(offline "${libgit2_BINARY_DIR}/libgit2_clar" -v -xonline) FUNCTION(ADD_CLAR_TEST name)
ADD_TEST(invasive "${libgit2_BINARY_DIR}/libgit2_clar" -v -score::ftruncate -sfilter::stream::bigfile -sodb::largefiles -siterator::workdir::filesystem_gunk -srepo::init -srepo::init::at_filesystem_root) IF (NOT USE_LEAK_CHECKER STREQUAL "OFF")
ADD_TEST(online "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline) ADD_TEST(${name} "${libgit2_SOURCE_DIR}/script/${USE_LEAK_CHECKER}.sh" "${libgit2_BINARY_DIR}/libgit2_clar" ${ARGN})
ADD_TEST(gitdaemon "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::push) ELSE()
ADD_TEST(ssh "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::push -sonline::clone::ssh_cert -sonline::clone::ssh_with_paths) ADD_TEST(${name} "${libgit2_BINARY_DIR}/libgit2_clar" ${ARGN})
ADD_TEST(proxy "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::clone::proxy) ENDIF()
ENDFUNCTION(ADD_CLAR_TEST)
ADD_CLAR_TEST(offline -v -xonline)
ADD_CLAR_TEST(invasive -v -score::ftruncate -sfilter::stream::bigfile -sodb::largefiles -siterator::workdir::filesystem_gunk -srepo::init -srepo::init::at_filesystem_root)
ADD_CLAR_TEST(online -v -sonline)
ADD_CLAR_TEST(gitdaemon -v -sonline::push)
ADD_CLAR_TEST(ssh -v -sonline::push -sonline::clone::ssh_cert -sonline::clone::ssh_with_paths)
ADD_CLAR_TEST(proxy -v -sonline::clone::proxy)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment