#!/bin/sh
set -e

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

buildsimplenativepackage 'foo' 'all' '1' 'stable'
buildsimplenativepackage 'foo' 'all' '2' 'sid'
setupaptarchive --no-update

NEWMETHODS="$(readlink -f rootdir)/usr/lib/apt/methods"
OLDMETHODS="$(readlink -f rootdir/usr/lib/apt/methods)"
rm "$NEWMETHODS"
mkdir "$NEWMETHODS"
backupIFS="$IFS"
IFS="$(printf "\n\b")"
for METH in $(find "$OLDMETHODS" -maxdepth 1 ! -type d); do
	ln -s "$OLDMETHODS/$(basename "$METH")" "$NEWMETHODS"
done
IFS="$backupIFS"

changetohttpswebserver
for FILE in rootdir/etc/apt/sources.list.d/*-sid-* ; do
	sed -i -e 's#https:#http:#' -e "s#:${APTHTTPSPORT}/#:${APTHTTPPORT}/#" "$FILE"
done

pretest() {
	msgmsg "$@"
	rm -rf rootdir/var/lib/apt/lists
	testsuccessequal 'N: Unable to locate package foo' aptcache policy foo
}
pretest 'initialize test' 'update'
testsuccess aptget update
testsuccessequal "foo:
  Installed: (none)
  Candidate: 2
  Version table:
     2 500
        500 http://localhost:${APTHTTPPORT} sid/main all Packages
     1 500
        500 https://localhost:${APTHTTPSPORT} stable/main all Packages" aptcache policy foo

pretest 'not found' 'release files'
mv aptarchive/dists/stable aptarchive/dists/stable.good
testfailuremsg "E: The repository 'https://localhost:${APTHTTPSPORT} stable Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details." apt update
testfailure aptget update --no-allow-insecure-repositories
testequalor2 "Hit:1 http://localhost:${APTHTTPPORT} sid InRelease
Ign:2 https://localhost:${APTHTTPSPORT} stable InRelease
  404  Not Found
Err:3 https://localhost:${APTHTTPSPORT} stable Release
  404  Not Found
Reading package lists...
E: The repository 'https://localhost:${APTHTTPSPORT} stable Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details." "Ign:1 https://localhost:${APTHTTPSPORT} stable InRelease
  404  Not Found
Err:2 https://localhost:${APTHTTPSPORT} stable Release
  404  Not Found
Hit:3 http://localhost:${APTHTTPPORT} sid InRelease
Reading package lists...
E: The repository 'https://localhost:${APTHTTPSPORT} stable Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details." cat rootdir/tmp/testfailure.output

mv aptarchive/dists/stable.good aptarchive/dists/stable
posttest() {
	testsuccessequal "foo:
  Installed: (none)
  Candidate: 2
  Version table:
     2 500
        500 http://localhost:${APTHTTPPORT} sid/main all Packages" aptcache policy foo
}
posttest

pretest 'method disabled' 'https'
echo 'Dir::Bin::Methods::https "false";' > rootdir/etc/apt/apt.conf.d/99disable-https
testfailuremsg "E: The method 'https' is explicitly disabled via configuration.
N: If you meant to use Tor remember to use tor+https instead of https.
E: Failed to fetch https://localhost:${APTHTTPSPORT}/dists/stable/InRelease  
E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
rm -f rootdir/etc/apt/apt.conf.d/99disable-https
posttest

pretest 'method not installed' 'https'
rm "${NEWMETHODS}/https"
testfailuremsg "E: The method driver ${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/methods/https could not be found.
N: Is the package apt-transport-https installed?
E: Failed to fetch https://localhost:${APTHTTPSPORT}/dists/stable/InRelease  
E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
posttest

pretest 'https connection refused' 'doom port'
for FILE in rootdir/etc/apt/sources.list.d/*-stable-* ; do
	# lets see how many testservers run also Doom
	sed -i -e "s#:${APTHTTPSPORT}/#:666/#" "$FILE"
done
testwarning aptget update -o Dir::Bin::Methods::https="${OLDMETHODS}/https"
if grep -q WITH_CURL:BOOL=OFF    $PROJECT_BINARY_DIR/CMakeCache.txt; then
testequalor2 "W: Failed to fetch https://localhost:666/dists/stable/InRelease  Failed to connect to localhost port 666: Connection refused
W: Some index files failed to download. They have been ignored, or old ones used instead." "W: Failed to fetch https://localhost:666/dists/stable/InRelease  Could not connect to localhost:666 (127.0.0.1). - connect (111: Connection refused)
W: Some index files failed to download. They have been ignored, or old ones used instead." tail -n 2 rootdir/tmp/testwarning.output
else
testequalor2 "W: Failed to fetch https://localhost:666/dists/stable/InRelease  Failed to connect to localhost port 666: Connection refused
W: Some index files failed to download. They have been ignored, or old ones used instead." "W: Failed to fetch https://localhost:666/dists/stable/InRelease  couldn't connect to host
W: Some index files failed to download. They have been ignored, or old ones used instead." tail -n 2 rootdir/tmp/testwarning.output
fi
posttest