harden: per-item robustness + deadlines/caps across connectors; layered tests

Mail: _safe_decode + _iter_messages (per-mail try/except) -> eine kaputte Mail
(charset x-unknown) bricht die Suche nicht mehr ab, findet so auch uralte Mails.
Vollscan + Datum-Sort + MAX_SCAN/DEADLINE_S (Selbstheilung, kein 24h-Haenger mehr).

Files: search_files mit SEARCH_DEADLINE_S + SEARCH_MAX_DIRS begrenzt (war
unbegrenzte rekursive PROPFIND -> real 35s/449 Calls).

Calendar/Contacts: PARSE_DEADLINE_S fuer client-seitiges vobject-Parsen;
MAX_RESULTS-Output-Cap in get_events/get_tasks (war 10939 Zeilen bei 6000 Events);
search Top-N + Hinweise.

Tests: in Schichten getrennt -> Smoke (nightly), Edge + Stress (on-demand).
Neu: test_smoke/test_edge/test_stress + conftest-Marker + run_full_tests.sh,
nightly laeuft nur Smoke. Kontakt-Foto-Roundtrip-Test, Mail-Edge-Mails
(x-unknown, kaputter Header, 2009er Alt-Mail).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Lohmaier
2026-06-24 21:17:26 +02:00
co-authored by Claude Opus 4.8
parent 936ebc2f56
commit c9ccb4392b
26 changed files with 719 additions and 65 deletions
+27
View File
@@ -46,6 +46,33 @@ add("mcp-test-mail","INBOX", mail_with("voice@example.com","Sprachnachricht","Ku
add("mcp-test-mail","INBOX", mail_with("projekt@example.com","Projektdateien","Archiv und Notizen.",["archive.zip","notes.txt","data.csv"]))
add("mcp-test-mail","INBOX", mail_with("media@example.com","Praesentation + Clip","Folien und ein kurzes Video.",["slides.pptx","clip.mp4"]))
# --- Edge-Cases: Robustheit + uralte Mails (Fix 2026-06-24) ---
def addraw(acct, folder, raw_bytes):
path=os.path.join(BASE,acct,folder); os.makedirs(os.path.dirname(path),exist_ok=True)
mailbox.Maildir(path,create=True).add(raw_bytes)
# Uralte Mail (2009) mit eindeutigem Token -> Suche muss alte Mails finden
_old=simple("archiv@example.com","mcptest@local","Uralte Rechnung URALTMAIL2009","Sehr alte Mail aus 2009 zum Testen der Alt-Mail-Suche.")
_old.replace_header("Date","Tue, 03 Mar 2009 08:15:00 +0100")
add("mcp-test-mail","Archive",_old)
# Mail mit kaputtem Charset x-unknown -> darf die Suche NICHT killen, Token findbar
addraw("mcp-test-mail","INBOX",
b"From: weird@example.com\r\nTo: mcptest@local\r\n"
b"Subject: Kaputtes Encoding XUNKNOWNTOKEN\r\n"
b"Date: Wed, 10 Jan 2018 12:00:00 +0100\r\n"
b'Content-Type: text/plain; charset="x-unknown"\r\n'
b"Content-Transfer-Encoding: 8bit\r\n\r\n"
b"Koerpertext mit kaputtem Charset XUNKNOWNTOKEN und Umlaut \xfc.\r\n")
# Mail mit kaputtem encoded-word-Header -> decode_hdr darf nicht crashen
addraw("mcp-test-mail","INBOX",
b"From: =?invalid-charset?Q?Br=F6tchen?= <bad@example.com>\r\nTo: mcptest@local\r\n"
b"Subject: =?x-unknown?B?a2FwdXR0?= BADHEADERTOKEN\r\n"
b"Date: Fri, 05 Jul 2013 09:00:00 +0200\r\n"
b"Content-Type: text/plain; charset=utf-8\r\n\r\n"
b"Body BADHEADERTOKEN.\r\n")
# new -> cur
for r,d,f in os.walk(BASE):
if r.endswith("new"):