From f884a538ce79f70d44bdaaa9cb5ad2801dc36196 Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Fri, 11 Mar 2022 18:29:38 +0100 Subject: Code coverage generation using LCOV. Signed-off-by: Toni Uhlig --- .github/workflows/build.yml | 5 ++++- .gitlab-ci.yml | 6 ++++-- CMakeLists.txt | 16 ++++++++++++++++ scripts/code-coverage.sh | 8 ++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100755 scripts/code-coverage.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 786c30eb1..a2b05a73b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: - name: Configure nDPI run: | mkdir build && cd build - env CMAKE_C_FLAGS='-Werror' cmake .. -DBUILD_EXAMPLES=ON -DBUILD_NDPI=ON -DENABLE_SANITIZER=ON -DENABLE_ZLIB=ON ${{ matrix.ndpid_gcrypt }} + env CMAKE_C_FLAGS='-Werror' cmake .. -DENABLE_COVERAGE=ON -DBUILD_EXAMPLES=ON -DBUILD_NDPI=ON -DENABLE_SANITIZER=ON -DENABLE_ZLIB=ON ${{ matrix.ndpid_gcrypt }} - name: Build nDPI run: | make -C build all VERBOSE=1 @@ -52,6 +52,9 @@ jobs: run: | make -C ./build daemon VERBOSE=1 make -C ./build daemon VERBOSE=1 + - name: Coverage + run: | + make -C ./build coverage - name: Dist run: | make -C ./build dist diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d7e46aa0..cd6c014f4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,7 +23,7 @@ build_and_test: # static linked build - mkdir build-cmake-submodule - cd build-cmake-submodule - - env CMAKE_C_FLAGS='-Werror' cmake .. -DBUILD_EXAMPLES=ON -DBUILD_NDPI=ON -DENABLE_SANITIZER=ON -DENABLE_ZLIB=ON + - env CMAKE_C_FLAGS='-Werror' cmake .. -DENABLE_COVERAGE=ON -DBUILD_EXAMPLES=ON -DBUILD_NDPI=ON -DENABLE_SANITIZER=ON -DENABLE_ZLIB=ON - make libnDPI - tree libnDPI - make install VERBOSE=1 DESTDIR="$(realpath ../_install)" @@ -37,7 +37,7 @@ build_and_test: - mkdir build - cd build - export PKG_CONFIG_PATH="$(realpath ../build-cmake-submodule/libnDPI/lib/pkgconfig)" - - env CMAKE_C_FLAGS='-Werror' cmake .. -DBUILD_EXAMPLES=ON -DENABLE_SANITIZER=ON -DENABLE_MEMORY_PROFILING=ON -DENABLE_ZLIB=ON + - env CMAKE_C_FLAGS='-Werror' cmake .. -DENABLE_COVERAGE=ON -DBUILD_EXAMPLES=ON -DENABLE_SANITIZER=ON -DENABLE_MEMORY_PROFILING=ON -DENABLE_ZLIB=ON - make all VERBOSE=1 - cd .. - ./build/nDPId-test || test $? -eq 1 @@ -45,6 +45,8 @@ build_and_test: # dameon start/stop test - NUSER=nobody make -C ./build daemon VERBOSE=1 - NUSER=nobody make -C ./build daemon VERBOSE=1 + # generate coverage report + - make -C ./build coverage # make dist - make -C ./build dist artifacts: diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fadb2a95..56d3c2c4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ else() set(LIBM_LIB "") endif() +option(ENABLE_COVERAGE "Generate a code coverage report using lcov/genhtml." OFF) option(ENABLE_SANITIZER "Enable ASAN/LSAN/UBSAN." OFF) option(ENABLE_SANITIZER_THREAD "Enable TSAN (does not work together with ASAN)." OFF) option(ENABLE_MEMORY_PROFILING "Enable dynamic memory tracking." OFF) @@ -110,6 +111,16 @@ if(BUILD_NDPI AND NDPI_WITH_GCRYPT) endif() endif() +if(ENABLE_COVERAGE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") + add_custom_target(coverage) + add_custom_command( + TARGET coverage + COMMAND "${CMAKE_SOURCE_DIR}/scripts/code-coverage.sh" + DEPENDS nDPId nDPIsrvd nDPId-test + ) +endif() if(ENABLE_SANITIZER) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize=undefined -fno-sanitize=alignment -fsanitize=enum -fsanitize=leak") endif() @@ -303,6 +314,10 @@ if(BUILD_EXAMPLES) "${pkgcfg_lib_PCRE_pcre}" "${pkgcfg_lib_MAXMINDDB_maxminddb}" "${GCRYPT_LIBRARY}" "${GCRYPT_ERROR_LIBRARY}" "${PCAP_LIBRARY}") + if(ENABLE_COVERAGE) + add_dependencies(coverage nDPIsrvd-collectd nDPIsrvd-captured nDPIsrvd-json-dump nDPIsrvd-simple) + endif() + install(TARGETS nDPIsrvd-collectd nDPIsrvd-captured nDPIsrvd-json-dump nDPIsrvd-simple DESTINATION bin) endif() @@ -337,6 +352,7 @@ message(STATUS "CROSS_COMPILE_TRIPLET....: ${CROSS_COMPILE_TRIPLET}") message(STATUS "CMAKE_BUILD_TYPE.........: ${CMAKE_BUILD_TYPE}") message(STATUS "CMAKE_C_FLAGS............: ${CMAKE_C_FLAGS}") message(STATUS "NDPID_DEFS...............: ${NDPID_DEFS}") +message(STATUS "ENABLE_COVERAGE..........: ${ENABLE_COVERAGE}") message(STATUS "ENABLE_SANITIZER.........: ${ENABLE_SANITIZER}") message(STATUS "ENABLE_SANITIZER_THREAD..: ${ENABLE_SANITIZER_THREAD}") message(STATUS "ENABLE_MEMORY_PROFILING..: ${ENABLE_MEMORY_PROFILING}") diff --git a/scripts/code-coverage.sh b/scripts/code-coverage.sh new file mode 100755 index 000000000..37038bd2a --- /dev/null +++ b/scripts/code-coverage.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +cd "$(dirname "${0}")/.." +mkdir -p coverage_report +lcov --directory . --capture --output-file lcov.info +genhtml -o coverage_report lcov.info -- cgit v1.2.3