Add automation for code coverage 90/311190/3
authorPhan Xuan Tan <xuan.tan@samsung.com>
Thu, 16 May 2024 02:39:47 +0000 (09:39 +0700)
committerDariusz Michaluk <d.michaluk@samsung.com>
Thu, 16 May 2024 09:24:27 +0000 (09:24 +0000)
Change-Id: I868d933135bf4411ee8d28a2d13ece178e46981b

CMakeLists.txt
packaging/cert-svc.spec
unit-tests/CMakeLists.txt
unit-tests/cert-svc-coverage.sh.in [new file with mode: 0644]

index f0968d4..edd73f6 100644 (file)
@@ -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
index f998c38..49d0617 100644 (file)
@@ -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
index 7da3ed9..1dd5d63 100644 (file)
@@ -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 (file)
index 0000000..c37e2a1
--- /dev/null
@@ -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/