Files
MikrotikManager/backend/src/modules/mcp/path-verification.test.ts
T

50 lines
4.1 KiB
TypeScript

import assert from "node:assert/strict"
import { test } from "node:test"
import { inspectTrace, inspectControlPing } from "./path-verification.js"
const raw = [{ address: "192.0.2.1", sent: "1", loss: "0" }, { address: "192.0.2.2", sent: "1", loss: "0" }]
test("control failure requires the exact completed probe and valid terminal counters", () => {
const failed = inspectControlPing([{ sent: "3", received: "0", "packet-loss": "100" }])
assert.equal(failed.confirmedFailure, true)
assert.deepEqual(failed.packetCounts, { sent: 3, received: 0 })
for (const rows of [[], [{ status: "timeout" }], [{ sent: "2", received: "0" }], [{ sent: "4", received: "0" }], [{ sent: "9".repeat(400), received: "0" }], [{ sent: "3", received: "4" }], [{ sent: "3", received: "0" }, { sent: "invalid", received: "0" }]]) assert.equal(inspectControlPing(rows).confirmedFailure, false)
assert.equal(inspectControlPing([{ sent: "3", received: "3", "packet-loss": "0", "avg-rtt": "1ms" }]).confirmedFailure, false)
assert.equal(inspectControlPing([{ sent: "3", received: "0", "packet-loss": "0" }]).ping.measured, false)
})
test("path proof requires ordered expected hops and destination, never infers a missing hop", () => {
assert.equal(inspectTrace(raw, "192.0.2.2", ["192.0.2.1", "192.0.2.2"]).verified, true)
assert.equal(inspectTrace(raw, "192.0.2.2", ["192.0.2.2", "192.0.2.1"]).verified, false)
assert.equal(inspectTrace(raw, "192.0.2.3", ["192.0.2.1"]).verified, false)
assert.equal(inspectTrace([{ ...raw[0], status: "timeout" }, raw[1]], "192.0.2.2", ["192.0.2.1"]).verified, false)
assert.equal(inspectTrace([{ ...raw[0], sent: undefined }, raw[1]], "192.0.2.2", ["192.0.2.1"]).verified, false)
assert.equal(inspectTrace([{ ...raw[0], loss: "100" }, raw[1]], "192.0.2.2", ["192.0.2.1"]).verified, false)
})
test("incomplete positive ping cannot attest the three-packet command; unknown reasons expose no raw payload", () => {
for (const [sent, received] of [["1", "1"], ["2", "2"], ["4", "4"], ["invalid", "3"], ["9".repeat(400), "3"]]) {
const result = inspectControlPing([{ sent, received, "packet-loss": "0", "avg-rtt": "1ms", status: "NEVER_NATIVE_BODY" }])
assert.equal(result.ping.measured, false); assert.equal(result.packetCounts, null)
assert.equal(result.reason, "PING_COUNTERS_UNCONFIRMED"); assert.equal(result.confirmedFailure, false)
assert.ok(!JSON.stringify({ reason: result.reason, observation: result.observation }).includes("NEVER_"))
}
const complete = inspectControlPing([{ sent: "3", received: "3", "packet-loss": "0", "avg-rtt": "1ms" }])
assert.equal(complete.ping.measured, true); assert.equal(complete.reason, null)
assert.deepEqual(complete.observation, { rows: 1, hasTerminalCounters: true, terminalSent: 3, terminalReceived: 3 })
assert.equal(inspectControlPing([{ sent: "3", received: "2", "packet-loss": "33", "avg-rtt": "1ms" }]).reason, "PING_PARTIAL_LOSS")
assert.equal(inspectControlPing([{ sent: "3", received: "0", "packet-loss": "0" }]).reason, "PING_COUNTERS_INCONSISTENT")
})
test("native REST traceroute uses the last complete section and never merges partial tables", () => {
const partial = [{ ".section": "0", address: "", sent: "1", loss: "0" }]
const complete = raw.map(row => ({ ...row, ".section": "1" }))
assert.equal(inspectTrace([...partial, ...complete], "192.0.2.2", ["192.0.2.1", "192.0.2.2"]).verified, true)
assert.equal(inspectTrace([...complete, { ...raw[0], ".section": "2" }], "192.0.2.2", ["192.0.2.1", "192.0.2.2"]).verified, false)
assert.equal(inspectTrace([...complete, { ...raw[0], ".section": "invalid" }], "192.0.2.2", ["192.0.2.1"]).verified, false)
})
test("unrelated unresponsive hops stay unknown without hiding observed required nodes", () => {
const gap = { address: "", status: "timeout", sent: "1", loss: "100" }
const proof = inspectTrace([raw[0], gap, raw[1]], "192.0.2.2", ["192.0.2.1", "192.0.2.2"])
assert.equal(proof.verified, true); assert.equal(proof.completeTrace, false)
assert.equal(inspectTrace([raw[0], gap, raw[1]], "192.0.2.2", ["192.0.2.3", "192.0.2.2"]).verified, false)
assert.equal(inspectTrace([...raw, gap], "192.0.2.2", ["192.0.2.1", "192.0.2.2"]).verified, false)
})