testCleanCandidatesKeepsWhatsInUse
tcmts.dev.testCleanCandidatesKeepsWhatsInUse · #dagttuk2 · term
import { candidateDir, cleanCandidates } from "#codebase/tcmts/dev";
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
export const testCleanCandidatesKeepsWhatsInUse = () => {
const dist = fs.mkdtempSync(path.join(os.tmpdir(), "tcm dist "));
const running = spawn(process.execPath, ["-e", "setInterval(() => {}, 1000)"], {
stdio: "ignore",
});
try {
const make = (branch: string, pid?: number, old = false) => {
const dir = candidateDir(dist, branch);
fs.mkdirSync(path.join(dir, "install"), { recursive: true });
if (pid) fs.writeFileSync(path.join(dir, "verify.lock"), String(pid));
if (old) fs.utimesSync(dir, new Date(0), new Date(0));
return path.relative(dist, dir);
};
const building = make("session/a", running.pid, true);
const failedRecently = make("session/b");
const failedLongAgo = make("session/c", undefined, true);
const gone = make("session/d");
const leftByTheDead = make("session/e", 2147483646, true);
fs.mkdirSync(path.join(dist, "candidate"));
const removed = cleanCandidates(dist, [
"main",
"session/a",
"session/b",
"session/c",
"session/e",
]);
assert.deepEqual(removed.sort(), [failedLongAgo, gone, leftByTheDead, "candidate"].sort());
for (const kept of [building, failedRecently]) assert.ok(fs.existsSync(path.join(dist, kept)));
// the one place verifies built before is left while one of those holds dist/verify.lock
fs.mkdirSync(path.join(dist, "candidate"));
fs.writeFileSync(path.join(dist, "verify.lock"), String(running.pid));
assert.deepEqual(cleanCandidates(dist, ["session/a", "session/b"]), []);
} finally {
running.kill("SIGKILL");
fs.rmSync(dist, { recursive: true, force: true });
}
}
uses