16-3: Race-nahe Tests ergänzen
Stand: 2026-03-18
J01-19
16-3 Race-nahe Tests ergänzen
Inhalts-Schlüssel
Diese Seite
Weitere Seiten
Öffentliche Schritte
- 16-1: Locking für Rate-Limit und CAPTCHA ausrollen
- 16-2: Locking für Token-Rotation ausrollen
- 16-4: Betriebsnotiz aktualisieren
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
RuntimeLockRunnerbricht mit einem Lock-Timeout ab, wenn der Key bereits belegt ist. - Nach Lock-Freigabe ist der Schreibzustand konsistent lesbar.
- Lese-Operationen in
TokenServicebenö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 |