import assert from "node:assert/strict" import { test } from "node:test" import { normalizeOspfState, normalizeBfdState, ospfNodeState, ospfBfdConflicts } from "./ospf-state" test("RouterOS states keep transitional adjacency separate from failure", () => { assert.deepEqual(["full", "2-way", "ExStart", "exchange", "loading", "attempt", "init", "down"].map(normalizeOspfState), ["Full", "2-Way", "ExStart", "Exchange", "Loading", "Attempt", "Init", "Down"]) assert.equal(normalizeOspfState("future-state"), "Unknown") assert.equal(normalizeBfdState(""), "Unknown") assert.equal(normalizeBfdState(" UP "), "Up") }) test("Full/BFD conflict requires fresh exact device, interface, peer, explicit active BFD and unique direct session", () => { const neighbor = { localRouter: "1", localIface: "gre-own", neighborAddress: "198.18.153.2", state: "Full" as const } const iface = { serverId: "1", interfaceName: "gre-own", active: true, useBfd: true } const session = { serverId: "1", iface: "gre-own", remoteAddr: "198.18.153.2", state: "Down" as const, multihop: false } assert.deepEqual(ospfBfdConflicts([neighbor], [iface], [session]), [neighbor]) assert.deepEqual(ospfBfdConflicts([neighbor], [iface], [{ ...session, state: "AdminDown" }]), [neighbor]) for (const s of [{ ...session, serverId: "2" }, { ...session, iface: "ether1" }, { ...session, remoteAddr: "198.18.153.3" }, { ...session, multihop: true }, { ...session, multihop: null }, { ...session, state: "Unknown" as const }, { ...session, state: "Up" as const }, { ...session, dataUnknown: true }]) assert.deepEqual(ospfBfdConflicts([neighbor], [iface], [s]), []) assert.deepEqual(ospfBfdConflicts([neighbor], [iface], [session, { ...session, state: "Up" }]), []) for (const i of [{ ...iface, useBfd: null }, { ...iface, useBfd: false }, { ...iface, active: false }, { ...iface, active: null }, { ...iface, dataUnknown: true }]) assert.deepEqual(ospfBfdConflicts([neighbor], [i], [session]), []) assert.deepEqual(ospfBfdConflicts([{ ...neighbor, dataUnknown: true }], [iface], [session]), []) assert.deepEqual(ospfBfdConflicts([{ ...neighbor, state: "Down" }], [iface], [session]), []) assert.deepEqual(ospfBfdConflicts([{ ...neighbor, neighborAddress: undefined }], [iface], [session]), []) }) test("topology does not infer Down from missing or transitional evidence", () => { assert.equal(ospfNodeState([]), "none") assert.equal(ospfNodeState(["Down"]), "Down") assert.equal(ospfNodeState(["Down", "Unknown"]), "Unknown") assert.equal(ospfNodeState(["Exchange", "Loading"]), "Pending") assert.equal(ospfNodeState(["2-Way", "Down"]), "2-Way") assert.equal(ospfNodeState(["Full", "Unknown"]), "Full") })