Files
MikrotikManager/backend/src/services/traffic-flow-key-execution.test.ts
T

20 lines
1.6 KiB
TypeScript

import assert from "node:assert/strict"
import { ensureTrafficFlowHostKeys } from "./traffic-flow-key-execution.js"
let pair = {publicKey:"",privateKey:""},generated=0,writes=0
let release!:()=>void
const bothRead = new Promise<void>(resolve=>{release=resolve})
let initialReads=0
const deps = {
read:async()=>{const snapshot={...pair}; if(initialReads<2){initialReads++;if(initialReads===2)release();await bothRead} return snapshot},
generate:()=>{generated++;return {publicKey:"public-"+generated,privateKey:"private-"+generated}},
installIfMissing:async(keys:typeof pair)=>{writes++;if(pair.publicKey&&pair.privateKey)return false;pair=keys;return true},
}
const results=await Promise.all([ensureTrafficFlowHostKeys(deps),ensureTrafficFlowHostKeys(deps)])
assert.equal(generated,2);assert.equal(writes,2);assert.equal(results.filter(r=>r.created).length,1)
assert.equal(results[0].publicKey,results[1].publicKey);assert.equal(results[0].publicKey,pair.publicKey)
const before={...pair};assert.equal((await ensureTrafficFlowHostKeys(deps)).created,false);assert.deepEqual(pair,before);assert.equal(writes,2)
await assert.rejects(ensureTrafficFlowHostKeys({read:async()=>({publicKey:"",privateKey:""}),generate:deps.generate,installIfMissing:async()=>true}),/не подтверждено/)
let called=0
await assert.rejects(ensureTrafficFlowHostKeys({read:async()=>({publicKey:"",privateKey:""}),generate:deps.generate,installIfMissing:async()=>{called++;throw Error("DB failure")}}),/DB failure/)
assert.equal(called,1);console.log("NetFlow key execution: concurrent callers share winner, existing pair unchanged, unknown/failure never retried")