Files
MikrotikManager/backend/src/services/gre-bgp-snapshot-collector.test.ts
T

27 lines
2.0 KiB
TypeScript

import assert from "node:assert/strict"
import { collectGreBgpSnapshotOnce, getGreBgpSnapshotCollectorState } from "./gre-bgp-snapshot-collector.js"
const peer = { serverName: "CHR", name: "own-peer", state: "Established" }
{
let release!: () => void
let bgpStarted = false
const pending = collectGreBgpSnapshotOnce({ fetchGre: () => new Promise(resolve => { release = () => resolve([{ targetLabel: "own / CHR", status: "up" }]) }), fetchBgp: async () => { bgpStarted = true; return [peer] } })
await Promise.resolve(); await Promise.resolve()
assert(bgpStarted, "BGP starts before GRE finishes")
assert(getGreBgpSnapshotCollectorState().running)
let duplicateCalls = 0
const duplicate = await collectGreBgpSnapshotOnce({ fetchGre: async () => { duplicateCalls++; return [] }, fetchBgp: async () => { duplicateCalls++; return [] } })
assert(duplicate.skipped); assert.equal(duplicateCalls, 0)
release(); const result = await pending
assert.equal(result.greWritten, 1); assert.equal(result.bgpWritten, 1)
}
for (const failGre of [true, false]) {
const result = await collectGreBgpSnapshotOnce({ fetchGre: () => { if (failGre) throw Error("GRE source refused"); return Promise.resolve([{ targetLabel: "own / CHR", status: "up" }]) }, fetchBgp: async () => { if (!failGre) throw Error("BGP source refused"); return [peer] } })
assert.equal(result.fatalError, undefined)
assert.deepEqual(result.errors, [failGre ? "GRE: GRE source refused" : "BGP: BGP source refused"])
assert.equal(result.greWritten, failGre ? 0 : 1); assert.equal(result.bgpWritten, failGre ? 1 : 0)
assert.equal(getGreBgpSnapshotCollectorState().running, false)
}
const empty = await collectGreBgpSnapshotOnce({ fetchGre: async () => [], fetchBgp: async () => [] })
assert.deepEqual(empty.errors, []); assert.equal(empty.bgpWritten, 0); assert.equal(empty.greWritten, 0)
console.log("GRE/BGP collector: concurrent independent reads, scoped sync/async failures, no duplicate fetch and recovery; no SQL/RouterOS")