100 lines
2.7 KiB
TypeScript
100 lines
2.7 KiB
TypeScript
import { beforeEach, expect, it, vi } from "vitest";
|
|
import { WindowsPrivateRuntime } from "../../src/windows/WindowsPrivateRuntime.js";
|
|
import { PrivateRuntimeRootUnavailableError } from "../../src/process/PrivateRuntimeRootUnavailableError.js";
|
|
|
|
const { nativeCall } = vi.hoisted(() => ({ nativeCall: vi.fn() }));
|
|
vi.mock("../../src/windows/WindowsNativeLoader.js", async (original) => ({
|
|
...(await original<
|
|
typeof import("../../src/windows/WindowsNativeLoader.js")
|
|
>()),
|
|
requireWindowsNativeAuthority: () => ({ call: nativeCall }),
|
|
}));
|
|
beforeEach(() => {
|
|
nativeCall.mockReset();
|
|
});
|
|
|
|
it.each([
|
|
{
|
|
label: "sharing conflict before allocation",
|
|
win32Code: 32,
|
|
runtimeAllocation: "not-started",
|
|
retryable: true,
|
|
},
|
|
{
|
|
label: "lock conflict before allocation",
|
|
win32Code: 33,
|
|
runtimeAllocation: "not-started",
|
|
retryable: true,
|
|
},
|
|
{ label: "unknown allocation", win32Code: 32, retryable: false },
|
|
{
|
|
label: "possible allocation",
|
|
win32Code: 32,
|
|
runtimeAllocation: "started",
|
|
retryable: false,
|
|
},
|
|
{
|
|
label: "permission failure",
|
|
win32Code: 5,
|
|
runtimeAllocation: "not-started",
|
|
retryable: false,
|
|
},
|
|
{
|
|
label: "string code",
|
|
win32Code: "32",
|
|
runtimeAllocation: "not-started",
|
|
retryable: false,
|
|
},
|
|
{
|
|
label: "inconsistent error code",
|
|
win32Code: 32,
|
|
code: "EACCES",
|
|
runtimeAllocation: "not-started",
|
|
retryable: false,
|
|
},
|
|
])(
|
|
"retains $label without guessing runtime ownership",
|
|
({ retryable, label: _label, ...facts }) => {
|
|
const cause = Object.assign(new Error("Selected native diagnostic"), {
|
|
code: "ERR_REA_WINDOWS_NATIVE",
|
|
...facts,
|
|
});
|
|
nativeCall.mockImplementation(() => {
|
|
throw cause;
|
|
});
|
|
let observed: unknown;
|
|
try {
|
|
WindowsPrivateRuntime.create("D:/selected parent", "selected-prefix-");
|
|
} catch (failure: unknown) {
|
|
observed = failure;
|
|
}
|
|
expect(nativeCall).toHaveBeenCalledTimes(1);
|
|
expect(nativeCall).toHaveBeenCalledWith("runtime_create", [
|
|
"D:/selected parent",
|
|
"selected-prefix-",
|
|
]);
|
|
if (retryable) {
|
|
expect(observed).toBeInstanceOf(PrivateRuntimeRootUnavailableError);
|
|
expect(observed).toMatchObject({
|
|
message: cause.message,
|
|
cause,
|
|
retryable: true,
|
|
});
|
|
} else expect(observed).toBe(cause);
|
|
},
|
|
);
|
|
|
|
it("does not infer a transient status from a human-readable diagnostic", () => {
|
|
const cause = new Error("Open Windows path component failed (Win32 32)");
|
|
nativeCall.mockImplementation(() => {
|
|
throw cause;
|
|
});
|
|
let observed: unknown;
|
|
try {
|
|
WindowsPrivateRuntime.create("D:/selected parent", "selected-prefix-");
|
|
} catch (failure: unknown) {
|
|
observed = failure;
|
|
}
|
|
expect(observed).toBe(cause);
|
|
});
|