secondsUntilNextRun(0)); } /** * Der Kern des Fixes: Nach einem Fehlschlag darf nicht bis zum naechsten regulaeren * Lauf gewartet werden - die per Webhook angeforderte Aktualisierung waere sonst bis * zu MONITOR_SYNC_INTERVAL Sekunden verzoegert. */ public function testRetriesQuicklyAfterAFailure(): void { $schedule = new SyncSchedule(600, retryBaseSeconds: 5); self::assertSame(5, $schedule->secondsUntilNextRun(1)); } public function testBacksOffExponentiallyWhileFailuresContinue(): void { $schedule = new SyncSchedule(600, retryBaseSeconds: 5); self::assertSame(10, $schedule->secondsUntilNextRun(2)); self::assertSame(20, $schedule->secondsUntilNextRun(3)); self::assertSame(40, $schedule->secondsUntilNextRun(4)); } /** Eine laengere Codeberg-Stoerung darf nicht in einen Dauerbeschuss laufen. */ public function testNeverWaitsLongerThanTheRegularInterval(): void { $schedule = new SyncSchedule(600, retryBaseSeconds: 5); self::assertSame(600, $schedule->secondsUntilNextRun(8)); self::assertSame(600, $schedule->secondsUntilNextRun(50)); } /** Sehr viele Fehlschlaege duerfen 2^n nicht ueberlaufen lassen. */ public function testSurvivesAnAbsurdNumberOfFailures(): void { $schedule = new SyncSchedule(600, retryBaseSeconds: 5); self::assertSame(600, $schedule->secondsUntilNextRun(PHP_INT_MAX)); } /** Bei sehr kurzem Intervall bleibt dieses die Untergrenze, nicht die Retry-Basis. */ public function testShortIntervalIsNotStretchedByTheRetryBase(): void { $schedule = new SyncSchedule(3, retryBaseSeconds: 5); self::assertSame(3, $schedule->secondsUntilNextRun(0)); self::assertSame(3, $schedule->secondsUntilNextRun(1)); } }