Stand: 2026-03-18

J01-19 16-3 Race-nahe Tests ergänzen
Typ
Subtask
Status
Erledigt
Priorität
Medium
Bearbeitung
-
Sprint
-
Sprint-Rolle
-
Lösung
Fertig
Aktualisiert
2026-03-18T16:14:16.406+0100
Übergeordnet
J01-16
Kontext J01-16

Inhalts-Schlüssel

Diese Seite

Weitere Seiten

Öffentliche Schritte

Schrittspezifischer öffentlicher Arbeitsstand für 16-3 unter J01-16.

Ziel

Race-nahe Tests für die Schreibpfade ergänzen, die in 16-1 und 16-2 unter Lock gestellt wurden: RateLimiter, CaptchaService und TokenService.

Teststrategie

PHP ist single-threaded; echter Parallelzugriff erfordert Prozess-Forks. Stattdessen wird der Lock-Key jedes Dienstes manuell durch eine direkte FlockStore-Instanz belegt, bevor der Dienst-Aufruf startet. Damit werden die folgenden Eigenschaften überprüft:

  • Der Schreibpfad läuft tatsächlich unter dem erwarteten Lock-Key (kein „am Lock vorbei”).
  • Der RuntimeLockRunner bricht mit einem Lock-Timeout ab, wenn der Key bereits belegt ist.
  • Nach Lock-Freigabe ist der Schreibzustand konsistent lesbar.
  • Lese-Operationen in TokenService benötigen keinen Lock (kein Timeout).

Überprüfungsplan

Prüfpunkt Erwartung Nachweis / Ort Status
RateLimiter.allow() läuft unter Lock Timeout, wenn ratelimit_{key} bereits belegt ConcurrencyTest::testRateLimiterAllowTimesOutWhenLockBusy Erledigt
Aufeinanderfolgende allow()-Aufrufe sind serialisiert Zähler korrekt erhöht, Limit wird eingehalten ConcurrencyTest::testRateLimiterSerializesCallsForSameKey Erledigt
CaptchaService.verify() läuft unter Lock Timeout, wenn captcha_{id} bereits belegt ConcurrencyTest::testCaptchaVerifyTimesOutWhenLockBusy Erledigt
used_at wird unter Lock atomar geschrieben Challenge nach Verify inaktiv, kein zerrissener Zustand ConcurrencyTest::testCaptchaVerifyUsedAtWrittenUnderLock Erledigt
TokenService.rotate() läuft unter Lock Timeout, wenn token_{profile} bereits belegt ConcurrencyTest::testTokenRotateTimesOutWhenLockBusy Erledigt
rotate() schreibt atomar Hashes nach Rotation konsistent lesbar ConcurrencyTest::testTokenRotateWritesAtomically Erledigt
Lese-Operationen brauchen keinen Lock verify() und findProfileForToken() laufen durch, auch wenn Token-Lock belegt ist ConcurrencyTest::testTokenReadOperationsNeedNoLock Erledigt
Gesamttest-Suite grün 33/33 PHPUnit-Tests nach Änderung php vendor/bin/phpunit Erledigt