7a0648088c
Merge PR #159 after Code Queue rebase and validation. Runner verified M3 cardinality, hardware-loop smoke, patch-panel runtime smoke, m3 readonly contract, and git diff check. This is source/config blocker removal only; it does not claim DEV-LIVE M3 pass.
97 lines
3.7 KiB
JavaScript
97 lines
3.7 KiB
JavaScript
#!/usr/bin/env node
|
|
import assert from "node:assert/strict";
|
|
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { loadMvpGateSummary } from "../internal/mvp-gate/summary.mjs";
|
|
import { runCli } from "../tools/hwlab-cli/lib/cli.mjs";
|
|
import { gateSummary } from "../web/hwlab-cloud-web/gate-summary.mjs";
|
|
import { runCloudWebM3ReadonlyContract } from "../web/hwlab-cloud-web/scripts/m3-readonly-contract.mjs";
|
|
|
|
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
|
|
async function captureCli(args) {
|
|
let stdout = "";
|
|
let stderr = "";
|
|
const exitCode = await runCli(args, {
|
|
cwd: repoRoot,
|
|
stdout: {
|
|
write(chunk) {
|
|
stdout += chunk;
|
|
}
|
|
},
|
|
stderr: {
|
|
write(chunk) {
|
|
stderr += chunk;
|
|
}
|
|
}
|
|
});
|
|
return { exitCode, stdout, stderr };
|
|
}
|
|
|
|
const summary = loadMvpGateSummary(repoRoot);
|
|
assert.equal(summary.endpoint, "http://74.48.78.17:16667");
|
|
assert.deepEqual(
|
|
summary.milestones.map((item) => item.id),
|
|
["M0", "M1", "M2", "M3", "M4", "M5"]
|
|
);
|
|
|
|
const dryRun = await captureCli(["test", "e2e", "--env", "dev", "--mvp"]);
|
|
assert.equal(dryRun.exitCode, 0, dryRun.stderr);
|
|
const dryRunJson = JSON.parse(dryRun.stdout);
|
|
assert.equal(dryRunJson.mode, "dry-run");
|
|
assert.equal(dryRunJson.environment, "dev");
|
|
assert.equal(dryRunJson.endpoint, summary.endpoint);
|
|
assert.equal(dryRunJson.contractStatus.artifacts.count, 13);
|
|
assert.equal(dryRunJson.contractStatus.health.count, 14);
|
|
assert.equal(dryRunJson.contractStatus.topology.gatewaySessions, 2);
|
|
assert.equal(dryRunJson.contractStatus.topology.boxResources, 2);
|
|
assert.equal(dryRunJson.contractStatus.topology.patchPanelStatusId, "pps_m5-0001");
|
|
assert.equal(dryRunJson.contractStatus.agent.agentSessionId, "agt_m5-0001");
|
|
assert.equal(dryRunJson.contractStatus.evidence.records.length, 2);
|
|
assert.match(dryRunJson.statement, /no DEV\/PROD changes/);
|
|
|
|
const explicitDryRun = await captureCli(["test", "e2e", "--env", "dev", "--mvp", "--dry-run"]);
|
|
assert.equal(explicitDryRun.exitCode, 0, explicitDryRun.stderr);
|
|
assert.equal(JSON.parse(explicitDryRun.stdout).mode, "dry-run");
|
|
|
|
const liveBlocked = await captureCli([
|
|
"test",
|
|
"e2e",
|
|
"--env",
|
|
"dev",
|
|
"--mvp",
|
|
"--live",
|
|
"--confirm-dev",
|
|
"--confirmed-non-production"
|
|
]);
|
|
assert.equal(liveBlocked.exitCode, 2);
|
|
const liveBlockedJson = JSON.parse(liveBlocked.stderr);
|
|
assert.equal(liveBlockedJson.code, "BLOCKED");
|
|
assert.equal(liveBlockedJson.blockers[0].type, "runtime_blocker");
|
|
assert.equal(liveBlockedJson.blockers[0].scope, "db-live");
|
|
assert.ok(liveBlockedJson.blockers.some((blocker) => blocker.scope === "m3-hardware-loop-runtime"));
|
|
|
|
assert.equal(gateSummary.endpoint, summary.endpoint);
|
|
assert.equal(gateSummary.gateStatus, "blocked");
|
|
assert.equal(gateSummary.artifactCount, 13);
|
|
assert.equal(gateSummary.healthCount, 14);
|
|
assert.equal(gateSummary.gatewaySessionCount, 2);
|
|
assert.equal(gateSummary.boxResourceCount, 2);
|
|
assert.equal(gateSummary.topology.patchPanel.serviceId, "hwlab-patch-panel");
|
|
assert.deepEqual(gateSummary.topology.patchPanel.activeConnections, [
|
|
{
|
|
fromResourceId: "res_boxsimu_1",
|
|
fromPort: "DO1",
|
|
toResourceId: "res_boxsimu_2",
|
|
toPort: "DI1"
|
|
}
|
|
]);
|
|
assert.doesNotMatch(JSON.stringify(gateSummary.topology), /res_m5-control-relay|res_m5-target-board|out1|reset/u);
|
|
assert.equal(gateSummary.m5DryRunTopology.patchPanel.patchPanelStatusId, "pps_m5-0001");
|
|
assert.equal(gateSummary.agent.agentServiceId, "hwlab-agent-mgr");
|
|
assert.equal(gateSummary.agent.workerServiceId, "hwlab-agent-worker");
|
|
assert.equal(gateSummary.evidenceRecords.length, 2);
|
|
runCloudWebM3ReadonlyContract();
|
|
|
|
console.log("L6 CLI/Web smoke passed: CLI and Web read the M0-M5 gate report and Cloud Web stays read-only for M3 diagnostics");
|