Skip to content

Commit d827b11

Browse files
committed
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.
1 parent fe3b5da commit d827b11

File tree

8 files changed

+37
-56
lines changed

8 files changed

+37
-56
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ OPTION(USE_HTTPS "Enable HTTPS support. Can be set to a specific backend" ON)
5757
OPTION(USE_SHA1 "Enable SHA1. Can be set to CollisionDetection(ON)/HTTPS/Generic" ON)
5858
OPTION(USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF)
5959
OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)" OFF)
60+
OPTION(USE_LEAK_CHECKER "Run tests with leak checker" OFF)
6061
OPTION(VALGRIND "Configure build for valgrind" OFF)
6162
OPTION(DEBUG_POOL "Enable debug pool allocator" OFF)
6263
OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF)

azure-pipelines.yml

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ jobs:
1616
imageName: 'libgit2/trusty-amd64:latest'
1717
environmentVariables: |
1818
CC=gcc
19-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON
20-
LEAK_CHECK=valgrind
19+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
2120
2221
- job: linux_amd64_trusty_gcc_mbedtls
2322
displayName: 'Linux (amd64; Trusty; GCC; mbedTLS)'
@@ -29,8 +28,7 @@ jobs:
2928
imageName: 'libgit2/trusty-amd64:latest'
3029
environmentVariables: |
3130
CC=gcc
32-
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON
33-
LEAK_CHECK=valgrind
31+
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
3432
3533
- job: linux_amd64_trusty_clang_openssl
3634
displayName: 'Linux (amd64; Trusty; Clang; OpenSSL)'
@@ -42,8 +40,7 @@ jobs:
4240
imageName: 'libgit2/trusty-amd64:latest'
4341
environmentVariables: |
4442
CC=clang
45-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON
46-
LEAK_CHECK=valgrind
43+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
4744
4845
- job: linux_amd64_trusty_clang_mbedtls
4946
displayName: 'Linux (amd64; Trusty; Clang; mbedTLS)'
@@ -55,8 +52,7 @@ jobs:
5552
imageName: 'libgit2/trusty-amd64:latest'
5653
environmentVariables: |
5754
CC=clang
58-
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON
59-
LEAK_CHECK=valgrind
55+
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
6056
6157
- job: macos
6258
displayName: 'macOS'
@@ -70,8 +66,7 @@ jobs:
7066
environmentVariables:
7167
TMPDIR: $(Agent.TempDirectory)
7268
PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
73-
LEAK_CHECK: leaks
74-
CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON
69+
CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=leaks
7570
SKIP_SSH_TESTS: true
7671

7772
- job: windows_vs_amd64

azure-pipelines/nightly.yml

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ jobs:
1212
imageName: 'libgit2/trusty-amd64:latest'
1313
environmentVariables: |
1414
CC=gcc
15-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON
16-
LEAK_CHECK=valgrind
15+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
1716
RUN_INVASIVE_TESTS=true
1817
1918
- job: linux_amd64_trusty_gcc_mbedtls
@@ -26,8 +25,7 @@ jobs:
2625
imageName: 'libgit2/trusty-amd64:latest'
2726
environmentVariables: |
2827
CC=gcc
29-
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON
30-
LEAK_CHECK=valgrind
28+
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
3129
RUN_INVASIVE_TESTS=true
3230
3331
- job: linux_amd64_trusty_clang_openssl
@@ -40,8 +38,7 @@ jobs:
4038
imageName: 'libgit2/trusty-amd64:latest'
4139
environmentVariables: |
4240
CC=clang
43-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON
44-
LEAK_CHECK=valgrind
41+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
4542
RUN_INVASIVE_TESTS=true
4643
4744
- job: linux_amd64_trusty_clang_mbedtls
@@ -54,8 +51,7 @@ jobs:
5451
imageName: 'libgit2/trusty-amd64:latest'
5552
environmentVariables: |
5653
CC=clang
57-
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON
58-
LEAK_CHECK=valgrind
54+
CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
5955
RUN_INVASIVE_TESTS=true
6056
6157
- job: macos
@@ -70,8 +66,7 @@ jobs:
7066
environmentVariables:
7167
TMPDIR: $(Agent.TempDirectory)
7268
PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
73-
LEAK_CHECK: leaks
74-
CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON
69+
CMAKE_OPTIONS: -G Ninja -DREGEX_BACKEND=regcomp_l -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=leaks
7570
RUN_INVASIVE_TESTS: true
7671
SKIP_SSH_TESTS: true
7772

@@ -139,8 +134,7 @@ jobs:
139134
imageName: 'libgit2/bionic-x86:latest'
140135
environmentVariables: |
141136
CC=gcc
142-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON
143-
LEAK_CHECK=valgrind
137+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
144138
RUN_INVASIVE_TESTS=true
145139
146140
- job: linux_x86_bionic_clang_openssl
@@ -154,8 +148,7 @@ jobs:
154148
imageName: 'libgit2/bionic-x86:latest'
155149
environmentVariables: |
156150
CC=clang
157-
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON
158-
LEAK_CHECK=valgrind
151+
CMAKE_OPTIONS=-DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind
159152
RUN_INVASIVE_TESTS=true
160153
161154
- job: linux_arm32_bionic_gcc_openssl

ci/test.sh

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ USER=${USER:-$(whoami)}
1313

1414
SUCCESS=1
1515

16-
VALGRIND="valgrind --leak-check=full --show-reachable=yes --error-exitcode=125 --num-callers=50 --suppressions=\"$SOURCE_DIR/libgit2_clar.supp\""
17-
LEAKS="MallocStackLogging=1 MallocScribble=1 MallocLogFile=/dev/null CLAR_AT_EXIT=\"leaks -quiet \$PPID\""
18-
1916
cleanup() {
2017
echo "Cleaning up..."
2118

@@ -32,29 +29,7 @@ cleanup() {
3229
echo "Done."
3330
}
3431

35-
# Ask ctest what it would run if we were to invoke it directly. This lets
36-
# us manage the test configuration in a single place (tests/CMakeLists.txt)
37-
# instead of running clar here as well. But it allows us to wrap our test
38-
# harness with a leak checker like valgrind. Append the option to write
39-
# JUnit-style XML files.
4032
run_test() {
41-
TEST_CMD=$(ctest -N -V -R "^${1}$" | sed -n 's/^[0-9]*: Test command: //p')
42-
43-
if [ -z "$TEST_CMD" ]; then
44-
echo "Could not find tests: $1"
45-
exit 1
46-
fi
47-
48-
TEST_CMD="${TEST_CMD} -r${BUILD_DIR}/results_${1}.xml"
49-
50-
if [ "$LEAK_CHECK" = "valgrind" ]; then
51-
RUNNER="$VALGRIND $TEST_CMD"
52-
elif [ "$LEAK_CHECK" = "leaks" ]; then
53-
RUNNER="$LEAKS $TEST_CMD"
54-
else
55-
RUNNER="$TEST_CMD"
56-
fi
57-
5833
if [[ "$GITTEST_FLAKY_RETRY" > 0 ]]; then
5934
ATTEMPTS_REMAIN=$GITTEST_FLAKY_RETRY
6035
else
@@ -70,7 +45,8 @@ run_test() {
7045
fi
7146

7247
RETURN_CODE=0
73-
eval $RUNNER || RETURN_CODE=$? && true
48+
49+
CLAR_SUMMARY="${BUILD_DIR}/results_${1}.xml" ctest -V -R "^${1}$" || RETURN_CODE=$? && true
7450

7551
if [ "$RETURN_CODE" -eq 0 ]; then
7652
break

script/leaks.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/bin/sh
2+
export MallocStackLogging=1
3+
export MallocScribble=1
4+
export MallocLogFile=/dev/null
5+
export CLAR_AT_EXIT="leaks -quiet \$PPID"
6+
exec "$@"

script/valgrind.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/bash
2+
exec valgrind --leak-check=full --show-reachable=yes --error-exitcode=125 --num-callers=50 --suppressions="$(dirname "${BASH_SOURCE[0]}")/valgrind.supp" "$@"
File renamed without changes.

tests/CMakeLists.txt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,17 @@ IF (MSVC_IDE)
5757
SET_SOURCE_FILES_PROPERTIES("precompiled.c" COMPILE_FLAGS "/Ycprecompiled.h")
5858
ENDIF ()
5959

60-
ADD_TEST(offline "${libgit2_BINARY_DIR}/libgit2_clar" -v -xonline)
61-
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)
62-
ADD_TEST(online "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline)
63-
ADD_TEST(gitdaemon "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::push)
64-
ADD_TEST(ssh "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::push -sonline::clone::ssh_cert -sonline::clone::ssh_with_paths)
65-
ADD_TEST(proxy "${libgit2_BINARY_DIR}/libgit2_clar" -v -sonline::clone::proxy)
60+
FUNCTION(ADD_CLAR_TEST name)
61+
IF (NOT USE_LEAK_CHECKER STREQUAL "OFF")
62+
ADD_TEST(${name} "${libgit2_SOURCE_DIR}/script/${USE_LEAK_CHECKER}.sh" "${libgit2_BINARY_DIR}/libgit2_clar" ${ARGN})
63+
ELSE()
64+
ADD_TEST(${name} "${libgit2_BINARY_DIR}/libgit2_clar" ${ARGN})
65+
ENDIF()
66+
ENDFUNCTION(ADD_CLAR_TEST)
67+
68+
ADD_CLAR_TEST(offline -v -xonline)
69+
ADD_CLAR_TEST(invasive -v -score::ftruncate -sfilter::stream::bigfile -sodb::largefiles -siterator::workdir::filesystem_gunk -srepo::init -srepo::init::at_filesystem_root)
70+
ADD_CLAR_TEST(online -v -sonline)
71+
ADD_CLAR_TEST(gitdaemon -v -sonline::push)
72+
ADD_CLAR_TEST(ssh -v -sonline::push -sonline::clone::ssh_cert -sonline::clone::ssh_with_paths)
73+
ADD_CLAR_TEST(proxy -v -sonline::clone::proxy)

0 commit comments

Comments
 (0)