71 lines
3.8 KiB
JavaScript
71 lines
3.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { createHash } from "node:crypto";
|
|
import { readFile } from "node:fs/promises";
|
|
import { ConfigurationBatchRuntime } from "../workspace/configuration-batch.mjs";
|
|
import { fnv1a64 } from "./replay.mjs";
|
|
|
|
const ROOT = new URL("../../", import.meta.url);
|
|
const CONTEXT_ID = "linuxcnc-2.10.0-pre0-wasm-m1-py-c1";
|
|
const matrix = JSON.parse(await readFile(new URL("../../coverage/full-configuration-startup-matrix.report.json", import.meta.url)));
|
|
const batch = new ConfigurationBatchRuntime({ context_id: CONTEXT_ID });
|
|
assert.equal(batch.load(matrix.matrix, { context_id: CONTEXT_ID }).status, "verified");
|
|
assert.deepEqual(batch.state.counts, {
|
|
total: 264,
|
|
ready: 56,
|
|
blocked: 208,
|
|
startup_preflight: { blocked_resource: 194, blocked_unindexed_resource_graph: 11, blocked_unregistered_kinematics: 3, static_ready: 56 },
|
|
resource_status: { blocked_missing: 147, blocked_missing_and_unresolved: 49, ready: 9, unindexed: 59 },
|
|
});
|
|
|
|
const diagnosticById = new Map(batch.state.diagnostics.map((row) => [row.config_id, row]));
|
|
const entrypointResults = [];
|
|
const hashes = [];
|
|
for (const row of matrix.matrix) {
|
|
const value = await readFile(new URL(`../../${row.path}`, import.meta.url));
|
|
const sourceHash = createHash("sha256").update(value).digest("hex");
|
|
const entry = batch.state.entrypoints.find((item) => item.config_id === row.config_id);
|
|
assert.ok(entry, row.config_id);
|
|
assert.equal(entry.status, row.status);
|
|
const diagnostic = row.status === "blocked" ? diagnosticById.get(row.config_id) : null;
|
|
entrypointResults.push({
|
|
config_id: row.config_id,
|
|
path: row.path,
|
|
source_sha256: sourceHash,
|
|
status: row.status === "ready" ? "READY" : "BLOCKED",
|
|
startup_preflight: row.startup_preflight,
|
|
resource_status: row.resource_status,
|
|
diagnostic_code: diagnostic?.code ?? null,
|
|
missing_count: row.missing_resources.length,
|
|
unresolved_count: row.unresolved_resources.length,
|
|
});
|
|
hashes.push(`${row.config_id}:${sourceHash}:${row.status}`);
|
|
}
|
|
entrypointResults.sort((left, right) => left.config_id.localeCompare(right.config_id));
|
|
hashes.sort();
|
|
|
|
const saved = batch.export();
|
|
const restored = new ConfigurationBatchRuntime({ context_id: CONTEXT_ID });
|
|
assert.deepEqual(restored.restore(saved), saved);
|
|
const simConfigCount = entrypointResults.filter((row) => row.path.startsWith("linuxcnc/configs/sim/")).length;
|
|
const testConfigCount = entrypointResults.filter((row) => row.path.startsWith("linuxcnc/tests/")).length;
|
|
assert.equal(simConfigCount, 216);
|
|
assert.equal(testConfigCount, 48);
|
|
|
|
const output = {
|
|
schema: "linuxcnc-source-config-startup-adapter.v1",
|
|
context_id: CONTEXT_ID,
|
|
matrix_report_sha256: createHash("sha256").update(await readFile(new URL("../../coverage/full-configuration-startup-matrix.report.json", import.meta.url))).digest("hex"),
|
|
registered_entries: matrix.counts.registered_entries,
|
|
reported_entrypoints: matrix.counts.entrypoints,
|
|
entrypoint_results: entrypointResults,
|
|
counts: { total: entrypointResults.length, sim_configs: simConfigCount, test_configs: testConfigCount, READY: batch.state.counts.ready, BLOCKED: batch.state.counts.blocked },
|
|
workflow: { batch_schema: saved.schema, batch_state_hash: saved.state_hash, restore_equal: JSON.stringify(restored.export()) === JSON.stringify(saved), diagnostic_count: batch.state.diagnostics.length, entrypoint_hash: fnv1a64(hashes) },
|
|
boundaries: [
|
|
"READY is static startup preflight, not an official LinuxCNC runtime oracle",
|
|
"BLOCKED rows retain resource/kinematics diagnostics and are never promoted",
|
|
"full native/WASM/Worker startup probes remain represented by configuration-startup-runtime evidence",
|
|
],
|
|
};
|
|
output.aggregate_hash = fnv1a64({ counts: output.counts, workflow: output.workflow, entrypoint_hash: output.workflow.entrypoint_hash });
|
|
console.log(JSON.stringify(output));
|