Automate code coverage measurement 47/243047/5
authorDariusz Michaluk <d.michaluk@samsung.com>
Wed, 2 Sep 2020 13:56:43 +0000 (15:56 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Thu, 29 Oct 2020 15:53:07 +0000 (16:53 +0100)
To gather unit tests coverage report:
- use COVERAGE build_type,
- instal cynara-coverage rpm,
- run cynara-coverage.sh script.

Change-Id: I96e113e2fff06e126ea20a1a2bb06dfdd98ae0db

CMakeLists.txt
packaging/libcynara-commons.spec
test/CMakeLists.txt
test/cynara-coverage.sh.in [new file with mode: 0644]

index ca9168b644e23bf2b4f45cf6e449270951f6300e..025219a7c6e12a86fc9c9fa97897a82e99ad0f8b 100644 (file)
@@ -109,6 +109,13 @@ SET(SOCKET_DIR
     CACHE PATH
     "Running system information directory")
 
+IF(NOT DEFINED COVERAGE_DIR)
+SET(COVERAGE_DIR
+    "${CMAKE_INSTALL_FULL_DATAROOTDIR}/${PROJECT_NAME}-coverage"
+    CACHE PATH
+    "Read-only coverage data directory")
+ENDIF(NOT DEFINED COVERAGE_DIR)
+
 ADD_DEFINITIONS("-DLIB_DIR=\"${LIB_DIR}\"")
 ADD_DEFINITIONS("-DBIN_DIR=\"${BIN_DIR}\"")
 ADD_DEFINITIONS("-DSBIN_DIR=\"${SBIN_DIR}\"")
@@ -118,6 +125,7 @@ ADD_DEFINITIONS("-DLOCAL_STATE_DIR=\"${LOCAL_STATE_DIR}\"")
 ADD_DEFINITIONS("-DDATA_ROOT_DIR=\"${DATA_ROOT_DIR}\"")
 ADD_DEFINITIONS("-DSYSTEMD_UNIT_DIR=\"${SYSTEMD_UNIT_DIR}\"")
 ADD_DEFINITIONS("-DSOCKET_DIR=\"${SOCKET_DIR}\"")
+ADD_DEFINITIONS("-DCOVERAGE_DIR=\"${COVERAGE_DIR}\"")
 
 ############################# compiler flags ##################################
 
index 06f46b8d0e355d17f341fd68795646b02552bb4a..7a19b227b7d028f250a4c34176cb5e1bddeaf3ee 100644 (file)
@@ -53,7 +53,12 @@ BuildRequires: pkgconfig(libunwind)
 
 %endif
 
+%if "%{build_type}" == "COVERAGE"
+BuildRequires: lcov
+%endif
+
 %global project_name cynara
+%global coverage_dir %{_datadir}/cynara-coverage
 
 %package -n cynara-devel
 Summary:    Cynara development files
@@ -205,18 +210,14 @@ export LDFLAGS+="-Wl,--rpath=%{_libdir}"
         -DSYSTEMD_UNIT_DIR:PATH=%{_unitdir} \
         -DSOCKET_DIR:PATH=/run/%{project_name} \
         -DDB_FILES_SMACK_LABEL="System" \
-        -DMONITORING=ON
+        -DMONITORING=ON \
+        -DCOVERAGE_DIR=%{coverage_dir}
 make %{?jobs:-j%jobs}
 
 %install
 #rm -rf %{buildroot}
 %make_install
 
-%if "%{build_type}" == "COVERAGE"
-mkdir -p %{buildroot}%{_datadir}/gcov/cynara
-find -name '*.gcno' -exec cp --parents {} %{buildroot}%{_datadir}/gcov/cynara \;
-%endif
-
 %post -n libcynara-client -p /sbin/ldconfig
 
 %postun -n libcynara-client -p /sbin/ldconfig
@@ -349,16 +350,20 @@ fi
 %{_libdir}/libcynara-monitor.so.*
 
 %if "%{build_type}" == "COVERAGE"
-%package gcov
-Summary:    Cynara gcov for measuring test coverage
-Requires:   lcov
-Requires:   gcc
+%package -n cynara-coverage
+Summary:    Cynara code coverage data
+Group:      Security/Testing
 Requires:   cynara-tests = %{version}
 Requires:   libcynara-commons-debugsource = %{version}
-Group:      Security/Testing
-%description gcov
-Cynara code coverage objects
+Requires:   lcov
+Requires:   gcc
+
+%description -n cynara-coverage
+Cynara code coverage data
+
+%files -n cynara-coverage
+%manifest cynara-tests.manifest
+%{_bindir}/cynara-coverage.sh
+%coverage_dir
 
-%files gcov
-%{_datadir}/gcov/cynara
 %endif
index d04d75ec4c6dfc6e938a2250174c3abdcbc377fd..38ac4c72253b3eb051a160adb98d98af32ac6737 100644 (file)
@@ -52,6 +52,29 @@ ENDIF ()
 
 FIND_PACKAGE(Threads REQUIRED)
 
+IF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
+    # coverage data
+    SET(COVERAGE_BUILD_DIR
+        ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET_CYNARA_TESTS}.dir/
+    )
+
+    # install gcno files
+    INSTALL(
+        DIRECTORY ${COVERAGE_BUILD_DIR}/
+        DESTINATION ${COVERAGE_DIR}
+        FILES_MATCHING PATTERN "*.gcno"
+    )
+
+    # install code coverage automation script
+    CONFIGURE_FILE(cynara-coverage.sh.in cynara-coverage.sh @ONLY)
+    INSTALL(
+        PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cynara-coverage.sh
+        DESTINATION ${BIN_DIR}
+    )
+
+ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
 ADD_DEFINITIONS("-DCYNARA_NO_LOGS")
 SET(CYNARA_SRC ${PROJECT_SOURCE_DIR}/src)
 
diff --git a/test/cynara-coverage.sh.in b/test/cynara-coverage.sh.in
new file mode 100644 (file)
index 0000000..a4a4973
--- /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@-@CYNARA_VERSION@"
+
+# create dir for the report
+mkdir $HTML_DIR
+
+# remove old gcda files
+find / -iname "*.gcda" -exec rm {} \;
+
+# launch unit tests
+cynara-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/