Guard OPFS bridge path staging

This commit is contained in:
2026-06-13 19:50:02 +08:00
parent 0b09c3c069
commit ea2537e4e3
2 changed files with 191 additions and 1 deletions

View File

@@ -131,6 +131,62 @@ function assertMachineFileStoragePaths(machineId, paths) {
);
}
function assertParameterBridgePaths(
machineId,
result,
wasmPath,
filename = "linuxcnc.var",
) {
assert.equal(
result.opfsPath,
`linuxcnc/machines/${machineId}/${filename}`,
`${machineId}/${filename} parameter bridge OPFS path drift`,
);
assert.equal(
result.wasmPath,
wasmPath,
`${machineId}/${filename} parameter bridge WASM path drift`,
);
}
function assertToolTableBridgePaths(
machineId,
result,
wasmPath,
filename = "tool.tbl",
) {
assert.equal(
result.opfsPath,
`linuxcnc/machines/${machineId}/${filename}`,
`${machineId}/${filename} tool table bridge OPFS path drift`,
);
assert.equal(
result.wasmPath,
wasmPath,
`${machineId}/${filename} tool table bridge WASM path drift`,
);
}
function assertSessionBridgePaths(
machineId,
result,
{
iniWasmPath = "/work/machine.ini",
parameterWasmPath = "/work/linuxcnc.var",
toolTableWasmPath = "/work/tool.tbl",
} = {},
) {
assert.equal(result.machineId, machineId, `${machineId} session machine id drift`);
assert.equal(
result.ini.opfsPath,
`linuxcnc/machines/${machineId}/machine.ini`,
`${machineId} session INI OPFS path drift`,
);
assert.equal(result.ini.wasmPath, iniWasmPath, `${machineId} session INI WASM path drift`);
assertParameterBridgePaths(machineId, result.parameters, parameterWasmPath);
assertToolTableBridgePaths(machineId, result.toolTable, toolTableWasmPath);
}
assert.equal(await getOpfsRoot(storage), root);
assert.equal(normalizeOpfsPath("linuxcnc/machines/xyzab.ini"), "linuxcnc/machines/xyzab.ini");
@@ -369,6 +425,19 @@ assert.deepEqual(restoredParameters, {
result: "restore_parameters=0\nrestore_path=/work/bridge.var\n",
});
assert.equal(bridgeFiles.get("/work/bridge.var"), "5161 0.0\n5162 0.0\n");
assertParameterBridgePaths("xyzab-tdr", restoredParameters, "/work/bridge.var");
const restoredDefaultParameters = await restoreMachineParametersFromOpfs(
bridgeInterp,
"xyzab-tdr",
{ storage },
);
assertParameterBridgePaths("xyzab-tdr", restoredDefaultParameters, "/work/linuxcnc.var");
assert.equal(
restoredDefaultParameters.result,
"restore_parameters=0\nrestore_path=/work/linuxcnc.var\n",
);
assert.equal(bridgeFiles.get("/work/linuxcnc.var"), "5161 0.0\n5162 0.0\n");
const savedParameters = await saveMachineParametersToOpfs(
bridgeInterp,
@@ -376,7 +445,7 @@ const savedParameters = await saveMachineParametersToOpfs(
{ 5161: 12.34, 5162: 56.78 },
{ storage, wasmPath: "/work/bridge.var" },
);
assert.equal(savedParameters.opfsPath, "linuxcnc/machines/xyzab-tdr/linuxcnc.var");
assertParameterBridgePaths("xyzab-tdr", savedParameters, "/work/bridge.var");
assert.equal(savedParameters.backupOpfsPath, "linuxcnc/machines/xyzab-tdr/linuxcnc.var.bak");
assert.equal(savedParameters.result.includes("save_parameters=0"), true);
assert.equal(
@@ -387,6 +456,18 @@ assert.equal(
await loadTextFile("linuxcnc/machines/xyzab-tdr/linuxcnc.var.bak", storage),
"5161 0.0\n5162 0.0\n",
);
const savedDefaultParameters = await saveMachineParametersToOpfs(
bridgeInterp,
"xyzab-tdr",
{ 5161: 12.34 },
{ storage },
);
assertParameterBridgePaths("xyzab-tdr", savedDefaultParameters, "/work/linuxcnc.var");
assert.equal(
savedDefaultParameters.backupOpfsPath,
"linuxcnc/machines/xyzab-tdr/linuxcnc.var.bak",
);
assert.equal(savedDefaultParameters.result.includes("save_path=/work/linuxcnc.var"), true);
const loadedToolTable = await loadMachineToolTableFromOpfs(
bridgeInterp,
@@ -399,6 +480,19 @@ assert.deepEqual(loadedToolTable, {
result: "tooldata_load=0\nload_tool_path=/work/bridge-tool.tbl\nrandom_toolchanger=0\n",
});
assert.equal(bridgeFiles.get("/work/bridge-tool.tbl"), "T0 P0 ; no tool\nT2 P2 Z1.25 D0.25\n");
assertToolTableBridgePaths("xyzab-tdr", loadedToolTable, "/work/bridge-tool.tbl");
const loadedDefaultToolTable = await loadMachineToolTableFromOpfs(
bridgeInterp,
"xyzab-tdr",
{ storage },
);
assertToolTableBridgePaths("xyzab-tdr", loadedDefaultToolTable, "/work/tool.tbl");
assert.equal(
loadedDefaultToolTable.result,
"tooldata_load=0\nload_tool_path=/work/tool.tbl\nrandom_toolchanger=0\n",
);
assert.equal(bridgeFiles.get("/work/tool.tbl"), "T0 P0 ; no tool\nT2 P2 Z1.25 D0.25\n");
const loadedRandomToolTable = await loadMachineToolTableFromOpfs(
bridgeInterp,
@@ -419,11 +513,19 @@ const savedToolTable = await saveMachineToolTableToOpfs(
);
assert.equal(savedToolTable.opfsPath, "linuxcnc/machines/xyzab-tdr/tool.tbl");
assert.equal(savedToolTable.wasmPath, "/work/bridge-tool.tbl");
assertToolTableBridgePaths("xyzab-tdr", savedToolTable, "/work/bridge-tool.tbl");
assert.equal(savedToolTable.result.includes("tooldata_save=0"), true);
assert.equal(
await loadTextFile("linuxcnc/machines/xyzab-tdr/tool.tbl", storage),
"T2 P2 Z+1.250000 D+0.250000 ;loaded by LinuxCNC\n",
);
const savedDefaultToolTable = await saveMachineToolTableToOpfs(
bridgeInterp,
"xyzab-tdr",
{ storage },
);
assertToolTableBridgePaths("xyzab-tdr", savedDefaultToolTable, "/work/tool.tbl");
assert.equal(savedDefaultToolTable.result.includes("save_tool_path=/work/tool.tbl"), true);
const loadedSession = await loadMachineSessionFromOpfs(
bridgeInterp,
@@ -452,6 +554,11 @@ assert.deepEqual(loadedSession, {
result: "tooldata_load=0\nload_tool_path=/work/session-tool.tbl\nrandom_toolchanger=0\n",
},
});
assertSessionBridgePaths("xyzab-tdr", loadedSession, {
iniWasmPath: "/work/session.ini",
parameterWasmPath: "/work/session.var",
toolTableWasmPath: "/work/session-tool.tbl",
});
assert.equal(bridgeFiles.get("/work/session.ini"), "[EMC]\nMACHINE = xyzab-tdr\n");
assert.equal(bridgeFiles.get("/work/session.var"), "5161\t12.340000\n5162\t56.780000\n");
assert.equal(
@@ -459,6 +566,19 @@ assert.equal(
"T2 P2 Z+1.250000 D+0.250000 ;loaded by LinuxCNC\n",
);
const loadedDefaultSession = await loadMachineSessionFromOpfs(
bridgeInterp,
"xyzab-tdr",
{ storage },
);
assertSessionBridgePaths("xyzab-tdr", loadedDefaultSession);
assert.equal(bridgeFiles.get("/work/machine.ini"), "[EMC]\nMACHINE = xyzab-tdr\n");
assert.equal(bridgeFiles.get("/work/linuxcnc.var"), "5161\t12.340000\n5162\t56.780000\n");
assert.equal(
bridgeFiles.get("/work/tool.tbl"),
"T2 P2 Z+1.250000 D+0.250000 ;loaded by LinuxCNC\n",
);
const loadedRandomSession = await loadMachineSessionFromOpfs(
bridgeInterp,
"xyzab-tdr",