testJobsRunOnTheirOwn

tcmts.cli.mcp.testJobsRunOnTheirOwn · #6vbhzkiv · term

A background job is a process of its own, writing its output and how it ended to files: what's read from them is what it printed, its exit code, and its record (this process started it). Ids go on.

import { jobIds, jobWhen, startJob } from "#codebase/tcmts/cli/mcp";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";

export const testJobsRunOnTheirOwn = async () => {
  const dir = fs.mkdtempSync(path.join(os.tmpdir(), "tcm jobs "));
  try {
    const node = (code: string) => ({
      cmd: [process.execPath, "-e", code],
      cwd: dir,
      env: process.env,
    });
    const id = startJob(
      dir,
      { argv: ["run", "slow"] },
      node(
        `console.log("one"); setTimeout(() => { console.error("two"); process.exit(3); }, 200);`,
      ),
    );
    assert.equal(id, 1);
    const job = await jobWhen(dir, id, (j) => !!j.done);
    assert.equal(job.out, "one\ntwo\n");
    assert.equal(job.done!.code, 3);
    assert.deepEqual(job.argv, ["run", "slow"]);
    assert.equal(job.server, process.pid);
    assert.equal(job.lost, undefined);
    assert.equal(startJob(dir, { argv: [] }, node("")), 2);
    assert.deepEqual(jobIds(dir), [1, 2]);
    await jobWhen(dir, 2, (j) => j.done?.code === 0);
  } finally {
    fs.rmSync(dir, { recursive: true, force: true });
  }
}

uses