import { chmod, mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { expect, it as test } from "vitest"; import { createTestTempDirectory } from "../../tests/fixtures/temporaryDirectory.js"; import { resolveFirmwareCommand } from "./FirmwareCommand.js"; const it = test.skipIf(process.platform !== "linux"); it("rejects a directory configured as the firmware engine executable", async () => { const root = await createTestTempDirectory("rea-firmware-command-"); const command = join(root, "binwalk"); const limiter = await executableFixture(root, "prlimit"); await mkdir(command); await expect( resolveFirmwareCommand( { REA_BINWALK_COMMAND: command, REA_FIRMWARE_PRLIMIT_COMMAND: limiter, }, "binwalk", "inspect_firmware_regions", ), ).rejects.toMatchObject({ _tag: "AnalysisCapabilityUnavailableError", reason: expect.stringContaining(command), }); }); it("classifies an unusable firmware engine as an unavailable capability", async () => { const root = await createTestTempDirectory("rea-firmware-command-"); const command = join(root, "binwalk"); const limiter = await executableFixture(root, "prlimit"); await writeFile(command, "not executable", { mode: 0o600 }); await expect( resolveFirmwareCommand( { REA_BINWALK_COMMAND: command, REA_FIRMWARE_PRLIMIT_COMMAND: limiter, }, "binwalk", "inspect_firmware_regions", ), ).rejects.toMatchObject({ _tag: "AnalysisCapabilityUnavailableError", reason: expect.stringContaining(command), }); }); it("rejects a directory configured as the resource limiter executable", async () => { const root = await createTestTempDirectory("rea-firmware-limiter-"); const command = await executableFixture(root, "binwalk"); const limiter = join(root, "prlimit"); await mkdir(limiter); await expect( resolveFirmwareCommand( { REA_BINWALK_COMMAND: command, REA_FIRMWARE_PRLIMIT_COMMAND: limiter, }, "binwalk", "inspect_firmware_regions", ), ).rejects.toMatchObject({ _tag: "AnalysisCapabilityUnavailableError", reason: expect.stringContaining(limiter), }); }); const executableFixture = async (root: string, name: string) => { const path = join(root, name); await writeFile(path, "#!/bin/sh\n"); await chmod(path, 0o700); return path; };