Automate code coverage measurement 18/251618/4
authorDariusz Michaluk <d.michaluk@samsung.com>
Fri, 15 Jan 2021 08:19:30 +0000 (09:19 +0100)
committerDariusz Michaluk <d.michaluk@samsung.com>
Fri, 22 Jan 2021 16:11:26 +0000 (17:11 +0100)
To gather unit tests coverage report:
- use COVERAGE build_type,
- install security-privilege-manager-coverage rpm,
- run privilege-checker-coverage.sh script.

Change-Id: I79142f2b87e7ecdc8fae3efad903dfebd3f3a654

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

index e1943e36d66b482deb412e9ef3761970ae7b0c48..8da6018fe8e8bde1b0810ecdd8a045306f60382c 100644 (file)
@@ -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        "-O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_C_FLAGS_RELEASE      "-O2 -DNDEBUG")
+SET(CMAKE_C_FLAGS_COVERAGE     "-O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE")
 
 ADD_DEFINITIONS("-Werror")
 ADD_DEFINITIONS("-Wall")
index fb5253b367859267aa1f8d536030656339601d4e..7e8d01191e8167552c7334b2c4cabfcb37373c4f 100644 (file)
@@ -22,6 +22,9 @@ BuildRequires: pkgconfig(pkgmgr-info)
 BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(sqlite3)
 BuildRequires: pkgconfig(libtzplatform-config)
+%if "%{build_type}" == "COVERAGE"
+BuildRequires: lcov
+%endif
 Requires: security-config
 Requires: tizen-platform-config
 Requires: pkgmgr
@@ -99,6 +102,20 @@ Summary:    Internal TC for privilege-checker
 %description -n security-privilege-manager-tests
 Internal TC for privilege-checker APIs
 
+%if "%{build_type}" == "COVERAGE"
+
+%package -n security-privilege-manager-coverage
+Summary: Privilege Checker code coverage data
+Requires: security-privilege-manager-tests = %{version}-%{release}
+Requires: privilege-checker-debugsource = %{version}-%{release}
+Requires: lcov
+Requires: gcc
+
+%description -n security-privilege-manager-coverage
+Privilege Checker code coverage data
+
+%endif
+
 %package -n privilege-verifier
 Summary:    Privilege Verification Utility
 BuildRequires: pkgconfig(sqlite3)
@@ -113,9 +130,13 @@ The Privilege Verifier Utility provides functions to verify privilege informatio
 cp %{SOURCE1000} .
 
 %build
+
+%global coverage_dir %{_datadir}/privilege-checker-coverage
+
 %cmake . -DCMAKE_BUILD_TYPE=%{build_type} \
         -DTZ_SYS_DB=%TZ_SYS_DB \
-        -DTZ_SYS_SHARE=%TZ_SYS_SHARE
+        -DTZ_SYS_SHARE=%TZ_SYS_SHARE \
+        -DCOVERAGE_DIR=%{coverage_dir}
 
 make %{?jobs:-j%jobs}
 
@@ -207,6 +228,14 @@ mv %{_sysconfdir}/privilege-checker.ini.iot %{_sysconfdir}/privilege-checker.ini
 %files -n security-privilege-manager-tests
 %{_bindir}/privilege-checker-tests
 
+%if "%{build_type}" == "COVERAGE"
+
+%files -n security-privilege-manager-coverage
+%{_bindir}/privilege-checker-coverage.sh
+%coverage_dir
+
+%endif
+
 %files -n privilege-verifier
 %license LICENSE.APLv2
 %{_bindir}/privilege-verifier
index 8b1d90393d74fddc547914c1d680f910cd6d66cb..e8a59c2c972efde64d9302877fe70b53ac87b63e 100644 (file)
@@ -4,6 +4,29 @@ ADD_DEFINITIONS(-D__TIZEN__)
 
 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/test)
 
+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-checker-coverage.sh.in privilege-checker-coverage.sh @ONLY)
+       INSTALL(
+               PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/privilege-checker-coverage.sh
+               DESTINATION ${CMAKE_INSTALL_BINDIR}
+       )
+
+ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
 SET(TEST_SRCS
        privilege-checker.c
        tc-common.c
diff --git a/test/privilege-checker-coverage.sh.in b/test/privilege-checker-coverage.sh.in
new file mode 100644 (file)
index 0000000..bab3511
--- /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@-@PROJECT_VERSION@"
+
+# create dir for the report
+mkdir $HTML_DIR
+
+# remove old gcda files
+find / -iname "*.gcda" -exec rm {} \;
+
+# launch unit tests
+privilege-checker-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/