]> git.saurik.com Git - apt.git/blame - test/integration/framework
switch tests to Translation-en usage
[apt.git] / test / integration / framework
CommitLineData
8d876415
DK
1#!/bin/sh -- # no runable script, just for vi
2
5d76cee1 3EXIT_CODE=0
8c1dd12c 4
8d876415 5# we all like colorful messages
1290422a 6if [ "$MSGCOLOR" != 'NO' ]; then
27cb4f6c 7 if [ ! -t 1 ]; then # but check that we output to a terminal
1290422a
DK
8 export MSGCOLOR='NO'
9 fi
10fi
11
12
13if [ "$MSGCOLOR" != 'NO' ]; then
14 CERROR="\033[1;31m" # red
15 CWARNING="\033[1;33m" # yellow
16 CMSG="\033[1;32m" # green
17 CINFO="\033[1;96m" # light blue
18 CDEBUG="\033[1;94m" # blue
19 CNORMAL="\033[0;39m" # default system console color
20 CDONE="\033[1;32m" # green
21 CPASS="\033[1;32m" # green
22 CFAIL="\033[1;31m" # red
23 CCMD="\033[1;35m" # pink
682a3bf7 24fi
8d876415 25
de81b2e2
DK
26msgprintf() {
27 local START="$1"
28 local MIDDLE="$2"
29 local END="$3"
30 shift 3
31 if [ -n "$1" ]; then
32 printf "$START " "$1"
d73840dc 33 shift
de81b2e2 34 while [ -n "$1" ]; do
03aa0847 35 printf "$MIDDLE " "$(echo "$1" | sed -e 's#^apt\([cfghs]\)#apt-\1#')"
de81b2e2
DK
36 shift
37 done
38 fi
39 printf "${END}"
2a2a7ef4 40}
de81b2e2
DK
41msgdie() { msgprintf "${CERROR}E: %s" '%s' "${CNORMAL}\n" "$@" >&2; exit 1; }
42msgwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}\n" "$@" >&2; }
43msgmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}\n" "$@"; }
44msginfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}\n" "$@"; }
45msgdebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}\n" "$@"; }
46msgdone() { msgprintf "${CDONE}DONE" '%s' "${CNORMAL}\n" "$@"; }
47msgnwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}" "$@" >&2; }
48msgnmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}" "$@"; }
49msgninfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}" "$@"; }
50msgndebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}" "$@"; }
51msgtest() { msgprintf "${CINFO}%s" "${CCMD}%s${CINFO}" "…${CNORMAL} " "$@"; }
3c528b91 52msgpass() { printf "${CPASS}PASS${CNORMAL}\n"; }
68ba0b7f
DK
53msgskip() {
54 if [ $# -gt 0 ]; then printf "${CWARNING}SKIP: $*${CNORMAL}\n" >&2;
55 else printf "${CWARNING}SKIP${CNORMAL}\n" >&2; fi
56}
5229b285 57msgfail() {
3c528b91
MO
58 if [ $# -gt 0 ]; then printf "${CFAIL}FAIL: $*${CNORMAL}\n" >&2;
59 else printf "${CFAIL}FAIL${CNORMAL}\n" >&2; fi
03aa0847
DK
60 if [ -n "$APT_DEBUG_TESTS" ]; then
61 $SHELL
62 fi
5229b285
DK
63 EXIT_CODE=$((EXIT_CODE+1));
64}
8d876415
DK
65
66# enable / disable Debugging
fc89263e
DK
67MSGLEVEL=${MSGLEVEL:-3}
68if [ $MSGLEVEL -le 0 ]; then
69 msgdie() { true; }
70fi
71if [ $MSGLEVEL -le 1 ]; then
72 msgwarn() { true; }
73 msgnwarn() { true; }
74fi
75if [ $MSGLEVEL -le 2 ]; then
76 msgmsg() { true; }
77 msgnmsg() { true; }
39cc8228 78 msgtest() { true; }
3c528b91
MO
79 msgpass() { printf " ${CPASS}P${CNORMAL}"; }
80 msgskip() { printf " ${CWARNING}S${CNORMAL}" >&2; }
682a3bf7 81 if [ -n "$CFAIL" ]; then
3c528b91 82 msgfail() { printf " ${CFAIL}FAIL${CNORMAL}" >&2; EXIT_CODE=$((EXIT_CODE+1)); }
682a3bf7 83 else
3c528b91 84 msgfail() { printf " ###FAILED###" >&2; EXIT_CODE=$((EXIT_CODE+1)); }
682a3bf7 85 fi
fc89263e
DK
86fi
87if [ $MSGLEVEL -le 3 ]; then
88 msginfo() { true; }
89 msgninfo() { true; }
90fi
91if [ $MSGLEVEL -le 4 ]; then
92 msgdebug() { true; }
93 msgndebug() { true; }
94fi
95msgdone() {
96 if [ "$1" = "debug" -a $MSGLEVEL -le 4 ] ||
97 [ "$1" = "info" -a $MSGLEVEL -le 3 ] ||
98 [ "$1" = "msg" -a $MSGLEVEL -le 2 ] ||
99 [ "$1" = "warn" -a $MSGLEVEL -le 1 ] ||
100 [ "$1" = "die" -a $MSGLEVEL -le 0 ]; then
101 true;
102 else
3c528b91 103 printf "${CDONE}DONE${CNORMAL}\n";
fc89263e
DK
104 fi
105}
e43a426e
MV
106getaptconfig() {
107 if [ -f ./aptconfig.conf ]; then
108 echo "./aptconfig.conf"
109 elif [ -f ../aptconfig.conf ]; then
110 echo "../aptconfig.conf"
111 fi
112}
8d876415
DK
113runapt() {
114 msgdebug "Executing: ${CCMD}$*${CDEBUG} "
846856f4
DK
115 local CMD="$1"
116 shift
3b8eb3bc 117 case $CMD in
a311fb96 118 sh|aptitude|*/*|command) ;;
3b8eb3bc
DK
119 *) CMD="${BUILDDIRECTORY}/$CMD";;
120 esac
a311fb96 121 MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${LIBRARYPATH} $CMD "$@"
8d876415 122}
846856f4
DK
123aptconfig() { runapt apt-config "$@"; }
124aptcache() { runapt apt-cache "$@"; }
125aptcdrom() { runapt apt-cdrom "$@"; }
126aptget() { runapt apt-get "$@"; }
127aptftparchive() { runapt apt-ftparchive "$@"; }
128aptkey() { runapt apt-key "$@"; }
129aptmark() { runapt apt-mark "$@"; }
4f6d26b4 130aptsortpkgs() { runapt apt-sortpkgs "$@"; }
796673c3 131apt() { runapt apt "$@"; }
3b8eb3bc
DK
132apthelper() { runapt "${APTHELPERBINDIR}/apt-helper" "$@"; }
133aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; }
134aptitude() { runapt aptitude "$@"; }
8d50b63f 135aptextracttemplates() { runapt apt-extracttemplates "$@"; }
3082603f 136aptinternalsolver() { runapt "${APTINTERNALSOLVER}" "$@"; }
3b8eb3bc 137
158fda31 138dpkg() {
846856f4 139 command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
158fda31 140}
ce7f128c
DK
141dpkgcheckbuilddeps() {
142 command dpkg-checkbuilddeps --admindir=${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg "$@"
b6b5a542 143}
3fa950f1 144gdb() {
a311fb96 145 local CMD="$1"
ce928105 146 shift
a311fb96 147 runapt command gdb --quiet -ex run "${BUILDDIRECTORY}/$CMD" --args "${BUILDDIRECTORY}/$CMD" "$@"
ae99ce2e 148}
8d876415 149
8c1dd12c 150exitwithstatus() {
f91bd741
MV
151 # error if we about to overflow, but ...
152 # "255 failures ought to be enough for everybody"
5d76cee1
MV
153 if [ $EXIT_CODE -gt 255 ]; then
154 msgdie "Total failure count $EXIT_CODE too big"
f91bd741 155 fi
5d76cee1 156 exit $((EXIT_CODE <= 255 ? EXIT_CODE : 255));
8c1dd12c
MV
157}
158
804d4a0d
DK
159shellsetedetector() {
160 local exit_status=$?
161 if [ "$exit_status" != '0' ]; then
3c528b91 162 printf >&2 "${CERROR}E: Looks like the testcases ended prematurely with exitcode: ${exit_status}${CNORMAL}\n"
804d4a0d
DK
163 if [ "$EXIT_CODE" = '0' ]; then
164 EXIT_CODE="$exit_status"
165 fi
166 fi
167}
168
b720d0bd 169addtrap() {
8437b7d4
DK
170 if [ "$1" = 'prefix' ]; then
171 CURRENTTRAP="$2 $CURRENTTRAP"
172 else
173 CURRENTTRAP="$CURRENTTRAP $1"
174 fi
804d4a0d 175 trap "shellsetedetector; $CURRENTTRAP exitwithstatus;" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
b720d0bd 176}
8d876415
DK
177
178setupenvironment() {
0d303f17
DK
179 # privilege dropping and testing doesn't work if /tmp isn't world-writeable (as e.g. with libpam-tmpdir)
180 if [ -n "$TMPDIR" ] && [ "$(id -u)" = '0' ] && [ "$(stat --format '%a' "$TMPDIR")" != '1777' ]; then
181 unset TMPDIR
182 fi
75954ae2 183 TMPWORKINGDIRECTORY=$(mktemp -d)
5684f71f 184 addtrap "cd /; rm -rf $TMPWORKINGDIRECTORY;"
3cbbda3c 185 msgninfo "Preparing environment for ${CCMD}$(basename $0)${CINFO} in ${TMPWORKINGDIRECTORY}… "
5c0dd6fc 186
03aa0847 187 mkdir -m 700 "${TMPWORKINGDIRECTORY}/downloaded"
68ba0b7f
DK
188 if [ "$(id -u)" = '0' ]; then
189 # relax permissions so that running as root with user switching works
190 umask 022
03aa0847
DK
191 chmod 711 "$TMPWORKINGDIRECTORY"
192 chown _apt:root "${TMPWORKINGDIRECTORY}/downloaded"
68ba0b7f
DK
193 fi
194
5684f71f 195 TESTDIRECTORY=$(readlink -f $(dirname $0))
5c0dd6fc
MV
196 # allow overriding the default BUILDDIR location
197 BUILDDIRECTORY=${APT_INTEGRATION_TESTS_BUILD_DIR:-"${TESTDIRECTORY}/../../build/bin"}
3b8eb3bc 198 LIBRARYPATH=${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}"}
5c0dd6fc 199 METHODSDIR=${APT_INTEGRATION_TESTS_METHODS_DIR:-"${BUILDDIRECTORY}/methods"}
e43a426e 200 APTHELPERBINDIR=${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"}
c035b655 201 APTWEBSERVERBINDIR=${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}"}
3082603f 202 APTINTERNALSOLVER=${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/apt-internal-solver"}
8d876415 203 test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first"
5c0dd6fc
MV
204 # -----
205
8d876415 206 cd $TMPWORKINGDIRECTORY
cd725954 207 mkdir rootdir aptarchive keys
8d876415 208 cd rootdir
b29c3712 209 mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d
68ba0b7f 210 mkdir -p usr/bin var/cache var/lib/apt var/log tmp
cffea9af 211 mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers
cd725954 212 touch var/lib/dpkg/available
8d876415 213 mkdir -p usr/lib/apt
9082a1fc 214 ln -s ${METHODSDIR} usr/lib/apt/methods
1f6cf9e7
DK
215 if [ "$BUILDDIRECTORY" = "$LIBRARYPATH" ]; then
216 mkdir -p usr/lib/apt/solvers
217 ln -s "${BUILDDIRECTORY}/apt-dump-solver" usr/lib/apt/solvers/dump
218 ln -s "${BUILDDIRECTORY}/apt-internal-solver" usr/lib/apt/solvers/apt
219 echo "Dir::Bin::Solvers \"${TMPWORKINGDIRECTORY}/rootdir/usr/lib/apt/solvers\";" > etc/apt/apt.conf.d/externalsolver.conf
220 fi
291a386f
MV
221 # use the autoremove from the BUILDDIRECTORY if its there, otherwise
222 # system
223 if [ -e ${BUILDDIRECTORY}/../../debian/apt.conf.autoremove ]; then
224 ln -s ${BUILDDIRECTORY}/../../debian/apt.conf.autoremove etc/apt/apt.conf.d/01autoremove
225 else
226 ln -s /etc/apt/apt.conf.d/01autoremove etc/apt/apt.conf.d/01autoremove
227 fi
8d876415 228 cd ..
2c6baa5a 229 local PACKAGESFILE=$(echo "$(basename $0)" | sed -e 's/^test-/Packages-/' -e 's/^skip-/Packages-/')
53ea1b56
DK
230 if [ -f "${TESTDIRECTORY}/${PACKAGESFILE}" ]; then
231 cp "${TESTDIRECTORY}/${PACKAGESFILE}" aptarchive/Packages
8f8169ac 232 fi
4a4ea26c 233 local SOURCESSFILE=$(echo "$(basename $0)" | sed -e 's/^test-/Sources-/' -e 's/^skip-/Sources-/')
53ea1b56
DK
234 if [ -f "${TESTDIRECTORY}/${SOURCESSFILE}" ]; then
235 cp "${TESTDIRECTORY}/${SOURCESSFILE}" aptarchive/Sources
8f8169ac 236 fi
53ea1b56 237 cp $(find $TESTDIRECTORY -name '*.pub' -o -name '*.sec') keys/
5684f71f 238 chmod 644 $(find keys -name '*.pub' -o -name '*.sec')
cd725954 239 ln -s ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
d6cf2345 240
cffea9af 241 echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf
94eb3bee 242 echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf
8d876415
DK
243 echo "Debug::NoLocking \"true\";" >> aptconfig.conf
244 echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf
5c0dd6fc 245 echo "Dir::Bin::Methods \"${METHODSDIR}\";" >> aptconfig.conf
68ba0b7f
DK
246 # store apt-key were we can access it, even if we run it as a different user
247 # destroys coverage reporting though, so just do it for root for now
248 if [ "$(id -u)" = '0' ]; then
249 cp "${BUILDDIRECTORY}/apt-key" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/"
250 chmod o+rx "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key"
251 echo "Dir::Bin::apt-key \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key\";" >> aptconfig.conf
252 else
253 echo "Dir::Bin::apt-key \"${BUILDDIRECTORY}/apt-key\";" >> aptconfig.conf
254 fi
cffea9af
DK
255 echo "Dir::Bin::dpkg \"fakeroot\";" >> aptconfig.conf
256 echo "DPKG::options:: \"dpkg\";" >> aptconfig.conf
257 echo "DPKG::options:: \"--root=${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf
258 echo "DPKG::options:: \"--force-not-root\";" >> aptconfig.conf
259 echo "DPKG::options:: \"--force-bad-path\";" >> aptconfig.conf
846856f4 260 if ! command dpkg --assert-multi-arch >/dev/null 2>&1; then
53ea1b56
DK
261 echo "DPKG::options:: \"--force-architecture\";" >> aptconfig.conf # Added to test multiarch before dpkg is ready for it…
262 fi
cffea9af 263 echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf
2c085486 264 echo 'quiet::NoUpdate "true";' >> aptconfig.conf
0c8171d7 265 echo 'quiet::NoStatistic "true";' >> aptconfig.conf
d6cf2345
DK
266 # too distracting for users, but helpful to detect changes
267 echo 'Acquire::Progress::Ignore::ShowErrorText "true";' >> aptconfig.conf
0045df3f
DK
268 # in testcases, it can appear as if localhost has a rotation setup,
269 # hide this as we can't really deal with it properly
270 echo 'Acquire::Failure::ShowIP "false";' >> aptconfig.conf
d6cf2345 271
68ba0b7f
DK
272 cp "${TESTDIRECTORY}/apt.pem" "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem"
273 if [ "$(id -u)" = '0' ]; then
274 chown _apt:root "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem"
275 fi
276 echo "Acquire::https::CaInfo \"${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem\";" > rootdir/etc/apt/apt.conf.d/99https
d6cf2345 277 echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary
276e51dd 278 configcompression '.' 'gz' #'bz2' 'lzma' 'xz'
77a45beb 279
d4f4bcf7
MV
280 # Acquire::AllowInsecureRepositories=false is not yet the default
281 # but we want it to be the default soon
282 configallowinsecurerepositories "false";
283
ce7f128c 284 # cleanup the environment a bit
8c617819
MV
285 # prefer our apt binaries over the system apt binaries
286 export PATH="${BUILDDIRECTORY}:${PATH}:/usr/local/sbin:/usr/sbin:/sbin"
be233796 287 export LC_ALL=C.UTF-8
3b8eb3bc 288 unset LANGUAGE APT_CONFIG
ce7f128c
DK
289 unset GREP_OPTIONS DEB_BUILD_PROFILES
290
8d876415
DK
291 msgdone "info"
292}
293
ea65d079
DK
294getarchitecture() {
295 if [ "$1" = "native" -o -z "$1" ]; then
296 eval `aptconfig shell ARCH APT::Architecture`
297 if [ -n "$ARCH" ]; then
298 echo $ARCH
299 else
5834d7a1 300 dpkg --print-architecture
ea65d079
DK
301 fi
302 else
303 echo $1
304 fi
305}
306
53ea1b56
DK
307getarchitectures() {
308 echo "$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')"
309}
310
3dcdc1f9
DK
311getarchitecturesfromcommalist() {
312 echo "$1" | sed -e 's#,#\n#g' | sed -e "s/^native\$/$(getarchitecture 'native')/"
313}
314
8d876415 315configarchitecture() {
18908589
DK
316 {
317 echo "APT::Architecture \"$(getarchitecture $1)\";"
318 while [ -n "$1" ]; do
319 echo "APT::Architectures:: \"$(getarchitecture $1)\";"
320 shift
321 done
322 } >rootdir/etc/apt/apt.conf.d/01multiarch.conf
53ea1b56
DK
323 configdpkg
324}
325
326configdpkg() {
327 if [ ! -e rootdir/var/lib/dpkg/status ]; then
328 local STATUSFILE=$(echo "$(basename $0)" | sed -e 's/^test-/status-/' -e 's/^skip-/status-/')
329 if [ -f "${TESTDIRECTORY}/${STATUSFILE}" ]; then
330 cp "${TESTDIRECTORY}/${STATUSFILE}" rootdir/var/lib/dpkg/status
331 else
332 echo -n > rootdir/var/lib/dpkg/status
333 fi
334 fi
18908589 335 rm -f rootdir/etc/apt/apt.conf.d/00foreigndpkg
846856f4 336 if command dpkg --assert-multi-arch >/dev/null 2>&1 ; then
53ea1b56
DK
337 local ARCHS="$(getarchitectures)"
338 if echo "$ARCHS" | grep -E -q '[^ ]+ [^ ]+'; then
339 DPKGARCH="$(dpkg --print-architecture)"
340 for ARCH in ${ARCHS}; do
feae193b 341 if [ "${ARCH}" != "${DPKGARCH}" ]; then
18908589 342 if ! dpkg --add-architecture ${ARCH} >/dev/null 2>&1; then
feae193b 343 # old-style used e.g. in Ubuntu-P – and as it seems travis
18908589
DK
344 echo "DPKG::options:: \"--foreign-architecture\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
345 echo "DPKG::options:: \"${ARCH}\";" >> rootdir/etc/apt/apt.conf.d/00foreigndpkg
feae193b
DK
346 fi
347 fi
53ea1b56
DK
348 done
349 if [ "0" = "$(dpkg -l dpkg 2> /dev/null | grep '^i' | wc -l)" ]; then
05343a22
DK
350 # dpkg doesn't really check the version as long as it is fully installed,
351 # but just to be sure we choose one above the required version
352 insertinstalledpackage 'dpkg' "all" '1.16.2+fake'
53ea1b56
DK
353 fi
354 fi
355 fi
8d876415
DK
356}
357
d4f4bcf7
MV
358configallowinsecurerepositories() {
359 echo "Acquire::AllowInsecureRepositories \"$1\";" > rootdir/etc/apt/apt.conf.d/allow-insecure-repositories.conf
360
361}
362
276e51dd
DK
363configcompression() {
364 while [ -n "$1" ]; do
365 case "$1" in
3c528b91
MO
366 '.') printf ".\t.\tcat\n";;
367 'gz') printf "gzip\tgz\tgzip\n";;
368 'bz2') printf "bzip2\tbz2\tbzip2\n";;
369 'lzma') printf "lzma\tlzma\txz --format=lzma\n";;
370 'xz') printf "xz\txz\txz\n";;
371 *) printf "$1\t$1\t$1\n";;
276e51dd
DK
372 esac
373 shift
374 done > ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf
375}
376
5f982b9d
DK
377forcecompressor() {
378 COMPRESSOR="$1"
379 COMPRESSOR_CMD="$1"
380 case $COMPRESSOR in
381 gzip) COMPRESS='gz';;
382 bzip2) COMPRESS='bz2';;
383 lzma) COMPRESS='lzma';;
384 xz) COMPRESS='xz';;
385 *) msgdie "Compressor $COMPRESSOR is unknown to framework, so can't be forced by forcecompressor!";;
386 esac
387 local CONFFILE="${TMPWORKINGDIRECTORY}/rootdir/etc/apt/apt.conf.d/00force-compressor"
388 echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; };
389Dir::Bin::uncompressed \"/does/not/exist\";
390Dir::Bin::gzip \"/does/not/exist\";
391Dir::Bin::bzip2 \"/does/not/exist\";
392Dir::Bin::lzma \"/does/not/exist\";
393Dir::Bin::xz \"/does/not/exist\";" > "$CONFFILE"
394 if [ -e "/bin/${COMPRESSOR}" ]; then
395 echo "Dir::Bin::${COMPRESSOR} \"/bin/${COMPRESSOR}\";" >> "$CONFFILE"
396 elif [ -e "/usr/bin/${COMPRESSOR}" ]; then
397 echo "Dir::Bin::${COMPRESSOR} \"/usr/bin/${COMPRESSOR}\";" >> "$CONFFILE"
398 elif [ "${COMPRESSOR}" = 'lzma' ]; then
399 echo 'Dir::Bin::xz "/usr/bin/xz";' >> "$CONFFILE"
400 COMPRESSOR_CMD='xz --format=lzma'
401 else
402 msgtest 'Test for availability of compressor' "${COMPRESSOR}"
403 msgfail
404 fi
405}
406
75954ae2 407setupsimplenativepackage() {
ce9864a8
DK
408 local NAME="$1"
409 local ARCH="$2"
410 local VERSION="$3"
411 local RELEASE="${4:-unstable}"
412 local DEPENDENCIES="$5"
14109555 413 local DESCRIPTION="${6:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE}
18908589
DK
414 If you find such a package installed on your system,
415 something went horribly wrong! They are autogenerated
416 und used only by testcases and surf no other propose…"}"
417
b7899b00
DK
418 local SECTION="${7:-others}"
419 local DISTSECTION
420 if [ "$SECTION" = "$(echo "$SECTION" | cut -d'/' -f 2)" ]; then
421 DISTSECTION="main"
422 else
423 DISTSECTION="$(echo "$SECTION" | cut -d'/' -f 1)"
424 fi
ce9864a8
DK
425 local BUILDDIR=incoming/${NAME}-${VERSION}
426 mkdir -p ${BUILDDIR}/debian/source
427 cd ${BUILDDIR}
428 echo "* most suckless software product ever" > FEATURES
b7899b00
DK
429 test -e debian/copyright || echo "Copyleft by Joe Sixpack $(date +%Y)" > debian/copyright
430 test -e debian/changelog || echo "$NAME ($VERSION) $RELEASE; urgency=low
ce9864a8
DK
431
432 * Initial release
433
b7899b00
DK
434 -- Joe Sixpack <joe@example.org> $(date -R)" > debian/changelog
435 test -e debian/control || echo "Source: $NAME
436Section: $SECTION
ce9864a8
DK
437Priority: optional
438Maintainer: Joe Sixpack <joe@example.org>
439Build-Depends: debhelper (>= 7)
440Standards-Version: 3.9.1
441
875bcb36
DK
442Package: $NAME" > debian/control
443 if [ "$ARCH" = 'all' ]; then
444 echo "Architecture: all" >> debian/control
445 else
446 echo "Architecture: any" >> debian/control
447 fi
ce9864a8 448 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> debian/control
18908589
DK
449 echo "Description: $DESCRIPTION" >> debian/control
450
b7899b00
DK
451 test -e debian/compat || echo "7" > debian/compat
452 test -e debian/source/format || echo "3.0 (native)" > debian/source/format
ce9864a8 453 test -e debian/rules || cp /usr/share/doc/debhelper/examples/rules.tiny debian/rules
75954ae2
DK
454 cd - > /dev/null
455}
456
457buildsimplenativepackage() {
458 local NAME="$1"
459 local ARCH="$2"
460 local VERSION="$3"
461 local RELEASE="${4:-unstable}"
462 local DEPENDENCIES="$5"
14109555 463 local DESCRIPTION="${6:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE}
18908589
DK
464 If you find such a package installed on your system,
465 something went horribly wrong! They are autogenerated
466 und used only by testcases and surf no other propose…"}"
467
75954ae2 468 local SECTION="${7:-others}"
d67004e0 469 local PRIORITY="${8:-optional}"
42c1513b 470 local FILE_TREE="$9"
adff049d 471 local COMPRESS_TYPE="${10:-gzip}"
75954ae2
DK
472 local DISTSECTION
473 if [ "$SECTION" = "$(echo "$SECTION" | cut -d'/' -f 2)" ]; then
474 DISTSECTION="main"
475 else
476 DISTSECTION="$(echo "$SECTION" | cut -d'/' -f 1)"
477 fi
5a635ee4 478 local BUILDDIR=${TMPWORKINGDIRECTORY}/incoming/${NAME}-${VERSION}
b761356f 479
18331adf 480 msgninfo "Build package ${NAME} in ${VERSION} for ${RELEASE} in ${DISTSECTION}… "
b761356f
DK
481 mkdir -p $BUILDDIR/debian/source
482 echo "* most suckless software product ever" > ${BUILDDIR}/FEATURES
483 echo "#!/bin/sh
484echo '$NAME says \"Hello!\"'" > ${BUILDDIR}/${NAME}
485
486 echo "Copyleft by Joe Sixpack $(date +%Y)" > ${BUILDDIR}/debian/copyright
487 echo "$NAME ($VERSION) $RELEASE; urgency=low
488
489 * Initial release
490
491 -- Joe Sixpack <joe@example.org> $(date -R)" > ${BUILDDIR}/debian/changelog
492 echo "Source: $NAME
493Section: $SECTION
d67004e0 494Priority: $PRIORITY
b761356f 495Maintainer: Joe Sixpack <joe@example.org>
01f520ce
DK
496Standards-Version: 3.9.3" > ${BUILDDIR}/debian/control
497 local BUILDDEPS="$(echo "$DEPENDENCIES" | grep '^Build-')"
498 test -z "$BUILDDEPS" || echo "$BUILDDEPS" >> ${BUILDDIR}/debian/control
499 echo "
500Package: $NAME" >> ${BUILDDIR}/debian/control
b761356f 501
875bcb36
DK
502 if [ "$ARCH" = 'all' ]; then
503 echo "Architecture: all" >> ${BUILDDIR}/debian/control
504 else
505 echo "Architecture: any" >> ${BUILDDIR}/debian/control
506 fi
01f520ce
DK
507 local DEPS="$(echo "$DEPENDENCIES" | grep -v '^Build-')"
508 test -z "$DEPS" || echo "$DEPS" >> ${BUILDDIR}/debian/control
18908589 509 echo "Description: $DESCRIPTION" >> ${BUILDDIR}/debian/control
01f520ce 510
b761356f 511 echo '3.0 (native)' > ${BUILDDIR}/debian/source/format
f1828b69
DK
512 (cd ${BUILDDIR}/..; dpkg-source -b ${NAME}-${VERSION} 2>&1) | sed -n 's#^dpkg-source: info: building [^ ]\+ in ##p' \
513 | while read SRC; do
5a635ee4 514 echo "pool/${SRC}" >> ${BUILDDIR}/../${RELEASE}.${DISTSECTION}.srclist
f1828b69 515# if expr match "${SRC}" '.*\.dsc' >/dev/null 2>&1; then
33a22672 516# aptkey --keyring ./keys/joesixpack.pub --secret-keyring ./keys/joesixpack.sec --quiet --readonly \
bd7fb5aa 517# adv --yes --default-key 'Joe Sixpack' \
f1828b69
DK
518# --clearsign -o "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC"
519# mv "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC"
520# fi
b761356f 521 done
84aa13f4 522
3dcdc1f9 523 for arch in $(getarchitecturesfromcommalist "$ARCH"); do
84aa13f4
DK
524 rm -rf ${BUILDDIR}/debian/tmp
525 mkdir -p ${BUILDDIR}/debian/tmp/DEBIAN ${BUILDDIR}/debian/tmp/usr/share/doc/${NAME} ${BUILDDIR}/debian/tmp/usr/bin
526 cp ${BUILDDIR}/debian/copyright ${BUILDDIR}/debian/changelog ${BUILDDIR}/FEATURES ${BUILDDIR}/debian/tmp/usr/share/doc/${NAME}
527 cp ${BUILDDIR}/${NAME} ${BUILDDIR}/debian/tmp/usr/bin/${NAME}-${arch}
42c1513b
MV
528 if [ -n "$FILE_TREE" ]; then
529 cp -ar "$FILE_TREE" ${BUILDDIR}/debian/tmp
530 fi
42c1513b 531
84aa13f4
DK
532 (cd ${BUILDDIR}; dpkg-gencontrol -DArchitecture=$arch)
533 (cd ${BUILDDIR}/debian/tmp; md5sum $(find usr/ -type f) > DEBIAN/md5sums)
846856f4 534 local LOG="${BUILDDIR}/../${NAME}_${VERSION}_${arch}.dpkg-deb.log"
eb9dee96
DK
535 # ensure the right permissions as dpkg-deb ensists
536 chmod 755 ${BUILDDIR}/debian/tmp/DEBIAN
adff049d 537 if ! dpkg-deb -Z${COMPRESS_TYPE} --build ${BUILDDIR}/debian/tmp ${BUILDDIR}/.. >$LOG 2>&1; then
846856f4
DK
538 cat $LOG
539 false
540 fi
541 rm $LOG
84aa13f4
DK
542 echo "pool/${NAME}_${VERSION}_${arch}.deb" >> ${BUILDDIR}/../${RELEASE}.${DISTSECTION}.pkglist
543 done
544
13845042
DK
545 mkdir -p ${BUILDDIR}/../${NAME}_${VERSION}
546 cp ${BUILDDIR}/debian/changelog ${BUILDDIR}/../${NAME}_${VERSION}/
547 cp ${BUILDDIR}/debian/changelog ${BUILDDIR}/../${NAME}_${VERSION}.changelog
5a635ee4 548 rm -rf "${BUILDDIR}"
b761356f 549 msgdone "info"
75954ae2
DK
550}
551
552buildpackage() {
553 local BUILDDIR=$1
554 local RELEASE=$2
555 local SECTION=$3
ea65d079 556 local ARCH=$(getarchitecture $4)
846856f4
DK
557 local PKGNAME="$(echo "$BUILDDIR" | grep -o '[^/]*$')"
558 local BUILDLOG="$(readlink -f "${BUILDDIR}/../${PKGNAME}_${RELEASE}_${SECTION}.dpkg-bp.log")"
559 msgninfo "Build package ${PKGNAME} for ${RELEASE} in ${SECTION}… "
75954ae2
DK
560 cd $BUILDDIR
561 if [ "$ARCH" = "all" ]; then
562 ARCH="$(dpkg-architecture -qDEB_HOST_ARCH 2> /dev/null)"
563 fi
846856f4
DK
564 if ! dpkg-buildpackage -uc -us -a$ARCH >$BUILDLOG 2>&1 ; then
565 cat $BUILDLOG
566 false
567 fi
568 local PKGS="$(grep '^dpkg-deb: building package' $BUILDLOG | cut -d'/' -f 2 | sed -e "s#'\.##")"
569 local SRCS="$(grep '^dpkg-source: info: building' $BUILDLOG | grep -o '[a-z0-9._+~-]*$')"
ce9864a8 570 cd - > /dev/null
b7899b00 571 for PKG in $PKGS; do
75954ae2 572 echo "pool/${PKG}" >> ${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.pkglist
b7899b00
DK
573 done
574 for SRC in $SRCS; do
75954ae2 575 echo "pool/${SRC}" >> ${TMPWORKINGDIRECTORY}/incoming/${RELEASE}.${SECTION}.srclist
b7899b00 576 done
cffea9af 577 msgdone "info"
ce9864a8
DK
578}
579
580buildaptarchive() {
ce9864a8 581 if [ -d incoming ]; then
846856f4 582 buildaptarchivefromincoming "$@"
ce9864a8 583 else
846856f4 584 buildaptarchivefromfiles "$@"
ce9864a8
DK
585 fi
586}
587
588createaptftparchiveconfig() {
276e51dd
DK
589 local COMPRESSORS="$(cut -d' ' -f 1 ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf | tr '\n' ' ')"
590 COMPRESSORS="${COMPRESSORS%* }"
ce9864a8 591 local ARCHS="$(find pool/ -name '*.deb' | grep -oE '_[a-z0-9-]+\.deb$' | sort | uniq | sed -e '/^_all.deb$/ d' -e 's#^_\([a-z0-9-]*\)\.deb$#\1#' | tr '\n' ' ')"
158fda31
DK
592 if [ -z "$ARCHS" ]; then
593 # the pool is empty, so we will operate on faked packages - let us use the configured archs
53ea1b56 594 ARCHS="$(getarchitectures)"
158fda31 595 fi
ce9864a8
DK
596 echo -n 'Dir {
597 ArchiveDir "' >> ftparchive.conf
598 echo -n $(readlink -f .) >> ftparchive.conf
599 echo -n '";
600 CacheDir "' >> ftparchive.conf
601 echo -n $(readlink -f ..) >> ftparchive.conf
602 echo -n '";
b7899b00
DK
603 FileListDir "' >> ftparchive.conf
604 echo -n $(readlink -f pool/) >> ftparchive.conf
605 echo -n '";
606};
607Default {
276e51dd
DK
608 Packages::Compress "'"$COMPRESSORS"'";
609 Sources::Compress "'"$COMPRESSORS"'";
610 Contents::Compress "'"$COMPRESSORS"'";
611 Translation::Compress "'"$COMPRESSORS"'";
18331adf 612 LongDescription "false";
ce9864a8
DK
613};
614TreeDefault {
615 Directory "pool/";
616 SrcDirectory "pool/";
617};
618APT {
619 FTPArchive {
620 Release {
621 Origin "joesixpack";
622 Label "apttestcases";
623 Suite "unstable";
624 Description "repository with dummy packages";
625 Architectures "' >> ftparchive.conf
626 echo -n "$ARCHS" >> ftparchive.conf
627 echo 'source";
628 };
629 };
630};' >> ftparchive.conf
b7899b00
DK
631 for DIST in $(find ./pool/ -maxdepth 1 -name '*.pkglist' -type f | cut -d'/' -f 3 | cut -d'.' -f 1 | sort | uniq); do
632 echo -n 'tree "dists/' >> ftparchive.conf
633 echo -n "$DIST" >> ftparchive.conf
634 echo -n '" {
ce9864a8
DK
635 Architectures "' >> ftparchive.conf
636 echo -n "$ARCHS" >> ftparchive.conf
b7899b00
DK
637 echo -n 'source";
638 FileList "' >> ftparchive.conf
639 echo -n "${DIST}.\$(SECTION).pkglist" >> ftparchive.conf
640 echo -n '";
641 SourceFileList "' >> ftparchive.conf
642 echo -n "${DIST}.\$(SECTION).srclist" >> ftparchive.conf
643 echo -n '";
644 Sections "' >> ftparchive.conf
645 echo -n "$(find ./pool/ -maxdepth 1 -name "${DIST}.*.pkglist" -type f | cut -d'/' -f 3 | cut -d'.' -f 2 | sort | uniq | tr '\n' ' ')" >> ftparchive.conf
646 echo '";
ce9864a8 647};' >> ftparchive.conf
b7899b00 648 done
ce9864a8
DK
649}
650
651buildaptftparchivedirectorystructure() {
b7899b00
DK
652 local DISTS="$(grep -i '^tree ' ftparchive.conf | cut -d'/' -f 2 | sed -e 's#".*##')"
653 for DIST in $DISTS; do
654 local SECTIONS="$(grep -i -A 5 "dists/$DIST" ftparchive.conf | grep -i 'Sections' | cut -d'"' -f 2)"
655 for SECTION in $SECTIONS; do
656 local ARCHS="$(grep -A 5 "dists/$DIST" ftparchive.conf | grep Architectures | cut -d'"' -f 2 | sed -e 's#source##')"
657 for ARCH in $ARCHS; do
658 mkdir -p dists/${DIST}/${SECTION}/binary-${ARCH}
659 done
660 mkdir -p dists/${DIST}/${SECTION}/source
661 mkdir -p dists/${DIST}/${SECTION}/i18n
662 done
ce9864a8 663 done
ce9864a8
DK
664}
665
9b78cda6
DK
666insertpackage() {
667 local RELEASE="$1"
668 local NAME="$2"
669 local ARCH="$3"
670 local VERSION="$4"
671 local DEPENDENCIES="$5"
d67004e0 672 local PRIORITY="${6:-optional}"
14109555 673 local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE}
18908589
DK
674 If you find such a package installed on your system,
675 something went horribly wrong! They are autogenerated
676 und used only by testcases and surf no other propose…"}"
d67004e0 677 local ARCHS=""
3dcdc1f9 678 for arch in $(getarchitecturesfromcommalist "$ARCH"); do
c919ad6e 679 if [ "$arch" = 'all' -o "$arch" = 'none' ]; then
53ea1b56 680 ARCHS="$(getarchitectures)"
d67004e0
DK
681 else
682 ARCHS="$arch"
683 fi
684 for BUILDARCH in $ARCHS; do
685 local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}"
0e0d9919 686 mkdir -p $PPATH
d67004e0
DK
687 local FILE="${PPATH}/Packages"
688 echo "Package: $NAME
689Priority: $PRIORITY
9b78cda6 690Section: other
2c085486 691Installed-Size: 42
c919ad6e
DK
692Maintainer: Joe Sixpack <joe@example.org>" >> $FILE
693 test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE
694 echo "Version: $VERSION
d67004e0
DK
695Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb" >> $FILE
696 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
0e0d9919
DK
697 echo "Description: $(printf '%s' "$DESCRIPTION" | head -n 1)" >> $FILE
698 echo "Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)" >> $FILE
8ba17539 699 echo >> $FILE
d67004e0 700 done
9b78cda6 701 done
0e0d9919
DK
702 mkdir -p aptarchive/dists/${RELEASE}/main/source aptarchive/dists/${RELEASE}/main/i18n
703 touch aptarchive/dists/${RELEASE}/main/source/Sources
704 echo "Package: $NAME
705Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)
706Description-en: $DESCRIPTION
707" >> aptarchive/dists/${RELEASE}/main/i18n/Translation-en
9b78cda6
DK
708}
709
234675b7
DK
710insertsource() {
711 local RELEASE="$1"
712 local NAME="$2"
713 local ARCH="$3"
714 local VERSION="$4"
715 local DEPENDENCIES="$5"
716 local ARCHS=""
717 local SPATH="aptarchive/dists/${RELEASE}/main/source"
718 mkdir -p $SPATH
719 local FILE="${SPATH}/Sources"
720 echo "Package: $NAME
721Binary: $NAME
722Version: $VERSION
723Maintainer: Joe Sixpack <joe@example.org>
724Architecture: $ARCH" >> $FILE
725 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
726 echo "Files:
727 d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.dsc
d5dea0be
DK
728 d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.tar.gz
729" >> $FILE
234675b7
DK
730}
731
dfc2b1be
DK
732insertinstalledpackage() {
733 local NAME="$1"
734 local ARCH="$2"
735 local VERSION="$3"
736 local DEPENDENCIES="$4"
d67004e0 737 local PRIORITY="${5:-optional}"
d4b4e5ea 738 local STATUS="${6:-install ok installed}"
14109555 739 local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/installed
18908589
DK
740 If you find such a package installed on your system,
741 something went horribly wrong! They are autogenerated
742 und used only by testcases and surf no other propose…"}"
743
53ea1b56
DK
744 local FILE='rootdir/var/lib/dpkg/status'
745 local INFO='rootdir/var/lib/dpkg/info'
3dcdc1f9 746 for arch in $(getarchitecturesfromcommalist "$ARCH"); do
d67004e0 747 echo "Package: $NAME
d4b4e5ea 748Status: $STATUS
d67004e0 749Priority: $PRIORITY
dfc2b1be
DK
750Section: other
751Installed-Size: 42
752Maintainer: Joe Sixpack <joe@example.org>
dfc2b1be 753Version: $VERSION" >> $FILE
c919ad6e 754 test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE
d67004e0 755 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
18908589
DK
756 echo "Description: $DESCRIPTION" >> $FILE
757 echo >> $FILE
53ea1b56
DK
758 if [ "$(dpkg-query -W --showformat='${Multi-Arch}')" = 'same' ]; then
759 echo -n > ${INFO}/${NAME}:${arch}.list
760 else
761 echo -n > ${INFO}/${NAME}.list
762 fi
d67004e0 763 done
dfc2b1be
DK
764}
765
766
ce9864a8 767buildaptarchivefromincoming() {
3cbbda3c 768 msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on incoming packages…"
ce9864a8
DK
769 cd aptarchive
770 [ -e pool ] || ln -s ../incoming pool
771 [ -e ftparchive.conf ] || createaptftparchiveconfig
772 [ -e dists ] || buildaptftparchivedirectorystructure
b7899b00 773 msgninfo "\tGenerate Packages, Sources and Contents files… "
ce9864a8 774 aptftparchive -qq generate ftparchive.conf
ce9864a8
DK
775 cd - > /dev/null
776 msgdone "info"
4dbfe436 777 generatereleasefiles "$@"
ce9864a8
DK
778}
779
780buildaptarchivefromfiles() {
3cbbda3c 781 msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on prebuild files…"
0e0d9919 782 find aptarchive -name 'Packages' -o -name 'Sources' -o -name 'Translation-*' | while read line; do
9b78cda6 783 msgninfo "\t${line} file… "
276e51dd 784 compressfile "$line" "$1"
8d876415 785 msgdone "info"
9b78cda6 786 done
e3c62328 787 generatereleasefiles "$@"
9b78cda6
DK
788}
789
276e51dd
DK
790compressfile() {
791 cat ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf | while read compressor extension command; do
792 if [ "$compressor" = '.' ]; then
793 if [ -n "$2" ]; then
794 touch -d "$2" "$1"
795 fi
796 continue
797 fi
798 cat "$1" | $command > "${1}.${extension}"
799 if [ -n "$2" ]; then
800 touch -d "$2" "${1}.${extension}"
801 fi
802 done
803}
804
a3bbbab7 805# can be overridden by testcases for their pleasure
bf9e7447
DK
806getcodenamefromsuite() {
807 case "$1" in
808 unstable) echo 'sid';;
809 *) echo -n "$1";;
810 esac
811}
a3bbbab7 812getreleaseversionfromsuite() { true; }
718f797c 813getlabelfromsuite() { true; }
a3bbbab7 814
9b78cda6 815generatereleasefiles() {
884a4c0a
DK
816 # $1 is the Date header and $2 is the ValidUntil header to be set
817 # both should be given in notation date/touch can understand
9b78cda6
DK
818 msgninfo "\tGenerate Release files… "
819 if [ -e aptarchive/dists ]; then
820 for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do
a3bbbab7
DK
821 local SUITE="$(echo "$dir" | cut -d'/' -f 4)"
822 local CODENAME="$(getcodenamefromsuite $SUITE)"
823 local VERSION="$(getreleaseversionfromsuite $SUITE)"
718f797c 824 local LABEL="$(getlabelfromsuite $SUITE)"
884a4c0a 825 if [ -n "$VERSION" ]; then
718f797c
DK
826 VERSION="-o APT::FTPArchive::Release::Version=${VERSION}"
827 fi
828 if [ -n "$LABEL" ]; then
829 LABEL="-o APT::FTPArchive::Release::Label=${LABEL}"
a3bbbab7 830 fi
884a4c0a
DK
831 aptftparchive -qq release $dir \
832 -o APT::FTPArchive::Release::Suite="${SUITE}" \
833 -o APT::FTPArchive::Release::Codename="${CODENAME}" \
718f797c 834 ${LABEL} \
884a4c0a
DK
835 ${VERSION} \
836 | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference
a3bbbab7 837 if [ "$SUITE" = "experimental" -o "$SUITE" = "experimental2" ]; then
35faae11
DK
838 sed -i '/^Date: / a\
839NotAutomatic: yes' $dir/Release
840 fi
884a4c0a
DK
841 if [ -n "$1" -a "$1" != "now" ]; then
842 sed -i "s/^Date: .*$/Date: $(date -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')/" $dir/Release
843 fi
844 if [ -n "$2" ]; then
845 sed -i "/^Date: / a\
846Valid-Until: $(date -d "$2" '+%a, %d %b %Y %H:%M:%S %Z')" $dir/Release
847 fi
9b78cda6
DK
848 done
849 else
850 aptftparchive -qq release ./aptarchive | sed -e '/0 Release$/ d' > aptarchive/Release # remove the self reference
8d876415 851 fi
884a4c0a 852 if [ -n "$1" -a "$1" != "now" ]; then
fe0f7911
DK
853 for release in $(find ./aptarchive -name 'Release'); do
854 touch -d "$1" $release
855 done
8d876415 856 fi
b7899b00 857 msgdone "info"
8d876415
DK
858}
859
b7899b00
DK
860setupdistsaptarchive() {
861 local APTARCHIVE=$(readlink -f ./aptarchive)
862 rm -f root/etc/apt/sources.list.d/apt-test-*-deb.list
863 rm -f root/etc/apt/sources.list.d/apt-test-*-deb-src.list
864 for DISTS in $(find ./aptarchive/dists/ -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 4); do
865 SECTIONS=$(find ./aptarchive/dists/${DISTS}/ -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 5 | tr '\n' ' ')
866 msgninfo "\tadd deb and deb-src sources.list lines for ${CCMD}${DISTS} ${SECTIONS}${CINFO}… "
867 echo "deb file://$APTARCHIVE $DISTS $SECTIONS" > rootdir/etc/apt/sources.list.d/apt-test-${DISTS}-deb.list
868 echo "deb-src file://$APTARCHIVE $DISTS $SECTIONS" > rootdir/etc/apt/sources.list.d/apt-test-${DISTS}-deb-src.list
869 msgdone "info"
870 done
871}
872
873setupflataptarchive() {
ce9864a8 874 local APTARCHIVE=$(readlink -f ./aptarchive)
8d876415
DK
875 if [ -f ${APTARCHIVE}/Packages ]; then
876 msgninfo "\tadd deb sources.list line… "
877 echo "deb file://$APTARCHIVE /" > rootdir/etc/apt/sources.list.d/apt-test-archive-deb.list
878 msgdone "info"
879 else
880 rm -f rootdir/etc/apt/sources.list.d/apt-test-archive-deb.list
881 fi
882 if [ -f ${APTARCHIVE}/Sources ]; then
883 msgninfo "\tadd deb-src sources.list line… "
884 echo "deb-src file://$APTARCHIVE /" > rootdir/etc/apt/sources.list.d/apt-test-archive-deb-src.list
885 msgdone "info"
886 else
887 rm -f rootdir/etc/apt/sources.list.d/apt-test-archive-deb-src.list
888 fi
b7899b00
DK
889}
890
891setupaptarchive() {
4dbfe436
DK
892 local NOUPDATE=0
893 if [ "$1" = '--no-update' ]; then
894 NOUPDATE=1
895 shift
896 fi
897 buildaptarchive "$@"
b7899b00
DK
898 if [ -e aptarchive/dists ]; then
899 setupdistsaptarchive
900 else
901 setupflataptarchive
902 fi
9d653a6d 903 signreleasefiles 'Joe Sixpack'
4dbfe436 904 if [ "1" != "$NOUPDATE" ]; then
5684f71f 905 testsuccess aptget update -o Debug::pkgAcquire::Worker=true -o Debug::Acquire::gpgv=true
b2ea1a47 906 fi
8d876415
DK
907}
908
f213b6ea
DK
909signreleasefiles() {
910 local SIGNER="${1:-Joe Sixpack}"
07cb47e7 911 local REPODIR="${2:-aptarchive}"
f1e1abd8 912 local KEY="keys/$(echo "$SIGNER" | tr 'A-Z' 'a-z' | sed 's# ##g')"
33a22672 913 local GPG="aptkey --quiet --keyring ${KEY}.pub --secret-keyring ${KEY}.sec --readonly adv --batch --yes"
f1e1abd8 914 msgninfo "\tSign archive with $SIGNER key $KEY… "
29a59c46
DK
915 local REXKEY='keys/rexexpired'
916 local SECEXPIREBAK="${REXKEY}.sec.bak"
917 local PUBEXPIREBAK="${REXKEY}.pub.bak"
918 if [ "${SIGNER}" = 'Rex Expired' ]; then
919 # the key is expired, so gpg doesn't allow to sign with and the --faked-system-time
920 # option doesn't exist anymore (and using faketime would add a new obscure dependency)
921 # therefore we 'temporary' make the key not expired and restore a backup after signing
922 cp ${REXKEY}.sec $SECEXPIREBAK
923 cp ${REXKEY}.pub $PUBEXPIREBAK
924 local SECUNEXPIRED="${REXKEY}.sec.unexpired"
925 local PUBUNEXPIRED="${REXKEY}.pub.unexpired"
926 if [ -f "$SECUNEXPIRED" ] && [ -f "$PUBUNEXPIRED" ]; then
927 cp $SECUNEXPIRED ${REXKEY}.sec
928 cp $PUBUNEXPIRED ${REXKEY}.pub
929 else
f1e1abd8
DK
930 if ! printf "expire\n1w\nsave\n" | $GPG --default-key "$SIGNER" --command-fd 0 --edit-key "${SIGNER}" >setexpire.gpg 2>&1; then
931 cat setexpire.gpg
932 exit 1
933 fi
29a59c46
DK
934 cp ${REXKEY}.sec $SECUNEXPIRED
935 cp ${REXKEY}.pub $PUBUNEXPIRED
936 fi
937 fi
07cb47e7 938 for RELEASE in $(find ${REPODIR}/ -name Release); do
29a59c46 939 $GPG --default-key "$SIGNER" --armor --detach-sign --sign --output ${RELEASE}.gpg ${RELEASE}
e3c62328 940 local INRELEASE="$(echo "${RELEASE}" | sed 's#/Release$#/InRelease#')"
29a59c46 941 $GPG --default-key "$SIGNER" --clearsign --output $INRELEASE $RELEASE
e3c62328
DK
942 # we might have set a specific date for the Release file, so copy it
943 touch -d "$(stat --format "%y" ${RELEASE})" ${RELEASE}.gpg ${INRELEASE}
f213b6ea 944 done
29a59c46
DK
945 if [ -f "$SECEXPIREBAK" ] && [ -f "$PUBEXPIREBAK" ]; then
946 mv -f $SECEXPIREBAK ${REXKEY}.sec
947 mv -f $PUBEXPIREBAK ${REXKEY}.pub
948 fi
f213b6ea
DK
949 msgdone "info"
950}
951
f2c0ec8b 952webserverconfig() {
b0314abb
DK
953 local NOCHECK=false
954 if [ "$1" = '--no-check' ]; then
955 NOCHECK=true
956 shift
957 fi
0d58c26a 958 local DOWNLOG='rootdir/tmp/download-testfile.log'
b0314abb 959 local STATUS='downloaded/webserverconfig.status'
0d58c26a 960 rm -f "$STATUS" "$DOWNLOG"
b0314abb
DK
961 local URI
962 if [ -n "$2" ]; then
963 msgtest "Set webserver config option '${1}' to" "$2"
964 URI="http://localhost:8080/_config/set/${1}/${2}"
965 else
966 msgtest 'Clear webserver config option' "${1}"
967 URI="http://localhost:8080/_config/clear/${1}"
968 fi
969 if downloadfile "$URI" "$STATUS" > "$DOWNLOG"; then
f2c0ec8b
DK
970 msgpass
971 else
b0314abb 972 cat "$DOWNLOG" "$STATUS" || true
0d58c26a 973 msgfail
f2c0ec8b 974 fi
b0314abb 975 $NOCHECK || testwebserverlaststatuscode '200'
f2c0ec8b
DK
976}
977
fd46d305
DK
978rewritesourceslist() {
979 local APTARCHIVE="file://$(readlink -f "${TMPWORKINGDIRECTORY}/aptarchive")"
980 for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do
b0314abb 981 sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#http://localhost:8080/#${1}#" -e "s#https://localhost:4433/#${1}#"
fd46d305
DK
982 done
983}
984
5572f6bd
MV
985# wait for up to 10s for a pid file to appear to avoid possible race
986# when a helper is started and dosn't write the PID quick enough
987waitforpidfile() {
988 local PIDFILE="$1"
989 for i in $(seq 10); do
990 if test -s "$PIDFILE"; then
991 return 0
992 fi
993 sleep 1
994 done
995 msgdie "waiting for $PIDFILE failed"
996 return 1
997}
998
f213b6ea 999changetowebserver() {
23af9f40
DK
1000 if [ "$1" != '--no-rewrite' ]; then
1001 rewritesourceslist 'http://localhost:8080/'
1002 else
1003 shift
1004 fi
5c0dd6fc 1005 if test -x ${APTWEBSERVERBINDIR}/aptwebserver; then
fbd29dd6 1006 cd aptarchive
a0db467c
DK
1007 local LOG="webserver.log"
1008 if ! aptwebserver -o aptwebserver::fork=1 "$@" >$LOG 2>&1 ; then
bee0670b
DK
1009 cat $LOG
1010 false
1011 fi
5572f6bd 1012 waitforpidfile aptwebserver.pid
e3c62328
DK
1013 local PID="$(cat aptwebserver.pid)"
1014 if [ -z "$PID" ]; then
1015 msgdie 'Could not fork aptwebserver successfully'
1016 fi
1017 addtrap "kill $PID;"
fbd29dd6 1018 cd - > /dev/null
c5bcc607 1019 else
fbd29dd6 1020 msgdie 'You have to build aptwerbserver or install a webserver'
f213b6ea 1021 fi
fd46d305
DK
1022}
1023
1024changetohttpswebserver() {
1025 if ! which stunnel4 >/dev/null; then
1026 msgdie 'You need to install stunnel4 for https testcases'
1027 fi
1028 if [ ! -e "${TMPWORKINGDIRECTORY}/aptarchive/aptwebserver.pid" ]; then
dc95fee1 1029 changetowebserver --no-rewrite "$@"
fd46d305
DK
1030 fi
1031 echo "pid = ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid
68ba0b7f 1032cert = ${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem
23af9f40 1033output = /dev/null
fd46d305
DK
1034
1035[https]
1036accept = 4433
1037connect = 8080
1038" > ${TMPWORKINGDIRECTORY}/stunnel.conf
1039 stunnel4 "${TMPWORKINGDIRECTORY}/stunnel.conf"
5572f6bd 1040 waitforpidfile "${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid"
fd46d305 1041 local PID="$(cat ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid)"
5572f6bd
MV
1042 if [ -z "$PID" ]; then
1043 msgdie 'Could not fork stunnel4 successfully'
1044 fi
fd46d305
DK
1045 addtrap 'prefix' "kill ${PID};"
1046 rewritesourceslist 'https://localhost:4433/'
f213b6ea
DK
1047}
1048
c45233ea
DK
1049changetocdrom() {
1050 mkdir -p rootdir/media/cdrom/.disk
1051 local CD="$(readlink -f rootdir/media/cdrom)"
a0975c8d
DK
1052 echo "acquire::cdrom::mount \"${CD}\";
1053acquire::cdrom::${CD}/::mount \"mv ${CD}-unmounted ${CD}\";
1054acquire::cdrom::${CD}/::umount \"mv ${CD} ${CD}-unmounted\";
1055acquire::cdrom::autodetect 0;" > rootdir/etc/apt/apt.conf.d/00cdrom
c45233ea
DK
1056 echo -n "$1" > ${CD}/.disk/info
1057 if [ ! -d aptarchive/dists ]; then
1058 msgdie 'Flat file archive cdroms can not be created currently'
1059 return 1
1060 fi
a0975c8d 1061 mv aptarchive/dists "$CD"
c45233ea
DK
1062 ln -s "$(readlink -f ./incoming)" $CD/pool
1063 find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list' -delete
a0975c8d
DK
1064 # start with an unmounted disk
1065 mv "${CD}" "${CD}-unmounted"
1066 # we don't want the disk to be modifiable
1067 addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/media/cdrom/dists/ $PWD/rootdir/media/cdrom-unmounted/dists/ || true;"
b0314abb 1068 chmod -R 555 rootdir/media/cdrom-unmounted/dists
c45233ea
DK
1069}
1070
fd46d305 1071downloadfile() {
0d58c26a 1072 local PROTO="$(echo "$1" | cut -d':' -f 1 )"
3dcdc1f9 1073 apthelper -o Debug::Acquire::${PROTO}=1 \
0d58c26a 1074 download-file "$1" "$2" 2>&1 || true
fd46d305 1075 # only if the file exists the download was successful
b0314abb 1076 if [ -r "$2" ]; then
fd46d305
DK
1077 return 0
1078 else
1079 return 1
1080 fi
1081}
1082
f213b6ea 1083checkdiff() {
03aa0847 1084 local DIFFTEXT="$(command diff -u "$@" 2>&1 | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')"
8d876415 1085 if [ -n "$DIFFTEXT" ]; then
0d58c26a
DK
1086 echo >&2
1087 echo >&2 "$DIFFTEXT"
8d876415
DK
1088 return 1
1089 else
1090 return 0
1091 fi
1092}
1093
75954ae2
DK
1094testfileequal() {
1095 local FILE="$1"
1096 shift
1097 msgtest "Test for correctness of file" "$FILE"
1098 if [ -z "$*" ]; then
f213b6ea 1099 echo -n "" | checkdiff $FILE - && msgpass || msgfail
75954ae2 1100 else
f213b6ea 1101 echo "$*" | checkdiff $FILE - && msgpass || msgfail
75954ae2
DK
1102 fi
1103}
1104
b855a400
DK
1105testempty() {
1106 msgtest "Test for no output of" "$*"
859093da 1107 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile"
ab25bf1f 1108 if "$@" >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then
859093da
DK
1109 msgpass
1110 else
1111 cat $COMPAREFILE
1112 msgfail
1113 fi
ab25bf1f 1114 aptautotest 'testempty' "$@"
b855a400
DK
1115}
1116
f74a6fa1
DK
1117testequal() {
1118 local MSG='Test of equality of'
1119 if [ "$1" = '--nomsg' ]; then
1120 MSG=''
1121 shift
1122 fi
1123
03938280 1124 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequal.comparefile"
8d876415
DK
1125 echo "$1" > $COMPAREFILE
1126 shift
d2d68aaf 1127
f74a6fa1
DK
1128 if [ -n "$MSG" ]; then
1129 msgtest "$MSG" "$*"
1130 fi
ab25bf1f
DK
1131 "$@" 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
1132 aptautotest 'testequal' "$@"
8d876415
DK
1133}
1134
685625bd 1135testequalor2() {
03938280
DK
1136 local COMPAREFILE1="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile1"
1137 local COMPAREFILE2="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile2"
1138 local COMPAREAGAINST="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.compareagainst"
685625bd
DK
1139 echo "$1" > $COMPAREFILE1
1140 echo "$2" > $COMPAREFILE2
1141 shift 2
1142 msgtest "Test for equality OR of" "$*"
ab25bf1f 1143 "$@" >$COMPAREAGAINST 2>&1 || true
0d58c26a
DK
1144 if checkdiff $COMPAREFILE1 $COMPAREAGAINST >/dev/null 2>&1 || \
1145 checkdiff $COMPAREFILE2 $COMPAREAGAINST >/dev/null 2>&1
1146 then
0caa5a4c
DK
1147 msgpass
1148 else
1149 echo -n "\n${CINFO}Diff against OR 1${CNORMAL}"
1150 checkdiff $COMPAREFILE1 $COMPAREAGAINST || true
1151 echo -n "${CINFO}Diff against OR 2${CNORMAL}"
1152 checkdiff $COMPAREFILE2 $COMPAREAGAINST || true
1153 msgfail
1154 fi
ab25bf1f 1155 aptautotest 'testequalor2' "$@"
685625bd
DK
1156}
1157
8d876415 1158testshowvirtual() {
edc0ef10 1159 local VIRTUAL="N: Can't select versions from package '$1' as it is purely virtual"
8d876415
DK
1160 local PACKAGE="$1"
1161 shift
1162 while [ -n "$1" ]; do
1163 VIRTUAL="${VIRTUAL}
edc0ef10 1164N: Can't select versions from package '$1' as it is purely virtual"
8d876415
DK
1165 PACKAGE="${PACKAGE} $1"
1166 shift
1167 done
1168 msgtest "Test for virtual packages" "apt-cache show $PACKAGE"
1169 VIRTUAL="${VIRTUAL}
4bec02c2 1170N: No packages found"
03938280 1171 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testshowvirtual.comparefile"
ea65d079 1172 local ARCH="$(getarchitecture 'native')"
8d876415 1173 echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' > $COMPAREFILE
e8379ba3 1174 aptcache show -q=0 $PACKAGE 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
8d876415
DK
1175}
1176
1177testnopackage() {
1178 msgtest "Test for non-existent packages" "apt-cache show $*"
846856f4 1179 local SHOWPKG="$(aptcache show "$@" 2>&1 | grep '^Package: ')"
8d876415 1180 if [ -n "$SHOWPKG" ]; then
0d58c26a
DK
1181 echo >&2
1182 echo >&2 "$SHOWPKG"
8d876415 1183 msgfail
0d58c26a
DK
1184 else
1185 msgpass
8d876415 1186 fi
8d876415 1187}
01a6e24c
DK
1188
1189testdpkginstalled() {
1190 msgtest "Test for correctly installed package(s) with" "dpkg -l $*"
846856f4 1191 local PKGS="$(dpkg -l "$@" 2>/dev/null | grep '^i' | wc -l)"
87bc1c45 1192 if [ "$PKGS" != $# ]; then
0d58c26a
DK
1193 echo >&2 $PKGS
1194 dpkg -l "$@" | grep '^[a-z]' >&2
01a6e24c 1195 msgfail
0d58c26a
DK
1196 else
1197 msgpass
01a6e24c 1198 fi
01a6e24c
DK
1199}
1200
5cf733e1
DK
1201testdpkgnotinstalled() {
1202 msgtest "Test for correctly not-installed package(s) with" "dpkg -l $*"
846856f4 1203 local PKGS="$(dpkg -l "$@" 2> /dev/null | grep '^i' | wc -l)"
01a6e24c
DK
1204 if [ "$PKGS" != 0 ]; then
1205 echo
0d58c26a 1206 dpkg -l "$@" | grep '^[a-z]' >&2
01a6e24c 1207 msgfail
0d58c26a
DK
1208 else
1209 msgpass
01a6e24c 1210 fi
01a6e24c 1211}
ec7f904e
DK
1212
1213testmarkedauto() {
03938280 1214 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testmarkedauto.comparefile"
ec7f904e
DK
1215 if [ -n "$1" ]; then
1216 msgtest 'Test for correctly marked as auto-installed' "$*"
1217 while [ -n "$1" ]; do echo "$1"; shift; done | sort > $COMPAREFILE
1218 else
1219 msgtest 'Test for correctly marked as auto-installed' 'no package'
c98fb5e0 1220 echo -n > $COMPAREFILE
ec7f904e
DK
1221 fi
1222 aptmark showauto 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
1223}
89a1aa5d 1224
0440d936
DK
1225testsuccess() {
1226 if [ "$1" = '--nomsg' ]; then
1227 shift
1228 else
1229 msgtest 'Test for successful execution of' "$*"
1230 fi
03938280 1231 local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
4fa34122
DK
1232 if "$@" >${OUTPUT} 2>&1; then
1233 if expr match "$1" '^apt.*' >/dev/null; then
1234 if grep -q -E '^[WE]: ' "$OUTPUT"; then
1235 echo >&2
1236 cat >&2 $OUTPUT
1237 msgfail 'successful run, but output contains warnings/errors'
1238 else
1239 msgpass
1240 fi
1241 else
1242 msgpass
1243 fi
1244 else
1245 local EXITCODE=$?
1246 echo >&2
1247 cat >&2 $OUTPUT
1248 msgfail "exitcode $EXITCODE"
1249 fi
1250 aptautotest 'testsuccess' "$@"
1251}
1252testwarning() {
1253 if [ "$1" = '--nomsg' ]; then
1254 shift
1255 else
1256 msgtest 'Test for successful execution with warnings of' "$*"
1257 fi
1258 local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
1df24acf
DK
1259 if "$@" >${OUTPUT} 2>&1; then
1260 if expr match "$1" '^apt.*' >/dev/null; then
1261 if grep -q -E '^E: ' "$OUTPUT"; then
1262 echo >&2
1263 cat >&2 $OUTPUT
1264 msgfail 'successful run, but output contains errors'
4fa34122
DK
1265 elif ! grep -q -E '^W: ' "$OUTPUT"; then
1266 echo >&2
1267 cat >&2 $OUTPUT
1268 msgfail 'successful run, but output contains no warnings'
1df24acf
DK
1269 else
1270 msgpass
1271 fi
1272 else
1273 msgpass
1274 fi
0440d936 1275 else
07cb47e7 1276 local EXITCODE=$?
0d58c26a
DK
1277 echo >&2
1278 cat >&2 $OUTPUT
07cb47e7 1279 msgfail "exitcode $EXITCODE"
0440d936 1280 fi
4fa34122 1281 aptautotest 'testwarning' "$@"
0440d936 1282}
0440d936
DK
1283testfailure() {
1284 if [ "$1" = '--nomsg' ]; then
1285 shift
1286 else
889b0072 1287 msgtest 'Test for failure in execution of' "$*"
0440d936 1288 fi
03938280 1289 local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output"
1df24acf 1290 if "$@" >${OUTPUT} 2>&1; then
07cb47e7 1291 local EXITCODE=$?
0d58c26a
DK
1292 echo >&2
1293 cat >&2 $OUTPUT
07cb47e7 1294 msgfail "exitcode $EXITCODE"
0440d936 1295 else
1df24acf
DK
1296 local EXITCODE=$?
1297 if expr match "$1" '^apt.*' >/dev/null; then
1298 if ! grep -q -E '^E: ' "$OUTPUT"; then
1299 echo >&2
1300 cat >&2 $OUTPUT
1301 msgfail "run failed with exitcode ${EXITCODE}, but with no errors"
1302 else
1303 msgpass
1304 fi
1305 else
1306 msgpass
1307 fi
0440d936 1308 fi
ab25bf1f 1309 aptautotest 'testfailure' "$@"
0440d936
DK
1310}
1311
de81b2e2
DK
1312testfilestats() {
1313 msgtest "Test that file $1 has $2 $3" "$4"
1314 if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then
5684f71f
DK
1315 msgpass
1316 else
1317 echo >&2
1318 ls -l >&2 "$1"
de81b2e2
DK
1319 echo -n >&2 "stat(1) reports for $2: "
1320 stat --format "$2" "$1"
5684f71f
DK
1321 msgfail
1322 fi
1323}
de81b2e2
DK
1324testaccessrights() {
1325 testfilestats "$1" '%a' '=' "$2"
1326}
5684f71f 1327
0d58c26a
DK
1328testwebserverlaststatuscode() {
1329 local DOWNLOG='rootdir/tmp/webserverstatus-testfile.log'
03aa0847 1330 local STATUS='downloaded/webserverstatus-statusfile.log'
0d58c26a
DK
1331 rm -f "$DOWNLOG" "$STATUS"
1332 msgtest 'Test last status code from the webserver was' "$1"
b0314abb 1333 if downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then
0d58c26a
DK
1334 msgpass
1335 else
1336 echo >&2
1337 if [ -n "$2" ]; then
1338 shift
1339 echo >&2 '#### Additionally provided output files contain:'
1340 cat >&2 "$@"
1341 fi
1342 echo >&2 '#### Download log of the status code:'
1343 cat >&2 "$DOWNLOG"
1344 msgfail "Status was $(cat "$STATUS")"
1345 fi
1346}
1347
89a1aa5d
DK
1348pause() {
1349 echo "STOPPED execution. Press enter to continue"
1350 local IGNORE
1351 read IGNORE
1352}
ab25bf1f 1353
846bc058
DK
1354listcurrentlistsdirectory() {
1355 find rootdir/var/lib/apt/lists -maxdepth 1 -type d | while read line; do
1356 stat --format '%U:%G:%a:%n' "$line"
1357 done
1358 find rootdir/var/lib/apt/lists -maxdepth 1 \! -type d | while read line; do
1359 stat --format '%U:%G:%a:%s:%y:%n' "$line"
1360 done
1361}
1362
ab25bf1f
DK
1363### The following tests are run by most test methods automatically to check
1364### general things about commands executed without writing the test every time.
1365
1366aptautotest() {
1367 local TESTCALL="$1"
1368 local CMD="$2"
1369 local FIRSTOPT="$3"
1370 local AUTOTEST="aptautotest_$(basename "$CMD" | tr -d '-')_$(echo "$FIRSTOPT" | tr -d '-')"
1371 if command -v $AUTOTEST >/dev/null; then
1372 shift 3
1373 # save and restore the *.output files from other tests
1374 # as we might otherwise override them in these automatic tests
03aa0847
DK
1375 rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-before
1376 mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-before
1377 mkdir ${TMPWORKINGDIRECTORY}/rootdir/tmp
ab25bf1f 1378 $AUTOTEST "$TESTCALL" "$@"
03aa0847
DK
1379 rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest
1380 mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest
1381 mv ${TMPWORKINGDIRECTORY}/rootdir/tmp-before ${TMPWORKINGDIRECTORY}/rootdir/tmp
ab25bf1f
DK
1382 fi
1383}
1384
1385aptautotest_aptget_update() {
1386 if ! test -d "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"; then return; fi
1387 # all copied files are properly chmodded
03aa0847 1388 for file in $(find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" -maxdepth 1 -type f); do
ab25bf1f
DK
1389 testfilestats "$file" '%U:%G:%a' '=' "${USER}:${USER}:644"
1390 done
1391}
1392aptautotest_apt_update() { aptautotest_aptget_update "$@"; }