49 lines
4.3 KiB
TypeScript
49 lines
4.3 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
import crypto from "node:crypto";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
const root = path.resolve(import.meta.dirname, "../../..");
|
|
const output = path.resolve(root, process.env.WBV2_RECOVERY_RECEIPT_REPORT ?? "tests/golden/WBV2-P8-002/chromium-receipts.json");
|
|
const map = JSON.parse(fs.readFileSync(path.join(root, "tools/web/wbv2-recovery-family-map.json"), "utf8"));
|
|
const sha256 = (file: string) => crypto.createHash("sha256").update(fs.readFileSync(path.join(root, file))).digest("hex");
|
|
|
|
test("P8-002 runs all atomic family surfaces in Chromium", async ({ page }) => {
|
|
const bindings = Object.fromEntries(Object.entries(map).map(([family, value]) => {
|
|
const source = value as { task: string; report: string };
|
|
const manifestPath = `tests/golden/${source.task}/manifest.json`;
|
|
const manifest = JSON.parse(fs.readFileSync(path.join(root, manifestPath), "utf8"));
|
|
const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => (artifact as { path: string }).path === source.report) as { path: string; sha256: string } | undefined;
|
|
expect(manifest.status).toBe("done"); expect(bound?.sha256).toBe(sha256(source.report));
|
|
const report = JSON.parse(fs.readFileSync(path.join(root, source.report), "utf8"));
|
|
expect(report.desktop.status).toBe("EXACT"); expect(report.wasm.status).toBe("EXACT");
|
|
expect(report.saveReopen ?? report.desktop.saveReopen ?? report.wasm.saveReopen).toBe("EXACT");
|
|
return [family, { ...source, manifest: manifestPath, manifestSha256: sha256(manifestPath), reportSha256: sha256(source.report) }];
|
|
}));
|
|
await page.goto("/");
|
|
const browser = await page.evaluate(async () => {
|
|
const { ATOMIC_CORRECTIVE_FAMILIES, createGenericFamilyMain, createGenericFamilyRegistry, runCorrectiveFamilyCases } = await import("/src/corrective-pilot-bridge.ts");
|
|
const families = [];
|
|
for (const family of ATOMIC_CORRECTIVE_FAMILIES) {
|
|
const runSurface = async (surface: "DESKTOP" | "WASM") => {
|
|
const main = createGenericFamilyMain(family);
|
|
const command = { schemaVersion: 1, requestId: `p8-${family.toLowerCase()}-${surface.toLowerCase()}`, commandType: "familySetState", baseRevision: 1, context: { mainId: `main:${family.toLowerCase()}`, targetKind: "DATABLOCK", targetId: `family:${family.toLowerCase()}`, editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "LOCAL", sha256: "8".repeat(64) } }, payload: { family, value: "after" } };
|
|
const [result] = await runCorrectiveFamilyCases([{ id: `${family.toLowerCase()}-${surface.toLowerCase()}`, family, registry: createGenericFamilyRegistry(main), surface, command, mainRevision: 1 }]);
|
|
const saved = main.snapshot();
|
|
const reopened = createGenericFamilyMain(family, saved.value.value, saved.revision, false).snapshot();
|
|
return { receipt: result.receipt.result, saved, reopened };
|
|
};
|
|
const desktop = await runSurface("DESKTOP");
|
|
const wasm = await runSurface("WASM");
|
|
families.push({ family, desktop, wasm, saveReopen: { status: JSON.stringify(desktop.saved.value) === JSON.stringify(desktop.reopened.value) && JSON.stringify(wasm.saved.value) === JSON.stringify(wasm.reopened.value) ? "EXACT" : "DRIFT", desktopRevision: desktop.reopened.revision, wasmRevision: wasm.reopened.revision } });
|
|
}
|
|
const flat = families.flatMap((entry) => [entry.desktop, entry.wasm]);
|
|
const summary = Object.fromEntries(families.map((entry) => [entry.family, { total: 2, finished: [entry.desktop, entry.wasm].filter((surface) => surface.receipt.status === "FINISHED").length, unchanged: [entry.desktop, entry.wasm].filter((surface) => surface.receipt.mainMutation === "UNCHANGED").length }]));
|
|
return { families, summary, finished: flat.filter((entry) => entry.receipt.status === "FINISHED").length };
|
|
});
|
|
expect(browser.families).toHaveLength(15); expect(browser.finished).toBe(30);
|
|
expect(browser.families.every((entry) => entry.desktop.receipt.status === "FINISHED" && entry.wasm.receipt.status === "FINISHED" && entry.saveReopen.status === "EXACT")).toBe(true);
|
|
fs.mkdirSync(path.dirname(output), { recursive: true });
|
|
fs.writeFileSync(output, `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P8-002", operation: "ATOMIC_FAMILY_RECOVERY_CHROMIUM", browser: "chromium", queueMutation: false, bindings, ...browser }, null, 2)}\n`);
|
|
});
|