X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b9b0f6222c489db78331cc8be3c093538d22c70b..eed65c79322c3c79facdea44ce39033b21972e36:/test/integration/framework?ds=sidebyside diff --git a/test/integration/framework b/test/integration/framework index dad8c99f0..7cf4d8a6d 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -4,7 +4,7 @@ EXIT_CODE=0 # we all like colorful messages if [ "$MSGCOLOR" != 'NO' ]; then - if ! expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then + if [ ! -t 1 ]; then # but check that we output to a terminal export MSGCOLOR='NO' fi fi @@ -23,30 +23,30 @@ if [ "$MSGCOLOR" != 'NO' ]; then CCMD="\033[1;35m" # pink fi -msgdie() { echo "${CERROR}E: $1${CNORMAL}" >&2; exit 1; } -msgwarn() { echo "${CWARNING}W: $1${CNORMAL}" >&2; } -msgmsg() { echo "${CMSG}$1${CNORMAL}"; } -msginfo() { echo "${CINFO}I: $1${CNORMAL}"; } -msgdebug() { echo "${CDEBUG}D: $1${CNORMAL}"; } -msgdone() { echo "${CDONE}DONE${CNORMAL}"; } -msgnwarn() { echo -n "${CWARNING}W: $1${CNORMAL}" >&2; } -msgnmsg() { echo -n "${CMSG}$1${CNORMAL}"; } -msgninfo() { echo -n "${CINFO}I: $1${CNORMAL}"; } -msgndebug() { echo -n "${CDEBUG}D: $1${CNORMAL}"; } +msgdie() { printf "${CERROR}E: $1${CNORMAL}\n" >&2; exit 1; } +msgwarn() { printf "${CWARNING}W: $1${CNORMAL}\n" >&2; } +msgmsg() { printf "${CMSG}$1${CNORMAL}\n"; } +msginfo() { printf "${CINFO}I: $1${CNORMAL}\n"; } +msgdebug() { printf "${CDEBUG}D: $1${CNORMAL}\n"; } +msgdone() { printf "${CDONE}DONE${CNORMAL}\n"; } +msgnwarn() { printf "${CWARNING}W: $1${CNORMAL}" >&2; } +msgnmsg() { printf "${CMSG}$1${CNORMAL}"; } +msgninfo() { printf "${CINFO}I: $1${CNORMAL}"; } +msgndebug() { printf "${CDEBUG}D: $1${CNORMAL}"; } msgtest() { while [ -n "$1" ]; do - echo -n "${CINFO}$1${CCMD} " - echo -n "$(echo "$2" | sed -e 's/^aptc/apt-c/' -e 's/^aptg/apt-g/' -e 's/^aptf/apt-f/')${CINFO} " + printf "${CINFO}$1${CCMD} " + printf -- "$(echo "$2" | sed -e 's#^apt\([cgfs]\)#apt-\1#')${CINFO} " shift if [ -n "$1" ]; then shift; else break; fi done - echo -n "…${CNORMAL} " + printf "…${CNORMAL} " } -msgpass() { echo "${CPASS}PASS${CNORMAL}"; } -msgskip() { echo "${CWARNING}SKIP${CNORMAL}" >&2; } +msgpass() { printf "${CPASS}PASS${CNORMAL}\n"; } +msgskip() { printf "${CWARNING}SKIP${CNORMAL}\n" >&2; } msgfail() { - if [ $# -gt 0 ]; then echo "${CFAIL}FAIL: $*${CNORMAL}" >&2; - else echo "${CFAIL}FAIL${CNORMAL}" >&2; fi + if [ $# -gt 0 ]; then printf "${CFAIL}FAIL: $*${CNORMAL}\n" >&2; + else printf "${CFAIL}FAIL${CNORMAL}\n" >&2; fi EXIT_CODE=$((EXIT_CODE+1)); } @@ -63,12 +63,12 @@ if [ $MSGLEVEL -le 2 ]; then msgmsg() { true; } msgnmsg() { true; } msgtest() { true; } - msgpass() { echo -n " ${CPASS}P${CNORMAL}"; } - msgskip() { echo -n " ${CWARNING}S${CNORMAL}" >&2; } + msgpass() { printf " ${CPASS}P${CNORMAL}"; } + msgskip() { printf " ${CWARNING}S${CNORMAL}" >&2; } if [ -n "$CFAIL" ]; then - msgfail() { echo -n " ${CFAIL}FAIL${CNORMAL}" >&2; EXIT_CODE=$((EXIT_CODE+1)); } + msgfail() { printf " ${CFAIL}FAIL${CNORMAL}" >&2; EXIT_CODE=$((EXIT_CODE+1)); } else - msgfail() { echo -n " ###FAILED###" >&2; EXIT_CODE=$((EXIT_CODE+1)); } + msgfail() { printf " ###FAILED###" >&2; EXIT_CODE=$((EXIT_CODE+1)); } fi fi if [ $MSGLEVEL -le 3 ]; then @@ -87,22 +87,25 @@ msgdone() { [ "$1" = "die" -a $MSGLEVEL -le 0 ]; then true; else - echo "${CDONE}DONE${CNORMAL}"; + printf "${CDONE}DONE${CNORMAL}\n"; fi } - +getaptconfig() { + if [ -f ./aptconfig.conf ]; then + echo "./aptconfig.conf" + elif [ -f ../aptconfig.conf ]; then + echo "../aptconfig.conf" + fi +} runapt() { msgdebug "Executing: ${CCMD}$*${CDEBUG} " - local CMD="${BUILDDIRECTORY}/$1" - if [ "$1" = 'sh' ]; then CMD='sh'; fi + local CMD="$1" shift - if [ -f ./aptconfig.conf ]; then - MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} $CMD "$@" - elif [ -f ../aptconfig.conf ]; then - MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} $CMD "$@" - else - MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=${BUILDDIRECTORY} $CMD "$@" - fi + case $CMD in + sh|aptitude|*/*|command) ;; + *) CMD="${BUILDDIRECTORY}/$CMD";; + esac + MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${LIBRARYPATH} $CMD "$@" } aptconfig() { runapt apt-config "$@"; } aptcache() { runapt apt-cache "$@"; } @@ -111,34 +114,24 @@ aptget() { runapt apt-get "$@"; } aptftparchive() { runapt apt-ftparchive "$@"; } aptkey() { runapt apt-key "$@"; } aptmark() { runapt apt-mark "$@"; } +aptsortpkgs() { runapt apt-sortpkgs "$@"; } apt() { runapt apt "$@"; } -apthelper() { - LD_LIBRARY_PATH=${APTHELPERBINDIR} ${APTHELPERBINDIR}/apt-helper "$@"; -} -aptwebserver() { - LD_LIBRARY_PATH=${APTWEBSERVERBINDIR} ${APTWEBSERVERBINDIR}/aptwebserver "$@"; -} +apthelper() { runapt "${APTHELPERBINDIR}/apt-helper" "$@"; } +aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; } +aptitude() { runapt aptitude "$@"; } +aptextracttemplates() { runapt apt-extracttemplates "$@"; } +aptinternalsolver() { runapt "${APTINTERNALSOLVER}" "$@"; } + dpkg() { command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@" } dpkgcheckbuilddeps() { command dpkg-checkbuilddeps --admindir=${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg "$@" } -aptitude() { - if [ -f ./aptconfig.conf ]; then - APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command aptitude "$@" - elif [ -f ../aptconfig.conf ]; then - APT_CONFIG=../aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command aptitude "$@" - else - LD_LIBRARY_PATH=${BUILDDIRECTORY} command aptitude "$@" - fi -} gdb() { - echo "gdb: run »$*«" - APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${BUILDDIRECTORY} command gdb ${BUILDDIRECTORY}/$1 --args "$@" -} -http() { - LD_LIBRARY_PATH=${BUILDDIRECTORY} ${BUILDDIRECTORY}/methods/http + local CMD="$1" + shift + runapt command gdb --quiet -ex run "${BUILDDIRECTORY}/$CMD" --args "${BUILDDIRECTORY}/$CMD" "$@" } gpg() { # see apt-key for the whole trickery. Setup is done in setupenvironment @@ -160,7 +153,7 @@ exitwithstatus() { shellsetedetector() { local exit_status=$? if [ "$exit_status" != '0' ]; then - echo >&2 "${CERROR}E: Looks like the testcases ended prematurely with exitcode: ${exit_status}${CNORMAL}" + printf >&2 "${CERROR}E: Looks like the testcases ended prematurely with exitcode: ${exit_status}${CNORMAL}\n" if [ "$EXIT_CODE" = '0' ]; then EXIT_CODE="$exit_status" fi @@ -183,9 +176,11 @@ setupenvironment() { # allow overriding the default BUILDDIR location BUILDDIRECTORY=${APT_INTEGRATION_TESTS_BUILD_DIR:-"${TESTDIRECTORY}/../../build/bin"} + LIBRARYPATH=${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}"} METHODSDIR=${APT_INTEGRATION_TESTS_METHODS_DIR:-"${BUILDDIRECTORY}/methods"} APTHELPERBINDIR=${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"} APTWEBSERVERBINDIR=${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}"} + APTINTERNALSOLVER=${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/apt-internal-solver"} test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first" # ----- @@ -194,12 +189,24 @@ setupenvironment() { 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 - mkdir -p var/cache var/lib var/log tmp + mkdir -p var/cache var/lib/apt var/log tmp mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers touch var/lib/dpkg/available mkdir -p usr/lib/apt ln -s ${METHODSDIR} usr/lib/apt/methods - ln -s ${BUILDDIRECTORY}/../../debian/apt.conf.autoremove etc/apt/apt.conf.d/01autoremove + if [ "$BUILDDIRECTORY" = "$LIBRARYPATH" ]; then + mkdir -p usr/lib/apt/solvers + ln -s "${BUILDDIRECTORY}/apt-dump-solver" usr/lib/apt/solvers/dump + ln -s "${BUILDDIRECTORY}/apt-internal-solver" usr/lib/apt/solvers/apt + echo "Dir::Bin::Solvers \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/solvers\";" > etc/apt/apt.conf.d/externalsolver.conf + fi + # use the autoremove from the BUILDDIRECTORY if its there, otherwise + # system + if [ -e ${BUILDDIRECTORY}/../../debian/apt.conf.autoremove ]; then + ln -s ${BUILDDIRECTORY}/../../debian/apt.conf.autoremove etc/apt/apt.conf.d/01autoremove + else + ln -s /etc/apt/apt.conf.d/01autoremove etc/apt/apt.conf.d/01autoremove + fi cd .. local PACKAGESFILE=$(echo "$(basename $0)" | sed -e 's/^test-/Packages-/' -e 's/^skip-/Packages-/') if [ -f "${TESTDIRECTORY}/${PACKAGESFILE}" ]; then @@ -226,6 +233,7 @@ setupenvironment() { fi echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf echo 'quiet::NoUpdate "true";' >> aptconfig.conf + echo 'quiet::NoStatistic "true";' >> aptconfig.conf echo "Acquire::https::CaInfo \"${TESTDIR}/apt.pem\";" > rootdir/etc/apt/apt.conf.d/99https echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary configcompression '.' 'gz' #'bz2' 'lzma' 'xz' @@ -244,9 +252,10 @@ setupenvironment() { gpg --quiet --check-trustdb --secret-keyring $SECRETKEYRING --keyring $SECRETKEYRING >/dev/null 2>&1 # cleanup the environment a bit - export PATH="${PATH}:/usr/local/sbin:/usr/sbin:/sbin" + # prefer our apt binaries over the system apt binaries + export PATH="${BUILDDIRECTORY}:${PATH}:/usr/local/sbin:/usr/sbin:/sbin" export LC_ALL=C.UTF-8 - unset LANGUAGE + unset LANGUAGE APT_CONFIG unset GREP_OPTIONS DEB_BUILD_PROFILES msgdone "info" @@ -269,6 +278,10 @@ getarchitectures() { echo "$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')" } +getarchitecturesfromcommalist() { + echo "$1" | sed -e 's#,#\n#g' | sed -e "s/^native\$/$(getarchitecture 'native')/" +} + configarchitecture() { { echo "APT::Architecture \"$(getarchitecture $1)\";" @@ -315,12 +328,12 @@ configdpkg() { configcompression() { while [ -n "$1" ]; do case "$1" in - '.') echo ".\t.\tcat";; - 'gz') echo "gzip\tgz\tgzip";; - 'bz2') echo "bzip2\tbz2\tbzip2";; - 'lzma') echo "lzma\tlzma\txz --format=lzma";; - 'xz') echo "xz\txz\txz";; - *) echo "$1\t$1\t$1";; + '.') 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";; esac shift done > ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf @@ -442,7 +455,7 @@ Package: $NAME" >> ${BUILDDIR}/debian/control # fi done - for arch in $(echo "$ARCH" | sed -e 's#,#\n#g' | sed -e "s#^native\$#$(getarchitecture 'native')#"); do + for arch in $(getarchitecturesfromcommalist "$ARCH"); do rm -rf ${BUILDDIR}/debian/tmp mkdir -p ${BUILDDIR}/debian/tmp/DEBIAN ${BUILDDIR}/debian/tmp/usr/share/doc/${NAME} ${BUILDDIR}/debian/tmp/usr/bin cp ${BUILDDIR}/debian/copyright ${BUILDDIR}/debian/changelog ${BUILDDIR}/FEATURES ${BUILDDIR}/debian/tmp/usr/share/doc/${NAME} @@ -597,7 +610,7 @@ insertpackage() { something went horribly wrong! They are autogenerated und used only by testcases and surf no other propose…"}" local ARCHS="" - for arch in $(echo "$ARCH" | sed -e 's#,#\n#g' | sed -e "s#^native\$#$(getarchitecture 'native')#"); do + for arch in $(getarchitecturesfromcommalist "$ARCH"); do if [ "$arch" = 'all' -o "$arch" = 'none' ]; then ARCHS="$(getarchitectures)" else @@ -659,7 +672,7 @@ insertinstalledpackage() { local FILE='rootdir/var/lib/dpkg/status' local INFO='rootdir/var/lib/dpkg/info' - for arch in $(echo "$ARCH" | sed -e 's#,#\n#g' | sed -e "s#^native\$#$(getarchitecture 'native')#"); do + for arch in $(getarchitecturesfromcommalist "$ARCH"); do echo "Package: $NAME Status: $STATUS Priority: $PRIORITY @@ -884,6 +897,20 @@ rewritesourceslist() { done } +# wait for up to 10s for a pid file to appear to avoid possible race +# when a helper is started and dosn't write the PID quick enough +waitforpidfile() { + local PIDFILE="$1" + for i in $(seq 10); do + if test -s "$PIDFILE"; then + return 0 + fi + sleep 1 + done + msgdie "waiting for $PIDFILE failed" + return 1 +} + changetowebserver() { if [ "$1" != '--no-rewrite' ]; then rewritesourceslist 'http://localhost:8080/' @@ -897,6 +924,7 @@ changetowebserver() { cat $LOG false fi + waitforpidfile aptwebserver.pid local PID="$(cat aptwebserver.pid)" if [ -z "$PID" ]; then msgdie 'Could not fork aptwebserver successfully' @@ -924,7 +952,11 @@ accept = 4433 connect = 8080 " > ${TMPWORKINGDIRECTORY}/stunnel.conf stunnel4 "${TMPWORKINGDIRECTORY}/stunnel.conf" + waitforpidfile "${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid" local PID="$(cat ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid)" + if [ -z "$PID" ]; then + msgdie 'Could not fork stunnel4 successfully' + fi addtrap 'prefix' "kill ${PID};" rewritesourceslist 'https://localhost:4433/' } @@ -953,8 +985,7 @@ acquire::cdrom::autodetect 0;" > rootdir/etc/apt/apt.conf.d/00cdrom downloadfile() { local PROTO="$(echo "$1" | cut -d':' -f 1 )" - apthelper -o Acquire::https::CaInfo=${TESTDIR}/apt.pem \ - -o Debug::Acquire::${PROTO}=1 \ + apthelper -o Debug::Acquire::${PROTO}=1 \ download-file "$1" "$2" 2>&1 || true # only if the file exists the download was successful if [ -e "$2" ]; then @@ -988,7 +1019,13 @@ testfileequal() { testempty() { msgtest "Test for no output of" "$*" - test -z "$($* 2>&1)" && msgpass || msgfail + local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile" + if $* >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then + msgpass + else + cat $COMPAREFILE + msgfail + fi } testequal() {