From 5c8d5b5d7f31e30efa3fe66bad0da011bd46de32 Mon Sep 17 00:00:00 2001 From: Dariusz Michaluk Date: Wed, 13 Jan 2021 14:07:34 +0100 Subject: [PATCH] Automate code coverage measurement To gather unit tests coverage report: - use COVERAGE build_type, - install privilege-info-coverage rpm, - run privilege-info-coverage.sh script. Change-Id: I21d6c63ffba6a61646d80facedfe5bdf3c27d797 --- CMakeLists.txt | 9 +++++++++ packaging/privilege-info.spec | 32 ++++++++++++++++++++++++++++++- test/CMakeLists.txt | 23 ++++++++++++++++++++++ test/privilege-info-coverage.sh.in | 39 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 test/privilege-info-coverage.sh.in diff --git a/CMakeLists.txt b/CMakeLists.txt index c8b66fa..0e024a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,8 +8,17 @@ IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE "RELEASE") ENDIF(NOT CMAKE_BUILD_TYPE) +IF(NOT DEFINED COVERAGE_DIR) + SET(COVERAGE_DIR + "${SHARE_INSTALL_PREFIX}/${PROJECT_NAME}-coverage" + CACHE PATH + "Read-only coverage data directory") +ENDIF(NOT DEFINED COVERAGE_DIR) +ADD_DEFINITIONS("-DCOVERAGE_DIR=\"${COVERAGE_DIR}\"") + SET(CMAKE_C_FLAGS_DEBUG "-std=c11 -O0 -ggdb -Wp,-U_FORTIFY_SOURCE") SET(CMAKE_C_FLAGS_RELEASE "-std=c11 -O2 -DNDEBUG") +SET(CMAKE_C_FLAGS_COVERAGE "-std=c11 -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE") ADD_DEFINITIONS("-Werror") ADD_DEFINITIONS("-Wall") diff --git a/packaging/privilege-info.spec b/packaging/privilege-info.spec index 5a1cdea..29b8410 100644 --- a/packaging/privilege-info.spec +++ b/packaging/privilege-info.spec @@ -17,6 +17,9 @@ BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(security-privilege-manager) +%if "%{build_type}" == "COVERAGE" +BuildRequires: lcov +%endif %description Provides Privilege Information(Privilege Info) API @@ -37,11 +40,29 @@ Requires: %{name} = %{version}-%{release} %description -n privilege-info-tests Privilege Info API Internal Test +%if "%{build_type}" == "COVERAGE" + +%package -n privilege-info-coverage +Summary: Privilege Info code coverage data +Group: Security/Testing +Requires: privilege-info-tests = %{version}-%{release} +Requires: privilege-info-debugsource = %{version}-%{release} +Requires: lcov +Requires: gcc + +%description -n privilege-info-coverage +Privilege Info code coverage data + +%endif + %prep %setup -q %build -%cmake . -DCMAKE_BUILD_TYPE=%{build_type} + +%global coverage_dir %{_datadir}/privilege-info-coverage + +%cmake . -DCMAKE_BUILD_TYPE=%{build_type} -DCOVERAGE_DIR=%{coverage_dir} make %{?jobs:-j%jobs} @@ -69,3 +90,12 @@ rm -rf %{buildroot} %files -n privilege-info-tests %manifest packaging/privilege-info.manifest %{_bindir}/privilege-info-tests + +%if "%{build_type}" == "COVERAGE" + +%files -n privilege-info-coverage +%manifest packaging/privilege-info.manifest +%{_bindir}/privilege-info-coverage.sh +%coverage_dir + +%endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a402a1b..74ccad7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,4 +2,27 @@ SET(TARGET_TESTS "privilege-info-tests") ADD_EXECUTABLE(${TARGET_TESTS} tc_privilege_info.c ../src/privilege_information.c) TARGET_LINK_LIBRARIES(${TARGET_TESTS} ${PRIVILEGE_INFO_DEPS_LIBRARIES}) +IF (CMAKE_BUILD_TYPE MATCHES "COVERAGE") + + # coverage data + SET(COVERAGE_BUILD_DIR + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET_TESTS}.dir/ + ) + + # install gcno files + INSTALL( + DIRECTORY ${COVERAGE_BUILD_DIR}/ + DESTINATION ${COVERAGE_DIR} + FILES_MATCHING PATTERN "*.gcno" + ) + + # install code coverage automation script + CONFIGURE_FILE(privilege-info-coverage.sh.in privilege-info-coverage.sh @ONLY) + INSTALL( + PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/privilege-info-coverage.sh + DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + +ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE") + INSTALL(TARGETS ${TARGET_TESTS} RUNTIME) diff --git a/test/privilege-info-coverage.sh.in b/test/privilege-info-coverage.sh.in new file mode 100644 index 0000000..42caa34 --- /dev/null +++ b/test/privilege-info-coverage.sh.in @@ -0,0 +1,39 @@ +#!/bin/bash + +set -exuo pipefail + +REPORT="@PROJECT_NAME@-coverage.info" +STDERR="@PROJECT_NAME@-coverage.stderr" +HTML_DIR="@PROJECT_NAME@-coverage" + +SRCS_DIR="/usr/src/debug/@PROJECT_NAME@-@PROJECT_VERSION@" + +# create dir for the report +mkdir $HTML_DIR + +# remove old gcda files +find / -iname "*.gcda" -exec rm {} \; + +# launch unit tests +privilege-info-tests + +# copy source files +cp -rp $SRCS_DIR/* "@CMAKE_BINARY_DIR@" + +# copy gcda files +cp -r "@COVERAGE_BUILD_DIR@"/* "@COVERAGE_DIR@" + +# prepare report +rm -f $STDERR +lcov --no-external -c -d "@COVERAGE_DIR@" -b "@CMAKE_BINARY_DIR@" -o $REPORT 2>$STDERR +lcov -r $REPORT "@CMAKE_BINARY_DIR@/test/*" -o $REPORT + +# check warnings +if [ -s $STDERR ] +then + echo "Warnings detected (see $STDERR). Aborting." + exit 1 +fi + +# html +genhtml $REPORT --output-directory $HTML_DIR/ -- 2.7.4