Files
safetynet/tests/broker-wfp-revalidation.test.mjs
T

10 lines
1.8 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {createRequire} from 'node:module';
const require=createRequire(import.meta.url);
const {createWfpRevalidation}=require('../apps/network-broker/wfp-revalidation.cjs');
const valid=()=>({bfeRunning:true,ownedSublayer:'ours',enumerationComplete:true,allObjectsReadable:true,sublayers:[{key:'ours',weight:65535}],filters:Array.from({length:8},(_,i)=>({key:String(i),sublayer:'ours',layer:'c38d57d1-05a7-4c33-904f-7fbceee60e82',ownedVerified:true}))});
test('unreadable native snapshot never admits',async()=>{const reasons=[];const m=createWfpRevalidation({readTopology:async()=>({...valid(),allObjectsReadable:false}),quarantine:r=>reasons.push(r)});assert.equal(await m.start(),false);assert.equal(m.current(),false);assert.deepEqual(reasons,['topology-incomplete']);m.close();});
test('slow initial original callback remains admitted only once and stale success cannot recover',async()=>{let resolve,calls=0;const reasons=[];const m=createWfpRevalidation({readTopology:()=>{calls++;return new Promise(r=>{resolve=r;});},quarantine:r=>reasons.push(r),deadlineMs:10});const starting=m.start();await new Promise(r=>setTimeout(r,30));assert.equal(m.status().pending,true);assert.equal(m.current(),false);resolve(valid());assert.equal(await starting,false);assert.equal(calls,1);assert.deepEqual(reasons,['wfp-revalidation-timeout']);m.close();});
test('periodic failed BFE status quarantines and never auto recovers',async()=>{let calls=0;const reasons=[];const m=createWfpRevalidation({readTopology:async()=>({...valid(),bfeRunning:++calls===1}),quarantine:r=>reasons.push(r),intervalMs:100});assert.equal(await m.start(),true);await new Promise(r=>setTimeout(r,150));assert.equal(m.current(),false);assert.deepEqual(reasons,['wfp-bfe-unavailable']);m.close();});