#	$OpenBSD: Makefile,v 1.32 2017/07/07 23:55:21 bluhm Exp $

# Regression tests by Niall O'Higgins <niallo@openbsd.org> and
# Tobias Stoeckmann <tobias@openbsd.org>.
# Based on OpenRCS regression framework.

.include <bsd.own.mk>

OPENCVS=	${BSDSRCDIR}/usr.bin/cvs/obj/opencvs
CVS?=		${OPENCVS}
CVSCMD=		${CVS} -f

REGRESS_ROOT=	${.OBJDIR}/regress_cvs_root
REGRESS_WCOPY=	${.OBJDIR}/regress_cvs_wcopy
REGRESS_SEED=	${REGRESS_WCOPY}/seed
REGRESS_IMPORT=	${.OBJDIR}/regress_cvs_import

.if defined(REMOTE)
MYCVSROOT?=	localhost:${REGRESS_ROOT}
.if defined(CVS_SERVER)
TESTFILE=	$(CVS_SERVER)
.else
TESTFILE=	cvs
.endif
.else
TESTFILE=	${CVS:T}
MYCVSROOT?=	${REGRESS_ROOT}
.endif

DIFF=		diff -u

CLEANFILES=	regress_cvs_root regress_cvs_wcopy regress_cvs_stderr \
		regress_cvs_stdout regress_cvs_import

# These must be done in order.
LTESTS= cvs-initial \
	cvs-import-mflag \
	cvs-checkout-dflag \
	cvs-checkout-rflag-HEAD \
	cvs-checkout-kflag-k-rflag-HEAD \
	cvs-checkout-rflag-inval_branch_rev \
	cvs-checkout-rflag-too_high \
	cvs-checkout \
	cvs-checkout-pflag \
	cvs-tag \
	cvs-add \
	cvs-add-dir \
	cvs-add-subdir_file \
	cvs-commit-Fflag \
	cvs-checkout \
	cvs-tag-branch \
	cvs-checkout-rflag_branch \
	cvs-diff-file \
	cvs-commit-to_branch \
	cvs-annotate \
	cvs-annotate-rflag-inval_branch_rev \
	cvs-annotate-rflag-inval_branch_rev-fflag \
	cvs-annotate-rflag-unknown_symbol-fflag \
	cvs-checkout-kflag-kv-rflag-1.1 \
	cvs-update-Aflag-kflag-kv \
	cvs-update-Aflag-kflag-k-rflag-1.1 \
	cvs-update-Aflag-rflag-1.1 \
	cvs-update-Aflag \
	cvs-status \
	cvs-diff \
	cvs-remove-fflag \
	cvs-status-vflag \
	cvs-log \
	cvs-rlog \
	cvs-rtag-one_more_branch \
	cvs-export \
	cvs-update-with-local
# Known to fail.
#	cvs-update-for_subdir
#	cvs-release-dflag

.for t in ${LTESTS}
REGRESS_TARGETS+=test-${t}
test-${t}: ${CVS}
.endfor

# XXX - should not print anything
test-cvs-add:
	@echo "initial content" > ${REGRESS_SEED}/seed2.txt
	@cd ${REGRESS_SEED}; \
	    ${CVSCMD} -q add seed2.txt > /dev/null 2> /dev/null
#	    eval 'test `${CVSCMD} -Q add seed2.txt | wc -l` -eq 0'

test-cvs-add-dir:
	@mkdir ${REGRESS_SEED}/subdir
	@cd ${REGRESS_SEED}; ${CVSCMD} -q add subdir > /dev/null 2> /dev/null
	@test -d ${REGRESS_SEED}/subdir/CVS && \
	    test -d ${REGRESS_ROOT}/seed/subdir

test-cvs-add-subdir_file:
	@echo "initial content of seed3.txt" > ${REGRESS_SEED}/subdir/seed3.txt
	@cd ${REGRESS_SEED}; \
	    ${CVSCMD} -q add subdir/seed3.txt > /dev/null 2> /dev/null
#	@eval 'test `${CVSCMD} -Q add seed2.txt | wc -l` -eq 0'

test-cvs-annotate:
	@cd ${REGRESS_SEED}; \
	    eval 'test `${CVSCMD} -Q annotate seed1.txt 2>/dev/null | \
	    wc -l` -eq 3'

test-cvs-annotate-rflag-inval_branch_rev:
	@cd ${REGRESS_SEED}; \
	    eval 'test `${CVSCMD} -Q annotate -r 1.2.3.4 seed1.txt 2>/dev/null \
	    | wc -l` -eq 0'

test-cvs-annotate-rflag-inval_branch_rev-fflag:
	@cd ${REGRESS_SEED}; \
	    eval 'test `${CVSCMD} -Q annotate -f -r 1.2.3.4 seed1.txt \
	    2>/dev/null | wc -l` -eq 3'

test-cvs-annotate-rflag-unknown_symbol-fflag:
	@cd ${REGRESS_SEED}; \
	    eval 'test `${CVSCMD} -Q annotate -f -r UNKNOWN seed1.txt \
	    2>/dev/null | wc -l` -eq 0'

test-cvs-checkout:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; ${CVSCMD} -Q -d ${MYCVSROOT} co seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt

test-cvs-checkout-kflag-k-rflag-HEAD:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co -rHEAD -kkv seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt
	@eval 'test `grep -c -e THEAD -e -kkv \
	    ${REGRESS_SEED}/CVS/Entries | wc -l` -eq 1'
	@eval 'test `grep -c Id$ \
	    ${REGRESS_SEED}/seed1.txt | wc -l` -eq 1'

test-cvs-checkout-kflag-kv-rflag-1.1:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co -r 1.1 -kkv seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt
	@eval 'test `grep -c -e T1.1 -e -kkv \
	    ${REGRESS_SEED}/CVS/Entries | wc -l` -eq 1'

test-cvs-checkout-pflag:
	@eval 'test `${CVSCMD} -Q -d ${MYCVSROOT} checkout \
	    -p seed/seed1.txt 2>/dev/null | wc -l` -eq 2'

test-cvs-checkout-rflag_branch:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co -r FIRST_BRANCH seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt
	@eval 'test `grep -c TFIRST_BRANCH ${REGRESS_SEED}/CVS/Entries` -eq 2'

test-cvs-checkout-rflag-inval_branch_rev:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; ${CVSCMD} -Q -d ${MYCVSROOT} co -r1.2.3.4 seed
	@eval 'test ! -f ${REGRESS_SEED}/seed1.txt'

test-cvs-checkout-rflag-too_high:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; ${CVSCMD} -Q -d ${MYCVSROOT} co -r1.5 seed
	@eval 'test ! -f ${REGRESS_SEED}/seed1.txt'

test-cvs-checkout-rflag-HEAD:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co -rHEAD seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt
	@eval 'test `grep -c THEAD ${REGRESS_SEED}/CVS/Entries | wc -l` -eq 1'

test-cvs-checkout-rflag-1.1:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co -r 1.1 seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt && test -f ${REGRESS_SEED}/seed2.txt

test-cvs-checkout-dflag:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co -d seed2 seed > /dev/null
	@test -d ${REGRESS_WCOPY}/seed2/CVS

test-cvs-checkout-subdir:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co seed/subdir > /dev/null
	@test -f ${REGRESS_SEED}/subdir/seed3.txt && \
	    test ! -f ${REGRESS_SEED}/seed2.txt

test-cvs-commit-Fflag:
	@sleep 1
	@echo "second line" >> ${REGRESS_SEED}/seed1.txt
	@echo "commit seed repo" > ${REGRESS_WCOPY}/logmsg.txt
	@cd ${REGRESS_SEED}; ${CVSCMD} commit \
	    -F ${REGRESS_WCOPY}/logmsg.txt > /dev/null
	@grep "^@commit seed repo" \
	    ${REGRESS_ROOT}/seed/seed1.txt,v > /dev/null
	@eval 'test `cat ${REGRESS_ROOT}/seed/seed1.txt,v | wc -l` -eq 60'
	@test -f ${REGRESS_ROOT}/seed/seed2.txt,v

test-cvs-commit-to_branch:
	@sleep 1
	@cd ${REGRESS_SEED}; ${CVSCMD} commit -m'first branch seed' > /dev/null
	@eval 'test `cat ${REGRESS_ROOT}/seed/seed1.txt,v | wc -l` -eq 80'
	@eval 'test `grep -c TFIRST_BRANCH ${REGRESS_SEED}/CVS/Entries` -eq 2'

test-cvs-diff:
	@sleep 1
	@echo "modified" > ${REGRESS_SEED}/seed2.txt
	@cd ${REGRESS_SEED}; eval 'test `${CVSCMD} -Q diff | wc -l` -eq 9'

test-cvs-diff-file:
	@sleep 1
	@echo "first branch line" >> ${REGRESS_SEED}/seed1.txt
	@cd ${REGRESS_SEED}; \
	    eval 'test `${CVSCMD} -Q diff seed1.txt | wc -l` -eq 7'

test-cvs-export:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir ${REGRESS_WCOPY}
	@cd ${REGRESS_WCOPY}; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} export -r HEAD seed > /dev/null
	@test -f ${REGRESS_SEED}/seed1.txt

test-cvs-import-mflag:
	@rm -rf ${REGRESS_IMPORT}
	@mkdir ${REGRESS_IMPORT}
	@cp ${.CURDIR}/seed1.txt ${REGRESS_IMPORT}
	@touch -t 200001010100 ${REGRESS_IMPORT}/seed1.txt
	@cd ${REGRESS_IMPORT} && ${CVSCMD} -Q -d ${MYCVSROOT} import \
	    -m'import seed repo' seed regress regress_import > /dev/null
	@chmod u+w ${REGRESS_ROOT}/seed/seed1.txt,v
	@perl ${.CURDIR}/setdate.pl ${REGRESS_ROOT}/seed/seed1.txt,v 1.1 \
	    2000.01.01.00.00.00
	@perl ${.CURDIR}/setdate.pl ${REGRESS_ROOT}/seed/seed1.txt,v 1.1.1.1 \
	    2000.01.01.00.00.00
	@sed "s/author `whoami`/author user/" \
	    ${REGRESS_ROOT}/seed/seed1.txt,v | \
	    ${DIFF} - ${.CURDIR}/test_${TESTFILE}_import_01_seed1.txt,v

test-cvs-initial: clean
	@${CVSCMD} -d ${MYCVSROOT} init
	@test -d ${REGRESS_ROOT}/CVSROOT

test-cvs-log:
	@cd ${REGRESS_SEED}; eval 'test `${CVSCMD} -Q log | wc -l` -eq 68'

test-cvs-release-dflag: test-cvs-checkout
	@cd ${REGRESS_WCOPY}; ${CVSCMD} -Q -d ${MYCVSROOT} release -d seed
	@test ! -d ${.OBJDIR}/regress_cvs_wcopy/seed
	@eval 'test `grep '^F' ${REGRESS_ROOT}/CVSROOT/history | wc -l` -eq 1'

test-cvs-remove-fflag:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q remove -f seed1.txt
	@test ! -f ${REGRESS_SEED}/seed1.txt

test-cvs-rlog:
	@eval 'test `${CVSCMD} -Q -d ${MYCVSROOT} rlog seed | wc -l` -eq 65'

test-cvs-status:
	@cd ${REGRESS_SEED}; eval 'test `${CVSCMD} -Q status | wc -l` -eq 21'

test-cvs-status-vflag:
	@cd ${REGRESS_SEED}; eval 'test `${CVSCMD} -Q status -v | wc -l` -eq 33'

test-cvs-tag:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q tag FIRST_TAG > /dev/null
	@grep FIRST_TAG ${REGRESS_ROOT}/seed/seed1.txt,v > /dev/null

test-cvs-tag-branch:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q tag -b FIRST_BRANCH > /dev/null
	@grep FIRST_BRANCH ${REGRESS_ROOT}/seed/seed1.txt,v > /dev/null

test-cvs-rtag-one_more_branch:
	@${CVSCMD} -d ${MYCVSROOT} -Q rtag -b SECOND_BRANCH seed > /dev/null
	@grep SECOND_BRANCH ${REGRESS_ROOT}/seed/seed2.txt,v \
	    | grep 4 > /dev/null

test-cvs-update-Aflag:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q update -A > /dev/null
	@eval 'test `grep -c -e T1 -e kkv ${REGRESS_SEED}/CVS/Entries` -eq 0'

test-cvs-update-Aflag-kflag-kv:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q update -A -kv > /dev/null
	@eval 'test `grep -c T1 ${REGRESS_SEED}/CVS/Entries` -eq 0'
	@eval 'test `grep -c kv ${REGRESS_SEED}/CVS/Entries` -eq 2'

test-cvs-update-Aflag-kflag-k-rflag-1.1:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q update -A -kk -r 1.1 > /dev/null
	@eval 'test `grep -c T1 ${REGRESS_SEED}/CVS/Entries` -eq 2'
	@eval 'test `grep -c kk ${REGRESS_SEED}/CVS/Entries` -eq 2'

test-cvs-update-Aflag-rflag-1.1:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q update -A -r 1.1 > /dev/null
	@eval 'test `grep -c T1 ${REGRESS_SEED}/CVS/Entries` -eq 2'
	@eval 'test `grep -c kk ${REGRESS_SEED}/CVS/Entries` -eq 0'

test-cvs-update-for_subdir:
	@cd ${REGRESS_SEED}; ${CVSCMD} -Q update > /dev/null
	@test -f ${REGRESS_SEED}/subdir/seed3.txt && \
	    test ! -f ${REGRESS_SEED}/seed1.txt && \
	    test ! -f ${REGRESS_SEED}/seed2.txt

test-cvs-merge:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir -p ${REGRESS_WCOPY}/a ${REGRESS_WCOPY}/b
	@cd ${REGRESS_WCOPY}/a; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co seed > /dev/null
	@cd ${REGRESS_WCOPY}/b; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co seed > /dev/null
	@echo "modified text" > ${REGRESS_WCOPY}/a/seed/seed1.txt
	@cd ${REGRESS_WCOPY}/a/seed && ${CVSCMD} -Q com -m 'a' > /dev/null
	@echo "modified text 2" > ${REGRESS_WCOPY}/b/seed/seed1.txt
	@cd ${REGRESS_WCOPY}/b/seed && ${CVSCMD} -Q up > /dev/null 2>&1
	@echo "modified text" > ${REGRESS_WCOPY}/b/seed/seed1.txt
	@cd ${REGRESS_WCOPY}/b/seed && test `${CVSCMD} -q up | wc -l` -eq 0

test-cvs-update-with-local:
	@rm -rf ${REGRESS_WCOPY}
	@mkdir -p ${REGRESS_WCOPY}/a ${REGRESS_WCOPY}/b
	@cd ${REGRESS_WCOPY}/a; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co seed > /dev/null
	@cd ${REGRESS_WCOPY}/b; \
	    ${CVSCMD} -Q -d ${MYCVSROOT} co seed > /dev/null
	@echo "new file" > ${REGRESS_WCOPY}/a/seed/test.txt
	@cd ${REGRESS_WCOPY}/a/seed && \
		${CVSCMD} -Q add test.txt > /dev/null && \
		${CVSCMD} -Q com -m 'a' > /dev/null
	@echo "local file" > ${REGRESS_WCOPY}/b/seed/test.txt
	@cd ${REGRESS_WCOPY}/b/seed && \
		${CVSCMD} -Q up 2>&1|grep -q '^C test.txt' && \
		grep -q '^local file' test.txt

clean:
	@rm -rf ${CLEANFILES}

# opencvs is not linked to the build, so make it on demand as a workaround
${OPENCVS}:
	cd ${BSDSRCDIR}/usr.bin/cvs && ${MAKE} obj
	cd ${BSDSRCDIR}/usr.bin/cvs && ${MAKE} all

.include <bsd.regress.mk>