#!/bin/bash
#
# Run tests in coverage mode, generating HTML and function reports.
#

set -e

# The tests are run from the repository root.
cd "$(realpath "$(dirname "$0")/../" )"

# Recreate the coverage output directory, to avoid including stale results
# from previous runs.
rm -rf .coverage
mkdir -p .coverage/sh .coverage/go .coverage/all
export COVER_DIR="$PWD/.coverage"

# Run Go tests in coverage mode.
go test \
	-covermode=count \
	-coverpkg=./... \
	./... \
	-args -test.gocoverdir="${COVER_DIR}/go/"

# Run external tests in coverage mode. They will run in coverage mode due to
# $GOCOVERDIR being set.
GOCOVERDIR="${COVER_DIR}/sh" setsid -w ./tests/external.sh

# Merge all coverage output into a single file.
go tool covdata merge -i "${COVER_DIR}/go,${COVER_DIR}/sh" -o "${COVER_DIR}/all"
go tool covdata textfmt -i "${COVER_DIR}/all" -o "${COVER_DIR}/merged.out"

# Generate reports based on the merged output.
go tool cover -func=.coverage/merged.out | sort -k 3 -n > ".func.txt"
go tool cover -html=.coverage/merged.out -o .coverage/dnss.cover.html

grep -i total .func.txt
echo "file:///$PWD/.coverage/dnss.cover.html"
