Automate code coverage measurement 67/235867/2
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Fri, 22 May 2020 14:47:26 +0000 (16:47 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Fri, 12 Jun 2020 12:08:50 +0000 (12:08 +0000)
* Unit-tests built and linked with coverage flags in debug mode only.
* Separate rpm for code coverage built in debug mode only, including:
** All the *.cpp and *.h files in /home/abuild/... in case lcov needs them
   (missing files issue).
** All the key-manager's *.gcno files produced during compilation
   (test/tools/misc files skipped).
** A helper script taking care of whole code coverage measurement, that is:
*** Removing old *.gcda files.
*** Launching internal test.
*** Gathering runtime *.gcda files.
*** Preparing a report with lcov. Fails if any error or warning is reported
    (e.g. a missing file warning). Files external to the project are excluded.
*** Preparing an html report based on lcov output.

Usage:
* Build key-manager in debug mode mode.
* Install the key-manager-unit-tests and key-manager-coverage RPMs.
* Execute ckm-coverage.sh to produce lcov html report.

Change-Id: I5118b8ffba05e40d05e732c5162bd924a2f24120

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

index 6764fbb..339b05d 100644 (file)
@@ -34,8 +34,6 @@ SET(CMAKE_C_FLAGS_DEBUG        "-g -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_CXX_FLAGS_DEBUG      "-g -std=c++14 -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_C_FLAGS_RELEASE      "-g -O2")
 SET(CMAKE_CXX_FLAGS_RELEASE    "-g -std=c++14 -O2")
-SET(CMAKE_C_FLAGS_CCOV         "-g -O2 --coverage")
-SET(CMAKE_CXX_FLAGS_CCOV       "-g -std=c++14 -O2 --coverage")
 
 # Force PIE
 SET(CMAKE_POSITION_INDEPENDENT_CODE "True")
index ed6495f..a467c80 100644 (file)
@@ -43,7 +43,8 @@ BuildRequires: key-manager-ta-devel
 BuildRequires: key-manager-ta-serialization-devel
 BuildRequires: pkgconfig(tef-libteec)
 %endif
-Requires:      libkey-manager-common = %{version}-%{release}
+Requires: libkey-manager-common = %{version}-%{release}
+BuildRequires: lcov
 
 %{?systemd_requires}
 
@@ -57,6 +58,7 @@ Requires:      libkey-manager-common = %{version}-%{release}
 %global ro_data_dir %{?TZ_SYS_RO_SHARE:%TZ_SYS_RO_SHARE/ckm}%{!?TZ_SYS_RO_SHARE:%_datadir/ckm}
 %global unit_tests_dir %{?TZ_SYS_DATA:%TZ_SYS_DATA/ckm-unit-tests}%{!?TZ_SYS_DATA:%/opt/data/ckm-unit-tests}
 %global misc_dir %{?TZ_SYS_DATA:%TZ_SYS_DATA/ckm-misc}%{!?TZ_SYS_DATA:%/opt/data/ckm-misc}
+%global coverage_dir %{?TZ_SYS_DATA:%TZ_SYS_DATA/ckm-coverage}%{!?TZ_SYS_DATA:%/opt/data/ckm-coverage}
 %global bin_dir %{?TZ_SYS_BIN:%TZ_SYS_BIN}%{!?TZ_SYS_BIN:%_bindir}
 # image creation error occured if /usr/sbin used for ldconfig
 #%global sbin_dir %{?TZ_SYS_SBIN:%TZ_SYS_SBIN}%{!?TZ_SYS_SBIN:%_sbindir}
@@ -153,6 +155,17 @@ Requires(postun): %{sbin_dir}/ldconfig
 %description -n key-manager-initial-values
 Includes ckm_initial_values tool for initial values XML generation
 
+%package -n key-manager-coverage
+Summary:    Central Key Manager code coverage data
+Group:      Security/Testing
+License:    Apache-2.0
+Requires:      key-manager-unit-tests
+Requires:      lcov
+Requires:      gcc
+
+%description -n key-manager-coverage
+Central Key Manager code coverage data
+
 %prep
 %setup -q
 
@@ -196,6 +209,7 @@ export LDFLAGS+="-Wl,--rpath=%{_libdir},-Bsymbolic-functions"
 %endif
         -DUNIT_TESTS_DIR=%{unit_tests_dir} \
         -DMISC_DIR=%{misc_dir} \
+        -DCOVERAGE_DIR=%{coverage_dir} \
         -DDUMP_LEGACY_DB_LIBNAME=%{dump_legacy_db_libname}
 
 make %{?jobs:-j%jobs}
@@ -365,3 +379,17 @@ fi
 %license LICENSE.BSL-1.0
 %{bin_dir}/ckm-unit-tests
 %unit_tests_dir
+
+###############################################################################
+%if %{build_type} == DEBUG
+###############################################################################
+
+%files -n key-manager-coverage
+%license LICENSE
+%{bin_dir}/key-manager-coverage.sh
+%{_builddir}/%{name}-%{version}
+%coverage_dir
+
+#################### %{build_type} == DEBUG ###################################
+%endif
+###############################################################################
index 83d7fea..095abcc 100644 (file)
@@ -1,3 +1,36 @@
+# enable code coverage in debug build only
+IF (CMAKE_BUILD_TYPE MATCHES "DEBUG")
+
+    # coverage build flags
+    SET(COVERAGE_LINK_OPTIONS --coverage)
+    SET(COVERAGE_COMPILE_OPTIONS --coverage)
+
+    # coverage data
+    SET(COVERAGE_BUILD_DIR
+        ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET_UNIT_TESTS}.dir/__/src/
+    )
+
+    # install gcno files
+    INSTALL(
+        DIRECTORY ${COVERAGE_BUILD_DIR}/
+        DESTINATION ${COVERAGE_DIR}
+        FILES_MATCHING PATTERN "*.gcno"
+    )
+
+    # install all the source & header files just as in the buildir
+    INSTALL(
+        DIRECTORY ${PROJECT_SOURCE_DIR}/src
+        DESTINATION ${CMAKE_BINARY_DIR}
+        FILES_MATCHING PATTERN "*.cpp" PATTERN "*.h"
+    )
+
+    # install code coverage automation script
+    CONFIGURE_FILE(key-manager-coverage.sh.in key-manager-coverage.sh @ONLY)
+    INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/key-manager-coverage.sh DESTINATION ${BIN_DIR})
+
+ENDIF (CMAKE_BUILD_TYPE MATCHES "DEBUG")
+
+
 FIND_PACKAGE(Threads REQUIRED)
 
 SET(DB_TEST_DIR ${UNIT_TESTS_DIR}/db)
@@ -105,6 +138,8 @@ ADD_EXECUTABLE(
     ${TZ_BACKEND_SOURCES}
 )
 
+TARGET_COMPILE_OPTIONS(${TARGET_UNIT_TESTS} PRIVATE ${COVERAGE_COMPILE_OPTIONS})
+
 TARGET_LINK_LIBRARIES(
     ${TARGET_UNIT_TESTS}
     ${KEY_MANAGER_DEP_LIBRARIES}
@@ -112,6 +147,7 @@ TARGET_LINK_LIBRARIES(
     ${CMAKE_THREAD_LIBS_INIT}
     boost_unit_test_framework
     -ldl
+    ${COVERAGE_LINK_OPTIONS}
 )
 
 INSTALL(TARGETS ${TARGET_UNIT_TESTS} DESTINATION bin)
diff --git a/unit-tests/key-manager-coverage.sh.in b/unit-tests/key-manager-coverage.sh.in
new file mode 100644 (file)
index 0000000..f0656d4
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+set -exuo pipefail
+
+REPORT="key-manager-coverage.info"
+STDERR="key-manager-coverage.stderr"
+HTML_DIR="key-manager-coverage"
+
+# create dir for the report
+mkdir $HTML_DIR
+
+# remove old gcda files
+find / -iname "*.gcda" -exec rm {} \;
+
+# launch unit tests
+ckm-unit-tests
+
+# 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
+
+# check warnings
+if [ -s $STDERR ]
+then
+    echo "Warnings detected (see $STDERR). Aborting."
+    exit 1
+fi
+
+# html
+genhtml $REPORT --output-directory $HTML_DIR/