#!/bin/sh
#
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.

#
# Common configuration data for system tests, to be sourced into
# other shell scripts.
#

# Find the top of the BIND9 tree.
TOP=${SYSTEMTESTTOP:=.}/../../..

# Make it absolute so that it continues to work after we cd.
TOP=`cd $TOP && pwd`

NAMED=$TOP/bin/named/named
# We must use "named -l" instead of "lwresd" because argv[0] is lost
# if the program is libtoolized.
LWRESD="$TOP/bin/named/named -l"
DIG=$TOP/bin/dig/dig
RNDC=$TOP/bin/rndc/rndc
NSUPDATE=$TOP/bin/nsupdate/nsupdate
DDNSCONFGEN=$TOP/bin/confgen/ddns-confgen
KEYGEN=$TOP/bin/dnssec/dnssec-keygen
KEYFRLAB=$TOP/bin/dnssec/dnssec-keyfromlabel
SIGNER=$TOP/bin/dnssec/dnssec-signzone
REVOKE=$TOP/bin/dnssec/dnssec-revoke
SETTIME=$TOP/bin/dnssec/dnssec-settime
DSFROMKEY=$TOP/bin/dnssec/dnssec-dsfromkey
IMPORTKEY=$TOP/bin/dnssec/dnssec-importkey
CHECKDS=$TOP/bin/python/dnssec-checkds
COVERAGE=$TOP/bin/python/dnssec-coverage
CHECKZONE=$TOP/bin/check/named-checkzone
CHECKCONF=$TOP/bin/check/named-checkconf
PK11GEN="$TOP/bin/pkcs11/pkcs11-keygen -s ${SLOT:-0} -p 1234"
PK11LIST="$TOP/bin/pkcs11/pkcs11-list -s ${SLOT:-0} -p 1234"
PK11DEL="$TOP/bin/pkcs11/pkcs11-destroy -s ${SLOT:-0} -p 1234"
JOURNALPRINT=$TOP/bin/tools/named-journalprint
VERIFY=$TOP/bin/dnssec/dnssec-verify
ARPANAME=$TOP/bin/tools/arpaname
SAMPLE=$TOP/lib/export/samples/sample
GENRANDOM=$TOP/bin/tools/genrandom
NSLOOKUP=$TOP/bin/dig/nslookup
FEATURETEST=$TOP/bin/tests/system/feature-test

RANDFILE=$TOP/bin/tests/system/random.data
MDIG=$TOP/bin/tests/mdig

SAMPLEUPDATE=$TOP/lib/export/samples/sample-update

# we don't want a KRB5_CONFIG setting breaking the tests
KRB5_CONFIG=/dev/null

# The "stress" test is not run by default since it creates enough
# load on the machine to make it unusable to other users.
# The "dialup", "delzone", and "dupsigs" tests are also not run by
# default because they take a very long time to complete.
#
# List of tests hard-coded to use ports 5300 and 9953. For this
# reason, these must be run sequentially.
SEQUENTIALDIRS="ecdsa eddsa gost lwresd pkcs11 tkey"

# List of tests that use ports assigned by caller (other than 5300
# and 9953). Because separate blocks of ports can be used for teach
# test, these tests can be run in parallel.
#
# This symbol must be kept in step with the PARALLEL macro in Makefile.in
PARALLELDIRS="acl additional addzone allow-query autosign builtin
	 cacheclean chain checkconf @CHECKDS@ checknames
         checkzone @COVERAGE@ database digdelv dlv dlz dlzexternal
	 dns64 dnssec emptyzones fetchlimit filter-aaaa
	 formerr forward glue inline integrity ixfr legacy
	 limits logfileconfig masterfile masterformat metadata
	 notify nslookup nsupdate pending reclimit redirect
	 resolver rndc rootkeysentinel rpz rrl rrsetorder
         rsabigexponent runtime smartsign
	 sortlist spf staticstub stub tsig tsiggss unknown
	 upforwd verify views wildcard xfer xferquota zero zonechecks"

SUBDIRS="$SEQUENTIALDIRS $PARALLELDIRS"

# Things that are different on Windows
KILL=kill
DIFF=diff
DOS2UNIX=true
# There's no trailing period on Windows
TP=.

# Use the CONFIG_SHELL detected by configure for tests
SHELL=@SHELL@

# CURL will be empty if no program was found by configure
CURL=@CURL@

# XMLLINT will be empty if no program was found by configure
XMLLINT=@XMLLINT@

# PERL will be an empty string if no perl interpreter was found.
PERL=@PERL@

# PYTHON will be an empty string if no python interpreter was found.
PYTHON=@PYTHON@

if test -n "$PERL"
then
	if $PERL -e "use IO::Socket::INET6;" 2> /dev/null
	then
		TESTSOCK6="$PERL $TOP/bin/tests/system/testsock6.pl"
	else
		TESTSOCK6=false
	fi
else
	TESTSOCK6=false
fi

if grep "^#define WANT_IPV6 1" $TOP/config.h > /dev/null 2>&1 ; then
	TESTSOCK6="$TESTSOCK6"
else
	TESTSOCK6=false
fi

. ${TOP}/version

#
# Set up color-coded test output
#
if [ ${SYSTEMTEST_FORCE_COLOR:-0} -eq 1 ] || test -t 1 && type tput > /dev/null 2>&1 && tput setaf 7 > /dev/null 2>&1 ; then
    COLOR_END=`tput setaf 4`    # blue
    COLOR_FAIL=`tput setaf 1`   # red
    COLOR_INFO=`tput bold`      # bold
    COLOR_NONE=`tput sgr0`
    COLOR_PASS=`tput setaf 2`   # green
    COLOR_START=`tput setaf 4`  # blue
    COLOR_WARN=`tput setaf 3`   # yellow
else
    # set to empty strings so printf succeeds
    COLOR_END=''
    COLOR_FAIL=''
    COLOR_INFO=''
    COLOR_NONE=''
    COLOR_PASS=''
    COLOR_START=''
    COLOR_WARN=''
fi

if type printf > /dev/null 2>&1
then
	echofail () {
		printf "${COLOR_FAIL}%s${COLOR_NONE}\n" "$*"
	}
	echowarn () {
		printf "${COLOR_WARN}%s${COLOR_NONE}\n" "$*"
	}
	echopass () {
		printf "${COLOR_PASS}%s${COLOR_NONE}\n" "$*"
	}
	echoinfo () {
		printf "${COLOR_INFO}%s${COLOR_NONE}\n" "$*"
	}
	echostart () {
		printf "${COLOR_START}%s${COLOR_NONE}\n" "$*"
	}
	echoend () {
		printf "${COLOR_END}%s${COLOR_NONE}\n" "$*"
	}
else
	echofail () {
		echo "$*"
	}
	echowarn () {
		echo "$*"
	}
	echopass () {
		echo "$*"
	}
	echoinfo () {
		echo "$*"
	}
	echostart () {
		echo "$*"
	}
	echoend () {
		echo "$*"
	}
fi

SYSTESTDIR="`basename $PWD`"

echo_i() {
    echo "$@" | while read LINE ; do
       echoinfo "I:$SYSTESTDIR:$LINE"
    done
}

echo_ic() {
    echo "$@" | while read LINE ; do
       echoinfo "I:$SYSTESTDIR:  $LINE"
    done
}

cat_i() {
    while read LINE ; do
       echoinfo "I:$SYSTESTDIR:$LINE"
    done
}

digcomp() {
    output=`$PERL $SYSTEMTESTTOP/digcomp.pl "$@"`
    result=$?
    [ -n "$output" ] &&  { echo "digcomp failed:"; echo "$output"; } | cat_i
    return $result
}

#
# Useful functions in test scripts
#

# nextpart: read everything that's been appended to a file since the
# last time 'nextpart' was called.
nextpart () {
    [ -f $1.prev ] || echo "0" > $1.prev
    prev=`cat $1.prev`
    awk "NR > $prev "'{ print }
         END          { print NR > "/dev/stderr" }' $1 2> $1.prev
}

# copy_setports - Copy Configuration File and Replace Ports
#
# Convenience function to copy a configuration file, replacing the tokens
# QUERYPORT, CONTROLPORT and EXTRAPORT[1-8] with the values of the equivalent
# environment variables. (These values are set by "run.sh", which calls the
# scripts invoking this function.)
#
# Usage:
#   copy_setports infile outfile

copy_setports() {
    sed -e "s/@PORT@/${PORT}/g" \
        -e "s/@EXTRAPORT1@/${EXTRAPORT1}/g" \
        -e "s/@EXTRAPORT2@/${EXTRAPORT2}/g" \
        -e "s/@EXTRAPORT3@/${EXTRAPORT3}/g" \
        -e "s/@EXTRAPORT4@/${EXTRAPORT4}/g" \
        -e "s/@EXTRAPORT5@/${EXTRAPORT5}/g" \
        -e "s/@EXTRAPORT6@/${EXTRAPORT6}/g" \
        -e "s/@EXTRAPORT7@/${EXTRAPORT7}/g" \
        -e "s/@EXTRAPORT8@/${EXTRAPORT8}/g" \
        -e "s/@CONTROLPORT@/${CONTROLPORT}/g" $1 > $2
}

#
# Export command paths
#
export ARPANAME
export CHECKZONE
export DESCRIPTION
export DIG
export FEATURETEST
export JOURNALPRINT
export KEYFRLAB
export KEYGEN
export KRB5_CONFIG
export LWRESD
export MDIG
export NAMED
export NSLOOKUP
export NSUPDATE
export PERL
export PK11DEL
export PK11GEN
export PK11LIST
export PYTHON
export RANDFILE
export RESOLVE
export RNDC
export SAMPLEUPDATE
export SIGNER
export SUBDIRS
export TESTSOCK6
