mirror of
https://github.com/home-assistant/frontend.git
synced 2026-08-13 08:32:32 +01:00
* 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
65 lines
1.7 KiB
JavaScript
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();
|
|
});
|
|
});
|