From d0a838365be8811f36b8a233f9e7c756dfc32632 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Wed, 29 Jul 2026 14:41:11 +0200 Subject: [PATCH] Document IMAP expunge release coverage --- contrib/testing/README.md | 3 +- docs/release-testing-0.7.md | 2 +- docs/test-evidence/0.7-r1.md | 60 ++++++++++++++++++++++++++++-------- docs/upstream-test-suites.md | 8 ++--- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/contrib/testing/README.md b/contrib/testing/README.md index 27f395b..6904492 100644 --- a/contrib/testing/README.md +++ b/contrib/testing/README.md @@ -65,7 +65,8 @@ one-off files in `/tmp`: syntax, empty-mailbox behavior, synchronization, and cleanup. - `upstream-imaptest-check.py` runs the generic Dovecot ImapTest project against live Bongo IMAPS. Scripted mode stages a selected core, search, - `imap-01-11`, or complete upstream test set in a temporary directory; + `imap-01-11`, `imap-01-12`, or complete upstream test set in a temporary + directory; `--isolate-groups` gives every selected group a separate process and disposable mailbox before the same groups are run together to expose cross-group state defects. Stress mode uses deterministic random input, diff --git a/docs/release-testing-0.7.md b/docs/release-testing-0.7.md index 42813e4..0f11f06 100644 --- a/docs/release-testing-0.7.md +++ b/docs/release-testing-0.7.md @@ -179,7 +179,7 @@ review does not mark an open live test as passed. | IMAP-09 | FETCH/UID FETCH body, headers, partials, flags, envelope, binary | [PASS](test-evidence/0.7-r1.md#imap-09) | | | | IMAP-10 | STORE/UID STORE add/remove/replace flags and silent variants | [PASS](test-evidence/0.7-r1.md#imap-10) | | | | IMAP-11 | COPY/UID COPY/MOVE/UID MOVE and UIDPLUS response codes | [PASS](test-evidence/0.7-r1.md#imap-11) | | | -| IMAP-12 | EXPUNGE/UID EXPUNGE preserve sequence and UID semantics | | | | +| IMAP-12 | EXPUNGE/UID EXPUNGE preserve sequence and UID semantics | [PASS](test-evidence/0.7-r1.md#imap-12) | | | | IMAP-13 | SEARCH/UID SEARCH sets, flags, dates, sizes, HEADER/SUBJECT/FROM/TO | | | | | IMAP-14 | SEARCH BODY/TEXT/NOT/OR/CHARSET, ESEARCH RETURN, saved `$` set | | | | | IMAP-15 | IDLE notifications and DONE with concurrent delivery/disconnect | | | | diff --git a/docs/test-evidence/0.7-r1.md b/docs/test-evidence/0.7-r1.md index 86d93bc..427f213 100644 --- a/docs/test-evidence/0.7-r1.md +++ b/docs/test-evidence/0.7-r1.md @@ -3678,36 +3678,72 @@ the invariant. The complete native suite subsequently passed all 103 tests. IMAP-11 PASS host=127.0.0.1:993 copy=sequence/uid move=sequence/uid/same-mailbox uidplus=copyuid/order/uidnext metadata=flags/keywords/internaldate sets=duplicate/nonexistent examine=copy/read-only-move syntax=trailing-rejected missing=trycreate cleanup=yes ``` -## IMAP-01 through IMAP-11 Dovecot ImapTest corroboration +## IMAP-12 Result: **PASS** -Commit `44ccc52adfd527429e79b7fc5f1e48cfaf708bd2` was installed as the -Gentoo debug build and tested on 2026-07-29 with Dovecot ImapTest. The -release subset consists of 26 upstream scripted groups: `atoms`, `append`, +Commits `f714694b` and `3de6f0da` were installed as the Gentoo GCC 15.3.0 +debug build and tested on 2026-07-29 with +`contrib/testing/imap-expunge-check.py`. The live test used two simultaneously +selected sessions and verified ordinary EXPUNGE, selective UID EXPUNGE, +duplicate and non-existent UIDs, an empty mailbox, read-only rejection, exact +32-bit non-zero UID-set syntax, unsolicited synchronization, and descending +sequence-number responses when several messages were removed. + +The command and parser paths were compared directly with Dovecot 2.4.4 +`src/imap/cmd-expunge.c`, `src/imap/imap-expunge.c`, and +`src/imap/imap-sync.c`, plus Cyrus IMAP 3.12.3 `imap/imapd.c` and +`imap/index.c`. Bongo now rejects trailing EXPUNGE arguments, requires exactly +one UID EXPUNGE set, validates the complete set before inspecting mailbox +contents, and rejects zero, leading-zero, junk-suffixed, and overflowing UID +endpoints. + +The first live run exposed a wider allocator defect: the historical +`MemCalloc` compatibility macro called `g_malloc` and therefore did not +zero-initialize selection masks. It now delegates to an overflow-checked +`g_malloc0` wrapper. A native allocator regression test verifies both zeroing +and multiplication-overflow rejection. The complete native suite passed all +105 tests after this repair. + +```text +IMAP-12 PASS host=127.0.0.1:993 expunge=all/deleted-only/descending uid-expunge=selective/duplicates/nonexistent/empty sessions=two/synchronized read-only=rejected syntax=arguments/uid-set/uint32 cleanup=yes +``` + +Dovecot ImapTest's independent `expunge` group also passed all 22 commands +against the installed server. The disposable live-test and upstream-test +mailboxes were removed after their runs. + +## IMAP-01 through IMAP-12 Dovecot ImapTest corroboration + +Result: **PASS** + +Commits through `3de6f0da` were installed as the Gentoo debug build and tested +on 2026-07-29 with Dovecot ImapTest. The release subset consists of 27 +upstream scripted groups: `atoms`, `append`, `close`, `copy`, `fetch`, `fetch-body`, the three nested `message/rfc822` body groups, `fetch-body-mime`, `fetch-bodystructure`, `fetch-envelope`, `id`, `list`, `listext`, `logout`, `move`, `mutf7`, `nil`, `pipeline`, `select`, `store`, `subscribe`, `uidplus`, `uidvalidity`, and -`uidvalidity-rename`. +`uidvalidity-rename`, plus `expunge`. The first pass ran every group in a separate ImapTest process with a separate -disposable mailbox. All 26 groups passed with no missing-capability skips. +disposable mailbox. All 27 groups passed with no missing-capability skips. The second pass ran the same corpus together against one disposable mailbox; -all 26 groups, 251 base-protocol commands, and 60 extension commands passed. +all 27 groups, 273 base-protocol commands, and 60 extension commands passed. This combination distinguishes primary command failures from cascades while also detecting state leakage and command-order interactions. ```text -PASS: Dovecot ImapTest imap-01-11 suite (26 scripted test groups, isolated) -26 test groups: 0 failed, 0 skipped due to missing capabilities -base protocol: 0/251 individual commands failed +PASS: Dovecot ImapTest imap-01-12 suite (27 scripted test groups, isolated) +27 test groups: 0 failed, 0 skipped due to missing capabilities +base protocol: 0/273 individual commands failed extensions: 0/60 individual commands failed -PASS: Dovecot ImapTest imap-01-11 suite (26 scripted test groups, combined) +PASS: Dovecot ImapTest imap-01-12 suite (27 scripted test groups, combined) ``` The run found and verified the CLOSE watcher ordering, nested RFC822 MIME -offsets, recursive LIST/LSUB attributes, and same-mailbox MOVE UIDNEXT fixes. +offsets, recursive LIST/LSUB attributes, same-mailbox MOVE UIDNEXT, and strict +EXPUNGE/UID EXPUNGE fixes. Credentials were supplied through a mode-0600 temporary user file. Every temporary mailbox and staged corpus was removed on completion. diff --git a/docs/upstream-test-suites.md b/docs/upstream-test-suites.md index 7f17c84..e837071 100644 --- a/docs/upstream-test-suites.md +++ b/docs/upstream-test-suites.md @@ -40,8 +40,8 @@ export BONGO_TEST_PASSWORD='a-disposable-password-of-at-least-12-characters' ./contrib/testing/upstream-imaptest-check.py scripted --suite core ./contrib/testing/upstream-imaptest-check.py scripted --suite search ./contrib/testing/upstream-imaptest-check.py scripted \ - --suite imap-01-11 --isolate-groups -./contrib/testing/upstream-imaptest-check.py scripted --suite imap-01-11 + --suite imap-01-12 --isolate-groups +./contrib/testing/upstream-imaptest-check.py scripted --suite imap-01-12 ./contrib/testing/upstream-imaptest-check.py stress --imap4rev2 \ --clients 4 --seconds 30 --seed 700 ./contrib/testing/upstream-imaptest-check.py pop --seconds 30 @@ -51,8 +51,8 @@ The complete upstream suite can be selected with `--suite all`. Missing optional capabilities are reported as skips by ImapTest; a failure in the base protocol or an advertised extension fails the Bongo test. For diagnosis, `--test-group append` selects one named upstream file and may -be repeated. The `imap-01-11` release subset contains the 26 upstream groups -which corroborate the first eleven Bongo IMAP matrix rows. Run it first with +be repeated. The `imap-01-12` release subset contains the 27 upstream groups +which corroborate the first twelve Bongo IMAP matrix rows. Run it first with `--isolate-groups` so one damaged session cannot turn a primary defect into a cascade of misleading failures, then without that option to detect shared mailbox-state and ordering regressions. The adapter does not enable