]> git.saurik.com Git - apt.git/blobdiff - test/integration/framework
implement socks5h proxy support for http method
[apt.git] / test / integration / framework
index 4aa89cf203f8c848ddc9e1d6a4bce93a2dd47f37..0f442dff43bdf08b25ddc78ed2b9d78012580a84 100644 (file)
@@ -180,7 +180,7 @@ aptconfig() { runapt apt-config "$@"; }
 aptcache() { runapt apt-cache "$@"; }
 aptcdrom() { runapt apt-cdrom "$@"; }
 aptget() { runapt apt-get "$@"; }
-aptftparchive() { runapt apt-ftparchive "$@"; }
+aptftparchive() { runapt "${APTFTPARCHIVEBINDIR}/apt-ftparchive" "$@"; }
 aptkey() { runapt apt-key "$@"; }
 aptmark() { runapt apt-mark "$@"; }
 aptsortpkgs() { runapt apt-sortpkgs "$@"; }
@@ -257,6 +257,24 @@ escape_shell() {
     echo "$@" | sed -e "s#'#'\"'\"'#g"
 }
 
+find_project_binary_dir() {
+       local TESTDIRECTORY="$(readlink -f "$(dirname $0)")"
+       if [ -z "$PROJECT_BINARY_DIR" ]; then
+               PROJECT_BINARY_DIR=
+               for dir in ${TESTDIRECTORY}/../../ ${TESTDIRECTORY}/../../*; do
+                       test -e "$dir/CMakeCache.txt"  || continue
+                       if [ -z "$PROJECT_BINARY_DIR" ] ||
+                          [ "$dir/CMakeCache.txt" -nt "$PROJECT_BINARY_DIR/CMakeCache.txt" ]; then
+                               PROJECT_BINARY_DIR="$dir"
+                       fi
+               done
+               if [ -z "$PROJECT_BINARY_DIR" ]; then
+                       echo "Cannot find build directory, you might want to set PROJECT_BINARY_DIR" >&2
+                       exit 1
+               fi
+               export PROJECT_BINARY_DIR
+       fi
+}
 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
@@ -281,16 +299,19 @@ setupenvironment() {
        fi
 
        TESTDIRECTORY="$(readlink -f "$(dirname $0)")"
+       # Find the newest build directory (sets PROJECT_BINARY_DIR)
+       find_project_binary_dir
         # allow overriding the default BUILDDIR location
        SOURCEDIRECTORY="${APT_INTEGRATION_TESTS_SOURCE_DIR:-"${TESTDIRECTORY}/../../"}"
-       BUILDDIRECTORY="${APT_INTEGRATION_TESTS_BUILD_DIR:-"${TESTDIRECTORY}/../../build/bin"}"
-       LIBRARYPATH="${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}"}"
-        METHODSDIR="${APT_INTEGRATION_TESTS_METHODS_DIR:-"${BUILDDIRECTORY}/methods"}"
+       BUILDDIRECTORY="${APT_INTEGRATION_TESTS_BUILD_DIR:-"${PROJECT_BINARY_DIR}/cmdline"}"
+       LIBRARYPATH="${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}/../apt-pkg"}"
+        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"}"
-       APTDUMPSOLVER="${APT_INTEGRATION_TESTS_DUMP_SOLVER:-"${BUILDDIRECTORY}/apt-dump-solver"}"
-       APTINTERNALPLANNER="${APT_INTEGRATION_TESTS_INTERNAL_PLANNER:-"${BUILDDIRECTORY}/apt-internal-planner"}"
+        APTWEBSERVERBINDIR="${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}/../test/interactive-helper"}"
+        APTFTPARCHIVEBINDIR="${APT_INTEGRATION_TESTS_FTPARCHIVE_BIN_DIR:-"${BUILDDIRECTORY}/../ftparchive"}"
+        APTINTERNALSOLVER="${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/solvers/apt"}"
+       APTDUMPSOLVER="${APT_INTEGRATION_TESTS_DUMP_SOLVER:-"${BUILDDIRECTORY}/solvers/dump"}"
+       APTINTERNALPLANNER="${APT_INTEGRATION_TESTS_INTERNAL_PLANNER:-"${BUILDDIRECTORY}/planners/apt"}"
        test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first"
         # -----
 
@@ -298,20 +319,17 @@ 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 usr/bin var/cache var/lib var/log tmp
+       mkdir -p usr/bin var/cache var/lib var/log var/crash tmp
        mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers
+       mkdir -p usr/lib/apt/solvers usr/lib/apt/planners
        touch var/lib/dpkg/available
-       mkdir -p usr/lib/apt
        ln -s "${METHODSDIR}" usr/lib/apt/methods
-       if [ "$BUILDDIRECTORY" = "$LIBRARYPATH" ]; then
-               mkdir -p usr/lib/apt/solvers usr/lib/apt/planners
-               ln -s "${BUILDDIRECTORY}/apt-dump-solver" usr/lib/apt/solvers/dump
-               ln -s "${BUILDDIRECTORY}/apt-dump-solver" usr/lib/apt/planners/dump
-               ln -s "${BUILDDIRECTORY}/apt-internal-solver" usr/lib/apt/solvers/apt
-               ln -s "${BUILDDIRECTORY}/apt-internal-planner" usr/lib/apt/planners/apt
-               echo "Dir::Bin::Solvers \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/solvers\";" >> ../aptconfig.conf
-               echo "Dir::Bin::Planners \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/planners\";" >> ../aptconfig.conf
-       fi
+       ln -s "${APTDUMPSOLVER}" usr/lib/apt/solvers/dump
+       ln -s "${APTDUMPSOLVER}" usr/lib/apt/planners/dump
+       ln -s "${APTINTERNALSOLVER}" usr/lib/apt/solvers/apt
+       ln -s "${APTINTERNALPLANNER}" usr/lib/apt/planners/apt
+       echo "Dir::Bin::Solvers \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/solvers\";" >> ../aptconfig.conf
+       echo "Dir::Bin::Planners \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/planners\";" >> ../aptconfig.conf
         # use the autoremove from the BUILDDIRECTORY if its there, otherwise
         # system
         if [ -e "${BUILDDIRECTORY}/../../debian/apt.conf.autoremove" ]; then
@@ -334,7 +352,6 @@ setupenvironment() {
        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 "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf
        echo "Dir::Bin::Methods \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/methods\";" >> aptconfig.conf
        # either store apt-key were we can access it, even if we run it as a different user
@@ -433,6 +450,10 @@ EOF
        # most tests just need one signed Release file, not both
        export APT_DONT_SIGN='Release.gpg'
 
+       if [ -r "${TESTDIRECTORY}/extra-environment" ]; then
+               . "${TESTDIRECTORY}/extra-environment"
+       fi
+
        msgdone "info"
 }
 
@@ -481,17 +502,21 @@ configdpkg() {
        rm -f rootdir/etc/apt/apt.conf.d/00foreigndpkg
        if command dpkg --assert-multi-arch >/dev/null 2>&1 ; then
                local ARCHS="$(getarchitectures)"
-               if echo "$ARCHS" | grep -E -q '[^ ]+ [^ ]+'; then
-                       DPKGARCH="$(dpkg --print-architecture)"
-                       for ARCH in ${ARCHS}; do
-                               if [ "${ARCH}" != "${DPKGARCH}" ]; then
-                                       if ! dpkg --add-architecture ${ARCH} >/dev/null 2>&1; then
-                                               # old-style used e.g. in Ubuntu-P – and as it seems travis
-                                               echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
-                                               echo "DPKG::options:: \"${ARCH}\";"  >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
-                                       fi
+               local DPKGARCH="$(dpkg --print-architecture)"
+               # this ensures that even if multi-arch isn't active in the view
+               # of apt, given that dpkg can't be told which arch is native
+               # the arch apt treats as native might be foreign for dpkg
+               for ARCH in ${ARCHS}; do
+                       if [ "${ARCH}" != "${DPKGARCH}" ]; then
+                               if ! dpkg --add-architecture ${ARCH} >/dev/null 2>&1; then
+                                       # old-style used e.g. in Ubuntu-P – and as it seems travis
+                                       echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
+                                       echo "DPKG::options:: \"${ARCH}\";"  >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
                                fi
-                       done
+                       fi
+               done
+               # if multi-arch make sure dpkg can detect itself as capable of it
+               if echo "$ARCHS" | grep -E -q '[^ ]+ [^ ]+'; then
                        if [ "0" = "$(dpkg -l dpkg 2> /dev/null | grep '^i' | wc -l)" ]; then
                                # dpkg doesn't really check the version as long as it is fully installed,
                                # but just to be sure we choose one above the required version
@@ -1882,6 +1907,11 @@ pause() {
        read IGNORE
 }
 
+logcurrentarchivedirectory() {
+       find "${TMPWORKINGDIRECTORY}/aptarchive/dists" -type f | while read line; do
+               stat --format '%U:%G:%a:%n' "$line"
+       done | sort > "${TMPWORKINGDIRECTORY}/rootdir/var/log/aptgetupdate.before.lst"
+}
 listcurrentlistsdirectory() {
        {
                find rootdir/var/lib/apt/lists -maxdepth 1 -type d | while read line; do
@@ -1922,12 +1952,20 @@ mkdir() {
 ### general things about commands executed without writing the test every time.
 
 aptautotest() {
+       if [ $# -lt 3 ]; then return; fi
        local TESTCALL="$1"
        local CMD="$2"
        local FIRSTOPT="$3"
+       shift 2
+       for i in "$@"; do
+               if ! expr match "$i" '^-' >/dev/null 2>&1; then
+                       FIRSTOPT="$i"
+                       break
+               fi
+       done
+       shift
        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
                # as we might otherwise override them in these automatic tests
                rm -rf "${TMPWORKINGDIRECTORY}/rootdir/tmp-before"
@@ -1960,6 +1998,10 @@ aptautotest_aptget_update() {
                # failure cases can retain partial files and such
                testempty find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" -mindepth 1 ! \( -name 'lock' -o -name '*.FAILED' \)
        fi
+       if [ -s "${TMPWORKINGDIRECTORY}/rootdir/var/log/aptgetupdate.before.lst" ]; then
+               testfileequal "${TMPWORKINGDIRECTORY}/rootdir/var/log/aptgetupdate.before.lst" \
+                       "$(find "${TMPWORKINGDIRECTORY}/aptarchive/dists" -type f | while read line; do stat --format '%U:%G:%a:%n' "$line"; done | sort)"
+       fi
 }
 aptautotest_apt_update() { aptautotest_aptget_update "$@"; }
 aptautotest_aptcdrom_add() { aptautotest_aptget_update "$@"; }
@@ -1980,3 +2022,11 @@ aptautotest_aptget_purge() { testaptautotestnodpkgwarning "$@"; }
 aptautotest_apt_install() { testaptautotestnodpkgwarning "$@"; }
 aptautotest_apt_remove() { testaptautotestnodpkgwarning "$@"; }
 aptautotest_apt_purge() { testaptautotestnodpkgwarning "$@"; }
+
+testaptmarknodefaultsections() {
+       testfailure grep '^Auto-Installed: 0$' "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/extended_states"
+}
+aptautotest_aptmark_auto() { testaptmarknodefaultsections "$@"; }
+aptautotest_aptmark_manual() { testaptmarknodefaultsections "$@"; }
+aptautotest_aptget_markauto() { testaptmarknodefaultsections "$@"; }
+aptautotest_aptget_markmanual() { testaptmarknodefaultsections "$@"; }