Files
rea/src/artifacts/hostExecutableMarking.test.ts
T
91f843bf38 fix(artifacts): mark Windows host executables by extension (#1823)
Windows has no POSIX execute bit; Node reports file modes from the
read-only attribute alone, so every host file, including PE images,
reported `executable: false` while the same occurrence reported
`artifact_kind: executable`. Derive the host executable marking once:
POSIX permission bits stay authoritative, and Windows marks regular
files with the CreateProcess/cmd launchable extensions.

Fixes #1819

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 06:26:30 -07:00

37 lines
1.1 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { hostExecutableMarking } from "./hostExecutableMarking.js";
const file = (mode: number) => ({ mode, isFile: () => true });
const directory = (mode: number) => ({ mode, isFile: () => false });
describe("hostExecutableMarking", () => {
it("marks Windows launchable files by extension because NTFS has no execute bit", () => {
expect(
hostExecutableMarking("C:\\scratch\\whoami.exe", file(0o666), "win32"),
).toBe(true);
expect(
hostExecutableMarking("C:\\scratch\\SETUP.CMD", file(0o444), "win32"),
).toBe(true);
expect(
hostExecutableMarking("C:\\scratch\\library.dll", file(0o666), "win32"),
).toBe(false);
expect(
hostExecutableMarking(
"C:\\scratch\\tools.exe",
directory(0o666),
"win32",
),
).toBe(false);
});
it("keeps POSIX permission bits authoritative regardless of extension", () => {
expect(hostExecutableMarking("/scratch/tool", file(0o755), "linux")).toBe(
true,
);
expect(
hostExecutableMarking("/scratch/whoami.exe", file(0o644), "darwin"),
).toBe(false);
});
});