Files
hyperframes/packages/engine/src/services/frameCapture-gpuCompletion.test.ts
T
James Russo 3a6b7f0612 fix: align local WebGPU capture behavior (#2907)
* fix: align local WebGPU capture behavior

* fix: address WebGPU capture review feedback

* fix: retain overlapping GPU seek work

* fix: satisfy runtime seek completion types

* fix: drain concurrent GPU seek work

* fix: prevent WebGPU capture barrier starvation

* fix: keep WebGPU presentation active during render seeks
2026-07-30 21:52:30 -07:00

44 lines
1.7 KiB
TypeScript

// fallow-ignore-file code-duplication
import { readFileSync } from "node:fs";
import { describe, expect, it, vi } from "vitest";
import { waitForPendingSeekCompletion } from "./frameCapture.js";
describe("WebGPU frame completion", () => {
it("blocks capture preparation until the runtime completion promise settles", async () => {
let finish: (() => void) | undefined;
const gpuWork = new Promise<void>((resolve) => {
finish = resolve;
});
const previousWindow = Reflect.get(globalThis, "window");
Reflect.set(globalThis, "window", { __hfWaitForSeekCompletion: () => gpuWork });
const page = {
evaluate: vi.fn(async (pageFunction: () => unknown) => pageFunction()),
};
try {
let settled = false;
const pending = waitForPendingSeekCompletion(page).then(() => {
settled = true;
});
await Promise.resolve();
expect(settled).toBe(false);
finish?.();
await pending;
expect(settled).toBe(true);
} finally {
if (previousWindow === undefined) Reflect.deleteProperty(globalThis, "window");
else Reflect.set(globalThis, "window", previousWindow);
}
});
it("runs the completion wait after video injection and before screenshot capture", () => {
const source = readFileSync(new URL("./frameCapture.ts", import.meta.url), "utf8");
const injection = source.indexOf("await session.onBeforeCapture(page, quantizedTime)");
const completion = source.indexOf("await waitForPendingSeekCompletion(page)");
const screenshot = source.indexOf("async function captureFrameCore");
expect(injection).toBeGreaterThan(-1);
expect(completion).toBeGreaterThan(injection);
expect(screenshot).toBeGreaterThan(completion);
});
});