#!/bin/sh
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
setupenvironment
configarchitecture 'amd64' 'i386' 'armel'

insertinstalledpackage 'build-essential' 'all' '0' 'Multi-Arch: foreign'

insertpackage 'unstable' 'foo' 'all' '1.0'
insertpackage 'unstable' 'bar' 'all' '1.0'

insertsource 'unstable' 'buildprofiles' 'any' '1' 'Build-Depends: foo (>= 1.0) [i386 arm] <!stage1 !cross>, bar'

# table from https://wiki.debian.org/BuildProfileSpec
insertsource 'unstable' 'spec-1' 'any' '1' 'Build-Depends: foo <!stage1>'
insertsource 'unstable' 'spec-2' 'any' '1' 'Build-Depends: foo <stage1>'
insertsource 'unstable' 'spec-3' 'any' '1' 'Build-Depends: foo <!stage1 !notest>'
insertsource 'unstable' 'spec-4' 'any' '1' 'Build-Depends: foo <stage1 notest>'
insertsource 'unstable' 'spec-5' 'any' '1' 'Build-Depends: foo <!stage1 notest>'
insertsource 'unstable' 'spec-6' 'any' '1' 'Build-Depends: foo <stage1 !notest>'
insertsource 'unstable' 'spec-7' 'any' '1' 'Build-Depends: foo <stage1> <!notest>'

setupaptarchive

testsuccessequal 'Reading package lists...
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  bar
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst bar (1.0 unstable [all])
Conf bar (1.0 unstable [all])' aptget build-dep buildprofiles -s

testsuccessequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  bar foo
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Inst bar (1.0 unstable [all])
Inst foo (1.0 unstable [all])
Conf bar (1.0 unstable [all])
Conf foo (1.0 unstable [all])' aptget build-dep buildprofiles -s -o APT::Architecture=i386

testsuccessequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  bar
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst bar (1.0 unstable [all])
Conf bar (1.0 unstable [all])' aptget build-dep buildprofiles -s -o APT::Architecture=armel

testsuccessequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  bar
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst bar (1.0 unstable [all])
Conf bar (1.0 unstable [all])' aptget build-dep buildprofiles -s -o APT::Architecture=i386 -P stage1

KEEP='Reading package lists...
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  foo
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst foo (1.0 unstable [all])
Conf foo (1.0 unstable [all])'
setdrop() {
	DROP="Reading package lists...
$1 has no build depends.
Reading package lists...
Building dependency tree...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."
}

msgtest 'Check if version of installed dpkg is high enough for' 'build profiles support'
if dpkg --compare-versions "$(command dpkg-query --showformat='${Version}' --show dpkg)" 'ge' '1.17.14'; then
	msgpass
	testwithdpkg() {
		msgtest "Test with" "dpkg-checkbuilddeps -d '$1' -P '$2'"
		local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwithdpkg.output"
		if dpkgcheckbuilddeps -d "$1" -P "$2" /dev/null >$OUTPUT 2>&1; then
			if [ "$3" = "$DROP" ]; then
				msgpass
			else
				cat $OUTPUT
				msgfail
			fi
		else
			if [ "$3" = "$KEEP" ]; then
				msgpass
			else
				cat $OUTPUT
				msgfail
			fi
		fi
	}
else
	msgskip
	testwithdpkg() {
		msgtest "Test with" "dpkg-checkbuilddeps -d '$1' -P '$2'"
		msgskip
	}
fi

testprofile() {
	if [ -n "$3" ]; then
		testequal "$4" aptget build-dep "$1" -s -P "$3"
		export DEB_BUILD_PROFILES="$(echo "$3" | tr ',' ' ')"
		testequal "$4" aptget build-dep "$1" -s -o with::environment=1
		unset DEB_BUILD_PROFILES
	else
		testequal "$4" aptget build-dep "$1" -s
	fi
	testwithdpkg "$2" "$3" "$4"
}

testsuccess aptcache gencaches
setdrop 'spec-1'
testprofile 'spec-1' 'foo <!stage1>' '' "$KEEP"
testprofile 'spec-1' 'foo <!stage1>' 'stage1' "$DROP"
testprofile 'spec-1' 'foo <!stage1>' 'notest' "$KEEP"
testprofile 'spec-1' 'foo <!stage1>' 'stage1,notest' "$DROP"

setdrop 'spec-2'
testprofile 'spec-2' 'foo <stage1>' '' "$DROP"
testprofile 'spec-2' 'foo <stage1>' 'stage1' "$KEEP"
testprofile 'spec-2' 'foo <stage1>' 'notest' "$DROP"
testprofile 'spec-2' 'foo <stage1>' 'stage1,notest' "$KEEP"

setdrop 'spec-3'
testprofile 'spec-3' 'foo <!stage1 !notest>' '' "$KEEP"
testprofile 'spec-3' 'foo <!stage1 !notest>' 'stage1' "$DROP"
testprofile 'spec-3' 'foo <!stage1 !notest>' 'notest' "$DROP"
testprofile 'spec-3' 'foo <!stage1 !notest>' 'stage1,notest' "$DROP"

setdrop 'spec-4'
testprofile 'spec-4' 'foo <stage1 notest>' '' "$DROP"
testprofile 'spec-4' 'foo <stage1 notest>' 'stage1' "$DROP"
testprofile 'spec-4' 'foo <stage1 notest>' 'notest' "$DROP"
testprofile 'spec-4' 'foo <stage1 notest>' 'stage1,notest' "$KEEP"

setdrop 'spec-5'
testprofile 'spec-5' 'foo <!stage1 notest>' '' "$DROP"
testprofile 'spec-5' 'foo <!stage1 notest>' 'stage1' "$DROP"
testprofile 'spec-5' 'foo <!stage1 notest>' 'notest' "$KEEP"
testprofile 'spec-5' 'foo <!stage1 notest>' 'stage1,notest' "$DROP"

setdrop 'spec-6'
testprofile 'spec-6' 'foo <stage1 !notest>' '' "$DROP"
testprofile 'spec-6' 'foo <stage1 !notest>' 'stage1' "$KEEP"
testprofile 'spec-6' 'foo <stage1 !notest>' 'notest' "$DROP"
testprofile 'spec-6' 'foo <stage1 !notest>' 'stage1,notest' "$DROP"

setdrop 'spec-7'
testprofile 'spec-7' 'foo <stage1> <!notest>' '' "$KEEP"
testprofile 'spec-7' 'foo <stage1> <!notest>' 'stage1' "$KEEP"
testprofile 'spec-7' 'foo <stage1> <!notest>' 'notest' "$DROP"
testprofile 'spec-7' 'foo <stage1> <!notest>' 'stage1,notest' "$KEEP"