diff --git a/contrib/testing/smtp-tlsrpt-delivery-check.py b/contrib/testing/smtp-tlsrpt-delivery-check.py index 3bf5854..65e6cc6 100755 --- a/contrib/testing/smtp-tlsrpt-delivery-check.py +++ b/contrib/testing/smtp-tlsrpt-delivery-check.py @@ -196,6 +196,14 @@ def request_worker() -> None: raise SMTP29Error(f"worker request failed: {output}") +def scheduler_state() -> object: + output = testtool("scheduler-list") + try: + return json.loads(output) + except json.JSONDecodeError: + return output + + def wait_until(function, description: str): deadline = time.monotonic() + TIMEOUT last = None @@ -500,12 +508,23 @@ def perform_test() -> None: record(event(yesterday, delivery_domain, policy)) record(event(yesterday, delivery_domain, policy, success=False)) prepare(today, now, signing_domain) + initial_delivery = matching_delivery(delivery_domain) + if not initial_delivery: + raise SMTP29Error( + "prepared TLSRPT delivery is not pending: " + f"{next_delivery(int(time.time()) + 172800)!r}") request_worker() - mail_raw = wait_until( - lambda: captured_report(smtp_capture, delivery_domain), - "TLSRPT mail delivery", - ) + try: + mail_raw = wait_until( + lambda: captured_report(smtp_capture, delivery_domain), + "TLSRPT mail delivery", + ) + except SMTP29Error as error: + raise SMTP29Error( + f"{error}; pending=" + f"{next_delivery(int(time.time()) + 172800)!r}; " + f"scheduler={scheduler_state()!r}") from error https_raw = wait_until( lambda: ( https_capture.snapshot()[0] @@ -656,6 +675,10 @@ def perform_test() -> None: discard_delivery(value, "interrupted SMTP-29 test fixture") except Exception: pass + try: + purge_stale_fixture_deliveries() + except Exception: + pass if configuration_changed: try: replace_configuration("smtp", original_smtp)