Automate code coverage measurement 19/243019/6
authorDariusz Michaluk <d.michaluk@samsung.com>
Wed, 2 Sep 2020 11:37:14 +0000 (13:37 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Thu, 29 Oct 2020 16:14:19 +0000 (17:14 +0100)
To gather unit tests coverage report:
- use COVERAGE build_type,
- instal yaca-coverage rpm,
- run yaca-coverage.sh script.

Change-Id: Ia3dd921d12e86cf0541252d9b1d224ce52a2d428

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

index 89f74a5..8629504 100644 (file)
@@ -99,6 +99,10 @@ IF(NOT DEFINED EXAMPLES_DIR)
        SET(EXAMPLES_DIR "${SHARE_INSTALL_PREFIX}/${PROJECT_NAME}/examples")
 ENDIF(NOT DEFINED EXAMPLES_DIR)
 
+IF(NOT DEFINED COVERAGE_DIR)
+       SET(COVERAGE_DIR "${SHARE_INSTALL_PREFIX}/${PROJECT_NAME}-coverage")
+ENDIF(NOT DEFINED COVERAGE_DIR)
+
 CONFIGURE_FILE(packaging/yaca.manifest.in yaca.manifest @ONLY)
 
 ADD_SUBDIRECTORY(${SRC_FOLDER})
index 22adaec..86d02ad 100644 (file)
@@ -34,30 +34,23 @@ The package provides Yet Another Crypto API.
 %prep
 %setup -q
 
+%global coverage_dir %{_datadir}/yaca-coverage
+
 %build
-%cmake . -DCMAKE_BUILD_TYPE=%{build_type}
+%cmake . \
+        -DCMAKE_BUILD_TYPE=%{build_type} \
+        -DCOVERAGE_DIR=%{coverage_dir}
 
 make -k %{?jobs:-j%jobs}
 
-%if %{build_type} == "COVERAGE"
-mkdir -p gcov-obj
-find . \( -name '*.gcno' ! -name 'tc_*' \) -exec cp '{}' gcov-obj ';'
-%endif
-
 %install
 %make_install
 %py3_compile %{buildroot}/%{python3_sitearch}
 
-%if "%{build_type}" == "COVERAGE"
-mkdir -p %{buildroot}%{_datadir}/gcov/obj
-install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj
-%endif
-
-
 %clean
 rm -rf %{buildroot}
 
-## Devel Package ###############################################################
+## Devel Package ##############################################################
 %package devel
 Summary:        Yet Another Crypto API development files
 Group:          Security/Other
@@ -71,7 +64,7 @@ The package provides Yet Another Crypto API development files.
 %{_includedir}/yaca
 %{_libdir}/pkgconfig/yaca.pc
 
-## Examples Package ############################################################
+## Examples Package ###########################################################
 %package examples
 Summary:        Yet Another Crypto API example files
 Group:          Security/Other
@@ -84,7 +77,7 @@ The package provides Yet Another Crypto API example files.
 %{_bindir}/yaca-example*
 %{_datadir}/%{name}/examples
 
-## Tests Package ############################################################
+## Tests Package ##############################################################
 %package tests
 Summary:        Yet Another Crypto API tests
 Group:          Security/Other
@@ -108,14 +101,20 @@ The package provides Yet Another Crypto API bindings for Python3.
 %files -n python3-yaca
 %{python3_sitearch}/%{name}
 
-## gcov Package ############################################################
+## Coverage Package ###########################################################
 %if "%{build_type}" == "COVERAGE"
-%package gcov
-Summary:  yaca gcov for measuring test coverage
-Group:    Secureity/Testing
-%description gcov
-New yaca gcov objects
-
-%files gcov
-%{_datadir}/gcov/obj/*
+%package coverage
+Summary:        Yet Another Crypto API code coverage data
+Group:          Security/Other
+Requires:       yaca-tests = %{version}-%{release}
+Requires:       yaca-debugsource = %{version}-%{release}
+Requires:       lcov
+Requires:       gcc
+
+%description coverage
+Yet Another Crypto API code coverage data
+
+%files coverage
+%{_bindir}/yaca-coverage.sh
+%coverage_dir
 %endif
index 8e81541..efcbd0e 100644 (file)
 #
 
 SET(TESTS_NAME yaca-unit-tests)
+
+IF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
+       # coverage data
+       SET(COVERAGE_BUILD_DIR
+               ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TESTS_NAME}.dir/
+       )
+
+       # install gcno files
+       INSTALL(
+               DIRECTORY ${COVERAGE_BUILD_DIR}/
+               DESTINATION ${COVERAGE_DIR}
+               FILES_MATCHING PATTERN "*.gcno"
+       )
+
+       # install code coverage automation script
+       CONFIGURE_FILE(yaca-coverage.sh.in yaca-coverage.sh @ONLY)
+       INSTALL(
+               PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/yaca-coverage.sh
+               DESTINATION ${CMAKE_INSTALL_BINDIR}
+       )
+
+ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
 FILE(GLOB YACA_SOURCES ${SRC_FOLDER}/*.c)
 SET(TESTS_SOURCES
        common.cpp
diff --git a/tests/yaca-coverage.sh.in b/tests/yaca-coverage.sh.in
new file mode 100644 (file)
index 0000000..6cd4584
--- /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
+yaca-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@/tests/*" -o $REPORT
+
+# check warnings
+if [ -s $STDERR ]
+then
+       echo "Warnings detected (see $STDERR). Aborting."
+       exit 1
+fi
+
+# html
+genhtml $REPORT --output-directory $HTML_DIR/