27 lines
2.0 KiB
TypeScript
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")
|