Automate code coverage measurement
authorDariusz Michaluk <d.michaluk@samsung.com>
Thu, 7 Mar 2024 11:47:01 +0000 (12:47 +0100)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Fri, 12 Apr 2024 10:05:06 +0000 (12:05 +0200)
To gather unit tests coverage report:
- use COVERAGE build_type,
- instal webauthn-ble-coverage rpm,
- run webauthn-ble-coverage.sh script.

Change-Id: Icf194a2157d46ec1f9d2fc657ccec73df211f671

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

index 43f8ec29f467bac870f534dd3f3024988b5b1443..03375bef5beed8d9546455b445257a9d3a503d0b 100644 (file)
@@ -31,8 +31,8 @@ SET(CMAKE_C_FLAGS_DEBUG        "-std=c11 -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_CXX_FLAGS_DEBUG      "-std=c++17 -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
 SET(CMAKE_C_FLAGS_RELEASE      "-std=c11 -O2 -DNDEBUG")
 SET(CMAKE_CXX_FLAGS_RELEASE    "-std=c++17 -O2 -DNDEBUG")
-SET(CMAKE_C_FLAGS_CCOV         "-std=c11 -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE")
-SET(CMAKE_CXX_FLAGS_CCOV       "-std=c++17 -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE")
+SET(CMAKE_C_FLAGS_COVERAGE     "-std=c11 -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE")
+SET(CMAKE_CXX_FLAGS_COVERAGE   "-std=c++17 -O0 -ggdb --coverage -Wp,-U_FORTIFY_SOURCE")
 
 SET(CMAKE_POSITION_INDEPENDENT_CODE "True")
 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie")
@@ -65,6 +65,10 @@ ENDIF (OPENSSL11_DEP_FOUND MATCHES 1)
 SET(PRJ_SRC_PATH ${PROJECT_SOURCE_DIR}/srcs)
 SET(PRJ_TEST_PATH ${PROJECT_SOURCE_DIR}/tests)
 
+IF(NOT DEFINED COVERAGE_DIR)
+    SET(COVERAGE_DIR "${SHARE_INSTALL_PREFIX}/${PROJECT_NAME}-coverage")
+ENDIF(NOT DEFINED COVERAGE_DIR)
+
 ################# common configurations for srcs and test #####################
 PKG_CHECK_MODULES(PROJECT_DEPS
     REQUIRED
index c60259a3240898dd96592c69108fbd2eaa2f73aa..ad756c9e55e65a45df7c26565f905899d11b6d38 100644 (file)
@@ -25,6 +25,7 @@ BuildRequires: pkgconfig(webauthn-hal)
 BuildRequires: pkgconfig(libwebsockets)
 BuildRequires: pkgconfig(capi-network-bluetooth)
 BuildRequires: pkgconfig(glib-2.0)
+
 %if 0%{?force_openssl11}
 BuildRequires: pkgconfig(openssl1.1)
 %else
@@ -56,16 +57,34 @@ Requires:      %{name} = %{version}-%{release}
 %description manual-tests
 Adaptation Layer of Web Authentication Service for BLE Authenticator (manual test)
 
+%if "%build_type" == "COVERAGE"
+%package coverage
+Summary:    Adaptation Layer of Web Authentication Service for BLE Authenticator (code coverage data)
+License:    Apache-2.0
+Group:      Security/Development
+BuildRequires: lcov
+Requires:   %{name}-unit-tests = %{version}-%{release}
+Requires:   %{name}-debugsource = %{version}-%{release}
+Requires:   lcov
+Requires:   gcc
+
+%description coverage
+Adaptation Layer of Web Authentication Service for BLE Authenticator (code coverage data)
+%endif
+
 %prep
 %setup -q
 
+%global coverage_dir %{_datadir}/%{name}-coverage
+
 %build
 %cmake . -DCMAKE_BUILD_TYPE=%{build_type} \
          -DPROJECT_NAME=%name \
          -DVERSION_MAJOR=%version_major \
          -DVERSION_MINOR=%version_minor \
          -DVERSION_PATCH=%version_patch \
-         -DBIN_DIR=%{_bindir}
+         -DBIN_DIR=%{_bindir} \
+         -DCOVERAGE_DIR=%{coverage_dir}
 
 make %{?jobs:-j%jobs}
 
@@ -96,3 +115,9 @@ rm -f %{WEBAUTHN_HYBRID_PLUGIN_SO_PATH}
 %{_bindir}/%{name}-manual-tests
 %{_bindir}/%{name}-manual-tunnel-tests
 %{_bindir}/%{name}-manual-tunnel-tests.sh
+
+%if "%build_type" == "COVERAGE"
+%files -n %{name}-coverage
+%{_bindir}/%{name}-coverage.sh
+%coverage_dir
+%endif
index 350ce83149a1a4b26bccf5dc681bddb52dad81e8..9b2b28b67b016562976748bab9a9fe7edb868467 100644 (file)
@@ -20,6 +20,27 @@ PKG_CHECK_MODULES(TESTS_DEPS
     ${OPENSSL_DEP}
 )
 
+IF(CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+    # coverage data
+    SET(COVERAGE_BUILD_DIR
+        ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET_WEBAUTHN_BLE_UNIT_TESTS}.dir/
+    )
+
+    # install gcno files
+    INSTALL(
+        DIRECTORY ${COVERAGE_BUILD_DIR}/
+        DESTINATION ${COVERAGE_DIR}
+        FILES_MATCHING PATTERN "*.gcno"
+    )
+
+    # install code coverage automation script
+    CONFIGURE_FILE(${PROJECT_NAME}-coverage.sh.in ${PROJECT_NAME}-coverage.sh @ONLY)
+    INSTALL(
+        PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-coverage.sh
+        DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+ENDIF(CMAKE_BUILD_TYPE MATCHES "COVERAGE")
+
 INCLUDE_DIRECTORIES(SYSTEM ${TESTS_DEPS_INCLUDE_DIRS})
 
 INCLUDE_DIRECTORIES(${TINYCBOR_DIR}/src/)
diff --git a/tests/webauthn-ble-coverage.sh.in b/tests/webauthn-ble-coverage.sh.in
new file mode 100644 (file)
index 0000000..8cff1f9
--- /dev/null
@@ -0,0 +1,52 @@
+#!/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
+webauthn-ble-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
+
+# Due to mismatch in the version of gcc/gcov and lcov, we need to ignore few errors
+IGNORE_ERRORS=" --ignore-errors unused,unused \
+                               --ignore-errors empty,empty \
+                               --ignore-errors mismatch,mismatch \
+                               --ignore-errors gcov,gcov "
+
+lcov $IGNORE_ERRORS --no-external -c -d "@COVERAGE_DIR@" -b "@CMAKE_BINARY_DIR@" -o $REPORT 2>$STDERR
+lcov $IGNORE_ERRORS -r $REPORT "@CMAKE_BINARY_DIR@/tests/*" -o $REPORT
+lcov $IGNORE_ERRORS -r $REPORT "@CMAKE_BINARY_DIR@/srcs/tinycbor/*" -o $REPORT
+
+# Let's skip lcov warning
+# geninfo: WARNING: using JSON module "JSON::PP" - which is much slower than some alternatives.
+# Consider installing one of JSON::XS or Cpanel::JSON::XS
+sed -i '/WARNING/d' $STDERR
+
+# check errors
+if [ -s $STDERR ]
+then
+       echo "Errors detected (see $STDERR). Aborting."
+       exit 1
+fi
+
+# html
+genhtml $REPORT --output-directory $HTML_DIR/