Files
bongo/contrib/testing/queue-store-byte-check.sh
Mario Fetka febe35c36f
Debian Trixie package bundle / packages (push) Failing after 12m44s
Add Queue to Store byte preservation check
2026-07-23 08:16:55 +02:00

100 lines
3.1 KiB
Bash
Executable File

#!/bin/sh
#
# Verify that the exact message owned by bongoqueue reaches bongostore without
# byte changes. The queue trace header is intentionally included in the
# comparison: QRETR is the source of truth, not the pre-queue input file.
set -eu
user=${1:-stqqueue}
sender=${2:-stq02@bongo.test}
queue_tool=${BONGO_QUEUE_TOOL:-/usr/bin/bongo-queuetool}
store_tool=${BONGO_STORE_TOOL:-/usr/bin/bongo-storetool}
run_as=${BONGO_TEST_RUN_AS:-bongo}
if [ "$(id -un)" = "$run_as" ]; then
as_bongo=
else
as_bongo="sudo -n -u $run_as"
fi
work=$(mktemp -d "${TMPDIR:-/tmp}/bongo-stq02.XXXXXX")
chmod 0755 "$work"
queue_id=
cleanup()
{
if [ -n "$queue_id" ]; then
$as_bongo "$queue_tool" delete "$queue_id" >/dev/null 2>&1 || true
fi
rm -rf "$work"
}
trap cleanup EXIT HUP INT TERM
# Keep this RFC 5322 message deterministic and CRLF-clean. The UTF-8 and long
# folded line catch text-mode, encoding, and accidental line-ending changes.
printf '%s\r\n' \
"From: STQ-02 <$sender>" \
"To: $user@bongo.test" \
"Subject: STQ-02 byte preservation äöü" \
"Date: Thu, 23 Jul 2026 12:34:56 +0200" \
"Message-ID: <stq02-byte-check@bongo.test>" \
"MIME-Version: 1.0" \
"Content-Type: text/plain; charset=UTF-8" \
"Content-Transfer-Encoding: 8bit" \
"X-STQ-02-Fold: first;" \
" second; third" \
"" \
"line one" \
".dot line must not be SMTP-unescaped here" \
"Grüße aus dem Queue-zu-Store-Test." >"$work/input.eml"
chmod 0644 "$work/input.eml"
$as_bongo "$store_tool" -u "$user" \
document-list /mail/INBOX >"$work/before"
queue_id=$($as_bongo "$queue_tool" hold-local "$work/input.eml")
case "$queue_id" in
999-*) ;;
*)
echo "STQ-02: unexpected held queue ID: $queue_id" >&2
exit 1
;;
esac
$as_bongo "$queue_tool" message "$queue_id" >"$work/queue.eml"
$as_bongo "$queue_tool" deliver-local \
"$queue_id" "$sender" "$user" INBOX
$as_bongo "$store_tool" -u "$user" \
document-list /mail/INBOX >"$work/after"
awk '{ print $1 }' "$work/before" | sort -u >"$work/before.ids"
awk '{ print $1 }' "$work/after" | sort -u >"$work/after.ids"
comm -13 "$work/before.ids" "$work/after.ids" >"$work/new.ids"
count=$(wc -l <"$work/new.ids")
if [ "$count" -ne 1 ]; then
echo "STQ-02: expected one new Store object, found $count" >&2
diff -u "$work/before" "$work/after" >&2 || true
exit 1
fi
document=$(sed -n '1p' "$work/new.ids")
$as_bongo "$store_tool" -u "$user" \
document-get "$document" - >"$work/store.eml"
if ! cmp -s "$work/queue.eml" "$work/store.eml"; then
echo "STQ-02: Queue and Store message bytes differ" >&2
cmp -l "$work/queue.eml" "$work/store.eml" | sed -n '1,20p' >&2
exit 1
fi
queue_sha=$(sha256sum "$work/queue.eml" | awk '{ print $1 }')
store_sha=$(sha256sum "$work/store.eml" | awk '{ print $1 }')
queue_size=$(wc -c <"$work/queue.eml")
store_size=$(wc -c <"$work/store.eml")
printf 'STQ-02 PASS queue=%s document=%s bytes=%s sha256=%s store-bytes=%s store-sha256=%s\n' \
"$queue_id" "$document" "$queue_size" "$queue_sha" \
"$store_size" "$store_sha"