Files
rea/src/artifacts/hostExecutableMarking.test.ts
T
Itoje Dollar e8491e023a fix(artifacts): mark Windows launchable files as host executables (#1824)
Host-file occurrences derived `executable` from POSIX execute bits, which
Windows never reports, so every Windows host file (including PE .exe
images classified as executable) reported `executable: false`.

Derive the fact once through hostExecutable: POSIX hosts keep the execute
bits; Windows marks regular files with the extensions it launches directly
(.exe, .com, .bat, .cmd), without reading the ambient PATHEXT.

Fixes #1819

Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
2026-10-12 01:15:35 +08:00

52 lines
1.6 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);
for (const path of [
"tools/SETUP.EXE",
"run.Cmd",
"build.bat",
"legacy.com",
])
expect(hostExecutableMarking(path, file(0o666), "win32")).toBe(true);
expect(hostExecutableMarking("readonly.exe", 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("does not treat other Windows filenames as executable even with execute bits", () => {
for (const path of ["notes.txt", "README", "archive.exe.bak"])
expect(hostExecutableMarking(path, file(0o777), "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);
});
});