diff --git a/src/ProcessManager.php b/src/ProcessManager.php index 1ff9f1ff..f47d7779 100644 --- a/src/ProcessManager.php +++ b/src/ProcessManager.php @@ -32,6 +32,8 @@ class ProcessManager private static string $input = ''; + private static ?ExecutableFinder $executableFinder = null; + /** @var array Secrets to redact from error messages */ private array $secrets = []; @@ -81,14 +83,19 @@ public static function setBin(string $bin): void self::$bin = $bin; } + public static function setExecutableFinder(?ExecutableFinder $executableFinder): void + { + self::$executableFinder = $executableFinder; + } + public static function guessBin(): string { if (isset(self::$bin) && self::$bin !== '') { return self::$bin; } - $finder = new ExecutableFinder(); - $rclonePath = $finder->find('rclone', '/usr/bin/rclone', [ + $finder = self::$executableFinder ?? new ExecutableFinder(); + $rclonePath = $finder->find('rclone', null, [ '/usr/local/bin', '/usr/bin', '/bin', diff --git a/tests/Unit/ProcessManagerTest.php b/tests/Unit/ProcessManagerTest.php new file mode 100644 index 00000000..d563bd0f --- /dev/null +++ b/tests/Unit/ProcessManagerTest.php @@ -0,0 +1,52 @@ +createMock(ExecutableFinder::class); + $mockFinder->expects($this->once()) + ->method('find') + ->with('rclone', null, $this->anything()) + ->willReturn(null); + + ProcessManager::setExecutableFinder($mockFinder); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Rclone binary not found'); + + ProcessManager::guessBin(); + } + + public function testGuessBinReturnsPathWhenFound(): void + { + $mockFinder = $this->createMock(ExecutableFinder::class); + $mockFinder->expects($this->once()) + ->method('find') + ->with('rclone', null, $this->anything()) + ->willReturn('/usr/bin/rclone'); + + ProcessManager::setExecutableFinder($mockFinder); + + $bin = ProcessManager::guessBin(); + + $this->assertSame('/usr/bin/rclone', $bin); + } +}