summaryrefslogtreecommitdiffstats
path: root/debian/tests/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'debian/tests/testsuite')
-rw-r--r--debian/tests/testsuite219
1 files changed, 219 insertions, 0 deletions
diff --git a/debian/tests/testsuite b/debian/tests/testsuite
new file mode 100644
index 0000000..f8edddb
--- /dev/null
+++ b/debian/tests/testsuite
@@ -0,0 +1,219 @@
+#!/bin/sh
+
+set -exu
+
+# dump information about the autopkgtest runner
+# print to stderr to prevent wrong interleaving with set -x output
+cat /etc/debian_version >&2
+env >&2
+nproc >&2
+apt-config dump >&2
+apt-cache policy >&2
+for f in /etc/apt/sources.list /etc/apt/sources.list.d/* /etc/apt/preferences.d/*; do
+ [ -e "$f" ] || continue
+ echo "dumping contents of $f" >&2
+ cat "$f" >&2
+done
+
+# The mmdebstrap autopkgtest can take a very long time and it cannot be split
+# into multiple individual tests because they all rely on the existence of the
+# local package cache. We cannot re-generate this cache multiple times because
+# if a dinstall happens while this autopkgtest is running (not unlikely because
+# this test takes 2 hours easy) then the chroots might not be bit-by-bit
+# identical with each other anymore. Being independent of unfortunate Debian
+# mirror updates is one of the reasons the cache exists.
+#
+# By default (and this cannot be changed), a autopkgtest "test" is allowed to
+# last 10000 seconds or 2:46:40 hours. If this test takes too long, we return
+# exit code 77, marking it as "skipped".
+
+TIME_BEGIN=$(date +%s)
+
+# the archive with the highest priority where the base-files package comes from
+# determines whether we are on stable, testing or unstable
+DEFAULT_DIST=$(cat << END | python3 -
+import apt_pkg, sys
+apt_pkg.init()
+c = apt_pkg.Cache(None)
+d = apt_pkg.DepCache(c)
+s = apt_pkg.SourceList()
+s.read_main_list()
+
+highest_prio = -1
+highest_archive = None
+for pkgfile, _ in d.get_candidate_ver(c["base-files"]).file_list:
+ print("processing: %s"%pkgfile, file=sys.stderr)
+ index = s.find_index(pkgfile)
+ if index is None:
+ print("index is none -- skipping", file=sys.stderr)
+ continue
+ if not index.is_trusted:
+ print("index is not trusted -- skipping", file=sys.stderr)
+ continue
+ archive = pkgfile.archive
+ if archive not in ["stable", "testing", "unstable"]:
+ print("index archive %s is %s -- skipping"%(index, archive), file=sys.stderr)
+ continue
+ prio = d.policy.get_priority(pkgfile)
+ if prio > highest_prio:
+ highest_prio = prio
+ highest_archive = archive
+if highest_archive is None:
+ print("highest priority apt archive is neither stable, testing or unstable", file=sys.stderr)
+ for f in c.file_list:
+ print('========================', file=sys.stderr)
+ for a in ['architecture', 'archive', 'codename', 'component', 'filename', 'id', 'index_type', 'label', 'not_automatic', 'not_source', 'origin', 'site', 'size', 'version']:
+ print("%s: %s"%(a, getattr(f, a, None)), file=sys.stderr)
+ print("priority: ", d.policy.get_priority(f), file=sys.stderr)
+ exit(1)
+print("highest archive priority: %s"%highest_archive, file=sys.stderr)
+print(highest_archive)
+END
+)
+
+# On stable and testing we can run tests that require m-a:same packages to
+# exist in the same version across multiple architectures. Only on unstable we
+# disable this because packages in unstable are often out-of-sync.
+RUN_MA_SAME_TESTS=yes
+case $DEFAULT_DIST in
+ unstable)
+ RUN_MA_SAME_TESTS=no
+ ;;
+ stable|testing)
+ # nothing to do
+ ;;
+ *)
+ echo "unknown distribution $DEFAULT_DIST, must be one of stable, testing or unstable" >&2
+ ;;
+esac
+
+SRC="$(pwd)"
+
+# change to temporary directory to not interfere with the source
+cd "$AUTOPKGTEST_TMP"
+
+# coverage.sh expects the scripts to be in the current directory
+# we copy make_mirror.sh instead of symlinking it because we are going to patch
+# it
+cp -a "$SRC/make_mirror.sh" make_mirror.sh
+ln -s "$SRC/run_qemu.sh" run_qemu.sh
+ln -s "$SRC/run_null.sh" run_null.sh
+cp -a "$SRC/hooks" .
+ln -s "$SRC/coverage.sh" coverage.sh
+ln -s "$SRC/gpgvnoexpkeysig" gpgvnoexpkeysig
+ln -s "$SRC/coverage.py" coverage.py
+ln -s "$SRC/coverage.txt" coverage.txt
+ln -s "$SRC/caching_proxy.py" caching_proxy.py
+ln -s "$SRC/.perltidyrc" .perltidyrc
+ln -s "$SRC/mmdebstrap-autopkgtest-build-qemu" mmdebstrap-autopkgtest-build-qemu
+cp -a "$SRC/tests" .
+
+# on Debian Salsa CI, $AUTOPKGTEST_NORMAL_USER is empty
+if [ -z "$AUTOPKGTEST_NORMAL_USER" ]; then
+ AUTOPKGTEST_NORMAL_USER=debci
+ useradd --create-home --groups sudo "$AUTOPKGTEST_NORMAL_USER"
+# useradd --create-home --groups kvm "$AUTOPKGTEST_NORMAL_USER"
+# ls -lha /dev/kvm || true
+# lsmod | grep kvm || true
+else
+ adduser "$AUTOPKGTEST_NORMAL_USER" sudo
+# adduser "$AUTOPKGTEST_NORMAL_USER" kvm
+fi
+
+mkdir ./shared
+chown "$AUTOPKGTEST_NORMAL_USER" ./shared
+
+echo "$AUTOPKGTEST_NORMAL_USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
+
+# we cannot use mini_httpd (or most other http servers) because they perform a
+# chdir() into the directory that is to be served on startup. But later on we
+# completely remove and replace that directory when creating the Debian mirror.
+# Thus we need a really stupid server which is able to cope with having its
+# www-root being replaced under its feet.
+#mini_httpd -D -h 127.0.0.1 -p 80 -u "$AUTOPKGTEST_NORMAL_USER" -T UTF-8 -dd "$AUTOPKGTEST_TMP/shared/cache" &
+python3 -m http.server --directory="$AUTOPKGTEST_TMP/shared/cache" --bind 127.0.0.1 80 2>/dev/null &
+HTTPD_PID=$!
+trap "kill $HTTPD_PID" INT QUIT TERM EXIT
+
+# create a fake mmdebstrap file in the current directory that coverage.sh can
+# copy
+cat << END > ./mmdebstrap
+#!/usr/bin/perl
+use strict;
+use warnings;
+exit(1)
+END
+
+# must not be used during testing -- installed version must be used instead
+cat << END > ./tarfilter
+#!/usr/bin/env python3
+exit(1)
+END
+
+# add entries to /etc/subuid and /etc/subgid if they don't exist yet
+if [ ! -e /etc/subuid ] || ! grep "$AUTOPKGTEST_NORMAL_USER" /etc/subuid; then
+ echo "$AUTOPKGTEST_NORMAL_USER:100000:65536" >> /etc/subuid
+fi
+if [ ! -e /etc/subgid ] || ! grep "$AUTOPKGTEST_NORMAL_USER" /etc/subgid; then
+ echo "$AUTOPKGTEST_NORMAL_USER:100000:65536" >> /etc/subgid
+fi
+
+ret=0
+timeout 50m runuser -u "$AUTOPKGTEST_NORMAL_USER" -- env CMD=mmdebstrap DEFAULT_DIST=$DEFAULT_DIST RUN_MA_SAME_TESTS=$RUN_MA_SAME_TESTS HAVE_QEMU=no HAVE_BINFMT=no USE_HOST_APT_CONFIG=yes "$SRC/make_mirror.sh" || ret=$?
+if [ "$ret" -ne 0 ]; then
+ echo "./make_mirror.sh failed" >&2
+ exit 77
+fi
+
+# subtract 10 seconds to account for the inaccuracy in measuring time
+TIMEOUT=$((10000-$(date +%s)+$TIME_BEGIN-10))
+
+# now run the script
+# we set CMD so that Devel::Cover is not used
+# HAVE_QEMU=no because there is no kvm kernel module
+# HAVE_BINFMT=no because there is no binfmt_misc kernel module
+ret=0
+timeout $TIMEOUT runuser -u "$AUTOPKGTEST_NORMAL_USER" -- env CMD="mmdebstrap --setup-hook=$SRC/debian/tests/sourcesfilter --hook-dir=$SRC/hooks/file-mirror-automount" DEFAULT_DIST=$DEFAULT_DIST RUN_MA_SAME_TESTS=$RUN_MA_SAME_TESTS HAVE_QEMU=no HAVE_BINFMT=no USE_HOST_APT_CONFIG=yes "$SRC/coverage.sh" --exitfirst || ret=$?
+if [ "$ret" -eq 124 ]; then
+ echo "command timed out after $TIMEOUT seconds" >&2
+ exit 77
+elif [ "$ret" -ne 0 ]; then
+ exit $ret
+fi
+
+# subtract 10 seconds to account for the inaccuracy in measuring time
+TIMEOUT=$((10000-$(date +%s)+$TIME_BEGIN-10))
+
+# exit successfully if there is not enough time left
+if [ "$TIMEOUT" -lt 3000 ]; then
+ echo "skipping remaining tests due to lack of remaining time" >&2
+ exit 0
+fi
+
+du -hs ./shared
+
+# FORCE_UPDATE=yes to force rebuilding the cache
+# ONLY_HOSTARCH=yes to limit the number of downloaded content
+# RUN_MA_SAME_TESTS=no because foreign arches are missing
+ret=0
+timeout $TIMEOUT runuser -u "$AUTOPKGTEST_NORMAL_USER" -- env CMD=mmdebstrap DEFAULT_DIST=$DEFAULT_DIST ONLY_HOSTARCH=yes FORCE_UPDATE=yes RUN_MA_SAME_TESTS=no HAVE_QEMU=no HAVE_BINFMT=no "$SRC/make_mirror.sh" || ret=$?
+if [ "$ret" -ne 0 ]; then
+ echo "./make_mirror.sh failed" >&2
+ exit 77
+fi
+
+# subtract 10 seconds to account for the inaccuracy in measuring time
+TIMEOUT=$((10000-$(date +%s)+$TIME_BEGIN-10))
+
+# run only those tests that were skipped because of USE_HOST_APT_CONFIG=yes but
+# ignore if any of them fails
+# failures here are irrelevant for transition testing because they cannot
+# respect the apt pinning options given by the test environment
+SKIPPED_TESTS=$(grep-dctrl --exact-match --field Needs-APT-Config true --no-field-names --show-field=Test < coverage.txt)
+# for tar1.txt also add create-directory test
+SKIPPED_TESTS="create-directory $SKIPPED_TESTS"
+timeout $TIMEOUT runuser -u "$AUTOPKGTEST_NORMAL_USER" -- env CMD="mmdebstrap" DEFAULT_DIST=$DEFAULT_DIST RUN_MA_SAME_TESTS=no HAVE_QEMU=no HAVE_BINFMT=no "$SRC/coverage.py" --exitfirst $SKIPPED_TESTS || exit 77
+
+du -hs ./shared
+
+exit 0