#!/usr/bin/env atf-sh
#
# $NetBSD: scripts_test,v 1.2 2017/06/02 19:13:44 jlam Exp $
#
# Copyright (c) 2017 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Johnny C. Lam.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# ENVIRONMENT
#	The following variables are used if they are set:
#
#	MAKE	The name or path to the BSD make(1) utility.  The default
#		is "make".
#
#	PKGSRCDIR
#		The location of the pkgsrc source tree.  The default is
#		"/usr/pkgsrc".
#

setup()
{
	cat > mk.conf << 'EOF'
# Definitions used by pkgformat/pkg/*.mk files that are not assigned
# default values.
#
CAT?=		cat
CHMOD?=		chmod
MKDIR?=		mkdir -p
MV?=		mv
RUN?=		@
SED?=		sed

# Override any other default definitions so that generated files go into
# the current directory.
#
PKGDIR=		${.CURDIR}
WRKDIR=		${.CURDIR}
PKG_DB_TMPDIR=	${.CURDIR}/.pkgdb

# Don't generate a pkgtasks datafile.
PKGTASKS_DATAFILE=	# empty
# Generate a sed(1) script from ${FILES_SUBST}.
FILES_SUBST_SED=	${FILES_SUBST:S/=/@!/:S/$/!g/:S/^/ -e s!@/}
EOF
}

###
### test1: no scripts
###

atf_test_case test1

test1_head()
{
	atf_set "descr" "no scripts"
}

test1_body()
{
	: ${MAKE:=make}
	: ${PKGSRCDIR:=/usr/pkgsrc}

	setup
	cat > Makefile << 'EOF'
.include "mk.conf"
.include "${PKGSRCDIR}/mk/pkgformat/pkg/scripts.mk"

.PHONY: all
all:
.if defined(_DEINSTALL_FILE)
	@echo "_DEINSTALL_FILE = "${_DEINSTALL_FILE:Q}
.endif
.if defined(_INSTALL_FILE)
	@echo "_INSTALL_FILE = "${_INSTALL_FILE:Q}
.endif
EOF
	${MAKE} all PKGSRCDIR="${PKGSRCDIR}" > output
	if grep -cq "^" output; then
		cat output
		atf_fail "variables should not be defined"
	fi
	atf_pass
}

###
### test2: named template files exist"
###

atf_test_case test2

test2_head()
{
	atf_set "descr" "named template files exist"
}

test2_body()
{
	: ${MAKE:=make}
	: ${PKGSRCDIR:=/usr/pkgsrc}

	setup
	echo "### HEADER SCRIPT TEMPLATE ###" > HEADER
	echo "### DEINSTALL SCRIPT TEMPLATE ###" > DEINSTALL
	echo "### INSTALL SCRIPT TEMPLATE ###" > INSTALL

	cat > Makefile << 'EOF'
.include "mk.conf"

HEADER_TEMPLATES+=	${PKGDIR}/HEADER
DEINSTALL_TEMPLATES+=	${PKGDIR}/DEINSTALL
INSTALL_TEMPLATES+=	${PKGDIR}/INSTALL

.include "${PKGSRCDIR}/mk/pkgformat/pkg/scripts.mk"

.PHONY: all
all: _pkgformat-generate-install-scripts
EOF
	${MAKE} all PKGSRCDIR="${PKGSRCDIR}" || atf_fail "make(1) failed"
	local count

	count=$( grep -c "### HEADER SCRIPT TEMPLATE ###" .pkgdb/+DEINSTALL )
	case $count in
	0)	cat .pkgdb/+DEINSTALL
		atf_fail "HEADER template was not used in +DEINSTALL" ;;
	1)	: "success" ;;
	*)	cat .pkgdb/+DEINSTALL
		atf_fail "HEADER template used too many times in +DEINSTALL" ;;
	esac

	count=$( grep -c "### HEADER SCRIPT TEMPLATE ###" .pkgdb/+INSTALL )
	case $count in
	0)	cat .pkgdb/+INSTALL
		atf_fail "HEADER template was not used in +INSTALL" ;;
	1)	: "success" ;;
	*)	cat .pkgdb/+INSTALL
		atf_fail "HEADER template used too many times in +INSTALL" ;;
	esac

	count=$( grep -c "### DEINSTALL SCRIPT TEMPLATE ###" .pkgdb/+DEINSTALL )
	case $count in
	0)	cat .pkgdb/+DEINSTALL
		atf_fail "DEINSTALL template was not used in +DEINSTALL" ;;
	1)	: "success" ;;
	*)	cat .pkgdb/+DEINSTALL
		atf_fail "DEINSTALL template used too many times in +DEINSTALL" ;;
	esac

	count=$( grep -c "### INSTALL SCRIPT TEMPLATE ###" .pkgdb/+INSTALL )
	case $count in
	0)	cat .pkgdb/+INSTALL
		atf_fail "INSTALL template was not used in +INSTALL" ;;
	1)	: "success" ;;
	*)	cat .pkgdb/+INSTALL
		atf_fail "INSTALL template used too many times in +INSTALL" ;;
	esac

	atf_pass
}

###
### test3: set DEINSTALL_SRC and INSTALL_SRC
###

atf_test_case test3

test3_head()
{
	atf_set "descr" "set DEINSTALL_SRC and INSTALL_SRC"
}

test3_body()
{
	: ${MAKE:=make}
	: ${PKGSRCDIR:=/usr/pkgsrc}

	setup
	( exec > INSTALL )	# empty INSTALL script
	cat > Makefile << 'EOF'
.include "mk.conf"

DEINSTALL_SRC=	# empty
INSTALL_SRC=	INSTALL

.include "${PKGSRCDIR}/mk/pkgformat/pkg/scripts.mk"

.PHONY: all
all: _pkgformat-generate-install-scripts
EOF
	${MAKE} all PKGSRCDIR="${PKGSRCDIR}" || atf_fail "make(1) failed"

	if [ -f .pkgdb/+DEINSTALL ]; then
		find .
		atf_fail "DEINSTALL_SRC is empty but +DEINSTALL script exists."
	fi

	if cmp INSTALL .pkgdb/+INSTALL; then
		: "success"
	else
		cat .pkgdb/+INSTALL
		atf_fail "INSTALL script not based solely on INSTALL_SRC"
	fi

	atf_pass
}

###
### test4
###

atf_test_case test4

test4_head()
{
	atf_set "descr" "*_TEMPLATES trigger USE_PKGTASKS"
}

test4_body()
{
	: ${MAKE:=make}
	: ${PKGSRCDIR:=/usr/pkgsrc}

	setup
	cat > Makefile << 'EOF'
.include "mk.conf"

INSTALL_TEMPLATES+=	fragment.tmpl

.include "${PKGSRCDIR}/mk/pkgformat/pkg/scripts.mk"

.PHONY: all
all:
	@echo ${USE_PKGTASKS:Q}
EOF
	${MAKE} all PKGSRCDIR="${PKGSRCDIR}" > output
	grep "yes" output || atf_fail "USE_PKGTASKS is not yes"
	atf_pass
}

atf_init_test_cases()
{
	atf_add_test_case test1
	atf_add_test_case test2
	atf_add_test_case test3
	atf_add_test_case test4
}
