#!/bin/bash # vim: set shiftwidth=4 tabstop=8 noexpandtab: # Copyright (C) 2018, Osamu Aoki # # 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. set -u TESTTYPE=FTP . ./lib_test_uscan DEB_HOST_OS="$(dpkg-architecture -qDEB_HOST_ARCH_OS)" if [ "$DEB_HOST_OS" = "kfreebsd" ]; then # kbsd has a non-working semaphore, that is needed here. echo "This test is not supported on $(dpkg-architecture -qDEB_HOST_ARCH), skipping" exit 0 fi COMMAND="uscan --no-conf" # set safe defaults WEBSCRIPT=":" DEBUGECHO=":" DEBUGLSLR=":" DEBUGBASH=":" # comment out for debug #COMMAND="$COMMAND --debug" #COMMAND="$COMMAND --verbose" #DEBUGECHO=echo #DEBUGLSLR="ls -laR" #DEBUGLSLR="ls -la" #DEBUGBASH="bash -i" # Initial Debian revision value is distribution dependent SUFFIX="1" if command -v dpkg-vendor >/dev/null; then VENDER="$(dpkg-vendor --query Vendor 2>/dev/null|tr 'A-Z' 'a-z')" case "$VENDER" in debian) SUFFIX="1" ;; *) SUFFIX="0${VENDER}1" ;; esac fi cleanup(){ kill -9 $(cat $TMPDIR/$REPOPATH/pid) rm -rf $TMPDIR echo "" } spawnFtpServer(){ ( local USCAN_FTP_SERVER=${USCAN_FTP_SERVER:-ftpserver.py} mkdir -p "$TMPDIR/$REPOPATH" cd "$TMPDIR/$REPOPATH" || exit 1 echo "FTP starting ... $TMPDIR/$REPOPATH" local pid python3 "$test_dir/uscan/$USCAN_FTP_SERVER" 2>log & pid=$! echo $pid > pid while ! [ -s port ]; do sleep 2s if ! kill -0 $pid 2> /dev/null ; then echo "The FTP server returned an error:" cat log exit 1 fi done ) } trap cleanup 1 2 3 13 15 containsName(){ echo "$1" | grep -qF "$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 FTP server that works offline, using the pyftpdlib # 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:-foo} # Debian source package name DEBVER=${2:-1.0} # Debian source package version mkdir -p debian/source cat < debian/rules %: dh $@ END chmod 755 debian/rules cat < debian/changelog $DEBNAME ($DEBVER) unstable; urgency=low * Release of the $DEBNAME package $DEBVER. -- Joe Developer 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@@@,ftp://127.0.0.1:${PORT}/,g" - \ >> debian/watch # debian/upstream/signing-key.asc mkdir -p debian/upstream cp -f $test_dir/uscan/PUBLIC_KEY.asc debian/upstream/signing-key.asc } # make tarball in $REPOPATH/$POOLPATH makeUpstreamTar() { UPNAME=${1:-foo} # Upstream package name UPVER=${2:-1.0} # 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/FILE.$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) NEWTAR=$UPNAME-$UPVER.tar tar -cf $NEWTAR $UPNAME-$UPVER NEWTAR=$UPNAME-$UPVER.tar.gz tar -czf $NEWTAR $UPNAME-$UPVER ;; bz2|bzip2) NEWTAR=$UPNAME-$UPVER.tar tar -cf $NEWTAR $UPNAME-$UPVER NEWTAR=$UPNAME-$UPVER.tar.bz2 tar --bzip2 -cf $NEWTAR $UPNAME-$UPVER ;; xz) NEWTAR=$UPNAME-$UPVER.tar tar -cf $NEWTAR $UPNAME-$UPVER NEWTAR= $UPNAME-$UPVER.tar.xz tar --xz -cf $NEWTAR $UPNAME-$UPVER ;; zip) NEWTAR=$UPNAME-$UPVER.zip zip -r $NEWTAR $UPNAME-$UPVER ;; *) echo "Wrong compression mode: $COMPRESSION" exit 1 ;; esac # make $NEWTAR.asc $GPG --homedir "$GPGHOME" --no-options -q --batch --no-default-keyring \ --secret-keyring $PRIVATE_KEYRING --default-key 72543FAF \ --armor --detach-sign $NEWTAR if [ "$COMPRESSION" != "zip" ]; then NEWTAR=$UPNAME-$UPVER.tar $GPG --homedir "$GPGHOME" --no-options -q --batch --no-default-keyring \ --secret-keyring $PRIVATE_KEYRING --default-key 72543FAF \ --armor --detach-sign $NEWTAR fi cd $OLDDIR } # setup a common watch file test environment helperWatch() { local SITESCRIPT=${1:-siteWebNonNative} local VEROLD=${2:-1.0} local VERNEW=${3:-2.0} local PREFIX="${4:-}" local TMPDIR=$(mktemp -d) ORIGDIR=`pwd` PKG=${PKG:-foo} REPOPATH=${REPOPATH:-repo} POOLPATH=${POOLPATH:-pool} GZREPACK=${GZREPACK:-gz} XCOMMAND=${XCOMMAND:-$COMMAND} WATCHVER="${WATCHVER:-3}" WATCHLINE0="@@@url@@@/ (?:.*)/@PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate" WATCHLINE="${WATCHLINE:-$WATCHLINE0}" cd $TMPDIR # start FTP server with its root at $TMPDIR/$REPOPATH spawnFtpServer || exit 1 PORT=$(cat $TMPDIR/$REPOPATH/port) $DEBUGECHO " ***** ftp://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 local UUPDATE="" if grep -q "uupdate" $TMPDIR/${PKG}/debian/watch ; then UUPDATE=uupdate fi local PGP="" if grep -q "pgpurlmangle" $TMPDIR/${PKG}/debian/watch ; then PGP=pgp fi if grep -q "pgpmode *= *auto" $TMPDIR/${PKG}/debian/watch ; then PGP=pgp fi if grep -q "pgpmode *= *previous" $TMPDIR/${PKG}/debian/watch ; then PGP=pgp fi $XCOMMAND assertEquals "uscan: exit_code!=0 but exit_code=0" "$?" "0" cd $TMPDIR $DEBUGLSLR UTARBALL=${PKG}-${VERNEW}.tar.gz STARBALL=${PKG}_${PREFIX}${VERNEW}.orig.tar.$GZREPACK assertTrue "$UTARBALL missing: $WATCHLINE" "[ -f $UTARBALL ]" assertTrue "$STARBALL missing: $WATCHLINE" "[ -f $STARBALL ]" if [ "$PGP" = "pgp" ]; then UTARSIG=${PKG}-${VERNEW}.tar.gz.asc if [ ! -f $UTARSIG ]; then UTARSIG=${PKG}-${VERNEW}.tar.asc fi STARSUG=${PKG}_${PREFIX}${VERNEW}.orig.tar.$GZREPACK.asc assertTrue "$UTARSIG and *.sig missing: $WATCHLINE" "[ -f $UTARSIG ]" assertTrue "$STARSIG missing: $WATCHLINE" "[ -f $STARSIG ]" fi # check uupdate if [ "$UUPDATE" = "uupdate" ]; then cd $TMPDIR/${PKG}-${PREFIX}${VERNEW} assertTrue 'pristine tarball is not extracted' "[ -f debian/changelog ]" DVERSION=`dpkg-parsechangelog -ldebian/changelog -SVersion` assertEquals "uscan: Version should be ${PREFIX}${VERNEW}-$SUFFIX but $DVERSION" "$DVERSION" "${PREFIX}${VERNEW}-$SUFFIX" cd $TMPDIR fi $DEBUGBASH cd $ORIGDIR cleanup unset REPOPATH unset POOLPATH unset GZREPACK unset XCOMMAND unset WATCHVER unset WATCHLINE } # setup a common watch file test environment with Zip upstream helperWatchZip() { local SITESCRIPT=${1:-siteWebNonNative} local VEROLD=${2:-1.0} local VERNEW=${3:-2.0} local PREFIX="${4:-}" local TMPDIR=$(mktemp -d) ORIGDIR=`pwd` PKG=${PKG:-foo} REPOPATH=${REPOPATH:-repo} POOLPATH=${POOLPATH:-pool} GZREPACK=${GZREPACK:-xz} XCOMMAND=${XCOMMAND:-$COMMAND} WATCHVER="${WATCHVER:-3}" WATCHLINE0="@@@url@@@/ (?:.*)/@PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate" WATCHLINE="${WATCHLINE:-$WATCHLINE0}" cd $TMPDIR # start FTP server with its root at $TMPDIR/$REPOPATH spawnFtpServer || exit 1 PORT=$(cat $TMPDIR/$REPOPATH/port) $DEBUGECHO " ***** ftp://localhost:$PORT started showing $TMPDIR/$REPOPATH *****" # make web site $SITESCRIPT # make local $VEROLD source tree unzip $TMPDIR/$REPOPATH/$POOLPATH/${PKG}-${VEROLD}.zip 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 local UUPDATE="" if grep -q "uupdate" $TMPDIR/${PKG}/debian/watch ; then UUPDATE=uupdate fi local PGP="" if grep -q "pgpurlmangle" $TMPDIR/${PKG}/debian/watch ; then PGP=pgp fi if grep -q "pgpmode *= *auto" $TMPDIR/${PKG}/debian/watch ; then PGP=pgp fi if grep -q "pgpmode *= *previous" $TMPDIR/${PKG}/debian/watch ; then PGP=pgp fi $XCOMMAND assertEquals "uscan: exit_code!=0 but exit_code=0" "$?" "0" cd $TMPDIR $DEBUGLSLR UTARBALL=${PKG}-${VERNEW}.zip STARBALL=${PKG}_${PREFIX}${VERNEW}.orig.tar.$GZREPACK assertTrue "$UTARBALL missing: $WATCHLINE" "[ -f $UTARBALL ]" assertTrue "$STARBALL missing: $WATCHLINE" "[ -f $STARBALL ]" if [ "$PGP" = "pgp" ]; then UTARSIG=${PKG}-${VERNEW}.zip.asc STARSUG=${PKG}_${PREFIX}${VERNEW}.orig.tar.$GZREPACK.asc assertTrue "$UTARSIG and *.sig missing: $WATCHLINE" "[ -f $UTARSIG ]" assertTrue "$STARSIG missing: $WATCHLINE" "[ -f $STARSIG ]" fi # check uupdate if [ "$UUPDATE" = "uupdate" ]; then cd $TMPDIR/${PKG}-${PREFIX}${VERNEW} assertTrue 'pristine tarball is not extracted' "[ -f debian/changelog ]" DVERSION=`dpkg-parsechangelog -ldebian/changelog -SVersion` assertEquals "uscan: Version should be ${PREFIX}${VERNEW}-$SUFFIX but $DVERSION" "$DVERSION" "${PREFIX}${VERNEW}-$SUFFIX" cd $TMPDIR fi $DEBUGBASH cd $ORIGDIR cleanup unset REPOPATH unset POOLPATH unset GZREPACK unset XCOMMAND unset WATCHVER unset WATCHLINE } siteNonNative() { local PKG=${1:-foo} local EXTRA=${2:-} 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/0.0/$PKG/ooo/ mkdir -p $TMPDIR/$REPOPATH/1.0/$PKG/ooo/ mkdir -p $TMPDIR/$REPOPATH/2.0/$PKG/ooo/ if [ -n "$EXTRA" ]; then makeUpstreamTar $PKG 3.0 gz non-native mkdir -p $TMPDIR/$REPOPATH/3.0/$PKG/ooo/ fi ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-0.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz.asc $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-0.0.tar.gz.asc ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.asc $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-0.0.tar.asc ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-1.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz.asc $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-1.0.tar.gz.asc ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.asc $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-1.0.tar.asc ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-2.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz.asc $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-2.0.tar.gz.asc ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.asc $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-2.0.tar.asc if [ -n "$EXTRA" ]; then ln -sf ../../../$POOLPATH/${PKG}-3.0.tar.gz $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-3.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-3.0.tar.gz.asc $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-3.0.tar.gz.asc ln -sf ../../../$POOLPATH/${PKG}-3.0.tar.asc $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-3.0.tar.asc fi } siteNonNativeZip() { local PKG=${1:-foo} local EXTRA=${2:-} makeUpstreamTar $PKG 0.0 zip non-native makeUpstreamTar $PKG 1.0 zip non-native makeUpstreamTar $PKG 2.0 zip non-native mkdir -p $TMPDIR/$REPOPATH/0.0/$PKG/ooo/ mkdir -p $TMPDIR/$REPOPATH/1.0/$PKG/ooo/ mkdir -p $TMPDIR/$REPOPATH/2.0/$PKG/ooo/ if [ -n "$EXTRA" ]; then makeUpstreamTar $PKG 3.0 gz non-native mkdir -p $TMPDIR/$REPOPATH/3.0/$PKG/ooo/ fi ln -sf ../../../$POOLPATH/${PKG}-0.0.zip $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-0.0.zip ln -sf ../../../$POOLPATH/${PKG}-0.0.zip.asc $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-0.0.zip.asc ln -sf ../../../$POOLPATH/${PKG}-1.0.zip $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-1.0.zip ln -sf ../../../$POOLPATH/${PKG}-1.0.zip.asc $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-1.0.zip.asc ln -sf ../../../$POOLPATH/${PKG}-2.0.zip $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-2.0.zip ln -sf ../../../$POOLPATH/${PKG}-2.0.zip.asc $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-2.0.zip.asc if [ -n "$EXTRA" ]; then ln -sf ../../../$POOLPATH/${PKG}-3.0.zip $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-3.0.zip ln -sf ../../../$POOLPATH/${PKG}-3.0.zip.asc $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-3.0.zip.asc fi } siteNonNativeR() { local PKG=${1:-foo} local EXTRA=${2:-} 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/0.0/$PKG/ooo/ mkdir -p $TMPDIR/$REPOPATH/1.0/$PKG/ooo/ mkdir -p $TMPDIR/$REPOPATH/2.0/$PKG/ooo/ if [ -n "$EXTRA" ]; then makeUpstreamTar $PKG 3.0 gz non-native mkdir -p $TMPDIR/$REPOPATH/3.0/$PKG/ooo/ fi ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-0.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-0.0.tar.gz.asc $TMPDIR/$REPOPATH/3.0/$PKG/ooo/${PKG}-0.0.tar.gz.asc ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-1.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-1.0.tar.gz.asc $TMPDIR/$REPOPATH/2.0/$PKG/ooo/${PKG}-1.0.tar.gz.asc ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-2.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-2.0.tar.gz.asc $TMPDIR/$REPOPATH/1.0/$PKG/ooo/${PKG}-2.0.tar.gz.asc if [ -n "$EXTRA" ]; then ln -sf ../../../$POOLPATH/${PKG}-3.0.tar.gz $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-3.0.tar.gz ln -sf ../../../$POOLPATH/${PKG}-3.0.tar.gz.asc $TMPDIR/$REPOPATH/0.0/$PKG/ooo/${PKG}-3.0.tar.gz.asc fi } # test a watch files ### VERSION 4 ### # standard tests # test non-native package with uupdate, bare FTP server in normal order testWatch4NonNative() { WATCHVER=4 WATCHLINE='opts=pgpsigurlmangle=s/$/.asc/ @@@url@@@([\.\d]+)/(.+)/(.+)/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate' helperWatch siteNonNative } # test --download-current-version, bare FTP server in normal order testWatch4NonNativeDlCurrent() { WATCHVER=4 XCOMMAND="$COMMAND --download-current-version" WATCHLINE='opts=pgpsigurlmangle=s/$/.asc/ @@@url@@@([\.\d]+)/(.+)/(.+)/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate' helperWatch siteNonNative 1.0 1.0 } # test --download-version, bare FTP server in normal order testWatch4NonNativeDlUversion() { WATCHVER=4 XCOMMAND="$COMMAND --download-version 0.0" WATCHLINE='opts=pgpsigurlmangle=s/$/.asc/ @@@url@@@([\.\d]+)/(.+)/(.+)/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate' helperWatch siteNonNative 1.0 0.0 } # test non-native package with uupdate, bare FTP server in normal order with upstream ZIP testWatch4NonNativeZip() { WATCHVER=4 COMPRESSION='zip' WATCHLINE='opts=pgpsigurlmangle=s/$/.asc/ @@@url@@@([\.\d]+)/(.+)/(.+)/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate' helperWatchZip siteNonNativeZip } # test non-native package with uupdate, bare FTP server in normal order with repack to xz testWatch4NonNativeXz() { WATCHVER=4 GZREPACK='xz' WATCHLINE='opts=pgpsigurlmangle=s/$/.asc/,compression=xz,repack @@@url@@@([\.\d]+)/(.+)/(.+)/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate' helperWatch siteNonNative } # test non-native package with uupdate, bare FTP server in normal order with ungzsig testWatch4NonNativeUngzsig() { WATCHVER=4 WATCHLINE='opts=pgpsigurlmangle=s/.gz$/.asc/,decompress @@@url@@@([\.\d]+)/(.+)/(.+)/ @PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate' helperWatch siteNonNative } . shunit2