]> git.saurik.com Git - apt.git/blame - test/integration/framework
rewrite ReadMessages()
[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 666insertpackage() {
10e100e5 667 local RELEASES="$1"
9b78cda6
DK
668 local NAME="$2"
669 local ARCH="$3"
670 local VERSION="$4"
671 local DEPENDENCIES="$5"
d67004e0 672 local PRIORITY="${6:-optional}"
10e100e5 673 local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASES}
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=""
10e100e5
DK
678 for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do
679 if [ "$RELEASE" = 'installed' ]; then
680 insertinstalledpackage "$2" "$3" "$4" "$5" "$6" "$7"
681 continue
d67004e0 682 fi
10e100e5
DK
683 for arch in $(getarchitecturesfromcommalist "$ARCH"); do
684 if [ "$arch" = 'all' -o "$arch" = 'none' ]; then
685 ARCHS="$(getarchitectures)"
686 else
687 ARCHS="$arch"
688 fi
689 for BUILDARCH in $ARCHS; do
690 local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}"
691 mkdir -p $PPATH
692 local FILE="${PPATH}/Packages"
693 echo "Package: $NAME
d67004e0 694Priority: $PRIORITY
9b78cda6 695Section: other
2c085486 696Installed-Size: 42
c919ad6e 697Maintainer: Joe Sixpack <joe@example.org>" >> $FILE
10e100e5
DK
698 test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE
699 echo "Version: $VERSION
d67004e0 700Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb" >> $FILE
10e100e5
DK
701 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
702 echo "Description: $(printf '%s' "$DESCRIPTION" | head -n 1)" >> $FILE
703 echo "Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)" >> $FILE
704 echo >> $FILE
705 done
d67004e0 706 done
10e100e5
DK
707 mkdir -p aptarchive/dists/${RELEASE}/main/source aptarchive/dists/${RELEASE}/main/i18n
708 touch aptarchive/dists/${RELEASE}/main/source/Sources
709 echo "Package: $NAME
0e0d9919
DK
710Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)
711Description-en: $DESCRIPTION
712" >> aptarchive/dists/${RELEASE}/main/i18n/Translation-en
10e100e5 713 done
9b78cda6
DK
714}
715
234675b7
DK
716insertsource() {
717 local RELEASE="$1"
718 local NAME="$2"
719 local ARCH="$3"
720 local VERSION="$4"
721 local DEPENDENCIES="$5"
722 local ARCHS=""
723 local SPATH="aptarchive/dists/${RELEASE}/main/source"
724 mkdir -p $SPATH
725 local FILE="${SPATH}/Sources"
726 echo "Package: $NAME
727Binary: $NAME
728Version: $VERSION
729Maintainer: Joe Sixpack <joe@example.org>
730Architecture: $ARCH" >> $FILE
731 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
732 echo "Files:
733 d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.dsc
d5dea0be
DK
734 d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.tar.gz
735" >> $FILE
234675b7
DK
736}
737
dfc2b1be
DK
738insertinstalledpackage() {
739 local NAME="$1"
740 local ARCH="$2"
741 local VERSION="$3"
742 local DEPENDENCIES="$4"
d67004e0 743 local PRIORITY="${5:-optional}"
d4b4e5ea 744 local STATUS="${6:-install ok installed}"
14109555 745 local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/installed
18908589
DK
746 If you find such a package installed on your system,
747 something went horribly wrong! They are autogenerated
748 und used only by testcases and surf no other propose…"}"
749
53ea1b56
DK
750 local FILE='rootdir/var/lib/dpkg/status'
751 local INFO='rootdir/var/lib/dpkg/info'
3dcdc1f9 752 for arch in $(getarchitecturesfromcommalist "$ARCH"); do
d67004e0 753 echo "Package: $NAME
d4b4e5ea 754Status: $STATUS
d67004e0 755Priority: $PRIORITY
dfc2b1be
DK
756Section: other
757Installed-Size: 42
758Maintainer: Joe Sixpack <joe@example.org>
dfc2b1be 759Version: $VERSION" >> $FILE
c919ad6e 760 test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE
d67004e0 761 test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
18908589
DK
762 echo "Description: $DESCRIPTION" >> $FILE
763 echo >> $FILE
53ea1b56
DK
764 if [ "$(dpkg-query -W --showformat='${Multi-Arch}')" = 'same' ]; then
765 echo -n > ${INFO}/${NAME}:${arch}.list
766 else
767 echo -n > ${INFO}/${NAME}.list
768 fi
d67004e0 769 done
dfc2b1be
DK
770}
771
772
ce9864a8 773buildaptarchivefromincoming() {
3cbbda3c 774 msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on incoming packages…"
ce9864a8
DK
775 cd aptarchive
776 [ -e pool ] || ln -s ../incoming pool
777 [ -e ftparchive.conf ] || createaptftparchiveconfig
778 [ -e dists ] || buildaptftparchivedirectorystructure
b7899b00 779 msgninfo "\tGenerate Packages, Sources and Contents files… "
ce9864a8 780 aptftparchive -qq generate ftparchive.conf
ce9864a8
DK
781 cd - > /dev/null
782 msgdone "info"
4dbfe436 783 generatereleasefiles "$@"
ce9864a8
DK
784}
785
786buildaptarchivefromfiles() {
3cbbda3c 787 msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on prebuild files…"
0e0d9919 788 find aptarchive -name 'Packages' -o -name 'Sources' -o -name 'Translation-*' | while read line; do
9b78cda6 789 msgninfo "\t${line} file… "
276e51dd 790 compressfile "$line" "$1"
8d876415 791 msgdone "info"
9b78cda6 792 done
e3c62328 793 generatereleasefiles "$@"
9b78cda6
DK
794}
795
276e51dd
DK
796compressfile() {
797 cat ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf | while read compressor extension command; do
798 if [ "$compressor" = '.' ]; then
799 if [ -n "$2" ]; then
800 touch -d "$2" "$1"
801 fi
802 continue
803 fi
804 cat "$1" | $command > "${1}.${extension}"
805 if [ -n "$2" ]; then
806 touch -d "$2" "${1}.${extension}"
807 fi
808 done
809}
810
a3bbbab7 811# can be overridden by testcases for their pleasure
bf9e7447
DK
812getcodenamefromsuite() {
813 case "$1" in
814 unstable) echo 'sid';;
815 *) echo -n "$1";;
816 esac
817}
a3bbbab7 818getreleaseversionfromsuite() { true; }
718f797c 819getlabelfromsuite() { true; }
a3bbbab7 820
9b78cda6 821generatereleasefiles() {
884a4c0a
DK
822 # $1 is the Date header and $2 is the ValidUntil header to be set
823 # both should be given in notation date/touch can understand
9b78cda6
DK
824 msgninfo "\tGenerate Release files… "
825 if [ -e aptarchive/dists ]; then
826 for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do
a3bbbab7
DK
827 local SUITE="$(echo "$dir" | cut -d'/' -f 4)"
828 local CODENAME="$(getcodenamefromsuite $SUITE)"
829 local VERSION="$(getreleaseversionfromsuite $SUITE)"
718f797c 830 local LABEL="$(getlabelfromsuite $SUITE)"
884a4c0a 831 if [ -n "$VERSION" ]; then
718f797c
DK
832 VERSION="-o APT::FTPArchive::Release::Version=${VERSION}"
833 fi
834 if [ -n "$LABEL" ]; then
835 LABEL="-o APT::FTPArchive::Release::Label=${LABEL}"
a3bbbab7 836 fi
884a4c0a
DK
837 aptftparchive -qq release $dir \
838 -o APT::FTPArchive::Release::Suite="${SUITE}" \
839 -o APT::FTPArchive::Release::Codename="${CODENAME}" \
718f797c 840 ${LABEL} \
884a4c0a
DK
841 ${VERSION} \
842 | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference
a3bbbab7 843 if [ "$SUITE" = "experimental" -o "$SUITE" = "experimental2" ]; then
35faae11
DK
844 sed -i '/^Date: / a\
845NotAutomatic: yes' $dir/Release
846 fi
884a4c0a
DK
847 if [ -n "$1" -a "$1" != "now" ]; then
848 sed -i "s/^Date: .*$/Date: $(date -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')/" $dir/Release
849 fi
850 if [ -n "$2" ]; then
851 sed -i "/^Date: / a\
852Valid-Until: $(date -d "$2" '+%a, %d %b %Y %H:%M:%S %Z')" $dir/Release
853 fi
9b78cda6
DK
854 done
855 else
856 aptftparchive -qq release ./aptarchive | sed -e '/0 Release$/ d' > aptarchive/Release # remove the self reference
8d876415 857 fi
884a4c0a 858 if [ -n "$1" -a "$1" != "now" ]; then
fe0f7911
DK
859 for release in $(find ./aptarchive -name 'Release'); do
860 touch -d "$1" $release
861 done
8d876415 862 fi
b7899b00 863 msgdone "info"
8d876415
DK
864}
865
b7899b00
DK
866setupdistsaptarchive() {
867 local APTARCHIVE=$(readlink -f ./aptarchive)
868 rm -f root/etc/apt/sources.list.d/apt-test-*-deb.list
869 rm -f root/etc/apt/sources.list.d/apt-test-*-deb-src.list
870 for DISTS in $(find ./aptarchive/dists/ -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 4); do
871 SECTIONS=$(find ./aptarchive/dists/${DISTS}/ -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 5 | tr '\n' ' ')
872 msgninfo "\tadd deb and deb-src sources.list lines for ${CCMD}${DISTS} ${SECTIONS}${CINFO}… "
873 echo "deb file://$APTARCHIVE $DISTS $SECTIONS" > rootdir/etc/apt/sources.list.d/apt-test-${DISTS}-deb.list
874 echo "deb-src file://$APTARCHIVE $DISTS $SECTIONS" > rootdir/etc/apt/sources.list.d/apt-test-${DISTS}-deb-src.list
875 msgdone "info"
876 done
877}
878
879setupflataptarchive() {
ce9864a8 880 local APTARCHIVE=$(readlink -f ./aptarchive)
8d876415
DK
881 if [ -f ${APTARCHIVE}/Packages ]; then
882 msgninfo "\tadd deb sources.list line… "
883 echo "deb file://$APTARCHIVE /" > rootdir/etc/apt/sources.list.d/apt-test-archive-deb.list
884 msgdone "info"
885 else
886 rm -f rootdir/etc/apt/sources.list.d/apt-test-archive-deb.list
887 fi
888 if [ -f ${APTARCHIVE}/Sources ]; then
889 msgninfo "\tadd deb-src sources.list line… "
890 echo "deb-src file://$APTARCHIVE /" > rootdir/etc/apt/sources.list.d/apt-test-archive-deb-src.list
891 msgdone "info"
892 else
893 rm -f rootdir/etc/apt/sources.list.d/apt-test-archive-deb-src.list
894 fi
b7899b00
DK
895}
896
897setupaptarchive() {
4dbfe436
DK
898 local NOUPDATE=0
899 if [ "$1" = '--no-update' ]; then
900 NOUPDATE=1
901 shift
902 fi
903 buildaptarchive "$@"
b7899b00
DK
904 if [ -e aptarchive/dists ]; then
905 setupdistsaptarchive
906 else
907 setupflataptarchive
908 fi
9d653a6d 909 signreleasefiles 'Joe Sixpack'
4dbfe436 910 if [ "1" != "$NOUPDATE" ]; then
5684f71f 911 testsuccess aptget update -o Debug::pkgAcquire::Worker=true -o Debug::Acquire::gpgv=true
b2ea1a47 912 fi
8d876415
DK
913}
914
f213b6ea
DK
915signreleasefiles() {
916 local SIGNER="${1:-Joe Sixpack}"
07cb47e7 917 local REPODIR="${2:-aptarchive}"
f1e1abd8 918 local KEY="keys/$(echo "$SIGNER" | tr 'A-Z' 'a-z' | sed 's# ##g')"
33a22672 919 local GPG="aptkey --quiet --keyring ${KEY}.pub --secret-keyring ${KEY}.sec --readonly adv --batch --yes"
f1e1abd8 920 msgninfo "\tSign archive with $SIGNER key $KEY… "
29a59c46
DK
921 local REXKEY='keys/rexexpired'
922 local SECEXPIREBAK="${REXKEY}.sec.bak"
923 local PUBEXPIREBAK="${REXKEY}.pub.bak"
924 if [ "${SIGNER}" = 'Rex Expired' ]; then
925 # the key is expired, so gpg doesn't allow to sign with and the --faked-system-time
926 # option doesn't exist anymore (and using faketime would add a new obscure dependency)
927 # therefore we 'temporary' make the key not expired and restore a backup after signing
928 cp ${REXKEY}.sec $SECEXPIREBAK
929 cp ${REXKEY}.pub $PUBEXPIREBAK
930 local SECUNEXPIRED="${REXKEY}.sec.unexpired"
931 local PUBUNEXPIRED="${REXKEY}.pub.unexpired"
932 if [ -f "$SECUNEXPIRED" ] && [ -f "$PUBUNEXPIRED" ]; then
933 cp $SECUNEXPIRED ${REXKEY}.sec
934 cp $PUBUNEXPIRED ${REXKEY}.pub
935 else
f1e1abd8
DK
936 if ! printf "expire\n1w\nsave\n" | $GPG --default-key "$SIGNER" --command-fd 0 --edit-key "${SIGNER}" >setexpire.gpg 2>&1; then
937 cat setexpire.gpg
938 exit 1
939 fi
29a59c46
DK
940 cp ${REXKEY}.sec $SECUNEXPIRED
941 cp ${REXKEY}.pub $PUBUNEXPIRED
942 fi
943 fi
07cb47e7 944 for RELEASE in $(find ${REPODIR}/ -name Release); do
29a59c46 945 $GPG --default-key "$SIGNER" --armor --detach-sign --sign --output ${RELEASE}.gpg ${RELEASE}
e3c62328 946 local INRELEASE="$(echo "${RELEASE}" | sed 's#/Release$#/InRelease#')"
29a59c46 947 $GPG --default-key "$SIGNER" --clearsign --output $INRELEASE $RELEASE
e3c62328
DK
948 # we might have set a specific date for the Release file, so copy it
949 touch -d "$(stat --format "%y" ${RELEASE})" ${RELEASE}.gpg ${INRELEASE}
f213b6ea 950 done
29a59c46
DK
951 if [ -f "$SECEXPIREBAK" ] && [ -f "$PUBEXPIREBAK" ]; then
952 mv -f $SECEXPIREBAK ${REXKEY}.sec
953 mv -f $PUBEXPIREBAK ${REXKEY}.pub
954 fi
f213b6ea
DK
955 msgdone "info"
956}
957
f2c0ec8b 958webserverconfig() {
b0314abb
DK
959 local NOCHECK=false
960 if [ "$1" = '--no-check' ]; then
961 NOCHECK=true
962 shift
963 fi
0d58c26a 964 local DOWNLOG='rootdir/tmp/download-testfile.log'
b0314abb 965 local STATUS='downloaded/webserverconfig.status'
0d58c26a 966 rm -f "$STATUS" "$DOWNLOG"
b0314abb
DK
967 local URI
968 if [ -n "$2" ]; then
969 msgtest "Set webserver config option '${1}' to" "$2"
970 URI="http://localhost:8080/_config/set/${1}/${2}"
971 else
972 msgtest 'Clear webserver config option' "${1}"
973 URI="http://localhost:8080/_config/clear/${1}"
974 fi
975 if downloadfile "$URI" "$STATUS" > "$DOWNLOG"; then
f2c0ec8b
DK
976 msgpass
977 else
b0314abb 978 cat "$DOWNLOG" "$STATUS" || true
0d58c26a 979 msgfail
f2c0ec8b 980 fi
b0314abb 981 $NOCHECK || testwebserverlaststatuscode '200'
f2c0ec8b
DK
982}
983
fd46d305
DK
984rewritesourceslist() {
985 local APTARCHIVE="file://$(readlink -f "${TMPWORKINGDIRECTORY}/aptarchive")"
986 for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do
b0314abb 987 sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#http://localhost:8080/#${1}#" -e "s#https://localhost:4433/#${1}#"
fd46d305
DK
988 done
989}
990
5572f6bd
MV
991# wait for up to 10s for a pid file to appear to avoid possible race
992# when a helper is started and dosn't write the PID quick enough
993waitforpidfile() {
994 local PIDFILE="$1"
995 for i in $(seq 10); do
996 if test -s "$PIDFILE"; then
997 return 0
998 fi
999 sleep 1
1000 done
1001 msgdie "waiting for $PIDFILE failed"
1002 return 1
1003}
1004
f213b6ea 1005changetowebserver() {
23af9f40
DK
1006 if [ "$1" != '--no-rewrite' ]; then
1007 rewritesourceslist 'http://localhost:8080/'
1008 else
1009 shift
1010 fi
5c0dd6fc 1011 if test -x ${APTWEBSERVERBINDIR}/aptwebserver; then
fbd29dd6 1012 cd aptarchive
a0db467c
DK
1013 local LOG="webserver.log"
1014 if ! aptwebserver -o aptwebserver::fork=1 "$@" >$LOG 2>&1 ; then
bee0670b
DK
1015 cat $LOG
1016 false
1017 fi
5572f6bd 1018 waitforpidfile aptwebserver.pid
e3c62328
DK
1019 local PID="$(cat aptwebserver.pid)"
1020 if [ -z "$PID" ]; then
1021 msgdie 'Could not fork aptwebserver successfully'
1022 fi
1023 addtrap "kill $PID;"
fbd29dd6 1024 cd - > /dev/null
c5bcc607 1025 else
fbd29dd6 1026 msgdie 'You have to build aptwerbserver or install a webserver'
f213b6ea 1027 fi
fd46d305
DK
1028}
1029
1030changetohttpswebserver() {
1031 if ! which stunnel4 >/dev/null; then
1032 msgdie 'You need to install stunnel4 for https testcases'
1033 fi
1034 if [ ! -e "${TMPWORKINGDIRECTORY}/aptarchive/aptwebserver.pid" ]; then
dc95fee1 1035 changetowebserver --no-rewrite "$@"
fd46d305
DK
1036 fi
1037 echo "pid = ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid
68ba0b7f 1038cert = ${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem
23af9f40 1039output = /dev/null
fd46d305
DK
1040
1041[https]
1042accept = 4433
1043connect = 8080
1044" > ${TMPWORKINGDIRECTORY}/stunnel.conf
1045 stunnel4 "${TMPWORKINGDIRECTORY}/stunnel.conf"
5572f6bd 1046 waitforpidfile "${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid"
fd46d305 1047 local PID="$(cat ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid)"
5572f6bd
MV
1048 if [ -z "$PID" ]; then
1049 msgdie 'Could not fork stunnel4 successfully'
1050 fi
fd46d305
DK
1051 addtrap 'prefix' "kill ${PID};"
1052 rewritesourceslist 'https://localhost:4433/'
f213b6ea
DK
1053}
1054
c45233ea
DK
1055changetocdrom() {
1056 mkdir -p rootdir/media/cdrom/.disk
1057 local CD="$(readlink -f rootdir/media/cdrom)"
a0975c8d
DK
1058 echo "acquire::cdrom::mount \"${CD}\";
1059acquire::cdrom::${CD}/::mount \"mv ${CD}-unmounted ${CD}\";
1060acquire::cdrom::${CD}/::umount \"mv ${CD} ${CD}-unmounted\";
1061acquire::cdrom::autodetect 0;" > rootdir/etc/apt/apt.conf.d/00cdrom
c45233ea
DK
1062 echo -n "$1" > ${CD}/.disk/info
1063 if [ ! -d aptarchive/dists ]; then
1064 msgdie 'Flat file archive cdroms can not be created currently'
1065 return 1
1066 fi
a0975c8d 1067 mv aptarchive/dists "$CD"
c45233ea
DK
1068 ln -s "$(readlink -f ./incoming)" $CD/pool
1069 find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list' -delete
a0975c8d
DK
1070 # start with an unmounted disk
1071 mv "${CD}" "${CD}-unmounted"
1072 # we don't want the disk to be modifiable
1073 addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/media/cdrom/dists/ $PWD/rootdir/media/cdrom-unmounted/dists/ || true;"
b0314abb 1074 chmod -R 555 rootdir/media/cdrom-unmounted/dists
c45233ea
DK
1075}
1076
fd46d305 1077downloadfile() {
0d58c26a 1078 local PROTO="$(echo "$1" | cut -d':' -f 1 )"
3dcdc1f9 1079 apthelper -o Debug::Acquire::${PROTO}=1 \
0d58c26a 1080 download-file "$1" "$2" 2>&1 || true
fd46d305 1081 # only if the file exists the download was successful
b0314abb 1082 if [ -r "$2" ]; then
fd46d305
DK
1083 return 0
1084 else
1085 return 1
1086 fi
1087}
1088
f213b6ea 1089checkdiff() {
03aa0847 1090 local DIFFTEXT="$(command diff -u "$@" 2>&1 | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')"
8d876415 1091 if [ -n "$DIFFTEXT" ]; then
0d58c26a
DK
1092 echo >&2
1093 echo >&2 "$DIFFTEXT"
8d876415
DK
1094 return 1
1095 else
1096 return 0
1097 fi
1098}
1099
75954ae2
DK
1100testfileequal() {
1101 local FILE="$1"
1102 shift
1103 msgtest "Test for correctness of file" "$FILE"
1104 if [ -z "$*" ]; then
f213b6ea 1105 echo -n "" | checkdiff $FILE - && msgpass || msgfail
75954ae2 1106 else
f213b6ea 1107 echo "$*" | checkdiff $FILE - && msgpass || msgfail
75954ae2
DK
1108 fi
1109}
1110
b855a400
DK
1111testempty() {
1112 msgtest "Test for no output of" "$*"
859093da 1113 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile"
ab25bf1f 1114 if "$@" >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then
859093da
DK
1115 msgpass
1116 else
1117 cat $COMPAREFILE
1118 msgfail
1119 fi
ab25bf1f 1120 aptautotest 'testempty' "$@"
b855a400
DK
1121}
1122
f74a6fa1
DK
1123testequal() {
1124 local MSG='Test of equality of'
1125 if [ "$1" = '--nomsg' ]; then
1126 MSG=''
1127 shift
1128 fi
1129
03938280 1130 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequal.comparefile"
8d876415
DK
1131 echo "$1" > $COMPAREFILE
1132 shift
d2d68aaf 1133
f74a6fa1
DK
1134 if [ -n "$MSG" ]; then
1135 msgtest "$MSG" "$*"
1136 fi
ab25bf1f
DK
1137 "$@" 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
1138 aptautotest 'testequal' "$@"
8d876415
DK
1139}
1140
685625bd 1141testequalor2() {
03938280
DK
1142 local COMPAREFILE1="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile1"
1143 local COMPAREFILE2="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.comparefile2"
1144 local COMPAREAGAINST="${TMPWORKINGDIRECTORY}/rootdir/tmp/testequalor2.compareagainst"
685625bd
DK
1145 echo "$1" > $COMPAREFILE1
1146 echo "$2" > $COMPAREFILE2
1147 shift 2
1148 msgtest "Test for equality OR of" "$*"
ab25bf1f 1149 "$@" >$COMPAREAGAINST 2>&1 || true
0d58c26a
DK
1150 if checkdiff $COMPAREFILE1 $COMPAREAGAINST >/dev/null 2>&1 || \
1151 checkdiff $COMPAREFILE2 $COMPAREAGAINST >/dev/null 2>&1
1152 then
0caa5a4c
DK
1153 msgpass
1154 else
1155 echo -n "\n${CINFO}Diff against OR 1${CNORMAL}"
1156 checkdiff $COMPAREFILE1 $COMPAREAGAINST || true
1157 echo -n "${CINFO}Diff against OR 2${CNORMAL}"
1158 checkdiff $COMPAREFILE2 $COMPAREAGAINST || true
1159 msgfail
1160 fi
ab25bf1f 1161 aptautotest 'testequalor2' "$@"
685625bd
DK
1162}
1163
8d876415 1164testshowvirtual() {
edc0ef10 1165 local VIRTUAL="N: Can't select versions from package '$1' as it is purely virtual"
8d876415
DK
1166 local PACKAGE="$1"
1167 shift
1168 while [ -n "$1" ]; do
1169 VIRTUAL="${VIRTUAL}
edc0ef10 1170N: Can't select versions from package '$1' as it is purely virtual"
8d876415
DK
1171 PACKAGE="${PACKAGE} $1"
1172 shift
1173 done
1174 msgtest "Test for virtual packages" "apt-cache show $PACKAGE"
1175 VIRTUAL="${VIRTUAL}
4bec02c2 1176N: No packages found"
03938280 1177 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testshowvirtual.comparefile"
ea65d079 1178 local ARCH="$(getarchitecture 'native')"
8d876415 1179 echo "$VIRTUAL" | sed -e "s/:$ARCH//" -e 's/:all//' > $COMPAREFILE
e8379ba3 1180 aptcache show -q=0 $PACKAGE 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
8d876415
DK
1181}
1182
1183testnopackage() {
1184 msgtest "Test for non-existent packages" "apt-cache show $*"
846856f4 1185 local SHOWPKG="$(aptcache show "$@" 2>&1 | grep '^Package: ')"
8d876415 1186 if [ -n "$SHOWPKG" ]; then
0d58c26a
DK
1187 echo >&2
1188 echo >&2 "$SHOWPKG"
8d876415 1189 msgfail
0d58c26a
DK
1190 else
1191 msgpass
8d876415 1192 fi
8d876415 1193}
01a6e24c
DK
1194
1195testdpkginstalled() {
1196 msgtest "Test for correctly installed package(s) with" "dpkg -l $*"
846856f4 1197 local PKGS="$(dpkg -l "$@" 2>/dev/null | grep '^i' | wc -l)"
87bc1c45 1198 if [ "$PKGS" != $# ]; then
0d58c26a
DK
1199 echo >&2 $PKGS
1200 dpkg -l "$@" | grep '^[a-z]' >&2
01a6e24c 1201 msgfail
0d58c26a
DK
1202 else
1203 msgpass
01a6e24c 1204 fi
01a6e24c
DK
1205}
1206
5cf733e1
DK
1207testdpkgnotinstalled() {
1208 msgtest "Test for correctly not-installed package(s) with" "dpkg -l $*"
846856f4 1209 local PKGS="$(dpkg -l "$@" 2> /dev/null | grep '^i' | wc -l)"
01a6e24c
DK
1210 if [ "$PKGS" != 0 ]; then
1211 echo
0d58c26a 1212 dpkg -l "$@" | grep '^[a-z]' >&2
01a6e24c 1213 msgfail
0d58c26a
DK
1214 else
1215 msgpass
01a6e24c 1216 fi
01a6e24c 1217}
ec7f904e
DK
1218
1219testmarkedauto() {
03938280 1220 local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testmarkedauto.comparefile"
ec7f904e
DK
1221 if [ -n "$1" ]; then
1222 msgtest 'Test for correctly marked as auto-installed' "$*"
1223 while [ -n "$1" ]; do echo "$1"; shift; done | sort > $COMPAREFILE
1224 else
1225 msgtest 'Test for correctly marked as auto-installed' 'no package'
c98fb5e0 1226 echo -n > $COMPAREFILE
ec7f904e
DK
1227 fi
1228 aptmark showauto 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
1229}
89a1aa5d 1230
0440d936
DK
1231testsuccess() {
1232 if [ "$1" = '--nomsg' ]; then
1233 shift
1234 else
1235 msgtest 'Test for successful execution of' "$*"
1236 fi
03938280 1237 local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
4fa34122
DK
1238 if "$@" >${OUTPUT} 2>&1; then
1239 if expr match "$1" '^apt.*' >/dev/null; then
1240 if grep -q -E '^[WE]: ' "$OUTPUT"; then
1241 echo >&2
1242 cat >&2 $OUTPUT
1243 msgfail 'successful run, but output contains warnings/errors'
1244 else
1245 msgpass
1246 fi
1247 else
1248 msgpass
1249 fi
1250 else
1251 local EXITCODE=$?
1252 echo >&2
1253 cat >&2 $OUTPUT
1254 msgfail "exitcode $EXITCODE"
1255 fi
1256 aptautotest 'testsuccess' "$@"
1257}
1258testwarning() {
1259 if [ "$1" = '--nomsg' ]; then
1260 shift
1261 else
1262 msgtest 'Test for successful execution with warnings of' "$*"
1263 fi
1264 local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
1df24acf
DK
1265 if "$@" >${OUTPUT} 2>&1; then
1266 if expr match "$1" '^apt.*' >/dev/null; then
1267 if grep -q -E '^E: ' "$OUTPUT"; then
1268 echo >&2
1269 cat >&2 $OUTPUT
1270 msgfail 'successful run, but output contains errors'
4fa34122
DK
1271 elif ! grep -q -E '^W: ' "$OUTPUT"; then
1272 echo >&2
1273 cat >&2 $OUTPUT
1274 msgfail 'successful run, but output contains no warnings'
1df24acf
DK
1275 else
1276 msgpass
1277 fi
1278 else
1279 msgpass
1280 fi
0440d936 1281 else
07cb47e7 1282 local EXITCODE=$?
0d58c26a
DK
1283 echo >&2
1284 cat >&2 $OUTPUT
07cb47e7 1285 msgfail "exitcode $EXITCODE"
0440d936 1286 fi
4fa34122 1287 aptautotest 'testwarning' "$@"
0440d936 1288}
0440d936
DK
1289testfailure() {
1290 if [ "$1" = '--nomsg' ]; then
1291 shift
1292 else
889b0072 1293 msgtest 'Test for failure in execution of' "$*"
0440d936 1294 fi
03938280 1295 local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output"
1df24acf 1296 if "$@" >${OUTPUT} 2>&1; then
07cb47e7 1297 local EXITCODE=$?
0d58c26a
DK
1298 echo >&2
1299 cat >&2 $OUTPUT
07cb47e7 1300 msgfail "exitcode $EXITCODE"
0440d936 1301 else
1df24acf
DK
1302 local EXITCODE=$?
1303 if expr match "$1" '^apt.*' >/dev/null; then
1304 if ! grep -q -E '^E: ' "$OUTPUT"; then
1305 echo >&2
1306 cat >&2 $OUTPUT
1307 msgfail "run failed with exitcode ${EXITCODE}, but with no errors"
1308 else
1309 msgpass
1310 fi
1311 else
1312 msgpass
1313 fi
0440d936 1314 fi
ab25bf1f 1315 aptautotest 'testfailure' "$@"
0440d936
DK
1316}
1317
de81b2e2
DK
1318testfilestats() {
1319 msgtest "Test that file $1 has $2 $3" "$4"
1320 if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then
5684f71f
DK
1321 msgpass
1322 else
1323 echo >&2
1324 ls -l >&2 "$1"
de81b2e2
DK
1325 echo -n >&2 "stat(1) reports for $2: "
1326 stat --format "$2" "$1"
5684f71f
DK
1327 msgfail
1328 fi
1329}
de81b2e2
DK
1330testaccessrights() {
1331 testfilestats "$1" '%a' '=' "$2"
1332}
5684f71f 1333
0d58c26a
DK
1334testwebserverlaststatuscode() {
1335 local DOWNLOG='rootdir/tmp/webserverstatus-testfile.log'
03aa0847 1336 local STATUS='downloaded/webserverstatus-statusfile.log'
0d58c26a
DK
1337 rm -f "$DOWNLOG" "$STATUS"
1338 msgtest 'Test last status code from the webserver was' "$1"
b0314abb 1339 if downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then
0d58c26a
DK
1340 msgpass
1341 else
1342 echo >&2
1343 if [ -n "$2" ]; then
1344 shift
1345 echo >&2 '#### Additionally provided output files contain:'
1346 cat >&2 "$@"
1347 fi
1348 echo >&2 '#### Download log of the status code:'
1349 cat >&2 "$DOWNLOG"
1350 msgfail "Status was $(cat "$STATUS")"
1351 fi
1352}
1353
89a1aa5d
DK
1354pause() {
1355 echo "STOPPED execution. Press enter to continue"
1356 local IGNORE
1357 read IGNORE
1358}
ab25bf1f 1359
846bc058
DK
1360listcurrentlistsdirectory() {
1361 find rootdir/var/lib/apt/lists -maxdepth 1 -type d | while read line; do
1362 stat --format '%U:%G:%a:%n' "$line"
1363 done
1364 find rootdir/var/lib/apt/lists -maxdepth 1 \! -type d | while read line; do
1365 stat --format '%U:%G:%a:%s:%y:%n' "$line"
1366 done
1367}
1368
ab25bf1f
DK
1369### The following tests are run by most test methods automatically to check
1370### general things about commands executed without writing the test every time.
1371
1372aptautotest() {
1373 local TESTCALL="$1"
1374 local CMD="$2"
1375 local FIRSTOPT="$3"
1376 local AUTOTEST="aptautotest_$(basename "$CMD" | tr -d '-')_$(echo "$FIRSTOPT" | tr -d '-')"
1377 if command -v $AUTOTEST >/dev/null; then
1378 shift 3
1379 # save and restore the *.output files from other tests
1380 # as we might otherwise override them in these automatic tests
03aa0847
DK
1381 rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-before
1382 mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-before
1383 mkdir ${TMPWORKINGDIRECTORY}/rootdir/tmp
ab25bf1f 1384 $AUTOTEST "$TESTCALL" "$@"
03aa0847
DK
1385 rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest
1386 mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest
1387 mv ${TMPWORKINGDIRECTORY}/rootdir/tmp-before ${TMPWORKINGDIRECTORY}/rootdir/tmp
ab25bf1f
DK
1388 fi
1389}
1390
1391aptautotest_aptget_update() {
1392 if ! test -d "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"; then return; fi
1393 # all copied files are properly chmodded
03aa0847 1394 for file in $(find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" -maxdepth 1 -type f); do
ab25bf1f
DK
1395 testfilestats "$file" '%U:%G:%a' '=' "${USER}:${USER}:644"
1396 done
1397}
1398aptautotest_apt_update() { aptautotest_aptget_update "$@"; }