Files
frontend/test/build-scripts/managed-process.test.js
T
Aidan TimsonandGitHub 3c6b70ded8 Prevent concurrent managed frontend workflows (#53396)
* Shared build and runner for all build,dev,test flows

* Harden managed process lifecycle

* Make build workflows deterministic

* Test build management contracts

* Queue shared generated output work

* Isolate generated inputs for dev servers

* Preserve dev server child failures

* Make generated lock test deterministic

* Keep test navigator configurable

* Block concurrent frontend workflows

* Simplify workflow lock ownership

* Focus workflow locking on managed commands

* Trim workflow lock unit tests

* Consolidate dev server lifecycle handlers
2026-07-31 09:30:49 +03:00

65 lines
1.7 KiB
JavaScript

/**
* @vitest-environment node
*/
import { mkdtemp, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import path from "node:path";
import process from "node:process";
import { afterEach, describe, expect, it } from "vitest";
import {
acquireProcessRecord,
processStartTime,
readProcessRecord,
releaseProcessRecord,
} from "../../build-scripts/managed-process.mjs";
const temporaryDirectories = [];
const temporaryFile = async (name) => {
const directory = await mkdtemp(path.join(tmpdir(), "ha-build-test-"));
temporaryDirectories.push(directory);
return path.join(directory, name);
};
afterEach(async () => {
await Promise.all(
temporaryDirectories
.splice(0)
.map((directory) => rm(directory, { recursive: true, force: true }))
);
});
describe("managed process records", () => {
it("recovers a stale owner", async () => {
const file = await temporaryFile("stale.lock");
await writeFile(
file,
JSON.stringify({ pid: 2147483647, startTime: "stale", token: "stale" })
);
const owner = {
pid: process.pid,
startTime: processStartTime(process.pid),
token: "current",
};
expect(acquireProcessRecord(file, owner).acquired).toBe(true);
expect(readProcessRecord(file)).toEqual(owner);
});
it("releases only for the owning token", async () => {
const file = await temporaryFile("token.lock");
const owner = {
pid: process.pid,
startTime: processStartTime(process.pid),
token: "owner",
};
acquireProcessRecord(file, owner);
releaseProcessRecord(file, "other");
expect(readProcessRecord(file)).toEqual(owner);
releaseProcessRecord(file, owner.token);
expect(readProcessRecord(file)).toBeUndefined();
});
});