# $OpenBSD: Makefile,v 1.14 2014/07/10 10:04:34 zhuk Exp $

# To add a test named ${testname}:
#  1) If test should catch errors, add sample portcheck output to the
#     ${testname}.sample file in this directory. Otherwise, this file should
#     absent.
#  2) Create test port directory with ${testname} name.
#  3) Add the test to REGRESS_TARGETS.
#  4) If the test doesn't need running plist checks, add the -P to the
#     TEST_${testname}_ARGS variable. Do this in the "test-specific parameters"
#     section below.

# user-customizeable
REGRESS_TARGETS ?=	t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14
PORTCHECK ?=		${PORTSDIR}/infrastructure/bin/portcheck
PORTCHECK_ARGS ?=
SUBST_CMD ?=		${PORTSDIR}/infrastructure/bin/pkg_subst

# internal stuff, non-customizable
PORTCHECK_ROOT_DIR =	${.CURDIR:C,/[^/]+/*$,,}
CATEGORY =		${.CURDIR:C,^${PORTSDIR}/,,}
SUBST_ARGS =		-c -DCATEGORY=${CATEGORY}
SCANNING_MSG =		"scanning ports under the ${PORTSDIR}"

# test-specific parameters
TEST_t1_ARGS =	-N
TEST_t3_ARGS =	-A ${CATEGORY}/t3
TEST_t4_ARGS =	-A -P ${CATEGORY}/t4
TEST_t5_ARGS =	-N
TEST_t7_ARGS =	-P
TEST_t8_ARGS =	-P
TEST_t9_ARGS =	-P
TEST_t13_ARGS =	-P
TEST_t14_ARGS =	-P

# define tests
.for _t in ${REGRESS_TARGETS}
TEST_${_t}_ARGS ?=
TEST_${_t}_DIR =	${.CURDIR}/${_t}
TEST_${_t}_DIFF_OPTS =
. if ${TEST_${_t}_ARGS:M-A}
TEST_${_t}_DIFF_OPTS +=	-I ${SCANNING_MSG}
. endif

# will exist if and only if portcheck returned non-zero
TEST_${_t}_FAIL =	${_t}.failed

# output of portcheck's stdout and stderr
TEST_${_t}_OUT =	${_t}.pkgpath
TEST_${_t}_ERR =	${_t}.errors

CLEANFILES +=		${TEST_${_t}_FAIL} ${TEST_${_t}_ERR} ${TEST_${_t}_OUT}

# sample error list, to compare with actual portcheck output
TEST_${_t}_SAMPLE_SRC =	${.CURDIR}/${_t}.sample

# same as above but after substitution, needed for path independancy
TEST_${_t}_SAMPLE =	${_t}.sample.subst
CLEANFILES +=		${TEST_${_t}_SAMPLE}

. if exists(${TEST_${_t}_SAMPLE_SRC})
${TEST_${_t}_SAMPLE}: ${TEST_${_t}_SAMPLE_SRC}
	@${SUBST_CMD} ${SUBST_ARGS} -DTEST=${_t} $> $@
${_t}: ${TEST_${_t}_SAMPLE}
. endif

${_t}:
	@echo '=> ${_t}'
	@rm -f ${TEST_${_t}_FAIL}
	@(cd ${TEST_${_t}_DIR}; ${PORTCHECK} ${TEST_${_t}_ARGS}) \
	  >${TEST_${_t}_OUT} 2>${TEST_${_t}_ERR} || touch ${TEST_${_t}_FAIL}

. if exists(${TEST_${_t}_SAMPLE_SRC})
# there should be errors printed and portcheck should exit with non-zero code
	@test -e ${TEST_${_t}_FAIL} || echo "${_t}: portcheck did not fail"
	@sort <${TEST_${_t}_ERR} | \
	    diff -u ${TEST_${_t}_DIFF_OPTS} ${TEST_${_t}_SAMPLE} -
. else
# there should be NO errors printed and portcheck should exit with zero code
	@test ! -e ${TEST_${_t}_FAIL} || echo "${_t}: portcheck did not succeed"

# in -A mode, portcheck still prints to stderr ${SCANNING_MSG}
.  if ${TEST_${_t}_ARGS:M-A}
	@echo ${SCANNING_MSG} | \
	   diff -u ${TEST_${_t}_DIFF_OPTS} - ${TEST_${_t}_ERR}
.  else
	@test ! -s ${TEST_${_t}_ERR} || { \
		echo "${_t}: portcheck printed errors:"; \
		cat ${TEST_${_t}_ERR}; \
	}
.  endif
. endif

. if ${TEST_${_t}_ARGS:M-A}
	@test ! -s ${TEST_${_t}_OUT} || { \
		echo "${_t}: portcheck printed on stdout:"; \
		cat ${TEST_${_t}_OUT}; \
	}
. else
	@echo ${CATEGORY}/${_t} | \
	    diff -u ${TEST_${_t}_DIFF_OPTS} - ${TEST_${_t}_OUT}
. endif

.PHONY: ${_t}
.endfor

.include <bsd.regress.mk>
