Files
MikrotikManager/backend/src/services/traffic-collection-lock.test.ts
T

26 lines
1.9 KiB
TypeScript

import assert from 'node:assert/strict'
import {withTrafficCollectionLock} from './traffic-collection-lock.js'
for(const state of ['busy','missing','ok','run-error','unlock-false','unlock-error','acquire-error']){
let runs=0,released:boolean|undefined,queries=0
const client={query:async()=>{
queries++
if(queries===1){if(state==='acquire-error')throw Error('connectivity');return {rows:state==='missing'?[]:[{acquired:state!=='busy'}]}}
if(state==='unlock-error')throw Error('unlock')
return {rows:[{released:state!=='unlock-false'}]}
},release:(destroy?:boolean)=>{released=destroy}}
const run=()=>withTrafficCollectionLock(async()=>client,async()=>{runs++;if(state==='run-error')throw Error('run');return 42})
if(['missing','run-error','acquire-error'].includes(state))await assert.rejects(run)
else {const result=await run();assert.equal(result.acquired,state!=='busy');if(result.acquired)assert.equal(result.value,42)}
assert.equal(runs,['busy','missing','acquire-error'].includes(state)?0:1)
assert.equal(released,['missing','unlock-false','unlock-error','acquire-error'].includes(state))
}
console.log('traffic lock: busy/no work/acquisition uncertainty/run failure/unlock failure/destruction passed')
import {EventEmitter} from 'node:events'
for(const event of ['error','end']){
const events=new EventEmitter();let destroy=false,writes=0
const client={query:async()=>({rows:[{acquired:true,released:true}]}),release:(value?:boolean)=>{destroy=!!value},on:events.on.bind(events),removeListener:events.removeListener.bind(events)}
await assert.rejects(withTrafficCollectionLock(async()=>client,async guard=>{guard();events.emit(event,Error('own loss'));guard();writes++;return 42}),/Соединение блокировки/)
assert.equal(writes,0);assert.equal(destroy,true);assert.equal(events.listenerCount(event),0)
}
console.log('traffic lock: error/end handled, guarded work aborted, connection destroyed, listeners removed')