Files
MikrotikManager/backend/src/services/bgp-catalog-parse.test.ts
T

45 lines
3.6 KiB
TypeScript

import assert from "node:assert/strict"
import { parseBgpCatalogSessions, parseBgpSessions } from "./bgp-parse-sessions.js"
import { servers } from "../db/schema.js"
const server = { id: 1, name: "Тест", host: "192.0.2.1", site: "", country: "RU" } as typeof servers.$inferSelect
const raw = { ".id": "*1", "total-updates-received": "42", "total-updates-sent": "99" }
const missing = parseBgpCatalogSessions(server, [raw])[0]
assert.equal(missing.state, "Unknown")
for (const field of ["prefixesRx", "prefixesTx", "holdTime", "keepalive", "inputMessages", "outputMessages", "afi"] as const) assert.equal(missing[field], null)
const selectedMissing = parseBgpSessions(server, [raw])[0]
for (const field of ["prefixesRx", "prefixesTx", "holdTime", "keepalive", "inputMessages", "outputMessages", "localAs", "remoteAs"] as const) assert.equal(selectedMissing[field], null)
assert.equal(selectedMissing.type, "Unknown")
for (const s of [{}, { uptime: "1m" }, { established: "false" }, { state: "" }, { state: " " }, { state: "ActiveFuture" }, { state: "new-native-state" }]) {
assert.equal(parseBgpSessions(server, [s])[0].state, "Unknown")
assert.equal(parseBgpCatalogSessions(server, [s])[0].state, "Unknown")
}
for (const [native, expected] of [["idle", "Idle"], [" ACTIVE ", "Active"], ["connect", "Connect"], ["Open Sent", "OpenSent"], ["openconfirm", "OpenConfirm"], ["established", "Established"]]) {
assert.equal(parseBgpSessions(server, [{ state: native }])[0].state, expected)
}
const observed = parseBgpCatalogSessions(server, [{ ".id": "*2", established: "true", "prefix-count": "0", "hold-time": "0", "keepalive-time": "1m30s", "remote.messages": "0", "local.messages": "2", "remote.afi": "ip,ipv6" }])[0]
assert.equal(observed.state, "Established")
assert.equal(observed.prefixesRx, 0)
assert.equal(observed.holdTime, 0)
assert.equal(observed.keepalive, 90)
assert.equal(observed.inputMessages, 0)
assert.equal(observed.afi, "ip,ipv6")
const invalid = parseBgpCatalogSessions(server, [{ ".id": "*3", "prefix-count": "12bad", "hold-time": "invalid", "remote.messages": "-1" }])[0]
assert.equal(invalid.prefixesRx, null)
assert.equal(invalid.holdTime, null)
assert.equal(invalid.inputMessages, null)
for (const parse of [parseBgpSessions, parseBgpCatalogSessions]) {
const row = parse(server, [{ "prefix-count": "0", "remote.messages": "0", "local.messages": "2", "hold-time": "0", "keepalive-time": "1s500ms", "remote.as": "4200000162", "local.as": "4200000163" }])[0]
assert.equal(row.prefixesRx, 0); assert.equal(row.inputMessages, 0); assert.equal(row.outputMessages, 2)
assert.equal(row.holdTime, 0); assert.equal(row.keepalive, 1.5); assert.equal(row.remoteAs, 4200000162)
for (const invalid of ["-1", "12bad", "9007199254740992"]) assert.equal(parse(server, [{ "prefix-count": invalid, "remote.messages": invalid }])[0].prefixesRx, null)
assert.equal(parse(server, [{ "hold-time": "9".repeat(320) + "s" }])[0].holdTime, null)
}
console.log("BGP parser: selected/catalog strict nullable AS/counters/timers/AFI, explicit zero and milliseconds, no UPDATE-prefix/default substitution")
assert.equal(missing.remoteAs, null)
assert.equal(missing.localAs, null)
assert.equal(missing.type, "Unknown")
for (const value of ["0", "-1", "12bad", "4294967296"]) assert.equal(parseBgpCatalogSessions(server, [{ ".id": "*1", "remote.as": value }])[0].remoteAs, null)
assert.equal(parseBgpCatalogSessions(server, [{ ".id": "*1", "remote.as": "4294967295", "local.as": "4294967295" }])[0].type, "iBGP")
assert.equal(parseBgpCatalogSessions(server, [{ ".id": "*1", "remote.as": "64513", "local.as": "64512" }])[0].type, "eBGP")