diff options
-rw-r--r-- | meson.build | 3 | ||||
-rw-r--r-- | src/basic/macro.h | 13 | ||||
-rwxr-xr-x | test/TEST-02-UNITTESTS/test.sh | 4 | ||||
-rw-r--r-- | test/test-functions | 4 |
4 files changed, 22 insertions, 2 deletions
diff --git a/meson.build b/meson.build index 4a154850db..69dce9c87f 100644 --- a/meson.build +++ b/meson.build @@ -47,6 +47,9 @@ fuzzer_build = want_ossfuzz or want_libfuzzer # More items are added later after they have been detected. summary({'build mode' : get_option('mode')}) +# GCOV doesn't define any macro when compiled with, so let's define it ourselves +conf.set10('BUILT_WITH_COVERAGE', get_option('b_coverage')) + ##################################################################### # Try to install the git pre-commit hook diff --git a/src/basic/macro.h b/src/basic/macro.h index 68d8b062e8..685de73449 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -29,6 +29,19 @@ #define _alignptr_ __attribute__((__aligned__(sizeof(void*)))) #define _warn_unused_result_ __attribute__((__warn_unused_result__)) +#if defined(BUILT_WITH_COVERAGE) && BUILT_WITH_COVERAGE +/* We need to explicitly call __gcov_dump() in places where we use _exit(), since + * _exit() skips at-exit hooks resulting in lost coverage */ +# include <unistd.h> +extern void __gcov_dump(void); + +_noreturn_ static inline void _coverage__exit(int status) { + __gcov_dump(); + _exit(status); +} +# define _exit(x) _coverage__exit(x) +#endif + #if !defined(HAS_FEATURE_MEMORY_SANITIZER) # if defined(__has_feature) # if __has_feature(memory_sanitizer) diff --git a/test/TEST-02-UNITTESTS/test.sh b/test/TEST-02-UNITTESTS/test.sh index 571abe41c3..80cb82a50d 100755 --- a/test/TEST-02-UNITTESTS/test.sh +++ b/test/TEST-02-UNITTESTS/test.sh @@ -4,6 +4,10 @@ set -e TEST_DESCRIPTION="Run unit tests under containers" RUN_IN_UNPRIVILEGED_CONTAINER=yes +# Some tests make collecting coverage impossible (like test-mount-util, which +# remounts the whole / as read-only), so let's ignore the gcov errors in such +# case +IGNORE_MISSING_COVERAGE=yes # embed some newlines in the kernel command line to stress our test suite KERNEL_APPEND=" diff --git a/test/test-functions b/test/test-functions index c734a15ca9..47eae9f0cb 100644 --- a/test/test-functions +++ b/test/test-functions @@ -1406,8 +1406,8 @@ check_coverage_reports() { # usually due to the sandbox being too restrictive (e.g. ProtectSystem=yes, # ProtectHome=yes) or the $BUILD_DIR being inaccessible to non-root users - see # `setfacl` stuff in install_compiled_systemd(). - - if "${JOURNALCTL:?}" -q --no-pager -D "${root:?}/var/log/journal" --grep "profiling:.+?gcda:[Cc]annot open"; then + if ! get_bool "${IGNORE_MISSING_COVERAGE:=}" && \ + "${JOURNALCTL:?}" -q --no-pager -D "${root:?}/var/log/journal" --grep "profiling:.+?gcda:[Cc]annot open"; then derror "Detected possibly missing coverage, check the journal" return 1 fi |