X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/3d284148090b6349c216407bb2766bd8f6a962f0..8d89cda7d66b6f125c457f36beeb84abb0df07f1:/test/integration/framework diff --git a/test/integration/framework b/test/integration/framework index 3e159f6a9..a0eeb6d45 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -54,7 +54,7 @@ msgprintf() { printf "$START " "$1" shift while [ -n "$1" ]; do - printf "$MIDDLE " "$(echo "$1" | sed -e 's#^apt\([cfghs]\)#apt-\1#')" + printf "$MIDDLE " "$(echo "$1" | sed -e 's#^apt\([cfghks]\)#apt-\1#')" shift done fi @@ -95,7 +95,7 @@ msgfail() { if [ $# -gt 0 ] && [ -n "$1" ]; then printf "${CFAIL}FAIL: $*${CNORMAL}\n" >&2; else printf "${CFAIL}FAIL${CNORMAL}\n" >&2; fi if [ -n "$APT_DEBUG_TESTS" ]; then - $SHELL + runapt $SHELL fi EXIT_CODE=$((EXIT_CODE+1)); } @@ -169,11 +169,11 @@ runapt() { msgdebug "Executing: ${CCMD}$*${CDEBUG} " local CMD="$1" shift - case $CMD in + case "$CMD" in sh|aptitude|*/*|command) ;; *) CMD="${BUILDDIRECTORY}/$CMD";; esac - MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${LIBRARYPATH} $CMD "$@" + MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" "$CMD" "$@" } aptconfig() { runapt apt-config "$@"; } aptcache() { runapt apt-cache "$@"; } @@ -245,13 +245,23 @@ addtrap() { trap "shellsetedetector; $CURRENTTRAP exitwithstatus;" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM } +escape_shell() { + echo "$@" | sed -e "s#'#'\"'\"'#g" +} + setupenvironment() { # privilege dropping and testing doesn't work if /tmp isn't world-writeable (as e.g. with libpam-tmpdir) if [ -n "$TMPDIR" ] && [ "$(id -u)" = '0' ] && [ "$(stat --format '%a' "$TMPDIR")" != '1777' ]; then unset TMPDIR fi TMPWORKINGDIRECTORY="$(mktemp -d)" - addtrap "cd /; rm -rf \"$TMPWORKINGDIRECTORY\";" + addtrap "cd /; rm -rf '$(escape_shell "$TMPWORKINGDIRECTORY")';" + if [ -n "$TMPDIR_ADD" ]; then + TMPWORKINGDIRECTORY="${TMPWORKINGDIRECTORY}/${TMPDIR_ADD}" + mkdir -p "$TMPWORKINGDIRECTORY" + unset TMPDIR_ADD + export TMPDIR="$TMPWORKINGDIRECTORY" + fi msgninfo "Preparing environment for ${0##*/} in ${TMPWORKINGDIRECTORY}…" mkdir -m 700 "${TMPWORKINGDIRECTORY}/downloaded" @@ -307,10 +317,8 @@ setupenvironment() { if [ -f "${TESTDIRECTORY}/${SOURCESSFILE}" ]; then cp "${TESTDIRECTORY}/${SOURCESSFILE}" aptarchive/Sources fi - for key in $(find "$TESTDIRECTORY" -name '*.pub' -o -name '*.sec'); do - cp "$key" keys/ - chmod 644 "$key" - done + find "$TESTDIRECTORY" \( -name '*.pub' -o -name '*.sec' \) -exec cp '{}' keys/ \; + chmod 644 keys/* ln -s "${TMPWORKINGDIRECTORY}/keys/joesixpack.pub" rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf @@ -330,11 +338,11 @@ setupenvironment() { cat > "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" <> "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" <> "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/gdb-dpkg" < "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" @@ -537,32 +549,15 @@ confighashes() { } forcecompressor() { COMPRESSOR="$1" - COMPRESSOR_CMD="$1" + COMPRESS="$1" + COMPRESSOR_CMD="apthelper cat-file -C $1" case $COMPRESSOR in gzip) COMPRESS='gz';; bzip2) COMPRESS='bz2';; - lzma) COMPRESS='lzma';; - xz) COMPRESS='xz';; - *) msgdie "Compressor $COMPRESSOR is unknown to framework, so can't be forced by forcecompressor!";; esac local CONFFILE="${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/00force-compressor" echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; }; -Dir::Bin::uncompressed \"/does/not/exist\"; -Dir::Bin::gzip \"/does/not/exist\"; -Dir::Bin::bzip2 \"/does/not/exist\"; -Dir::Bin::lzma \"/does/not/exist\"; -Dir::Bin::xz \"/does/not/exist\";" > "$CONFFILE" - if [ -e "/bin/${COMPRESSOR}" ]; then - echo "Dir::Bin::${COMPRESSOR} \"/bin/${COMPRESSOR}\";" >> "$CONFFILE" - elif [ -e "/usr/bin/${COMPRESSOR}" ]; then - echo "Dir::Bin::${COMPRESSOR} \"/usr/bin/${COMPRESSOR}\";" >> "$CONFFILE" - elif [ "${COMPRESSOR}" = 'lzma' ]; then - echo 'Dir::Bin::xz "/usr/bin/xz";' >> "$CONFFILE" - COMPRESSOR_CMD='xz --format=lzma' - else - msgtest 'Test for availability of compressor' "${COMPRESSOR}" - msgfail "${COMPRESSOR} not available" - fi +Dir::Bin::uncompressed \"/does/not/exist\";" > "$CONFFILE" } setupsimplenativepackage() { @@ -854,31 +849,33 @@ Description-en: $DESCRIPTION } insertsource() { - local RELEASE="$1" + local RELEASES="$1" local NAME="$2" local ARCH="$3" local VERSION="$4" local DEPENDENCIES="$5" - local BINARY="${6:-$NAME}" + local BINARY="${6:-$NAME}" local ARCHS="" - local SPATH="aptarchive/dists/${RELEASE}/main/source" - mkdir -p $SPATH - local FILE="${SPATH}/Sources" - local DSCFILE="${NAME}_${VERSION}.dsc" - local TARFILE="${NAME}_${VERSION}.tar.gz" - echo "Package: $NAME + for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do + local SPATH="aptarchive/dists/${RELEASE}/main/source" + mkdir -p $SPATH + local FILE="${SPATH}/Sources" + local DSCFILE="${NAME}_${VERSION}.dsc" + local TARFILE="${NAME}_${VERSION}.tar.gz" + echo "Package: $NAME Binary: $BINARY Version: $VERSION Maintainer: Joe Sixpack Architecture: $ARCH" >> $FILE - test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> "$FILE" - echo "Files: + test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> "$FILE" + echo "Files: $(echo -n "$DSCFILE" | md5sum | cut -d' ' -f 1) $(echo -n "$DSCFILE" | wc -c) "$DSCFILE" $(echo -n "$TARFILE" | md5sum | cut -d' ' -f 1) $(echo -n "$TARFILE" | wc -c) "$TARFILE" Checksums-Sha256: $(echo -n "$DSCFILE" | sha256sum | cut -d' ' -f 1) $(echo -n "$DSCFILE" | wc -c) "$DSCFILE" $(echo -n "$TARFILE" | sha256sum | cut -d' ' -f 1) $(echo -n "$TARFILE" | wc -c) "$TARFILE" " >> "$FILE" + done } insertinstalledpackage() { @@ -1095,9 +1092,9 @@ signreleasefiles() { fi fi for RELEASE in $(find "${REPODIR}/" -name Release); do - $GPG --default-key "$SIGNER" --armor --detach-sign --sign --output "${RELEASE}.gpg" "${RELEASE}" + testsuccess $GPG --default-key "$SIGNER" --armor --detach-sign --sign --output "${RELEASE}.gpg" "${RELEASE}" local INRELEASE="$(echo "${RELEASE}" | sed 's#/Release$#/InRelease#')" - $GPG --default-key "$SIGNER" --clearsign --output "$INRELEASE" "$RELEASE" + testsuccess $GPG --default-key "$SIGNER" --clearsign --output "$INRELEASE" "$RELEASE" # we might have set a specific date for the Release file, so copy it touch -d "$(stat --format "%y" ${RELEASE})" "${RELEASE}.gpg" "${INRELEASE}" done @@ -1181,7 +1178,7 @@ changetowebserver() { cd aptarchive local LOG="webserver.log" if ! aptwebserver --port 0 -o aptwebserver::fork=1 -o aptwebserver::portfile='aptwebserver.port' "$@" >$LOG 2>&1 ; then - cat $LOG + cat "$LOG" false fi waitforpidfile aptwebserver.pid @@ -1205,7 +1202,7 @@ changetowebserver() { } changetohttpswebserver() { - if ! which stunnel4 >/dev/null; then + if ! command -v stunnel4 >/dev/null 2>&1; then msgdie 'You need to install stunnel4 for https testcases' fi if [ ! -e "${TMPWORKINGDIRECTORY}/aptarchive/aptwebserver.pid" ]; then @@ -1251,7 +1248,7 @@ EOF # start with an unmounted disk mv "${CD}" "${CD}-unmounted" # we don't want the disk to be modifiable - addtrap 'prefix' "chmod -f -R +w \"$PWD/rootdir/media/cdrom/dists/\" \"$PWD/rootdir/media/cdrom-unmounted/dists/\" || true;" + addtrap 'prefix' "chmod -f -R +w '$(escape_shell "$PWD/rootdir/media/cdrom/dists/")' '$(escape_shell "$PWD/rootdir/media/cdrom-unmounted/dists/")' || true;" chmod -R 555 rootdir/media/cdrom-unmounted/dists } @@ -1316,9 +1313,13 @@ testfileequal() { testempty() { msggroup 'testempty' - msgtest "Test for no output of" "$*" + if [ "$1" = '--nomsg' ]; then + shift + else + msgtest "Test for no output of" "$*" + fi local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile" - if ("$@" >"$COMPAREFILE" 2>&1 || true) && test ! -s "$COMPAREFILE"; then + if "$@" >"$COMPAREFILE" 2>&1 && test ! -s "$COMPAREFILE"; then msgpass else msgfailoutput '' "$COMPAREFILE" "$@" @@ -1420,6 +1421,19 @@ testnopackage() { fi msggroup } +testnosrcpackage() { + msggroup 'testnosrcpackage' + msgtest "Test for non-existent source packages" "apt-cache showsrc $*" + local SHOWPKG="$(aptcache showsrc "$@" 2>&1 | grep '^Package: ')" + if [ -n "$SHOWPKG" ]; then + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testnosrcpackage.output" + echo "$SHOWPKG" >"$OUTPUT" + msgfailoutput '' "$OUTPUT" + else + msgpass + fi + msggroup +} testdpkgstatus() { msggroup 'testdpkgstatus' @@ -1497,7 +1511,10 @@ msgfailoutput() { if expr match "$1" "$FILEFLAGS" >/dev/null; then echo "#### stat(2) of file: $2 ####" stat "$2" || true - if test -e "$2"; then + if test -d "$2"; then + echo "#### The directory contains: $2 ####" + ls >&2 "$2" || true + elif test -e "$2"; then echo "#### Complete file: $2 ####" cat >&2 "$2" || true fi @@ -1509,6 +1526,14 @@ msgfailoutput() { msgfailoutputstatfile "$2" "$3" done echo '#### test output ####' + elif [ "$1" = 'cmp' ]; then + echo >&2 + while [ -n "$2" ]; do + echo "#### Complete file: $2 ####" + cat >&2 "$2" || true + shift + done + echo '#### cmp output ####' fi cat >&2 "$OUTPUT" msgfail "$MSG" @@ -1748,6 +1773,51 @@ testwebserverlaststatuscode() { msggroup } +createlistofkeys() { + local OUTPUT="$1" + shift + while [ -n "$1" ]; do + # gpg 2.1.something starts printing [SC] at some point + if grep -q ' rsa2048/' "$OUTPUT" && grep -qF '[SC]' "$OUTPUT"; then + case "$1" in + *Joe*|*Sixpack*) echo 'pub rsa2048/DBAC8DAE 2010-08-18 [SC]';; + *Rex*|*Expired*) echo 'pub rsa2048/27CE74F9 2013-07-12 [SC] [expired: 2013-07-13]';; + *Marvin*|*Paranoid*) echo 'pub rsa2048/528144E2 2011-01-16 [SC]';; + oldarchive) echo 'pub rsa1024/F68C85A3 2013-12-19 [SC]';; + newarchive) echo 'pub rsa2048/DBAC8DAE 2010-08-18 [SC]';; + *) echo 'UNKNOWN KEY';; + esac + # gpg 2.1 has a slightly different output format + elif grep -q ' rsa2048/' "$OUTPUT"; then + case "$1" in + *Joe*|*Sixpack*) echo 'pub rsa2048/DBAC8DAE 2010-08-18';; + *Rex*|*Expired*) echo 'pub rsa2048/27CE74F9 2013-07-12 [expired: 2013-07-13]';; + *Marvin*|*Paranoid*) echo 'pub rsa2048/528144E2 2011-01-16';; + oldarchive) echo 'pub rsa1024/F68C85A3 2013-12-19';; + newarchive) echo 'pub rsa2048/DBAC8DAE 2010-08-18';; + *) echo 'UNKNOWN KEY';; + esac + else + case "$1" in + *Joe*|*Sixpack*) echo 'pub 2048R/DBAC8DAE 2010-08-18';; + *Rex*|*Expired*) echo 'pub 2048R/27CE74F9 2013-07-12 [expired: 2013-07-13]';; + *Marvin*|*Paranoid*) echo 'pub 2048R/528144E2 2011-01-16';; + oldarchive) echo 'pub 1024R/F68C85A3 2013-12-19';; + newarchive) echo 'pub 2048R/DBAC8DAE 2010-08-18';; + *) echo 'UNKNOWN KEY';; + esac + fi + shift + done +} +testaptkeys() { + local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/aptkeylist.output" + if ! aptkey list | grep '^pub' > "$OUTPUT"; then + echo -n > "$OUTPUT" + fi + testfileequal "$OUTPUT" "$(createlistofkeys "$OUTPUT" "$@")" +} + pause() { echo "STOPPED execution. Press enter to continue" local IGNORE @@ -1764,6 +1834,12 @@ listcurrentlistsdirectory() { done } | sort } +forallsupportedcompressors() { + for COMP in $(aptconfig dump 'APT::Compressor' --format '%f%n' | cut -d':' -f 5 | uniq); do + if [ -z "$COMP" -o "$COMP" = '.' ]; then continue; fi + "$@" "$COMP" + done +} ### convenience hacks ### mkdir() { @@ -1790,7 +1866,7 @@ aptautotest() { local TESTCALL="$1" local CMD="$2" local FIRSTOPT="$3" - local AUTOTEST="aptautotest_$(echo "${CMD##*/}_${FIRSTOPT}" | tr -d '-')" + local AUTOTEST="aptautotest_$(echo "${CMD##*/}_${FIRSTOPT}" | tr -d -c 'A-za-z0-9')" if command -v $AUTOTEST >/dev/null; then shift 3 # save and restore the *.output files from other tests