+msgfailoutput() {
+ local MSG="$1"
+ local OUTPUT="$2"
+ shift 2
+ echo >&2
+ if [ "$1" = 'grep' ]; then
+ while [ -n "$2" ]; do shift; done
+ echo "#### Complete file: $1 ####"
+ cat >&2 "$1" || true
+ echo '#### grep output ####'
+ elif [ "$1" = 'test' ]; then
+ # doesn't support ! or non-file flags
+ msgfailoutputstatfile() {
+ local FILEFLAGS='^-[bcdefgGhkLOprsStuwx]$'
+ if expr match "$1" "$FILEFLAGS" >/dev/null; then
+ echo "#### stat(2) of file: $2 ####"
+ stat "$2" || true
+ fi
+ }
+ msgfailoutputstatfile "$2" "$3"
+ while [ -n "$5" ] && [ "$4" = '-o' -o "$4" = '-a' ]; do
+ shift 3
+ msgfailoutputstatfile "$2" "$3"
+ done
+ echo '#### test output ####'
+ fi
+ cat >&2 $OUTPUT
+ msgfail "$MSG"
+}
+
+testsuccess() {
+ if [ "$1" = '--nomsg' ]; then
+ shift
+ else
+ msgtest 'Test for successful execution of' "$*"
+ fi
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
+ if "$@" >${OUTPUT} 2>&1; then
+ if expr match "$1" '^apt.*' >/dev/null; then
+ if grep -q -E ' runtime error: ' "$OUTPUT"; then
+ msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+ elif grep -q -E '^[WE]: ' "$OUTPUT"; then
+ msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@"
+ else
+ msgpass
+ fi
+ else
+ msgpass
+ fi
+ else
+ local EXITCODE=$?
+ msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
+ fi
+ aptautotest 'testsuccess' "$@"
+}
+testwarning() {
+ if [ "$1" = '--nomsg' ]; then
+ shift
+ else
+ msgtest 'Test for successful execution with warnings of' "$*"
+ fi
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
+ if "$@" >${OUTPUT} 2>&1; then
+ if expr match "$1" '^apt.*' >/dev/null; then
+ if grep -q -E ' runtime error: ' "$OUTPUT"; then
+ msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+ elif grep -q -E '^E: ' "$OUTPUT"; then
+ msgfailoutput 'successful run, but output contains errors' "$OUTPUT" "$@"
+ elif ! grep -q -E '^W: ' "$OUTPUT"; then
+ msgfailoutput 'successful run, but output contains no warnings' "$OUTPUT" "$@"
+ else
+ msgpass
+ fi
+ else
+ msgpass
+ fi
+ else
+ local EXITCODE=$?
+ echo >&2
+ cat >&2 $OUTPUT
+ msgfail "exitcode $EXITCODE"
+ fi
+ aptautotest 'testwarning' "$@"
+}
+testfailure() {
+ if [ "$1" = '--nomsg' ]; then
+ shift
+ else
+ msgtest 'Test for failure in execution of' "$*"
+ fi
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output"
+ if "$@" >${OUTPUT} 2>&1; then
+ local EXITCODE=$?
+ msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
+ else
+ local EXITCODE=$?
+ if expr match "$1" '^apt.*' >/dev/null; then
+ if grep -q -E ' runtime error: ' "$OUTPUT"; then
+ msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+ elif ! grep -q -E '^E: ' "$OUTPUT"; then
+ msgfailoutput "run failed with exitcode ${EXITCODE}, but with no errors" "$OUTPUT" "$@"
+ else
+ msgpass
+ fi
+ else
+ msgpass
+ fi
+ fi
+ aptautotest 'testfailure' "$@"
+}
+
+testfilestats() {
+ msgtest "Test that file $1 has $2 $3" "$4"
+ if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then
+ msgpass
+ else
+ echo >&2
+ ls -ld >&2 "$1"
+ echo -n >&2 "stat(1) reports for $2: "
+ stat --format "$2" "$1"
+ msgfail
+ fi
+}
+testaccessrights() {
+ testfilestats "$1" '%a' '=' "$2"
+}
+
+testwebserverlaststatuscode() {
+ local DOWNLOG='rootdir/tmp/webserverstatus-testfile.log'
+ local STATUS='downloaded/webserverstatus-statusfile.log'
+ rm -f "$DOWNLOG" "$STATUS"
+ msgtest 'Test last status code from the webserver was' "$1"
+ if downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then
+ msgpass
+ else
+ echo >&2
+ if [ -n "$2" ]; then
+ shift
+ echo >&2 '#### Additionally provided output files contain:'
+ cat >&2 "$@"
+ fi
+ echo >&2 '#### Download log of the status code:'
+ cat >&2 "$DOWNLOG"
+ msgfail "Status was $(cat "$STATUS")"
+ fi
+}
+