[Spec] Add testcoverage option
authorSangjung Woo <sangjung.woo@samsung.com>
Fri, 17 Sep 2021 04:03:11 +0000 (13:03 +0900)
committerSangjung Woo <again4you@gmail.com>
Fri, 17 Sep 2021 06:20:39 +0000 (15:20 +0900)
To check the line & function coverage, this patch adds the testcoverage option.

Signed-off-by: Sangjung Woo <sangjung.woo@samsung.com>
packaging/nnstreamer-edge.spec
packaging/run_unittests.sh [new file with mode: 0644]

index fa299a95f7178d086191db45e9a0c373852fee9d..888e54030d545aadf1660271273ddf572262116b 100644 (file)
@@ -1,4 +1,4 @@
-%define     sensor_test 0
+%define     test_script $(pwd)/packaging/run_unittests.sh
 
 Name:       nnstreamer-edge
 Summary:    Common library set for nnstreamer-edge
@@ -16,6 +16,10 @@ BuildRequires:  pkgconfig(paho-mqtt-c)
 BuildRequires:  gtest-devel
 %endif
 
+%if 0%{?testcoverage}
+BuildRequires: lcov
+%endif
+
 %description
 nnstreamer-edge provides remote source nodes for NNStreamer pipelines without GStreamer dependencies.
 It also contains communicaton library for sharing server node information & status
@@ -39,6 +43,13 @@ Requires: nnstreamer-edge = %{version}-%{release}
 %description sensor-devel
 It is a development package for nnstreamer-edge-sensor.
 
+%if 0%{?testcoverage}
+%package unittest-coverage
+Summary: Unittest coverage result for nnstreamer-edge
+%description unittest-coverage
+HTML pages of lcov results of nnstreamer-edge generated during rpm build
+%endif
+
 %define enable_sensor_test -DENABLE_TEST=OFF
 %if 0%{?sensor_test}
 %define enable_sensor_test -DENABLE_TEST=ON
@@ -49,6 +60,20 @@ It is a development package for nnstreamer-edge-sensor.
 cp %{SOURCE1001} .
 
 %build
+
+%if 0%{?testcoverage}
+# To test coverage, disable optimizations (and should unset _FORTIFY_SOURCE to use -O0)
+CFLAGS=`echo $CFLAGS | sed -e "s|-O[1-9]|-O0|g"`
+CFLAGS=`echo $CFLAGS | sed -e "s|-Wp,-D_FORTIFY_SOURCE=[1-9]||g"`
+CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-O[1-9]|-O0|g"`
+CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-Wp,-D_FORTIFY_SOURCE=[1-9]||g"`
+
+export CFLAGS+=" -fprofile-arcs -ftest-coverage -g"
+export CXXFLAGS+=" -fprofile-arcs -ftest-coverage -g"
+export FFLAGS+=" -fprofile-arcs -ftest-coverage -g"
+export LDFLAGS+=" -lgcov"
+%endif
+
 mkdir -p build
 pushd build
 %cmake .. \
@@ -64,6 +89,35 @@ pushd build
 %make_install
 popd
 
+%if 0%{?sensor_test}
+LD_LIBRARY_PATH=./src bash %{test_script} ./tests/unittest_edge_sensor
+%endif
+
+%if 0%{?testcoverage}
+# 'lcov' generates the date format with UTC time zone by default. Let's replace UTC with KST.
+# If you can get a root privilege, run ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
+TZ='Asia/Seoul'; export TZ
+
+# Get commit info
+VCS=`cat ${RPM_SOURCE_DIR}/nnstreamer-edge.spec | grep "^VCS:" | sed "s|VCS:\\W*\\(.*\\)|\\1|"`
+
+# Create human readable coverage report web page.
+# Create null gcda files if gcov didn't create it because there is completely no unit test for them.
+find . -name "*.gcno" -exec sh -c 'touch -a "${1%.gcno}.gcda"' _ {} \;
+# Remove gcda for meaningless file (CMake's autogenerated)
+find . -name "CMakeCCompilerId*.gcda" -delete
+find . -name "CMakeCXXCompilerId*.gcda" -delete
+# Generate report
+lcov -t 'NNStreamer-edge unittest coverage' -o unittest.info -c -d . -b $(pwd) --no-external
+# Exclude test files.
+lcov -r unittest.info "*/tests/*" -o unittest-filtered.info
+# Visualize the report
+genhtml -o result unittest-filtered.info -t "NNStreamer-edge %{version}-%{release} ${VCS}" --ignore-errors source -p ${RPM_BUILD_DIR}
+
+mkdir -p %{buildroot}%{_datadir}/nnstreamer-edge/unittest/
+cp -r result %{buildroot}%{_datadir}/nnstreamer-edge/unittest/
+%endif # test coverage
+
 %clean
 rm -rf %{buildroot}
 
@@ -82,3 +136,8 @@ rm -rf %{buildroot}
 %files sensor-devel
 %{_includedir}/edge_sensor.h
 %{_libdir}/pkgconfig/nnstreamer-edge-sensor.pc
+
+%if 0%{?testcoverage}
+%files unittest-coverage
+%{_datadir}/nnstreamer-edge/unittest/*
+%endif
diff --git a/packaging/run_unittests.sh b/packaging/run_unittests.sh
new file mode 100644 (file)
index 0000000..c8726a6
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+##
+## @file run_unittests.sh
+## @author Jijoong Moon <jijoong.moon@samsung.com>
+## @date 17 September 2021
+## @brief Run unit test for nnstreamer-edge
+##
+
+ret=0
+pushd build
+
+run_entry() {
+  entry=$1
+  ${entry} --gtest_output="xml:${entry##*/}.xml"
+  return $?
+}
+
+if [ -f "$1" ]; then
+    echo $1
+    run_entry $1
+    exit $?
+elif [ -d "$1" ]; then
+    testlist=$(find $1 -type f -executable -name "unittest_*")
+    for t in ${testlist}; do
+       echo "running: ${t} @$(pwd)"
+       run_entry ${t}
+       ret=$?
+       if [ $ret -ne 0 ]; then
+           break
+       fi
+    done
+fi
+
+popd
+exit $ret