From 228c9fd7274f381e43b37623d52b50a97af89d5b Mon Sep 17 00:00:00 2001 From: Phan Xuan Tan Date: Thu, 16 May 2024 09:39:47 +0700 Subject: [PATCH] Add automation for code coverage Change-Id: I868d933135bf4411ee8d28a2d13ece178e46981b --- CMakeLists.txt | 12 +++++++-- packaging/cert-svc.spec | 31 ++++++++++++++++++++++- unit-tests/CMakeLists.txt | 23 +++++++++++++++++ unit-tests/cert-svc-coverage.sh.in | 51 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 unit-tests/cert-svc-coverage.sh.in diff --git a/CMakeLists.txt b/CMakeLists.txt index f0968d4..edd73f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,14 @@ INCLUDE(FindPkgConfig) STRING(REGEX MATCH "([^.]*)" SO_VERSION "${VERSION}") +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}\"") + # compiler options SET(GC_SECTIONS_FLAGS "-fdata-sections -ffunction-sections -Wl,--gc-sections") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GC_SECTIONS_FLAGS}") @@ -13,10 +21,10 @@ SET(CMAKE_C_FLAGS_RELEASE "-g -O2") SET(CMAKE_CXX_FLAGS_RELEASE "-g -std=c++0x -O2") SET(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wp,-U_FORTIFY_SOURCE") SET(CMAKE_CXX_FLAGS_DEBUG "-g -std=c++0x -O0 -Wp,-U_FORTIFY_SOURCE") -SET(CMAKE_C_FLAGS_CCOV "-g -O2 --coverage") -SET(CMAKE_CXX_FLAGS_CCOV "-g -std=c++0x -O2 --coverage") SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") +SET(CMAKE_C_FLAGS_COVERAGE "-O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE") +SET(CMAKE_CXX_FLAGS_COVERAGE "-g -std=c++0x -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE") SET(CMAKE_SKIP_RPATH "TRUE") # compiler warning flags diff --git a/packaging/cert-svc.spec b/packaging/cert-svc.spec index f998c38..49d0617 100644 --- a/packaging/cert-svc.spec +++ b/packaging/cert-svc.spec @@ -1,3 +1,5 @@ +%{!?build_type:%global build_type RELEASE} + Name: cert-svc Summary: Certification service Version: 2.2.2 @@ -24,6 +26,11 @@ BuildRequires: ca-certificates BuildRequires: ca-certificates-devel BuildRequires: ca-certificates-tizen-devel BuildRequires: boost-devel + +%if "%{build_type}" == "COVERAGE" +BuildRequires: lcov +%endif + Requires: ca-certificates Requires: ca-certificates-tizen Requires: security-config @@ -36,6 +43,7 @@ Requires: security-config %global group_name security_fw %global server_stream /tmp/.cert-server.socket %global smack_domain_name System +%global coverage_dir %{_datadir}/cert-svc-coverage %global bin_dir %{?TZ_SYS_BIN:%TZ_SYS_BIN}%{!?TZ_SYS_BIN:%_bindir} %global lib_dir %{?TZ_SYS_LIB:%TZ_SYS_LIB}%{!?TZ_SYS_LIB:%_libdir} @@ -82,6 +90,19 @@ Requires: %{name}-test = %{version}-%{release} %description test-binaries Certification service (test binaries) +%if "%{build_type}" == "COVERAGE" +%package coverage +Summary: Certification service code coverage data +Group: Security/Testing +Requires: cert-svc-test = %{version}-%{release} +Requires: cert-svc-debugsource = %{version}-%{release} +Requires: lcov +Requires: gcc + +%description coverage +Certification service code coverage data +%endif + %prep %setup -q @@ -102,7 +123,6 @@ export FFLAGS="$FFLAGS -DTIZEN_EMULATOR_MODE" export CFLAGS="$CFLAGS -Wno-stringop-truncation -Wno-stringop-overflow" export CXXFLAGS="$CXXFLAGS -Wno-stringop-truncation -Wno-stringop-overflow" -%{!?build_type:%define build_type "Release"} %cmake . -DVERSION=%version \ -DINCLUDEDIR=%_includedir \ -DUSER_NAME=%user_name \ @@ -124,6 +144,7 @@ export CXXFLAGS="$CXXFLAGS -Wno-stringop-truncation -Wno-stringop-overflow" -DCERT_SVC_DB_PATH=%cert_svc_db_path \ -DCERT_SVC_TESTS=%cert_svc_tests \ -DCERT_SVC_EXAMPLES=%cert_svc_examples \ + -DCOVERAGE_DIR=%{coverage_dir} \ -DCMAKE_BUILD_TYPE=%build_type \ -DSYSTEMD_UNIT_DIR=%_unitdir @@ -197,3 +218,11 @@ fi %files test-binaries %manifest %name.manifest %cert_svc_tests/apps + +%if "%{build_type}" == "COVERAGE" +%files coverage +%manifest %{name}.manifest +%license LICENSE +%{bin_dir}/cert-svc-coverage.sh +%coverage_dir +%endif diff --git a/unit-tests/CMakeLists.txt b/unit-tests/CMakeLists.txt index 7da3ed9..1dd5d63 100644 --- a/unit-tests/CMakeLists.txt +++ b/unit-tests/CMakeLists.txt @@ -34,6 +34,29 @@ FILE(GLOB VCORE_SOURCES ${PROJECT_SOURCE_DIR}/src/vcore/*.cpp) FILE(GLOB DPL_LOG_SOURCES ${PROJECT_SOURCE_DIR}/src/dpl/log/src/*.cpp) FILE(GLOB DPL_CORE_SOURCES ${PROJECT_SOURCE_DIR}/src/dpl/core/src/*.cpp) +IF (CMAKE_BUILD_TYPE MATCHES "COVERAGE") + + # coverage data + SET(COVERAGE_BUILD_DIR + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET_UNIT_TESTS}.dir/ + ) + + # install gcno files + INSTALL( + DIRECTORY ${COVERAGE_BUILD_DIR}/ + DESTINATION ${COVERAGE_DIR} + FILES_MATCHING PATTERN "*.gcno" + ) + + # install code coverage automation script + CONFIGURE_FILE(cert-svc-coverage.sh.in cert-svc-coverage.sh @ONLY) + INSTALL( + PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cert-svc-coverage.sh + DESTINATION ${BIN_DIR} + ) + +ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE") + SET(UNIT_TESTS_SOURCES test_main.cpp test_vcore_cert_store_type.cpp diff --git a/unit-tests/cert-svc-coverage.sh.in b/unit-tests/cert-svc-coverage.sh.in new file mode 100644 index 0000000..c37e2a1 --- /dev/null +++ b/unit-tests/cert-svc-coverage.sh.in @@ -0,0 +1,51 @@ +#!/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 +cert-svc-unit-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 + +# Due to mismatch in the version of gcc/gcov and lcov, we need to ignore few errors +IGNORE_ERRORS=" --ignore-errors unused,unused \ + --ignore-errors empty,empty \ + --ignore-errors mismatch,mismatch \ + --ignore-errors gcov,gcov " + +lcov $IGNORE_ERRORS --no-external -c -d "@COVERAGE_DIR@" -b "@CMAKE_BINARY_DIR@" -o $REPORT 2>$STDERR +lcov $IGNORE_ERRORS -r $REPORT "@CMAKE_BINARY_DIR@/unit-tests/*" -o $REPORT + +# Let's skip lcov warning +# geninfo: WARNING: using JSON module "JSON::PP" - which is much slower than some alternatives. +# Consider installing one of JSON::XS or Cpanel::JSON::XS +sed -i '/WARNING/d' $STDERR + +# check errors +if [ -s $STDERR ] +then + echo "Errors detected (see $STDERR). Aborting." + exit 1 +fi + +# html +genhtml --ignore-errors empty,empty $REPORT --output-directory $HTML_DIR/ -- 2.7.4