serversRefreshDue($rNow); } public function markRefreshed(int $rAt): void { $this->rServersRefreshedAt = $rAt; } }; } public function testReloadAtMostEveryFiveSeconds(): void { $rDaemon = $this->daemon(); $this->assertTrue($rDaemon->due(1000), 'first pass loads'); $rDaemon->markRefreshed(1000); $this->assertFalse($rDaemon->due(1000)); $this->assertFalse($rDaemon->due(1004)); $this->assertTrue($rDaemon->due(1005)); } public function testAQuarterSecondLoopReadsServersTwelveTimesAMinuteNotTwoHundredForty(): void { $rDaemon = $this->daemon(); $rReads = 0; for ($rTick = 0; $rTick < 240; $rTick++) { // one minute at usleep(250000) $rNow = 1000 + intdiv($rTick, 4); if ($rDaemon->due($rNow)) { $rReads++; $rDaemon->markRefreshed($rNow); } } $this->assertSame(12, $rReads); } /** @dataProvider daemons */ public function testDaemonsUseTheTimer(string $rFile): void { $rSource = (string) file_get_contents(dirname(__DIR__, 2) . '/src/Cli/Commands/' . $rFile); $this->assertStringContainsString('$this->serversRefreshDue()', $rSource); $this->assertStringNotContainsString('ServerRepository::getAll(true)', $rSource); } /** @return array */ public static function daemons(): array { return ['signals' => ['SignalsCommand.php'], 'watchdog' => ['WatchdogCommand.php'], 'cache handler' => ['CacheHandlerCommand.php']]; } }