+ cat >&2 "$OUTPUT"
+ msgfail "$MSG"
+}
+
+testsuccesswithglobalerror() {
+ local TYPE="$1"
+ local ERRORS="$2"
+ shift 2
+ msggroup "$TYPE"
+ if [ "$1" = '--nomsg' ]; then
+ shift
+ else
+ msgtest 'Test for successful execution of' "$*"
+ fi
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/${TYPE}.output"
+ if "$@" >"${OUTPUT}" 2>&1; then
+ if expr match "$1" '^apt.*' >/dev/null; then
+ if grep -q -E ' runtime error: ' "$OUTPUT"; then
+ msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+ elif grep -E "^[${ERRORS}]: " "$OUTPUT" > "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" 2>&1; then
+ if [ "$IGNORE_PTY_NOT_MOUNTED" = '1' ]; then
+ if echo 'E: Can not write log (Is /dev/pts mounted?) - posix_openpt (2: No such file or directory)' \
+ | cmp - "${TMPWORKINGDIRECTORY}/rootdir/tmp/checkforwarnings.output" >/dev/null 2>&1; then
+ msgpass
+ else
+ msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@"
+ fi
+ else
+ msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@"
+ fi
+ elif [ "$TYPE" = 'testsuccesswithnotice' ]; then
+ if grep -q -E "^N: " "$OUTPUT"; then
+ msgpass
+ else
+ msgfailoutput 'successful run, but output had no notices' "$OUTPUT" "$@"
+ fi
+ else
+ msgpass
+ fi
+ else
+ msgpass
+ fi
+ else
+ local EXITCODE=$?
+ msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
+ fi
+ aptautotest "$TYPE" "$@"
+ msggroup
+}
+testsuccesswithnotice() {
+ testsuccesswithglobalerror 'testsuccesswithnotice' 'WE' "$@"
+}
+testsuccess() {
+ testsuccesswithglobalerror 'testsuccess' 'NWE' "$@"
+}
+testwarning() {
+ msggroup 'testwarning'
+ if [ "$1" = '--nomsg' ]; then
+ shift
+ else
+ msgtest 'Test for successful execution with warnings of' "$*"
+ fi
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwarning.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=$?
+ msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
+ fi
+ aptautotest 'testwarning' "$@"
+ msggroup
+}
+testfailure() {
+ msggroup '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 [ "$1" = 'aptkey' ]; then
+ if grep -q -E " Can't check signature: " "$OUTPUT" || \
+ grep -q -E " BAD signature from " "$OUTPUT"; then
+ msgpass
+ else
+ msgfailoutput "run failed with exitcode ${EXITCODE}, but no signature error" "$OUTPUT" "$@"
+ fi
+ else
+ if grep -q -E ' runtime error: ' "$OUTPUT"; then
+ msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+ elif grep -q -E '==ERROR' "$OUTPUT"; then
+ msgfailoutput 'compiler sanitizers reported errors' "$OUTPUT" "$@"
+ elif ! grep -q -E '^E: ' "$OUTPUT"; then
+ msgfailoutput "run failed with exitcode ${EXITCODE}, but with no errors" "$OUTPUT" "$@"
+ else
+ msgpass
+ fi
+ fi
+ else
+ msgpass
+ fi
+ fi
+ aptautotest 'testfailure' "$@"
+ msggroup
+}
+
+testreturnstateequal() {
+ local STATE="$1"
+ if [ "$STATE" = 'testsuccesswithglobalerror' ]; then
+ local STATE="$2"
+ local TYPE="$3"
+ shift 3
+ msggroup "${STATE}equal"
+ if [ "$1" != '--nomsg' ]; then
+ local CMP="$1"
+ shift
+ testsuccesswithglobalerror "$STATE" "$TYPE" "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ else
+ local CMP="$2"
+ shift 2
+ testsuccesswithglobalerror "$STATE" "$TYPE" "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ fi
+ else
+ msggroup "${STATE}equal"
+ if [ "$2" != '--nomsg' ]; then
+ local CMP="$2"
+ shift 2
+ "$STATE" "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ else
+ local CMP="$3"
+ shift 3
+ "$STATE" --nomsg "$@"
+ testfileequal "${TMPWORKINGDIRECTORY}/rootdir/tmp/${STATE}.output" "$CMP"
+ fi
+ fi
+ msggroup
+}
+testsuccessequal() {
+ # we compare output, so we know perfectly well about N:
+ testreturnstateequal 'testsuccesswithglobalerror' 'testsuccess' 'WE' "$@"
+}
+testwarningequal() {
+ testreturnstateequal 'testwarning' "$@"
+}
+testfailureequal() {
+ testreturnstateequal 'testfailure' "$@"
+}
+
+testfailuremsg() {
+ msggroup 'testfailuremsg'
+ local CMP="$1"
+ shift
+ testfailure "$@"
+ msgtest 'Check that the output of the previous failed command has expected' 'failures and warnings'
+ local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailuremsg.comparefile"
+ grep '^\(W\|E\|N\):' "${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output" > "$COMPAREFILE" 2>&1 || true
+ testoutputequal "$COMPAREFILE" echo "$CMP"
+ msggroup
+}
+testwarningmsg() {
+ msggroup 'testwarningmsg'
+ local CMP="$1"
+ shift
+ testwarning "$@"
+ msgtest 'Check that the output of the previous warned command has expected' 'warnings'
+ local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwarningmsg.comparefile"
+ grep '^\(W\|E\|N\):' "${TMPWORKINGDIRECTORY}/rootdir/tmp/testwarning.output" > "$COMPAREFILE" 2>&1 || true
+ testoutputequal "$COMPAREFILE" echo "$CMP"
+ msggroup
+}
+
+testfilestats() {
+ msggroup 'testfilestats'
+ msgtest "Test that file $1 has $2 $3" "$4"
+ if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then
+ msgpass
+ else
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfilestats.output"
+ {
+ ls -ld "$1" || true
+ echo -n "stat(1) reports for $2: "
+ stat --format "$2" "$1" || true
+ } >"$OUTPUT" 2>&1
+ msgfailoutput '' "$OUTPUT"
+ fi
+ msggroup
+}
+testaccessrights() {
+ msggroup 'testaccessrights'
+ testfilestats "$1" '%a' '=' "$2"
+ msggroup
+}
+
+testwebserverlaststatuscode() {
+ msggroup '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:${APTHTTPPORT}/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then
+ msgpass
+ else
+ local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testwebserverlaststatuscode.output"
+ {
+ 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"
+ } >"$OUTPUT" 2>&1
+ msgfailoutput "Status was $(cat "$STATUS")" "$OUTPUT"
+ fi
+ msggroup