90 lines
2.6 KiB
TypeScript
90 lines
2.6 KiB
TypeScript
// @vitest-environment node
|
|
|
|
import { mkdtemp, rm } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import path from "node:path";
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
import {
|
|
PCRE2_LOCK,
|
|
parsePcre2BuildArguments,
|
|
verifyPcre2Pack,
|
|
} from "./pcre2-engine-pack.mjs";
|
|
|
|
const temporaryDirectories: string[] = [];
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(
|
|
temporaryDirectories
|
|
.splice(0)
|
|
.map((directory) => rm(directory, { recursive: true, force: true })),
|
|
);
|
|
});
|
|
|
|
describe("PCRE2 engine-pack gate", () => {
|
|
it("keeps the default build on the checked-in production-assets path", () => {
|
|
expect(parsePcre2BuildArguments([])).toEqual({ mode: "ecmascript" });
|
|
});
|
|
|
|
it("requires explicit offline source and compiler paths", () => {
|
|
expect(() => parsePcre2BuildArguments(["--pcre2"])).toThrow(
|
|
"requires both --source-dir and --emcc",
|
|
);
|
|
expect(() =>
|
|
parsePcre2BuildArguments([
|
|
"--source-dir",
|
|
"/source",
|
|
"--emcc",
|
|
"/compiler",
|
|
]),
|
|
).toThrow("explicit --pcre2 gate");
|
|
});
|
|
|
|
it("parses the exact staged-build contract", () => {
|
|
expect(
|
|
parsePcre2BuildArguments([
|
|
"--pcre2",
|
|
"--source-dir",
|
|
"/source",
|
|
"--emcc",
|
|
"/compiler",
|
|
"--force",
|
|
]),
|
|
).toEqual({
|
|
mode: "pcre2",
|
|
sourceDirectory: "/source",
|
|
emccFile: "/compiler",
|
|
force: true,
|
|
});
|
|
});
|
|
|
|
it.each([
|
|
["--unknown"],
|
|
["--pcre2", "--pcre2"],
|
|
["--pcre2", "--source-dir"],
|
|
["--pcre2", "--force", "--force"],
|
|
])("rejects ambiguous arguments %j", (...arguments_) => {
|
|
expect(() => parsePcre2BuildArguments(arguments_)).toThrow();
|
|
});
|
|
|
|
it("pins source, signed-tag object and compiler identities", () => {
|
|
expect(PCRE2_LOCK.source.tag).toBe("pcre2-10.47");
|
|
expect(PCRE2_LOCK.source.tagObject).toHaveLength(40);
|
|
expect(PCRE2_LOCK.source.commit).toHaveLength(40);
|
|
expect(PCRE2_LOCK.source.tree).toHaveLength(40);
|
|
expect(PCRE2_LOCK.emscripten.version).toBe("6.0.4");
|
|
expect(PCRE2_LOCK.emscripten.emccSha256).toHaveLength(64);
|
|
expect(PCRE2_LOCK.bridgeAbi).toBe(3);
|
|
expect(PCRE2_LOCK.maximumSubjectBytes).toBe(16 * 1024 * 1024);
|
|
expect(PCRE2_LOCK.maximumMatches).toBe(10_000);
|
|
});
|
|
|
|
it("rejects an incomplete staged pack before attempting to load it", async () => {
|
|
const directory = await mkdtemp(path.join(tmpdir(), "regex-pcre2-test-"));
|
|
temporaryDirectories.push(directory);
|
|
|
|
await expect(verifyPcre2Pack(directory, process.cwd())).rejects.toThrow(
|
|
"must contain only",
|
|
);
|
|
});
|
|
});
|