-%define sensor_test 0
+%define test_script $(pwd)/packaging/run_unittests.sh
Name: nnstreamer-edge
Summary: Common library set for nnstreamer-edge
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
%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
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 .. \
%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}
%files sensor-devel
%{_includedir}/edge_sensor.h
%{_libdir}/pkgconfig/nnstreamer-edge-sensor.pc
+
+%if 0%{?testcoverage}
+%files unittest-coverage
+%{_datadir}/nnstreamer-edge/unittest/*
+%endif
--- /dev/null
+#!/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