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
- # store apt-key were we can access it, even if we run it as a different user
- # destroys coverage reporting though, so just do it for root for now
+ # either store apt-key were we can access it, even if we run it as a different user
+ #cp "${BUILDDIRECTORY}/apt-key" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/"
+ #chmod o+rx "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key"
+ #echo "Dir::Bin::apt-key \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key\";" >> aptconfig.conf
+ # destroys coverage reporting though, so we disable changing user for the calling gpgv
+ echo "Dir::Bin::apt-key \"${BUILDDIRECTORY}/apt-key\";" >> aptconfig.conf
if [ "$(id -u)" = '0' ]; then
- cp "${BUILDDIRECTORY}/apt-key" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/"
- chmod o+rx "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key"
- echo "Dir::Bin::apt-key \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key\";" >> aptconfig.conf
- else
- echo "Dir::Bin::apt-key \"${BUILDDIRECTORY}/apt-key\";" >> aptconfig.conf
+ echo 'Binary::gpgv::Debug::NoDropPrivs "true";' >>aptconfig.conf
fi
cat > "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" <<EOF
if ! command dpkg --assert-multi-arch >/dev/null 2>&1; then
echo "DPKG::options:: \"--force-architecture\";" # Added to test multiarch before dpkg is ready for it…
fi
+ echo 'quiet "0";'
echo 'quiet::NoUpdate "true";'
echo 'quiet::NoStatistic "true";'
# too distracting for users, but helpful to detect changes
# in testcases, it can appear as if localhost has a rotation setup,
# hide this as we can't really deal with it properly
echo 'Acquire::Failure::ShowIP "false";'
+ # fakeroot can't fake everything, so disabled in production but good for tests
+ echo 'APT::Sandbox::Verify "true";'
} >> aptconfig.conf
cp "${TESTDIRECTORY}/apt.pem" "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem"
fi
echo "Acquire::https::CaInfo \"${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem\";" > rootdir/etc/apt/apt.conf.d/99https
echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary
+ echo 'Acquire::Connect::AddrConfig "false";' > rootdir/etc/apt/apt.conf.d/connect-addrconfig
configcompression '.' 'gz' #'bz2' 'lzma' 'xz'
confighashes 'SHA1' # these are tests, not security best-practices
# create some files in /tmp and look at user/group to get what this means
- TEST_DEFAULT_USER="$USER"
+ TEST_DEFAULT_USER="$(id -un)"
if [ "$(uname)" = 'GNU/kFreeBSD' ]; then
TEST_DEFAULT_GROUP='root'
else
- TEST_DEFAULT_GROUP="$USER"
+ TEST_DEFAULT_GROUP="$(id -gn)"
fi
# cleanup the environment a bit
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
+#include <limits.h>
static char * chrootdir = NULL;
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[strlen(chrootdir) + strlen(file)];
- strcpy(newfile, chrootdir);
- strcat(newfile, file);
+ char newfile[PATH_MAX];
+ snprintf(newfile, sizeof(newfile), "%s/%s", chrootdir, file);
char const * const baseadmindir = "/var/lib/dpkg";
- char admindir[strlen(chrootdir) + strlen(baseadmindir)];
- strcpy(admindir, chrootdir);
- strcat(admindir, baseadmindir);
+ char admindir[PATH_MAX];
+ snprintf(admindir, sizeof(admindir), "%s/%s", chrootdir, baseadmindir);
setenv("DPKG_ADMINDIR", admindir, 1);
return func_execvp(newfile, argv);
}
local DESCRIPTION="${6:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE}
If you find such a package installed on your system,
something went horribly wrong! They are autogenerated
- und used only by testcases and surf no other propose…"}"
+ und used only by testcases and serve no other purpose…"}"
local SECTION="${7:-others}"
local DISTSECTION
local DESCRIPTION="${6:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE}
If you find such a package installed on your system,
something went horribly wrong! They are autogenerated
- und used only by testcases and surf no other propose…"}"
+ und used only by testcases and serve no other purpose…"}"
local SECTION="${7:-others}"
local PRIORITY="${8:-optional}"
local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASES}
If you find such a package installed on your system,
something went horribly wrong! They are autogenerated
- und used only by testcases and surf no other propose…"}"
+ und used only by testcases and serve no other purpose…"}"
local ARCHS=""
for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do
if [ "$RELEASE" = 'installed' ]; then
local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/installed
If you find such a package installed on your system,
something went horribly wrong! They are autogenerated
- und used only by testcases and surf no other propose…"}"
+ und used only by testcases and serve no other purpose…"}"
local FILE='rootdir/var/lib/dpkg/status'
local INFO='rootdir/var/lib/dpkg/info'
# both should be given in notation date/touch can understand
local DATE="$1"
local VALIDUNTIL="$2"
- msgninfo "\tGenerate Release files… "
if [ -e aptarchive/dists ]; then
+ msgninfo "\tGenerate Release files for dists… "
for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do
local ARCHITECTURES="$(getarchitecturesfromreleasefile "$dir")"
local SUITE="$(echo "$dir" | cut -d'/' -f 4)"
local VERSION="$(getreleaseversionfromsuite $SUITE)"
local LABEL="$(getlabelfromsuite $SUITE)"
local ORIGIN="$(getoriginfromsuite $SUITE)"
- if [ -n "$VERSION" ]; then
- VERSION="-o APT::FTPArchive::Release::Version=${VERSION}"
- fi
- if [ -n "$LABEL" ]; then
- LABEL="-o APT::FTPArchive::Release::Label=${LABEL}"
- fi
- if [ -n "$ORIGIN" ]; then
- ORIGIN="-o APT::FTPArchive::Release::Origin=${ORIGIN}"
- fi
- if [ -n "$ARCHITECTURES" ]; then
- ARCHITECTURES="-o APT::FTPArchive::Release::Architectures=${ARCHITECTURES}"
- fi
aptftparchiverelease "$dir" \
-o APT::FTPArchive::Release::Suite="${SUITE}" \
-o APT::FTPArchive::Release::Codename="${CODENAME}" \
- ${ARCHITECTURES} \
- ${LABEL} \
- ${ORIGIN} \
- ${VERSION} \
+ -o APT::FTPArchive::Release::Architectures="${ARCHITECTURES}" \
+ -o APT::FTPArchive::Release::Label="${LABEL}" \
+ -o APT::FTPArchive::Release::Origin="${ORIGIN}" \
+ -o APT::FTPArchive::Release::Version="${VERSION}" \
> "$dir/Release"
if [ "$SUITE" = "experimental" -o "$SUITE" = "experimental2" ]; then
sed -i '/^Date: / a\
fi
done
else
+ msgninfo "\tGenerate Release files for flat… "
aptftparchiverelease ./aptarchive > aptarchive/Release
fi
if [ -n "$DATE" -a "$DATE" != "now" ]; then
fi
cd - > /dev/null
else
- msgdie 'You have to build aptwerbserver or install a webserver'
+ msgdie 'You have to build apt from source to have test/interactive-helper/aptwebserver available for tests requiring a webserver'
fi
if [ "$REWRTE" != 'yes' ]; then
rewritesourceslist "http://localhost:${APTHTTPPORT}/"
}
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
local ARCH="$(getarchitecture 'native')"
echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' >"$COMPAREFILE"
local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testshowvirtual.output"
- testoutputequal "$COMPAREFILE" aptcache show -q=0 "$PACKAGE"
+ testoutputequal "$COMPAREFILE" aptcache show "$PACKAGE"
msggroup
}
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'
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
msgfail "$MSG"
}
-testsuccess() {
- msggroup 'testsuccess'
+testsuccesswithglobalerror() {
+ local TYPE="$1"
+ local ERRORS="$2"
+ shift 2
+ msggroup "$TYPE"
if [ "$1" = '--nomsg' ]; then
shift
else
msgtest 'Test for successful execution of' "$*"
fi
- local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/${TYPE}.output"
if "$@" >"${OUTPUT}" 2>&1; then
if expr match "$1" '^apt.*' >/dev/null; then
if grep -q -E ' runtime error: ' "$OUTPUT"; then
msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
- elif grep -E '^[WE]: ' "$OUTPUT" > "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" 2>&1; then
+ elif grep -E "^[${ERRORS}]: " "$OUTPUT" > "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" 2>&1; then
if [ "$IGNORE_PTY_NOT_MOUNTED" = '1' ]; then
if echo 'E: Can not write log (Is /dev/pts mounted?) - posix_openpt (2: No such file or directory)' \
| cmp - "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" >/dev/null 2>&1; then
else
msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@"
fi
+ elif [ "$TYPE" = 'testsuccesswithnotice' ]; then
+ if grep -q -E "^N: " "$OUTPUT"; then
+ msgpass
+ else
+ msgfailoutput 'successful run, but output had no notices' "$OUTPUT" "$@"
+ fi
else
msgpass
fi
local EXITCODE=$?
msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
fi
- aptautotest 'testsuccess' "$@"
+ aptautotest "$TYPE" "$@"
msggroup
}
+testsuccesswithnotice() {
+ testsuccesswithglobalerror 'testsuccesswithnotice' 'WE' "$@"
+}
+testsuccess() {
+ testsuccesswithglobalerror 'testsuccess' 'NWE' "$@"
+}
testwarning() {
msggroup 'testwarning'
if [ "$1" = '--nomsg' ]; then
testreturnstateequal() {
local STATE="$1"
- msggroup "${STATE}equal"
- if [ "$2" != '--nomsg' ]; then
- local CMP="$2"
- shift 2
- "$STATE" "$@"
- testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
- else
- local CMP="$3"
+ if [ "$STATE" = 'testsuccesswithglobalerror' ]; then
+ local STATE="$2"
+ local TYPE="$3"
shift 3
- "$STATE" --nomsg "$@"
- testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ msggroup "${STATE}equal"
+ if [ "$1" != '--nomsg' ]; then
+ local CMP="$1"
+ shift
+ testsuccesswithglobalerror "$STATE" "$TYPE" "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ else
+ local CMP="$2"
+ shift 2
+ testsuccesswithglobalerror "$STATE" "$TYPE" "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ fi
+ else
+ msggroup "${STATE}equal"
+ if [ "$2" != '--nomsg' ]; then
+ local CMP="$2"
+ shift 2
+ "$STATE" "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ else
+ local CMP="$3"
+ shift 3
+ "$STATE" --nomsg "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ fi
fi
msggroup
}
testsuccessequal() {
- testreturnstateequal 'testsuccess' "$@"
+ # we compare output, so we know perfectly well about N:
+ testreturnstateequal 'testsuccesswithglobalerror' 'testsuccess' 'WE' "$@"
}
testwarningequal() {
testreturnstateequal 'testwarning' "$@"
### convenience hacks ###
mkdir() {
# creating some directories by hand is a tedious task, so make it look simple
- if [ "$*" = '-p rootdir/var/lib/apt/lists' ] || [ "$*" = "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" ] ||
- [ "$*" = '-p rootdir/var/lib/apt/lists/partial' ] || [ "$*" = "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" ]; then
+ local PARAMS="$*"
+ if [ "$PARAMS" != "${PARAMS#*rootdir/var/lib/apt/lists}" ]; then
# only the last directory created by mkdir is effected by the -m !
command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt"
command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"