docs(tests): clarify validation ownership and digest lifecycle checks

This commit is contained in:
2026-11-12 17:22:45 +08:00
parent eb287b8f23
commit 225170b024
6 changed files with 16 additions and 4 deletions
+3 -1
View File
@@ -8,10 +8,12 @@ import {createNetworkGate} from '../../src/lib/canvas-runtime/network.ts';
/** 暴露resolve的手动等待点,让首请求占住名额,测试可在第二请求获准前改变身份或abort。 */
const deferred=()=>{let resolve;const promise=new Promise(yes=>resolve=yes);return{resolve,promise};};
// 首请求等待时使身份失效,次请求不执行;恢复身份后第三请求能执行,证明拒绝的名额已释放。
// 首请求已经越过准入门,身份改变不会回溯撤销它;断言检查的是排队请求获准时重新核验。
test('transport rechecks identity after waiting for capacity and releases a rejected permit',async()=>{
let current=true,calls=0;const gate=createNetworkGate(1,()=>{if(!current)throw Error('identity_changed');}),hold=deferred(),signal=new AbortController().signal,first=gate.run(signal,async()=>{calls++;await hold.promise;}),second=assert.rejects(gate.run(signal,async()=>{calls++;}),/identity_changed/);await Promise.resolve();current=false;hold.resolve();await first;await second;assert.equal(calls,1);current=true;await gate.run(signal,async()=>{calls++;});assert.equal(calls,2);
});
// 排队请求先abort,随后释放首请求并运行第三个;调用数与护栏计数都只能包含真正获准的两个任务。
// 排队请求先 abort,随后释放首请求并运行第三个;调用数与护栏计数都只能包含真正获准的两个任务。
// assert.rejects 在 abort 之前挂好,避免预期的拒绝被当作未处理异常;取消不占用下一次可用名额。
test('an aborted queued transport cannot pass the effect guard or consume the next capacity grant',async()=>{
let guards=0,calls=0;const gate=createNetworkGate(1,()=>guards++),hold=deferred(),signal=new AbortController().signal,abort=new AbortController(),first=gate.run(signal,async()=>{calls++;await hold.promise;}),second=assert.rejects(gate.run(abort.signal,async()=>{calls++;}),/cancelled/);await Promise.resolve();abort.abort(Error('cancelled'));await second;hold.resolve();await first;await gate.run(signal,async()=>{calls++;});assert.equal(calls,2);assert.equal(guards,2);
});