XMPP: testgaten voor unhappy flows — bugs uit #1411-#1430 zijn niet gedekt door regressietests #1434

Closed
opened 2026-08-09 18:40:18 +00:00 by brenno · 0 comments
Owner

Bevinding

De XMPP-testsuite in test/xmpp/ dekt de happy paths en een aantal unhappy flows, maar laat significante gaten vallen precies bij de randgevallen die in issues #1411–#1430 zijn gevonden. Zonder tests voor deze scenario's zullen de bugs regredteren zodra ze worden gerepareerd.

Geteste unhappy flows (goed)

  • Session: stream drop met reconnect, max-attempts fail-closed, close tijdens backoff
  • MUC: nick-conflict (409), session-drop tijdens join
  • Snapshot: ontbrekende chunk (fail-closed), verminkte chunk-data (fail-closed)
  • Chat: dedup (replay), slechte handtekening (fail-closed), begrensde dedup-set
  • Key exchange: rot-replay, identiteitswissel
  • Transport: gap→resync, deferred backlog, resync coalescing, resync approval gate

Niet-geteste unhappy flows (gaten)

Per testbestand, de scenario's die NIET worden getest, met het bijbehorende issue:

Testbestand Niet-getest scenario Issue
xmpp_session_test Reconnect faalt tijdens onRejoin #1416, #1421
xmpp_session_test sendStanza tijdens reconnect (stanza gaat verloren) #1417
xmpp_muc_test leave() tijdens lopende join #1427
xmpp_muc_test presence zonder resource/nick #1426
xmpp_snapshot_test chunk-spoofing (chunk met verkeerd id) #1411
xmpp_snapshot_test snapshot met onbekende afzender #1414
xmpp_snapshot_test oversized chunk-data #1419
xmpp_snapshot_test maxPendingSnapshots overflow #1414
xmpp_chat_test head-of-line blocking (onbekende afzender) #1412
xmpp_key_exchange_test stanza.from null #1429
xmpp_key_exchange_test keyshare met onbekende afzender #1429
xmpp_presence_beacon_test _pending onbegrensd (nep-afzenders) #1413
xmpp_transport_test geen rate-limit op inbound ops #1433
xmpp_frame_transport_io_test send() op gesloten socket #1430
xmpp_frame_transport_io_test close() met socket-exception #1430
xmpp_collab_launch_test re-baseline listener race-window #1428
xmpp_collab_launch_test reconnect-machinery niet aangesloten #1421

Trust boundary

Interne kwaliteit — geen externe aanvaller. De gaten betekenen dat fixes voor #1411–#1430 niet worden beschermd tegen regressie.

Impact

  • Elke bug die wordt gerepareerd zonder bijbehorende test kan regredteren bij een volgende wijziging.
  • De unhappy flows die het meest waarschijnlijk zijn in productie (netwerkdrop, NAT-timeout, late joiner) zijn het minst getest.
  • De beveiligingsgerelateerde bugs (chunk-spoofing, stanza.from null, oversized chunks) hebben geen test die de fail-closed-gedrag verifieert.

Oplossingsrichting

  1. Per gerepareerd issue, schrijf een regressietest die rood is tegen de ónherstelde code en groen na de fix. Dit is de standaard in deze repo (zie de pr-landen skill: "een reparatie zonder regressietest gaat niet als PR de deur uit").
  2. Prioriteer de beveiligingsgerelateerde gaten eerst: chunk-spoofing (#1411), stanza.from null (#1429), oversized chunks (#1419), head-of-line blocking (#1412). Deze hebben fail-closed-gedrag dat geverifieerd moet worden.
  3. Voeg daarna de reconnect-gerelateerde gaten toe: reconnect-fail-tijdens-onRejoin (#1416), sendStanza-tijdens-reconnect (#1417), leave-tijdens-join (#1427). Deze zijn het meest waarschijnlijk in productie.
  4. Aanvullend: overweeg een property-based test voor de MUC-presence-parser en de snapshot-chunk-reassemblage — deze hebben veel invoercombinaties die handmatig lastig te dekken zijn.

Locatie

  • test/xmpp/xmpp_session_test.dart (reconnect-gaten)
  • test/xmpp/xmpp_muc_test.dart (leave-tijdens-join, presence-zonder-resource)
  • test/xmpp/xmpp_snapshot_test.dart (chunk-spoofing, oversized, overflow)
  • test/xmpp/xmpp_chat_test.dart (head-of-line blocking)
  • test/xmpp/xmpp_key_exchange_test.dart (stanza.from null)
  • test/xmpp/xmpp_presence_beacon_test.dart (_pending onbegrensd)
  • test/xmpp/xmpp_frame_transport_io_test.dart (socket-exception handling)
  • test/xmpp/xmpp_collab_launch_test.dart (re-baseline race, reconnect-integratie)

Severity

MEDIUM — geen crash of data-loss op zichzelf, maar de gaten betekenen dat de fixes voor #1411–#1430 niet worden beschermd.

## Bevinding De XMPP-testsuite in `test/xmpp/` dekt de happy paths en een aantal unhappy flows, maar laat significante gaten vallen precies bij de randgevallen die in issues #1411–#1430 zijn gevonden. Zonder tests voor deze scenario's zullen de bugs regredteren zodra ze worden gerepareerd. ### Geteste unhappy flows (goed) - **Session:** stream drop met reconnect, max-attempts fail-closed, close tijdens backoff - **MUC:** nick-conflict (409), session-drop tijdens join - **Snapshot:** ontbrekende chunk (fail-closed), verminkte chunk-data (fail-closed) - **Chat:** dedup (replay), slechte handtekening (fail-closed), begrensde dedup-set - **Key exchange:** rot-replay, identiteitswissel - **Transport:** gap→resync, deferred backlog, resync coalescing, resync approval gate ### Niet-geteste unhappy flows (gaten) Per testbestand, de scenario's die NIET worden getest, met het bijbehorende issue: | Testbestand | Niet-getest scenario | Issue | |---|---|---| | xmpp_session_test | Reconnect faalt tijdens onRejoin | #1416, #1421 | | xmpp_session_test | sendStanza tijdens reconnect (stanza gaat verloren) | #1417 | | xmpp_muc_test | leave() tijdens lopende join | #1427 | | xmpp_muc_test | presence zonder resource/nick | #1426 | | xmpp_snapshot_test | chunk-spoofing (chunk met verkeerd id) | #1411 | | xmpp_snapshot_test | snapshot met onbekende afzender | #1414 | | xmpp_snapshot_test | oversized chunk-data | #1419 | | xmpp_snapshot_test | maxPendingSnapshots overflow | #1414 | | xmpp_chat_test | head-of-line blocking (onbekende afzender) | #1412 | | xmpp_key_exchange_test | stanza.from null | #1429 | | xmpp_key_exchange_test | keyshare met onbekende afzender | #1429 | | xmpp_presence_beacon_test | _pending onbegrensd (nep-afzenders) | #1413 | | xmpp_transport_test | geen rate-limit op inbound ops | #1433 | | xmpp_frame_transport_io_test | send() op gesloten socket | #1430 | | xmpp_frame_transport_io_test | close() met socket-exception | #1430 | | xmpp_collab_launch_test | re-baseline listener race-window | #1428 | | xmpp_collab_launch_test | reconnect-machinery niet aangesloten | #1421 | ### Trust boundary Interne kwaliteit — geen externe aanvaller. De gaten betekenen dat fixes voor #1411–#1430 niet worden beschermd tegen regressie. ### Impact - Elke bug die wordt gerepareerd zonder bijbehorende test kan regredteren bij een volgende wijziging. - De unhappy flows die het meest waarschijnlijk zijn in productie (netwerkdrop, NAT-timeout, late joiner) zijn het minst getest. - De beveiligingsgerelateerde bugs (chunk-spoofing, stanza.from null, oversized chunks) hebben geen test die de fail-closed-gedrag verifieert. ### Oplossingsrichting 1. **Per gerepareerd issue, schrijf een regressietest die rood is tegen de ónherstelde code en groen na de fix.** Dit is de standaard in deze repo (zie de pr-landen skill: "een reparatie zonder regressietest gaat niet als PR de deur uit"). 2. **Prioriteer de beveiligingsgerelateerde gaten eerst:** chunk-spoofing (#1411), stanza.from null (#1429), oversized chunks (#1419), head-of-line blocking (#1412). Deze hebben fail-closed-gedrag dat geverifieerd moet worden. 3. **Voeg daarna de reconnect-gerelateerde gaten toe:** reconnect-fail-tijdens-onRejoin (#1416), sendStanza-tijdens-reconnect (#1417), leave-tijdens-join (#1427). Deze zijn het meest waarschijnlijk in productie. 4. **Aanvullend:** overweeg een property-based test voor de MUC-presence-parser en de snapshot-chunk-reassemblage — deze hebben veel invoercombinaties die handmatig lastig te dekken zijn. ### Locatie - `test/xmpp/xmpp_session_test.dart` (reconnect-gaten) - `test/xmpp/xmpp_muc_test.dart` (leave-tijdens-join, presence-zonder-resource) - `test/xmpp/xmpp_snapshot_test.dart` (chunk-spoofing, oversized, overflow) - `test/xmpp/xmpp_chat_test.dart` (head-of-line blocking) - `test/xmpp/xmpp_key_exchange_test.dart` (stanza.from null) - `test/xmpp/xmpp_presence_beacon_test.dart` (_pending onbegrensd) - `test/xmpp/xmpp_frame_transport_io_test.dart` (socket-exception handling) - `test/xmpp/xmpp_collab_launch_test.dart` (re-baseline race, reconnect-integratie) ### Severity MEDIUM — geen crash of data-loss op zichzelf, maar de gaten betekenen dat de fixes voor #1411–#1430 niet worden beschermd.
brenno 2026-08-09 20:56:42 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1434
No description provided.