#!/bin/sh

# Copyright (C) 2013, Rafael Laboissiere <rafael@laboissiere.net>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# On Debian systems, the complete text of the GNU General Public License
# version 3 can be found in the /usr/share/common-licenses/GPL-3 file.

test_dir=$(readlink -f "${0%/*}")

# Operation mode
if test "$1" = --installed; then
    COMMAND="uscan --no-conf --compression=xz"
    shift
else
    top_srcdir=$(readlink -f "${0%/*}/..")
    make -C "$top_srcdir/scripts" uscan mk-origtargz uupdate
    PATH="$top_srcdir/scripts:$PATH"
    PERL5LIB="$top_srcdir/lib"
    export PERL5LIB
    COMMAND="uscan --no-conf --compression=xz"
fi

REPOPATH=repo
POOLPATH=pool

# Initial Debian revision value is distribution dependent
SUFFIX="1"
if which dpkg-vendor >/dev/null 2>&1; then
    case "$(dpkg-vendor --query Vendor 2>/dev/null)" in
	"Ubuntu")
	    SUFFIX="0ubuntu1"
	    ;;
    esac
fi

# set safe defaults
WEBSCRIPT=":"
DEBUGECHO=":"
DEBUGLSLR=":"
# comment out for debug
#COMMAND="$COMMAND --debug"
#DEBUGECHO=echo
#DEBUGLSLR="ls -laR"

cleanup(){
    kill -9 $(cat $TMPDIR/$REPOPATH/pid)
    rm -rf $TMPDIR
    echo ""
}

spawnHttpServer(){
    (
	mkdir -p $TMPDIR/$REPOPATH
	cd $TMPDIR/$REPOPATH
	python "$test_dir/uscan/server.py" &
	echo $! > pid
	while ! [ -s port ]; do
	    :
	done
    )
}

trap cleanup 1 2 3 13 15

containsName(){
  echo "$1" | fgrep -q "$2"
  echo $?
}

. "${0%/*}/shunit2-helper-functions.sh"

# The following tests do the following: (1) create a minimal Debian package
# directory, containing minimal files debian/{changelog,watch,copyright},
# (2) create a minimal repository, containing a tarball (built on the fly),
# (3) start an HTTP server that works offline, using the SimpleHTTPServer
# module of Python, and (4) run uscan inside that minimal universe.

# make debian/ in `pwd`
# debian/watch contains $WATCHVER and $WATCHLINE with template URL updated
makeDebianDir() {
    DEBNAME=$1 # Debian source package name
    DEBVER=$2  # DEbian source package version
    mkdir -p debian/source

    cat <<END > debian/rules
%:
	dh $@
END
chmod 755 debian/rules

    cat <<END > debian/changelog
$DEBNAME ($DEBVER) unstable; urgency=low

  * Release of the $DEBNAME package $DEBVER.

 -- Joe Developer <jd@debian.org>  Mon, 02 Nov 2013 22:21:31 -0100
END
    # debian/source/format
    case $DEBVER in
	*-*) # non-native package
	    echo "3.0 (quilt)" > debian/source/format
	     ;;
	*) # native package
	    echo "3.0 (native)" > debian/source/format
	     ;;
    esac
    # debian/copyright
    echo "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/" \
	> debian/copyright
    # debian/watch
    echo "version=$WATCHVER" > debian/watch
    echo "$WATCHLINE" | sed -e "s,@@@url@@@,http://localhost:${PORT}/,g" - \
	>> debian/watch
}

# make tarball in $REPOPATH/$POOLPATH
makeUpstreamTar() {
    UPNAME=$1 # Upstream package name
    UPVER=$2  # upstream package version
    COMPRESSION=${3:-gz} # archve compression type
    TYPE=${4:-non-native} # set this if native-type upstream
    OLDDIR=`pwd`
    mkdir -p $TMPDIR/$REPOPATH/$POOLPATH/$UPNAME-$UPVER
    cd $TMPDIR/$REPOPATH/$POOLPATH
    touch $UPNAME-$UPVER/$UPNAME-$UPVER
    if [ "$TYPE" = "native" ]; then
	cd $TMPDIR/$REPOPATH/$POOLPATH/$UPNAME-$UPVER
	makeDebianDir $UPNAME $UPVER
	cd $TMPDIR/$REPOPATH/$POOLPATH
    fi
    case $COMPRESSION in
	gz|gzip) tar -czf $UPNAME-$UPVER.tar.gz $UPNAME-$UPVER
	    ;;
	bz2|bzip2) tar --bzip2 -cf $UPNAME-$UPVER.tar.bz2 $UPNAME-$UPVER
	    ;;
	xz) tar --xz -cf $UPNAME-$UPVER.tar.xz $UPNAME-$UPVER
	    ;;
	zip)zip -r $UPNAME-$UPVER.zip $UPNAME-$UPVER
	    ;;
	*)  echo "Wrong compression mode: $COMPRESSION"
	    exit 1
	    ;;
	esac
    cd $OLDDIR
}

# setup a common watch file test environment
helperWatch() {
    SITESCRIPT=$1
    VEROLD=$2
    VERNEW=$3
    PREFIX=$4
    TMPDIR=$(mktemp -d)
    ORIGDIR=`pwd`
    cd $TMPDIR
    # start HTTP server with its root at $TMPDIR/$REPOPATH
    spawnHttpServer
    PORT=$(cat $TMPDIR/$REPOPATH/port)
    $DEBUGECHO " ***** http://localhost:$PORT started showing $TMPDIR/$REPOPATH *****"
    # make web site
    $SITESCRIPT
    # make local $VEROLD source tree
    tar -xzf $TMPDIR/$REPOPATH/$POOLPATH/${PKG}-${VEROLD}.tar.gz
    if [ -n "$PREFIX" ]; then
	mv $TMPDIR/${PKG}-${VEROLD} $TMPDIR/${PKG}-${PREFIX}${VEROLD}
    fi
    mv $TMPDIR/${PKG}-${PREFIX}${VEROLD} $TMPDIR/${PKG}
    cd $TMPDIR/${PKG}
    if [ ! -d debian ]; then
	makeDebianDir $PKG ${PREFIX}${VEROLD}-$SUFFIX
    fi
    $COMMAND
    assertEquals "uscan: exit_code!=0 but exit_code=0" "$?" "0"
    cd $TMPDIR
    UTARBALL=${PKG}-${VERNEW}.tar.gz
    STARBALL=${PKG}_${PREFIX}${VERNEW}.orig.tar.gz
    assertTrue "$UTARBALL missing: $WATCHLINE" "[ -f $UTARBALL ]"
    assertTrue "$STARBALL missing: $WATCHLINE" "[ -f $STARBALL ]"
    # check uupdate
    if [ "$UUPDATE" = "uupdate" ]; then
	assertTrue 'pristine tarball is not extracted' "[ -f $TMPDIR/${PKG}-${PREFIX}${VERNEW}/debian/changelog ]"
	DVERSION=`dpkg-parsechangelog -l$TMPDIR/${PKG}-${PREFIX}${VERNEW}/debian/changelog -SVersion`
	assertEquals "uscan: Version should be ${PREFIX}${VERNEW}-$SUFFIX but $DVERSION" "$DVERSION" "${PREFIX}${VERNEW}-$SUFFIX"
    fi
    $DEBUGLSLR
    cd $ORIGDIR
    cleanup
}

# populate pool directory
sitePoolNative() {
    makeUpstreamTar $PKG 0.0 gz native
    makeUpstreamTar $PKG 1.0 gz native
    makeUpstreamTar $PKG 2.0 gz native
    mkdir -p $TMPDIR/$REPOPATH/123/foo/ooo/
    mkdir -p $TMPDIR/$REPOPATH/124/foo/ooo/
    mkdir -p $TMPDIR/$REPOPATH/125/foo/ooo/
    ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz $TMPDIR/$REPOPATH/123/foo/ooo/${PKG}-0.0.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz $TMPDIR/$REPOPATH/124/foo/ooo/${PKG}-1.0.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz $TMPDIR/$REPOPATH/125/foo/ooo/${PKG}-2.0.tar.gz
}

sitePoolNonNative() {
    makeUpstreamTar $PKG 0.0 gz non-native
    makeUpstreamTar $PKG 1.0 gz non-native
    makeUpstreamTar $PKG 2.0 gz non-native
    mkdir -p $TMPDIR/$REPOPATH/123/foo/ooo/
    mkdir -p $TMPDIR/$REPOPATH/124/foo/ooo/
    mkdir -p $TMPDIR/$REPOPATH/125/foo/ooo/
    ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz $TMPDIR/$REPOPATH/123/foo/ooo/${PKG}-0.0.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz $TMPDIR/$REPOPATH/124/foo/ooo/${PKG}-1.0.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz $TMPDIR/$REPOPATH/125/foo/ooo/${PKG}-2.0.tar.gz
}

# hide siteNative behind a web page
siteWebNative() {
    sitePoolNative
    cat <<END > $TMPDIR/$REPOPATH/index.html
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<a href="/123/foo/ooo/$PKG-0.0.tar.gz">Very old</a> <br/ >
<a href="/124/foo/ooo/$PKG-1.0.tar.gz">A bit OLD</a> <br />
<a href="/125/foo/ooo/$PKG-2.0.tar.gz">Latest</a> <br />
</body>
<html>
END
}

siteWebNonNative() {
    sitePoolNonNative
    cat <<END > $TMPDIR/$REPOPATH/index.html
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<a href="/123/foo/ooo/$PKG-0.0.tar.gz">Very old</a> <br/ >
<a href="/124/foo/ooo/$PKG-1.0.tar.gz">A bit OLD</a> <br />
<a href="/125/foo/ooo/$PKG-2.0.tar.gz">Latest</a> <br />
</body>
<html>
END
}

siteWebNonNativeR() {
    makeUpstreamTar $PKG 0.0 gz non-native
    makeUpstreamTar $PKG 1.0 gz non-native
    makeUpstreamTar $PKG 2.0 gz non-native
    mkdir -p $TMPDIR/$REPOPATH/123/foo/ooo/
    mkdir -p $TMPDIR/$REPOPATH/124/foo/ooo/
    mkdir -p $TMPDIR/$REPOPATH/125/foo/ooo/
    ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz $TMPDIR/$REPOPATH/125/foo/ooo/${PKG}-0.0.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz $TMPDIR/$REPOPATH/124/foo/ooo/${PKG}-1.0.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz $TMPDIR/$REPOPATH/123/foo/ooo/${PKG}-2.0.tar.gz
    cat <<END > $TMPDIR/$REPOPATH/index.html
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<a href="/125/foo/ooo/$PKG-0.0.tar.gz">Very old</a> <br/ >
<a href="/124/foo/ooo/$PKG-1.0.tar.gz">A bit OLD</a> <br />
<a href="/123/foo/ooo/$PKG-2.0.tar.gz">Latest</a> <br />
</body>
<html>
END
}

sitePrWebNonNative() {
    sitePoolNonNative
    cat <<END > $TMPDIR/$REPOPATH/index.html
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<a href="/123/boo/xxx/boo-0.0.tar.gz">Very old</a> <br/ >
<a href="/124/boo/xxx/boo-1.0.tar.gz">A bit OLD</a> <br />
<a href="/125/boo/xxx/boo-2.0.tar.gz">Latest</a> <br />
</body>
<html>
END
}

siteWebNonNativeLarge() {
    makeUpstreamTar $PKG 19990101 gz non-native
    makeUpstreamTar $PKG 20000101 gz non-native
    makeUpstreamTar $PKG 20010101 gz non-native
    mkdir -p $REPOPATH/123/foo/ooo/
    mkdir -p $REPOPATH/124/foo/ooo/
    mkdir -p $REPOPATH/125/foo/ooo/
    ln -sf ../../../$POOLPATH/${PKG}-19990101.tar.gz $TMPDIR/$REPOPATH/123/foo/ooo/${PKG}-19990101.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-20000101.tar.gz $TMPDIR/$REPOPATH/124/foo/ooo/${PKG}-20000101.tar.gz
    ln -sf ../../../$POOLPATH/${PKG}-20010101.tar.gz $TMPDIR/$REPOPATH/125/foo/ooo/${PKG}-20010101.tar.gz
    cat <<END > $TMPDIR/$REPOPATH/index.html
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<a href="/123/foo/ooo/$PKG-19990101.tar.gz">Very old</a> <br/ >
<a href="/124/foo/ooo/$PKG-20000101.tar.gz">A bit OLD</a> <br />
<a href="/125/foo/ooo/$PKG-20010101.tar.gz">Latest</a> <br />
</body>
<html>
END
}

siteXmlNonNative() {
    sitePoolNonNative
    cat <<END > $TMPDIR/$REPOPATH/index.html
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<Key>/123/foo/ooo/$PKG-0.0.tar.gz</Key> <br/ >
<Key>/124/foo/ooo/$PKG-1.0.tar.gz</Key> <br />
<Key>/125/foo/ooo/$PKG-2.0.tar.gz</Key> <br />
</body>
<html>
END
}

# test a watch files

testWatch3Native() {
    PKG=foo
    WATCHVER="3"
    WATCHLINE='@@@url@@@/(\d+)/(.+)/(.+)/'$PKG'-([\.\d]+).tar.gz debian'
    helperWatch sitePoolNative 1.0 2.0
}

testWatch3NonNative() {
    PKG=foo
    WATCHVER="3"
    WATCHLINE='@@@url@@@(\d+)/(.+)/(.+)/ '$PKG'-([\.\d]+).tar.gz debian uupdate'
    helperWatch sitePoolNonNative 1.0 2.0
}

testWatch3WebNative() {
    PKG=foo
    WATCHVER="3"
    WATCHLINE='@@@url@@@ (?:.*)/'$PKG'-([\d\.]+).tar.gz debian'
    helperWatch siteWebNative 1.0 2.0
}

testWatch3WebNonNative() {
    PKG=foo
    WATCHVER="3"
    WATCHLINE='@@@url@@@/ (?:.*)/'$PKG'-([\.\d]+).tar.gz debian uupdate'
    helperWatch siteWebNonNative 1.0 2.0
}

testWatch3WebNonNativeR() {
    PKG=foo
    WATCHVER="3"
    WATCHLINE='@@@url@@@/ (?:.*)/'$PKG'-([\.\d]+).tar.gz debian uupdate'
    helperWatch siteWebNonNativeR 1.0 2.0
}

testWatch3PrWebNonNative() {
    PKG=foo
    WATCHVER="3"
    WATCHLINE='opts="downloadurlmangle = s%boo/xxx%foo/ooo% ; s%boo-%foo-%, \
                     filenamemangle    = s%.*boo-(.*)%foo-$1% " \
    @@@url@@@/ (?:.*)/boo-([\d\.]+).tar.gz \
    debian uupdate'
    helperWatch sitePrWebNonNative 1.0 2.0
}

testWatch3WebNonNativeDlCurrent() {
    PKG=foo
    COMMANDOLD="$COMMAND"
    COMMAND="$COMMAND --download-current-version"
    WATCHVER="3"
    WATCHLINE='@@@url@@@/ (?:.*)/'$PKG'-([\.\d]+).tar.gz debian uupdate'
    helperWatch siteWebNonNative 1.0 1.0
    COMMAND="$COMMANDOLD"
}
testWatch3WebNonNativeDlUversion() {
    PKG=foo
    COMMANDOLD="$COMMAND"
    COMMAND="$COMMAND --download-version 0.0"
    WATCHVER="3"
    WATCHLINE='@@@url@@@/ (?:.*)/'$PKG'-([\.\d]+).tar.gz debian uupdate'
    helperWatch siteWebNonNative 1.0 0.0
    COMMAND="$COMMANDOLD"
}
testWatch3WebNonNativeDlDversion() {
    PKG=foo
    COMMANDOLD="$COMMAND"
    COMMAND="$COMMAND --download-debversion 0.0-1"
    WATCHVER="3"
    WATCHLINE='@@@url@@@/ (?:.*)/'$PKG'-([\.\d]+).tar.gz debian uupdate'
    helperWatch siteWebNonNative 1.0 0.0
    COMMAND="$COMMANDOLD"
}
## Debian version is 0.19990101 for future proof while upstream is 19990101
#testWatch3WebNonNativeLarge() {
#    PKG=foo
#    WATCHVER="3"
#    WATCHLINE='opts=" dversionmangle = s/0\.(.*)/$1/ , \
#	oversionmangle = s/(.*)/0.$1/" \
#	@@@url@@@  (?:.*)/'$PKG'-([\.\d]+).tar.gz debian uupdate'
#    helperWatch siteWebNonNativeLarge 20000101 20010101 0.
#}
#
## test for pagemangle
#testWatch3XmlNonNative() {
#    PKG=foo
#    WATCHVER="3"
#    WATCHLINE='opts="pagemangle = \
#	s%<Key>([^<]*)</Key>%<Key><a href=\"$1\">$1</a></Key>%g" \
#	@@@url@@@/ (?:.*)/'$PKG'-([\d\.]+).tar.gz debian uupdate'
#    helperWatch siteXmlNonNative 1.0 2.0
#}

. shunit2
