Automate code coverage measurement 89/242889/9
authorDariusz Michaluk <d.michaluk@samsung.com>
Tue, 1 Sep 2020 12:33:41 +0000 (14:33 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Fri, 30 Oct 2020 16:35:26 +0000 (16:35 +0000)
To gather unit tests coverage report:
- use COVERAGE build_type,
- instal security-manager-coverage rpm,
- run security-manager-coverage.sh script.

Change-Id: I34960e55e4cff81d0e99864e3c3ed4d5d3c48385

CMakeLists.txt
packaging/security-manager.spec
test/CMakeLists.txt
test/security-manager-coverage.sh.in [new file with mode: 0644]

index fe3d121..dc54049 100644 (file)
@@ -71,19 +71,27 @@ SET(PRIV_MAPPING_INSTALL_SUBDIR
     CACHE PATH
     "Read-only privilege Smack mapping directory")
 
+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("-DDB_INSTALL_DIR=\"${DB_INSTALL_DIR}\"")
 ADD_DEFINITIONS("-DLOCAL_STATE_INSTALL_DIR=\"${LOCAL_STATE_INSTALL_DIR}\"")
 ADD_DEFINITIONS("-DDATA_INSTALL_DIR=\"${DATA_INSTALL_DIR}\"")
 ADD_DEFINITIONS("-DPOLICY_INSTALL_DIR=\"${POLICY_INSTALL_DIR}\"")
 ADD_DEFINITIONS("-DDB_TEST_INSTALL_DIR=\"${DB_TEST_INSTALL_DIR}\"")
 ADD_DEFINITIONS("-DPRIV_MAPPING_INSTALL_SUBDIR=\"${PRIV_MAPPING_INSTALL_SUBDIR}\"")
+ADD_DEFINITIONS("-DCOVERAGE_DIR=\"${COVERAGE_DIR}\"")
 
 ############################# compiler flags ##################################
 
 SET(CMAKE_CXX_FLAGS_PROFILING  "-g -std=c++17 -O0 -pg -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_CXX_FLAGS_DEBUG      "-g -std=c++17 -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_CXX_FLAGS_RELEASE    "-g -std=c++17 -O2 -DNDEBUG=1")
-SET(CMAKE_CXX_FLAGS_CCOV       "-g -std=c++17 -O2 --coverage")
+SET(CMAKE_CXX_FLAGS_COVERAGE   "-g -std=c++17 -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_CXX_FLAGS_VALGRIND   "-ggdb -std=c++17 -O0 -fno-inline -Wp,-U_FORTIFY_SOURCE")
 
 # Force PIE
index 4e29dcc..1ca7311 100644 (file)
@@ -1,3 +1,5 @@
+%{!?build_type:%global build_type RELEASE}
+
 Name:       security-manager
 Summary:    Security manager and utilities
 Version:    1.6.13
@@ -40,6 +42,9 @@ BuildRequires: pkgconfig(security-privilege-manager)
 BuildRequires: pkgconfig(openssl1.1)
 BuildRequires: pkgconfig(mount)
 BuildRequires: boost-devel
+%if "%{build_type}" == "COVERAGE"
+BuildRequires: lcov
+%endif
 %{?systemd_requires}
 
 %description
@@ -119,6 +124,21 @@ Requires:   cynara
 %description -n security-license-manager
 Package with plugins for cynara.
 
+%if "%{build_type}" == "COVERAGE"
+
+%package -n security-manager-coverage
+Summary:    Security Manager code coverage data
+Group:      Security/Testing
+Requires:   security-manager-tests = %{version}-%{release}
+Requires:   security-manager-debugsource = %{version}-%{release}
+Requires:   lcov
+Requires:   gcc
+
+%description -n security-manager-coverage
+Security Manager code coverage data
+
+%endif
+
 %prep
 %setup -q
 
@@ -127,6 +147,7 @@ Package with plugins for cynara.
 export LDFLAGS+="-Wl,--rpath=%{_libdir}"
 
 %global db_test_dir %{_datadir}/sm-db-test
+%global coverage_dir %{_datadir}/security-manager-coverage
 
 %cmake . \
        -DVERSION=%{version} \
@@ -136,8 +157,9 @@ export LDFLAGS+="-Wl,--rpath=%{_libdir}"
        -DDB_INSTALL_DIR=%{TZ_SYS_DB} \
        -DDB_TEST_INSTALL_DIR=%{db_test_dir} \
        -DDB_LOGS=OFF \
-       -DCMAKE_BUILD_TYPE=%{?build_type:%build_type}%{!?build_type:RELEASE} \
-       -DCMAKE_VERBOSE_MAKEFILE=ON
+       -DCMAKE_BUILD_TYPE=%{build_type} \
+       -DCMAKE_VERBOSE_MAKEFILE=ON \
+       -DCOVERAGE_DIR=%{coverage_dir}
 make %{?jobs:-j%jobs}
 
 %install
@@ -366,3 +388,13 @@ chsmack -a System %{db_test_dir}/.security-manager-test-rules*.txt
 %{_bindir}/license-manager-agent
 %attr(-,root,root) %{_unitdir}/cynara.service.wants/license-manager-agent.service
 %attr(-,root,root) %{_unitdir}/license-manager-agent.service
+
+%if "%{build_type}" == "COVERAGE"
+
+%files -n security-manager-coverage
+%manifest %{_datadir}/security-manager-tests.manifest
+%license LICENSE
+%{_bindir}/security-manager-coverage.sh
+%coverage_dir
+
+%endif
index ffa2fdc..75e85c9 100644 (file)
@@ -51,6 +51,29 @@ SET(SM_TEST_SRC  ${PROJECT_SOURCE_DIR}/test)
 SET(TARGET_SM_TESTS "security-manager-unit-tests")
 SET(TARGET_SM_PERFORMANCE_TESTS "security-manager-performance-tests")
 
+IF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
+    # coverage data
+    SET(COVERAGE_BUILD_DIR
+        ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET_SM_TESTS}.dir/
+    )
+
+    # install gcno files
+    INSTALL(
+        DIRECTORY ${COVERAGE_BUILD_DIR}/
+        DESTINATION ${COVERAGE_DIR}
+        FILES_MATCHING PATTERN "*.gcno"
+    )
+
+    # install code coverage automation script
+    CONFIGURE_FILE(security-manager-coverage.sh.in security-manager-coverage.sh @ONLY)
+    INSTALL(
+        PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/security-manager-coverage.sh
+        DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+
+ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
 SET(SM_TESTS_SOURCES
     ${SM_TEST_SRC}/colour_log_formatter.cpp
     ${SM_TEST_SRC}/privilege_db_fixture.cpp
diff --git a/test/security-manager-coverage.sh.in b/test/security-manager-coverage.sh.in
new file mode 100644 (file)
index 0000000..68dd5ab
--- /dev/null
@@ -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@-@VERSION@"
+
+# create dir for the report
+mkdir $HTML_DIR
+
+# remove old gcda files
+find / -iname "*.gcda" -exec rm {} \;
+
+# launch unit tests
+security-manager-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
+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/