Make TLSRPT live fixture restart-safe

This commit is contained in:
Mario Fetka
2026-07-28 20:35:41 +02:00
parent 461a65b668
commit 3fcdf95ec1
+38 -5
View File
@@ -379,6 +379,26 @@ def matching_delivery(
return value
def discard_delivery(value: dict[str, object], reason: str) -> None:
delivery_id = int(value.get("id", 0))
if delivery_id <= 0:
raise SMTP29Error("pending delivery omitted its Store identifier")
testtool("tlsrpt-finish", str(delivery_id), "2", "0", reason)
def purge_stale_fixture_deliveries() -> None:
"""Remove leftovers from an interrupted SMTP-29 run only."""
for _unused in range(256):
value = next_delivery(int(time.time()) + 172800)
if not value.get("present"):
return
domain = str(value.get("report_domain", ""))
if "smtp29-" not in domain:
return
discard_delivery(value, "stale SMTP-29 test fixture")
raise SMTP29Error("too many stale SMTP-29 deliveries")
def expire_delivery(value: dict[str, object]) -> None:
expires = int(value.get("expires_at", 0))
if expires <= 0:
@@ -466,6 +486,7 @@ def perform_test() -> None:
replace_configuration("worker", configured_worker)
configuration_changed = True
restart_bongo(internal_host, internal_port)
purge_stale_fixture_deliveries()
now = int(time.time())
today = (now // 86400) * 86400
@@ -531,16 +552,22 @@ def perform_test() -> None:
restart_bongo(internal_host, internal_port)
record(event(yesterday, no_dkim_domain, no_dkim_policy))
prepare(today, int(time.time()), signing_domain)
pending_no_dkim = matching_delivery(no_dkim_domain)
if not pending_no_dkim:
raise SMTP29Error(
"prepared DKIM-required delivery is not pending: "
f"{next_delivery(int(time.time()) + 172800)!r}")
prepared.append(pending_no_dkim)
request_worker()
no_dkim = wait_until(
lambda: matching_delivery(no_dkim_domain, minimum_attempts=1),
"DKIM-required mail retry",
)
prepared.append(no_dkim)
prepared[-1] = no_dkim
if captured_report(smtp_capture, no_dkim_domain) is not None:
raise SMTP29Error(
"TLSRPT mail was sent while DKIM was disabled")
expire_delivery(no_dkim)
discard_delivery(no_dkim, "completed DKIM-disabled SMTP-29 check")
prepared.remove(no_dkim)
replace_configuration("smtp", configured_smtp)
restart_bongo(internal_host, internal_port)
@@ -552,12 +579,18 @@ def perform_test() -> None:
)
record(event(yesterday, retry_domain, retry_policy))
prepare(today, int(time.time()), signing_domain)
pending_retry = matching_delivery(retry_domain)
if not pending_retry:
raise SMTP29Error(
"prepared HTTPS retry delivery is not pending: "
f"{next_delivery(int(time.time()) + 172800)!r}")
prepared.append(pending_retry)
request_worker()
retry = wait_until(
lambda: matching_delivery(retry_domain, minimum_attempts=1),
"durable HTTPS retry",
)
prepared.append(retry)
prepared[-1] = retry
retry_id = retry.get("report_id")
retry_attempts = int(retry.get("attempts", -1))
restart_bongo(internal_host, internal_port)
@@ -601,7 +634,7 @@ def perform_test() -> None:
delayed = wait_until(delayed_delivery, "random initial delay")
prepared.append(delayed)
expire_delivery(delayed)
discard_delivery(delayed, "completed SMTP-29 delay check")
prepared.remove(delayed)
print(
@@ -620,7 +653,7 @@ def perform_test() -> None:
finally:
for value in prepared:
try:
expire_delivery(value)
discard_delivery(value, "interrupted SMTP-29 test fixture")
except Exception:
pass
if configuration_changed: