Skip to content

Commit 693434f

Browse files
committed
test(worker): add worker starter unit tests
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent c4d7b01 commit 693434f

1 file changed

Lines changed: 172 additions & 0 deletions

File tree

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2026 LibreCode coop and contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
9+
namespace OCA\Libresign\Tests\Unit\Service\Worker;
10+
11+
use OCA\Libresign\Service\Process\ProcessManager;
12+
use OCA\Libresign\Service\Worker\WorkerStarter;
13+
use OCA\Libresign\Tests\Unit\TestCase;
14+
use OCA\Libresign\Vendor\Symfony\Component\Process\Process;
15+
use OCP\IBinaryFinder;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
18+
class WorkerStarterTest extends TestCase {
19+
private IBinaryFinder&MockObject $binaryFinder;
20+
private ProcessManager&MockObject $processManager;
21+
22+
public function setUp(): void {
23+
parent::setUp();
24+
$this->binaryFinder = $this->createMock(IBinaryFinder::class);
25+
$this->processManager = $this->createMock(ProcessManager::class);
26+
}
27+
28+
private function makeProcessMock(?int $pid): Process&MockObject {
29+
$process = $this->createMock(Process::class);
30+
$process->expects($this->once())->method('setOptions')->with(['create_new_console' => true]);
31+
$process->expects($this->once())->method('setTimeout')->with(null);
32+
$process->expects($this->once())->method('start');
33+
$process->expects($this->once())->method('getPid')->willReturn($pid);
34+
return $process;
35+
}
36+
37+
/** @return array<int, Process&MockObject> */
38+
private function makeProcessMocks(int $count, ?int $pid): array {
39+
$processes = [];
40+
for ($i = 0; $i < $count; $i++) {
41+
$processes[] = $this->makeProcessMock($pid);
42+
}
43+
return $processes;
44+
}
45+
46+
public function testStartWorkersFallbacksToPhpAndRegistersPid(): void {
47+
$this->binaryFinder->expects($this->once())
48+
->method('findBinaryPath')
49+
->with('php')
50+
->willReturn(false);
51+
52+
$callIndex = 0;
53+
$this->processManager->expects($this->exactly(2))
54+
->method('register')
55+
->willReturnCallback(function (string $source, int $pid) use (&$callIndex): void {
56+
$callIndex++;
57+
$this->assertSame('worker', $source);
58+
$this->assertSame($callIndex === 1 ? 101 : 202, $pid);
59+
});
60+
61+
$workerStarter = new class($this->binaryFinder, $this->processManager, [$this->makeProcessMock(101), $this->makeProcessMock(202)]) extends WorkerStarter {
62+
/** @var Process[] */
63+
private array $processes;
64+
/** @var array<int, array<int, string>> */
65+
public array $commands = [];
66+
67+
public function __construct(IBinaryFinder $binaryFinder, ProcessManager $processManager, array $processes) {
68+
parent::__construct($binaryFinder, $processManager);
69+
$this->processes = $processes;
70+
}
71+
72+
protected function createProcess(array $command): Process {
73+
$this->commands[] = $command;
74+
return array_shift($this->processes);
75+
}
76+
};
77+
78+
$workerStarter->startWorkers(2);
79+
80+
$this->assertCount(2, $workerStarter->commands);
81+
$this->assertSame('php', $workerStarter->commands[0][0]);
82+
$this->assertSame('background-job:worker', $workerStarter->commands[0][2]);
83+
}
84+
85+
public function testStartWorkersClampsMinimumToOne(): void {
86+
$this->binaryFinder->expects($this->once())
87+
->method('findBinaryPath')
88+
->with('php')
89+
->willReturn('/usr/bin/php');
90+
91+
$this->processManager->expects($this->never())
92+
->method('register');
93+
94+
$workerStarter = new class($this->binaryFinder, $this->processManager, [$this->makeProcessMock(0)]) extends WorkerStarter {
95+
/** @var Process[] */
96+
private array $processes;
97+
/** @var array<int, array<int, string>> */
98+
public array $commands = [];
99+
100+
public function __construct(IBinaryFinder $binaryFinder, ProcessManager $processManager, array $processes) {
101+
parent::__construct($binaryFinder, $processManager);
102+
$this->processes = $processes;
103+
}
104+
105+
protected function createProcess(array $command): Process {
106+
$this->commands[] = $command;
107+
return array_shift($this->processes);
108+
}
109+
};
110+
111+
$workerStarter->startWorkers(0);
112+
113+
$this->assertCount(1, $workerStarter->commands);
114+
}
115+
116+
public function testStartWorkersClampsMaximumToThirtyTwo(): void {
117+
$this->binaryFinder->expects($this->once())
118+
->method('findBinaryPath')
119+
->with('php')
120+
->willReturn('/usr/bin/php');
121+
122+
$this->processManager->expects($this->never())
123+
->method('register');
124+
125+
$workerStarter = new class($this->binaryFinder, $this->processManager, $this->makeProcessMocks(32, null)) extends WorkerStarter {
126+
/** @var Process[] */
127+
private array $processes;
128+
/** @var array<int, array<int, string>> */
129+
public array $commands = [];
130+
131+
public function __construct(IBinaryFinder $binaryFinder, ProcessManager $processManager, array $processes) {
132+
parent::__construct($binaryFinder, $processManager);
133+
$this->processes = $processes;
134+
}
135+
136+
protected function createProcess(array $command): Process {
137+
$this->commands[] = $command;
138+
return array_shift($this->processes);
139+
}
140+
};
141+
142+
$workerStarter->startWorkers(999);
143+
144+
$this->assertCount(32, $workerStarter->commands);
145+
}
146+
147+
public function testStartWorkersDoesNotRegisterWhenPidIsInvalid(): void {
148+
$this->binaryFinder->expects($this->once())
149+
->method('findBinaryPath')
150+
->with('php')
151+
->willReturn('/usr/bin/php');
152+
153+
$this->processManager->expects($this->never())
154+
->method('register');
155+
156+
$workerStarter = new class($this->binaryFinder, $this->processManager, [$this->makeProcessMock(0), $this->makeProcessMock(-1), $this->makeProcessMock(null)]) extends WorkerStarter {
157+
/** @var Process[] */
158+
private array $processes;
159+
160+
public function __construct(IBinaryFinder $binaryFinder, ProcessManager $processManager, array $processes) {
161+
parent::__construct($binaryFinder, $processManager);
162+
$this->processes = $processes;
163+
}
164+
165+
protected function createProcess(array $command): Process {
166+
return array_shift($this->processes);
167+
}
168+
};
169+
170+
$workerStarter->startWorkers(3);
171+
}
172+
}

0 commit comments

Comments
 (0)