X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/d27daedb6a0bf672508072100f20233d08ccf0e0..37ca1f876972e35b979ebd5ee78bb0e2623f011f:/test/integration/framework diff --git a/test/integration/framework b/test/integration/framework index 8ea1e1c0d..c547032c2 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" < #include #include -#include static char * chrootdir = NULL; @@ -494,26 +502,31 @@ int execvp(const char *file, char *const argv[]) { if (chrootdir == NULL || strncmp(file, "/var/lib/dpkg/", strlen("/var/lib/dpkg/")) != 0) return func_execvp(file, argv); printf("REWRITE execvp call %s into %s\n", file, chrootdir); - char newfile[PATH_MAX]; - snprintf(newfile, sizeof(newfile), "%s/%s", chrootdir, file); + char *newfile; + if (asprintf(&newfile, "%s%s", chrootdir, file) == -1) { + perror("asprintf"); + return -1; + } char const * const baseadmindir = "/var/lib/dpkg"; - char admindir[PATH_MAX]; - snprintf(admindir, sizeof(admindir), "%s/%s", chrootdir, baseadmindir); + char *admindir; + if (asprintf(&admindir, "%s%s", chrootdir, baseadmindir) == -1) { + perror("asprintf"); + return -1; + } setenv("DPKG_ADMINDIR", admindir, 1); return func_execvp(newfile, argv); } EOF - testsuccess --nomsg gcc -fPIC -shared -o noopchroot.so noopchroot.c -ldl + testsuccess --nomsg gcc -Wall -fPIC -shared -o noopchroot.so noopchroot.c -ldl } configcompression() { + local CMD='apthelper cat-file -C' while [ -n "$1" ]; do case "$1" in '.') printf ".\t.\tcat\n";; - 'gz') printf "gzip\tgz\tgzip\n";; - 'bz2') printf "bzip2\tbz2\tbzip2\n";; - 'lzma') printf "lzma\tlzma\txz --format=lzma\n";; - 'xz') printf "xz\txz\txz\n";; - *) printf "$1\t$1\t$1\n";; + 'gz') printf "gzip\tgz\t$CMD $1\n";; + 'bz2') printf "bzip2\tbz2\t$CMD $1\n";; + *) printf "$1\t$1\t$CMD $1\n";; esac shift done > "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" @@ -536,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() { @@ -1094,9 +1090,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 @@ -1180,7 +1176,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 @@ -1250,7 +1246,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 } @@ -1763,6 +1759,41 @@ testwebserverlaststatuscode() { msggroup } +createlistofkeys() { + local OUTPUT="$1" + shift + while [ -n "$1" ]; do + # gpg 2.1 has a slightly different output format + if 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 @@ -1779,6 +1810,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() { @@ -1805,7 +1842,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