import { tmpdir } from "node:os"; import { describe, expect, it } from "vitest"; import { assertDiskSpace, defaultMediaJobLimits, freeBytes, isDiskFull, MediaDiskFullError, MediaJobLimiter, } from "./media-jobs.js"; describe("media job limits", () => { it("defaults to one GPU job and a bounded number of CPU jobs", () => { expect(defaultMediaJobLimits(1)).toEqual({ gpu: 1, cpu: 1 }); expect(defaultMediaJobLimits(4)).toEqual({ gpu: 1, cpu: 2 }); expect(defaultMediaJobLimits(64)).toEqual({ gpu: 1, cpu: 2 }); }); it("hands out permits up to the limit per class and never waits", () => { const limiter = new MediaJobLimiter({ gpu: 1, cpu: 2 }); const gpu = limiter.tryAcquire("gpu"); expect(gpu).not.toBeNull(); expect(limiter.tryAcquire("gpu")).toBeNull(); const cpu = [limiter.tryAcquire("cpu"), limiter.tryAcquire("cpu")]; expect(cpu.every(Boolean)).toBe(true); expect(limiter.tryAcquire("cpu")).toBeNull(); gpu?.(); gpu?.(); expect(limiter.running("gpu")).toBe(0); expect(limiter.tryAcquire("gpu")).not.toBeNull(); cpu[0]?.(); expect(limiter.running("cpu")).toBe(1); }); it("rejects limits below one", () => { expect(() => new MediaJobLimiter({ gpu: 0, cpu: 1 })).toThrow(); expect(() => new MediaJobLimiter({ gpu: 1, cpu: 1.5 })).toThrow(); }); }); describe("disk backpressure", () => { it("reports free space and pauses below the reserve", async () => { const dir = tmpdir(); expect(await freeBytes(dir)).toBeGreaterThan(0); await expect(assertDiskSpace(dir, 0)).resolves.toBeUndefined(); await expect(assertDiskSpace(dir, Number.MAX_SAFE_INTEGER)).rejects.toBeInstanceOf( MediaDiskFullError, ); }); it("recognizes a full disk from errno or ffmpeg output", () => { expect(isDiskFull(Object.assign(new Error("write"), { code: "ENOSPC" }))).toBe(true); expect(isDiskFull(new Error("ffmpeg failed: No space left on device"))).toBe(true); expect(isDiskFull(new Error("Invalid data found"))).toBe(false); expect(isDiskFull(null)).toBe(false); }); });