createMock(ProcessControl::class); $workers = new Workers($processControl); self::assertEmpty($workers); } public function testItSaysItHasOneWorkerWhenTaskExecutes(): void { $workers = new Workers(); $workers->createWorkerFor(fn() => exit(0), []); self::assertCount(1, $workers); } public function testItGivesTheAmountOfActiveWorkersOnCount(): void { $workers = new Workers(); $workers->createWorkerFor(fn() => exit(0), []); $workers->createWorkerFor(fn() => exit(0), []); self::assertCount(2, $workers); $workers->createWorkerFor(fn() => exit(0), []); self::assertCount(3, $workers); $workers->stop(); self::assertEmpty($workers); } public function testItEmitsAnEventWhenAWorkerIsStarted(): void { $workers = new Workers(); $workerStartedEventHasTakenPlace = false; $workers->on('worker_started', function () use (&$workerStartedEventHasTakenPlace) { $workerStartedEventHasTakenPlace = true; }); self::assertFalse($workerStartedEventHasTakenPlace); $workers->createWorkerFor(fn() => exit(0), []); self::assertTrue($workerStartedEventHasTakenPlace); } public function testItEmitsAnEventWhenAWorkerIsRemoved(): void { $workers = new Workers(); $reflector = new ReflectionObject($workers); $method = $reflector->getMethod('remove'); $method->setAccessible(true); $workerStoppedEventHasTakenPlace = false; $workers->on('worker_stopped', function () use (&$workerStoppedEventHasTakenPlace) { $workerStoppedEventHasTakenPlace = true; }); self::assertFalse($workerStoppedEventHasTakenPlace); $method->invoke($workers, 0); self::assertTrue($workerStoppedEventHasTakenPlace); } public function testItCallsForkOnProcessControlWhenAskedToCreateAWorker(): void { $processControl = $this->createMock(ProcessControl::class); $processControl->expects(self::once()) ->method('fork') ->willReturn(new Fork(1)); $workers = new Workers($processControl); $workers->createWorkerFor(fn() => []); } public function testItCallsNonBlockingWaitOnProcessControlWhenPerformingCleanup(): void { $processControl = $this->createMock(ProcessControl::class); $processControl->expects(self::once()) ->method('wait') ->with(WNOHANG) ->willReturn(new Wait(0)); $workers = new Workers($processControl); $workers->cleanup(); } public function testItCallsBlockingWaitOnProcessControlWhenAwaitingCongestionRelief(): void { $processControl = $this->createMock(ProcessControl::class); $processControl->expects(self::once()) ->method('wait') ->with(/* no arguments */) ->willReturn(new Wait(1)); $workers = new Workers($processControl); $workers->awaitCongestionRelief(); } }