#!/bin/sh

# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0.  If a copy of the MPL was not distributed with this
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.

SYSTEMTESTTOP=..
. $SYSTEMTESTTOP/conf.sh

status=0
n=1

matchall () {
    match_result=ok
    file=$1
    while IFS="," read expect matchline; do
	[ -z "$matchline" ] && continue
	matches=`grep "$matchline" $file | wc -l`
	[ "$matches" -ne "$expect" ] && {
	    echo "'$matchline': expected $expect found $matches"
	    return 1
	}
    done << EOF
    $2
EOF
    return 0
}

echo_i "checking for DNSSEC key coverage issues"
ret=0
for dir in [0-9][0-9]-*; do
	ret=0
	echo_i "$dir ($n)"
	kargs= cargs= kmatch= cmatch= kret= cret=0 warn= error= ok=
	. $dir/expect

	# use policy.conf if available
	policy=""
	if [ -e "$dir/policy.conf" ]; then
		policy="-c $dir/policy.conf"
		if grep -e "-c policy.conf" $dir/expect > /dev/null
		then
			echo_i "fix $dir/expect: multiple policy files"
			ret=1
		fi
	else
		policy="-c policy.conf"
	fi

	# run keymgr to update keys
	if [ "$CYGWIN" ]; then
	    $KEYMGR $policy -K $dir -g `cygpath -w $KEYGEN` \
		-s `cygpath -w $SETTIME` $kargs > keymgr.$n 2>&1
	else
	    $KEYMGR $policy -K $dir -g $KEYGEN \
		-s $SETTIME $kargs > keymgr.$n 2>&1
	fi
	# check that return code matches expectations
	found=$?
	if [ $found -ne $kret ]; then
	    echo "keymgr retcode was $found expected $kret"
	    ret=1
	fi

	# check for matches in keymgr output
	matchall keymgr.$n "$kmatch" || ret=1

	# now check coverage
	$COVERAGE -K $dir $cargs > coverage.$n 2>&1
	# check that return code matches expectations
	found=$?
	if [ $found -ne $cret ]; then
	    echo "coverage retcode was $found expected $cret"
	    ret=1
	fi

	# check for correct number of errors
	found=`grep ERROR coverage.$n | wc -l`
	if [ $found -ne $error ]; then
	    echo "error count was $found expected $error"
	    ret=1
	fi

	# check for correct number of warnings
	found=`grep WARNING coverage.$n | wc -l`
	if [ $found -ne $warn ]; then
	    echo "warning count was $found expected $warn"
	    ret=1
	fi

	# check for correct number of OKs
	found=`grep "No errors found" coverage.$n | wc -l`
	if [ $found -ne $ok ]; then
	    echo "good count was $found expected $ok"
	    ret=1
	fi

	# check for matches in coverage output
	matchall coverage.$n "$cmatch" || ret=1

	if [ -f $dir/extra.sh ]; then
	   cd $dir
	   . ./extra.sh
	   cd ..
	fi

	n=`expr $n + 1`
	if [ $ret != 0 ]; then echo_i "failed"; fi
	status=`expr $status + $ret`
done

echo_i "checking domains ending in . ($n)"
ret=0
$KEYMGR -g $KEYGEN -s $SETTIME . > keymgr.1.$n 2>&1
nkeys=`grep dnssec-keygen keymgr.1.$n | wc -l`
[ "$nkeys" -eq 2 ] || ret=1
$KEYMGR -g $KEYGEN -s $SETTIME . > keymgr.2.$n 2>&1
nkeys=`grep dnssec-keygen keymgr.2.$n | wc -l`
[ "$nkeys" -eq 0 ] || ret=1
$KEYMGR -g $KEYGEN -s $SETTIME example.com. > keymgr.3.$n 2>&1
nkeys=`grep dnssec-keygen keymgr.3.$n | wc -l`
[ "$nkeys" -eq 2 ] || ret=1
$KEYMGR -g $KEYGEN -s $SETTIME example.com. > keymgr.4.$n 2>&1
nkeys=`grep dnssec-keygen keymgr.4.$n | wc -l`
[ "$nkeys" -eq 0 ] || ret=1
status=`expr $status + $ret`
n=`expr $n + 1`

echo_i "checking policy.conf parser ($n)"
ret=0
PYTHONPATH="../../../python:$PYTHONPATH" ${PYTHON} testpolicy.py policy.sample > policy.out
$DOS2UNIX policy.out > /dev/null 2>&1
cmp -s policy.good policy.out || ret=1
if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
n=`expr $n + 1`

echo_i "exit status: $status"
[ $status -eq 0 ] || exit 1
