#!/bin/sh
# lcov code coverage script.
# Based on: https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake
# (commit 59f8ab8dded56b490dec388ac6ad449318de8779)
#
# Parameters:
# - $1: Build configuration.
# - $2: Base name for lcov files.
# - $3: Output directory.
#

if [ "$#" != "3" -o ! -f CMakeCache.txt ]; then
	echo "Syntax: $0 config basename output_directory"
	echo "Run this script from the top-level CMake build directory."
	exit 1
fi

CONFIG="$1"
coverage_base_info="$2.base.info"
coverage_test_info="$2.test.info"
coverage_info="$2.info"
coverage_cleaned="${coverage_info}.cleaned"
outputname="$3"

# lcov configuration overrides
LCOV_RC="--rc max_message_count=5 --rc branch_coverage=1"

# Cleanup lcov.
lcov ${LCOV_RC} --directory . --zerocounters

# Create baseline coverage data file.
# This ensures we get data for files that aren't loaded.
# References:
# - https://stackoverflow.com/questions/44203156/can-lcov-genhtml-show-files-that-were-never-executed
# - https://stackoverflow.com/a/45105825
lcov ${LCOV_RC} --ignore-errors inconsistent,inconsistent,mismatch \
	-c -i -d . -o "${coverage_base_info}"

# Run tests.
ctest -C "${CONFIG}"
if [ "$?" != "0" ]; then
	echo "*** WARNING: Some tests failed. Generating the lcov report anyway." >&2
fi

# Capture lcov output from the unit tests.
lcov ${LCOV_RC} --ignore-errors inconsistent,inconsistent,mismatch \
	-c -d . -o "${coverage_test_info}"

# Combine baseline and unit test output.
lcov ${LCOV_RC} --ignore-errors inconsistent,inconsistent,corrupt,mismatch \
	-a "${coverage_base_info}" \
	-a "${coverage_test_info}" \
	-o "${coverage_info}"

# Remove third-party libraries and generated sources.
lcov ${LCOV_RC} --ignore-errors unused,inconsistent \
	-o "${coverage_cleaned}" -r "${coverage_info}" \
	'*/tests/*' '/usr/*' '*/extlib/*' \
	'*/moc_*.cpp' '*.moc' '*/ui_*.h' '*/qrc_*.cpp' \
	'*/glibresources.c' \
	'*/NetworkManager.c' \
	'*/networkmanagerinterface.cpp' \
	'*/networkmanagerinterface.h' \
	'*/Notifications.c' \
	'*/notificationsinterface.cpp' \
	'*/notificationsinterface.h' \
	'*/SpecializedThumbnailer1.c' \
	'*/SpecializedThumbnailer1.h' \
	'*/libi18n/gettext.h'

# Generate the HTML report.
genhtml ${LCOV_RC} --ignore-errors inconsistent,corrupt \
	-o "${outputname}" "${coverage_cleaned}"
rm -f "${coverage_base_info}" "${coverage_test_info}" "${coverage_info}" "${coverage_cleaned}"
exit 0
