X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b7899b004710a0050407d4c6cdfc792110dd03cd..0dc05bf095ebe2908f7d9096b3914b8c988c023e:/test/integration/framework diff --git a/test/integration/framework b/test/integration/framework index 66a0b5dc7..a0bad4170 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -64,6 +64,8 @@ runapt() { msgdebug "Executing: ${CCMD}$*${CDEBUG} " if [ -f ./aptconfig.conf ]; then APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$* + elif [ -f ../aptconfig.conf ]; then + APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$* else LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/$* fi @@ -72,38 +74,55 @@ aptconfig() { runapt apt-config $*; } aptcache() { runapt apt-cache $*; } aptget() { runapt apt-get $*; } aptftparchive() { runapt apt-ftparchive $*; } +aptkey() { runapt apt-key $*; } +dpkg() { + $(which dpkg) --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log $* +} setupenvironment() { - local TMPWORKINGDIRECTORY=$(mktemp -d) + TMPWORKINGDIRECTORY=$(mktemp -d) local TESTDIR=$(readlink -f $(dirname $0)) - msgninfo "Preparing environment for ${CCMD}$0${CINFO} in ${TMPWORKINGDIRECTORY}… " + msgninfo "Preparing environment for ${CCMD}$(basename $0)${CINFO} in ${TMPWORKINGDIRECTORY}… " BUILDDIRECTORY="${TESTDIR}/../../build/bin" test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first" local OLDWORKINGDIRECTORY=$(pwd) - trap "cd /; rm -rf $TMPWORKINGDIRECTORY; cd $OLDWORKINGDIRECTORY" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM + CURRENTTRAP="cd /; rm -rf $TMPWORKINGDIRECTORY; cd $OLDWORKINGDIRECTORY" + trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM cd $TMPWORKINGDIRECTORY - mkdir rootdir aptarchive + mkdir rootdir aptarchive keys cd rootdir - mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d var/cache var/lib/dpkg - mkdir -p var/cache/apt/archives/partial var/lib/apt/lists/partial - local STATUSFILE=$(echo "$(basename $0)" | sed 's/^test-/status-/') + mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d + mkdir -p var/cache var/lib var/log + mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers + local STATUSFILE=$(echo "$(basename $0)" | sed -e 's/^test-/status-/' -e 's/^skip-/status-/') if [ -f "${TESTDIR}/${STATUSFILE}" ]; then cp "${TESTDIR}/${STATUSFILE}" var/lib/dpkg/status else touch var/lib/dpkg/status fi + touch var/lib/dpkg/available mkdir -p usr/lib/apt ln -s ${BUILDDIRECTORY}/methods usr/lib/apt/methods cd .. - local PACKAGESFILE=$(echo "$(basename $0)" | sed 's/^test-/Packages-/') + local PACKAGESFILE=$(echo "$(basename $0)" | sed -e 's/^test-/Packages-/' -e 's/^skip-/Packages-/') if [ -f "${TESTDIR}/${PACKAGESFILE}" ]; then cp "${TESTDIR}/${PACKAGESFILE}" aptarchive/Packages else touch aptarchive/Packages fi - echo "RootDir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf + cp $(find $TESTDIR -name '*.pub' -o -name '*.sec') keys/ + ln -s ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg + echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf + echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf echo "Debug::NoLocking \"true\";" >> aptconfig.conf echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf + echo "Dir::Bin::Methods \"${BUILDDIRECTORY}/methods\";" >> aptconfig.conf + echo "Dir::Bin::dpkg \"fakeroot\";" >> aptconfig.conf + echo "DPKG::options:: \"dpkg\";" >> aptconfig.conf + echo "DPKG::options:: \"--root=${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf + echo "DPKG::options:: \"--force-not-root\";" >> aptconfig.conf + echo "DPKG::options:: \"--force-bad-path\";" >> aptconfig.conf + echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf export LC_ALL=C msgdone "info" } @@ -118,7 +137,7 @@ configarchitecture() { done } -buildsimplenativepackage() { +setupsimplenativepackage() { local NAME="$1" local ARCH="$2" local VERSION="$3" @@ -132,7 +151,6 @@ buildsimplenativepackage() { else DISTSECTION="$(echo "$SECTION" | cut -d'/' -f 1)" fi - msgndebug "Build package ${CCMD}${NAME}=${VERSION}/${RELEASE}${CDEBUG}… " local BUILDDIR=incoming/${NAME}-${VERSION} mkdir -p ${BUILDDIR}/debian/source cd ${BUILDDIR} @@ -164,18 +182,48 @@ Architecture: $ARCH" > debian/control test -e debian/compat || echo "7" > debian/compat test -e debian/source/format || echo "3.0 (native)" > debian/source/format test -e debian/rules || cp /usr/share/doc/debhelper/examples/rules.tiny debian/rules + cd - > /dev/null +} + +buildsimplenativepackage() { + local NAME="$1" + local ARCH="$2" + local VERSION="$3" + local RELEASE="${4:-unstable}" + local DEPENDENCIES="$5" + local DESCRIPTION="$6" + local SECTION="${7:-others}" + local DISTSECTION + if [ "$SECTION" = "$(echo "$SECTION" | cut -d'/' -f 2)" ]; then + DISTSECTION="main" + else + DISTSECTION="$(echo "$SECTION" | cut -d'/' -f 1)" + fi + setupsimplenativepackage "$NAME" "$ARCH" "$VERSION" "$RELEASE" "$DEPENDENCIES" "$DESCRIPTION" "$SECTION" + buildpackage "incoming/${NAME}-${VERSION}" "$RELEASE" "$DISTSECTION" + rm -rf "incoming/${NAME}-${VERSION}" +} + +buildpackage() { + local BUILDDIR=$1 + local RELEASE=$2 + local SECTION=$3 + msgninfo "Build package $(echo "$BUILDDIR" | grep -o '[^/]*$') for ${RELEASE} in ${SECTION}… " + cd $BUILDDIR + if [ "$ARCH" = "all" ]; then + ARCH="$(dpkg-architecture -qDEB_HOST_ARCH 2> /dev/null)" + fi local BUILT="$(dpkg-buildpackage -uc -us -a$ARCH 2> /dev/null)" local PKGS="$( echo "$BUILT" | grep '^dpkg-deb: building package' | cut -d'/' -f 2 | sed -e "s#'\.##")" - local SRCS="$( echo "$BUILT" | grep '^dpkg-source: info: building' | grep -o '[a-z0-9._-]*$')" + local SRCS="$( echo "$BUILT" | grep '^dpkg-source: info: building' | grep -o '[a-z0-9._+~-]*$')" cd - > /dev/null for PKG in $PKGS; do - echo "pool/${PKG}" >> ./incoming/${RELEASE}.${DISTSECTION}.pkglist + echo "pool/${PKG}" >> ${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.pkglist done for SRC in $SRCS; do - echo "pool/${SRC}" >> ./incoming/${RELEASE}.${DISTSECTION}.srclist + echo "pool/${SRC}" >> ${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.srclist done - rm -rf $BUILDDIR - msgdone "debug" + msgdone "info" } buildaptarchive() { @@ -188,6 +236,10 @@ buildaptarchive() { createaptftparchiveconfig() { local ARCHS="$(find pool/ -name '*.deb' | grep -oE '_[a-z0-9-]+\.deb$' | sort | uniq | sed -e '/^_all.deb$/ d' -e 's#^_\([a-z0-9-]*\)\.deb$#\1#' | tr '\n' ' ')" + if [ -z "$ARCHS" ]; then + # the pool is empty, so we will operate on faked packages - let us use the configured archs + ARCHS="$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')" + fi echo -n 'Dir { ArchiveDir "' >> ftparchive.conf echo -n $(readlink -f .) >> ftparchive.conf @@ -239,7 +291,6 @@ APT { echo '"; };' >> ftparchive.conf done - less ftparchive.conf } buildaptftparchivedirectorystructure() { @@ -257,44 +308,77 @@ buildaptftparchivedirectorystructure() { done } +insertpackage() { + local RELEASE="$1" + local NAME="$2" + local ARCH="$3" + local VERSION="$4" + local DEPENDENCIES="$5" + local ARCHS="$ARCH" + if [ "$ARCHS" = "all" ]; then + ARCHS="$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')" + fi + for BUILDARCH in $ARCHS; do + local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}" + mkdir -p $PPATH aptarchive/dists/${RELEASE}/main/source + touch aptarchive/dists/${RELEASE}/main/source/Sources + local FILE="${PPATH}/Packages" + echo "Package: $NAME +Priority: optional +Section: other +Installed-Size: 23356 +Maintainer: Joe Sixpack +Architecture: $ARCH +Version: $VERSION" >> $FILE + test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE + echo "Description: an autogenerated dummy ${NAME}=${VERSION}/${RELEASE} + If you find such a package installed on your system, + YOU did something horribly wrong! They are autogenerated + und used only by testcases for APT and surf no other propose… +" >> $FILE + done +} + buildaptarchivefromincoming() { - msginfo "Build APT archive for ${CCMD}$0${CINFO} based on incoming packages…" + msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on incoming packages…" cd aptarchive [ -e pool ] || ln -s ../incoming pool [ -e ftparchive.conf ] || createaptftparchiveconfig [ -e dists ] || buildaptftparchivedirectorystructure msgninfo "\tGenerate Packages, Sources and Contents files… " aptftparchive -qq generate ftparchive.conf - msgdone "info" - msgninfo "\tGenerate Release files… " - for dir in $(find ./dists -mindepth 1 -maxdepth 1 -type d); do - aptftparchive -qq release $dir | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference - done cd - > /dev/null msgdone "info" + generatereleasefiles } buildaptarchivefromfiles() { - msginfo "Build APT archive for ${CCMD}$0${CINFO} based on prebuild files…" - cd aptarchive - if [ -f Packages ]; then - msgninfo "\tPackages file… " - cat Packages | gzip > Packages.gz - cat Packages | bzip2 > Packages.bz2 - cat Packages | lzma > Packages.lzma - msgdone "info" - fi - if [ -f Sources ]; then - msgninfo "\tSources file… " - cat Sources | gzip > Sources.gz - cat Sources | bzip2 > Sources.bz2 - cat Sources | lzma > Sources.lzma + msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on prebuild files…" + find aptarchive -name 'Packages' -o -name 'Sources' | while read line; do + msgninfo "\t${line} file… " + cat ${line} | gzip > ${line}.gz + cat ${line} | bzip2 > ${line}.bz2 + cat ${line} | lzma > ${line}.lzma msgdone "info" + done + generatereleasefiles +} + +generatereleasefiles() { + msgninfo "\tGenerate Release files… " + if [ -e aptarchive/dists ]; then + for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do + local CODENAME="$(echo "$dir" | cut -d'/' -f 4)" + aptftparchive -qq release $dir -o APT::FTPArchive::Release::Codename="${CODENAME}" | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference + if [ "$CODENAME" = "experimental" ]; then + sed -i '/^Date: / a\ +NotAutomatic: yes' $dir/Release + fi + done + else + aptftparchive -qq release ./aptarchive | sed -e '/0 Release$/ d' > aptarchive/Release # remove the self reference fi - msgninfo "\tRelease file… " - aptftparchive -qq release . | sed -e '/0 Release$/ d' > Release # remove the self reference msgdone "info" - cd .. } setupdistsaptarchive() { @@ -335,10 +419,44 @@ setupaptarchive() { else setupflataptarchive fi + signreleasefiles + msgninfo "\tSync APT's cache with the archive… " aptget update -qq + msgdone "info" } -diff() { +signreleasefiles() { + local SIGNER="${1:-Joe Sixpack}" + msgninfo "\tSign archive with $SIGNER key… " + local SECKEYS="" + for KEY in $(find keys/ -name '*.sec'); do + SECKEYS="$SECKEYS --secret-keyring $KEY" + done + local PUBKEYS="" + for KEY in $(find keys/ -name '*.pub'); do + PUBKEYS="$PUBKEYS --keyring $KEY" + done + for RELEASE in $(find aptarchive/ -name Release); do + gpg --yes --no-default-keyring $SECKEYS $PUBKEYS --default-key "$SIGNER" -abs -o ${RELEASE}.gpg ${RELEASE} + done + msgdone "info" +} + +changetowebserver() { + if which weborf > /dev/null; then + weborf -xb aptarchive/ 2>&1 > /dev/null & + CURRENTTRAP="kill $!; $CURRENTTRAP" + trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM + local APTARCHIVE="file://$(readlink -f ./aptarchive)" + for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do + sed -i $LIST -e "s#$APTARCHIVE#http://localhost:8080/#" + done + return 0 + fi + return 1 +} + +checkdiff() { local DIFFTEXT="$($(which diff) -u $* | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')" if [ -n "$DIFFTEXT" ]; then echo @@ -349,12 +467,23 @@ diff() { fi } +testfileequal() { + local FILE="$1" + shift + msgtest "Test for correctness of file" "$FILE" + if [ -z "$*" ]; then + echo -n "" | checkdiff $FILE - && msgpass || msgfail + else + echo "$*" | checkdiff $FILE - && msgpass || msgfail + fi +} + testequal() { local COMPAREFILE=$(mktemp) echo "$1" > $COMPAREFILE shift msgtest "Test for equality of" "$*" - $* 2>&1 | diff $COMPAREFILE - && msgpass || msgfail + $* 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail rm $COMPAREFILE } @@ -367,10 +496,10 @@ testequalor2() { shift 2 msgtest "Test for equality OR of" "$*" $* 2>&1 1> $COMPAREAGAINST - (diff $COMPAREFILE1 $COMPAREAGAINST 1> /dev/null || - diff $COMPAREFILE2 $COMPAREAGAINST 1> /dev/null) && msgpass || - ( echo "\n${CINFO}Diff against OR 1${CNORMAL}" "$(diff $COMPAREFILE1 $COMPAREAGAINST)" \ - "\n${CINFO}Diff against OR 2${CNORMAL}" "$(diff $COMPAREFILE2 $COMPAREAGAINST)" && + (checkdiff $COMPAREFILE1 $COMPAREAGAINST 1> /dev/null || + checkdiff $COMPAREFILE2 $COMPAREAGAINST 1> /dev/null) && msgpass || + ( echo "\n${CINFO}Diff against OR 1${CNORMAL}" "$(checkdiff $COMPAREFILE1 $COMPAREAGAINST)" \ + "\n${CINFO}Diff against OR 2${CNORMAL}" "$(checkdiff $COMPAREFILE2 $COMPAREAGAINST)" && msgfail ) rm $COMPAREFILE1 $COMPAREFILE2 $COMPAREAGAINST } @@ -392,7 +521,7 @@ N: No packages found" local ARCH=$(dpkg-architecture -qDEB_HOST_ARCH_CPU) eval `apt-config shell ARCH APT::Architecture` echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' > $COMPAREFILE - aptcache show $PACKAGE 2>&1 | diff $COMPAREFILE - && msgpass || msgfail + aptcache show -q=0 $PACKAGE 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail rm $COMPAREFILE } @@ -407,3 +536,27 @@ testnopackage() { fi msgpass } + +testdpkginstalled() { + msgtest "Test for correctly installed package(s) with" "dpkg -l $*" + local PKGS="$(dpkg -l $* | grep '^[a-z]' | grep '^[^i]' | wc -l)" + if [ "$PKGS" != 0 ]; then + echo $PKGS + dpkg -l $* | grep '^[a-z]' + msgfail + return 1 + fi + msgpass +} + +testdpkgnoninstalled() { + msgtest "Test for correctly non-installed package(s) with" "dpkg -l $*" + local PKGS="$(dpkg -l $* | grep '^[a-z]' | grep '^[^u]' | wc -l)" + if [ "$PKGS" != 0 ]; then + echo + dpkg -l $* | grep '^[a-z]' + msgfail + return 1 + fi + msgpass +}