Automate code coverage measurement 57/233857/13
authorDariusz Michaluk <d.michaluk@samsung.com>
Tue, 19 May 2020 14:50:46 +0000 (16:50 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Mon, 6 Jul 2020 09:59:39 +0000 (11:59 +0200)
Change-Id: Iedf2495b640d4f703f9b63dad934af7d42f9adc2

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

index 3ee7f7e..7b5b311 100644 (file)
@@ -1,3 +1,5 @@
+%{!?build_type:%global build_type RELEASE}
+
 Name: device-certificate-manager
 Summary: Device Certificate Manager daemon and libraries
 Version: 2.0
@@ -14,6 +16,7 @@ BuildRequires: pkgconfig(cynara-client)
 BuildRequires: pkgconfig(cynara-creds-socket)
 BuildRequires: pkgconfig(cynara-session)
 BuildRequires: boost-devel
+BuildRequires: lcov
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 Requires: boost-system
@@ -22,6 +25,7 @@ Requires: boost-system
 %global user_name              security_fw
 %global group_name             security_fw
 %global smack_domain_name      System
+%global coverage_dir           /opt/data/device-certificate-manager-coverage
 
 %description
 Device Certificate Manager provides cryptography services for the Iotivity framework.
@@ -50,17 +54,28 @@ Requires:   boost-test
 %description -n device-certificate-manager-tests
 Internal tests for Device Certificate Manager
 
+%package -n device-certificate-manager-coverage
+Summary:       Device Certificate Manager code coverage data
+Group:         Security/Testing
+Requires:      device-certificate-manager-tests
+Requires:      lcov
+Requires:      gcc
+
+%description -n device-certificate-manager-coverage
+Device Certificate Manager code coverage data
+
 %prep
 %setup -q
 cp -a %{SOURCE1001} .
 
 %build
-%cmake . -DCMAKE_BUILD_TYPE=%{?build_type:%build_type}%{!?build_type:Release} \
+%cmake . -DCMAKE_BUILD_TYPE=%{build_type} \
        -DSYSTEMD_UNIT_DIR=%{_unitdir} \
        -DUSER_NAME=%{user_name} \
        -DGROUP_NAME=%{group_name} \
        -DSMACK_DOMAIN_NAME=%{smack_domain_name} \
-       -DRPM_DIR=%{_sysconfdir}/rpm
+       -DRPM_DIR=%{_sysconfdir}/rpm \
+       -DCOVERAGE_DIR=%{coverage_dir}
 
 make %{?jobs:-j%jobs}
 
@@ -123,3 +138,14 @@ fi
 %manifest %{name}.manifest
 %license LICENSE
 %{_bindir}/device-certificate-manager-tests
+
+%if %{build_type} == DEBUG
+
+%files coverage
+%manifest %{name}.manifest
+%license LICENSE
+%{_bindir}/device-certificate-manager-coverage.sh
+%{_builddir}/%{name}-%{version}
+%coverage_dir
+
+%endif
index 67a48fd..27bfebb 100644 (file)
 # @author      Dariusz Michaluk <d.michaluk@samsung.com>
 # @author      Jaroslaw Pelczar <j.pelczar@samsung.com>
 
+SET(TARGET_TESTS "device-certificate-manager-tests")
+
+# 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_TESTS}.dir/
+       )
+
+       # 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}/
+               DESTINATION ${CMAKE_BINARY_DIR}
+               FILES_MATCHING PATTERN "*.cpp" PATTERN "*.h" PATTERN "*.c" PATTERN "*.cc"
+       )
+
+       # install code coverage automation script
+       CONFIGURE_FILE(device-certificate-manager-coverage.sh.in device-certificate-manager-coverage.sh @ONLY)
+       INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/device-certificate-manager-coverage.sh DESTINATION ${CMAKE_INSTALL_BINDIR})
+
+ENDIF (CMAKE_BUILD_TYPE MATCHES "DEBUG")
+
 FIND_PACKAGE(Boost REQUIRED
        COMPONENTS
        unit_test_framework)
@@ -26,13 +60,15 @@ INCLUDE_DIRECTORIES(../src/dcm-client)
 
 ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK)
 
-SET(TARGET_TESTS "device-certificate-manager-tests")
 ADD_EXECUTABLE(${TARGET_TESTS}
        device_certificate_manager_tests.cpp
        api_test.cpp)
 
+TARGET_COMPILE_OPTIONS(${TARGET_TESTS} PRIVATE ${COVERAGE_COMPILE_OPTIONS})
+
 TARGET_LINK_LIBRARIES(${TARGET_TESTS}
        ${Boost_UNIT_TEST_FRAMEWORK_LIBRARIES}
+       ${COVERAGE_LINK_OPTIONS}
        device-certificate-manager)
 
 INSTALL(TARGETS
diff --git a/tests/device-certificate-manager-coverage.sh.in b/tests/device-certificate-manager-coverage.sh.in
new file mode 100644 (file)
index 0000000..0be9525
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+set -exuo pipefail
+
+REPORT="device-certificate-manager-coverage.info"
+STDERR="device-certificate-manager-coverage.stderr"
+HTML_DIR="device-certificate-manager-coverage"
+
+# create dir for the report
+mkdir $HTML_DIR
+
+# remove old gcda files
+find / -iname "*.gcda" -exec rm {} \;
+
+# launch unit tests
+device-certificate-manager-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
+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/