diff --git a/test/live_encryption_e2e_test.dart b/test/live_encryption_e2e_test.dart index 5c36833..c241c05 100644 --- a/test/live_encryption_e2e_test.dart +++ b/test/live_encryption_e2e_test.dart @@ -207,6 +207,23 @@ Future _login(Client client, _TestAccounts acc, ); } +/// Logout ohne Nachzügler. matrix 6.2 prüft bei einer FEHLER-Antwort des +/// Sync-Long-Polls nicht, ob die Anfrage noch aktuell ist: Läuft beim Logout +/// noch ein Long-Poll mit dem alten Token, kommt dessen 401 (M_UNKNOWN_TOKEN) +/// später zurück und das SDK ruft erneut `clear()`. Direkt nach einem +/// Re-Login würde das die NEUE Session löschen, nach `dispose()` wirft es +/// (DB geschlossen → Fallback auf die globale sqflite-Factory) – genau das +/// machte diesen Test sporadisch rot (2026-10-07). Deshalb erst die +/// Sync-Schleife anhalten, den laufenden Long-Poll regulär auslaufen lassen +/// (≤ 30 s), dann abmelden. `clear()` schaltet backgroundSync wieder ein. +Future _logoutWithoutStraySync(Client client) async { + client.backgroundSync = false; + await client + .oneShotSync(timeout: Duration.zero) + .timeout(const Duration(seconds: 60)); + await client.logout(); +} + /// Holt (oder erzeugt) den unverschlüsselten Autopilot-Testraum. Future _ensureTestRoom(Client client) async { const roomName = 'Pyramid Autopilot Testraum'; @@ -340,7 +357,7 @@ void main() { expect(client.userID?.toLowerCase(), acc.user1.toLowerCase()); // ── Phase 4: Logout → Re-Login → alte Nachricht wieder lesbar ── - await client.logout(); + await _logoutWithoutStraySync(client); expect(client.isLogged(), isFalse); await _login(client, acc, user: acc.user1, pass: acc.pass1, device: 'Autopilot Enc-Test 2'); @@ -348,7 +365,7 @@ void main() { expect(await _timelineContains(roomAfter, marker), isTrue, reason: 'Alte Nachricht nach Logout+Re-Login nicht mehr lesbar'); // Aufräumen: Session serverseitig beenden, DB wird dabei geleert. - await client.logout(); + await _logoutWithoutStraySync(client); await client.dispose(closeDatabase: true); }, skip: skip, @@ -414,7 +431,7 @@ void main() { expect(roomAfter, isNotNull, reason: 'Testraum nach Migration nicht mehr in der DB'); // Aufräumen (Session serverseitig beenden). - await client.logout(); + await _logoutWithoutStraySync(client); await client.dispose(closeDatabase: true); }, skip: skip,