Add a test for the inbox's drain-before-error rule
Hand-mutating CultMeshRealtimeInbox.receive() to check `completed` before the ready queue (so dispose() rejects an already-queued frame instead of draining it first) found no existing test that dies for it. Add one: two reliable-ordered frames sit in the provider's receive queue, the provider is disposed, and both frames must still come back from receive() before the next call rejects. Verified by hand against the final code and restored, per the fix batch's mutation list; not committed as a harness. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
2e7f10993f
commit
f0f0694a81
1 changed files with 26 additions and 0 deletions
|
|
@ -371,6 +371,32 @@ test("reliable-ordered client frames are delivered in order at the provider, nev
|
|||
}
|
||||
});
|
||||
|
||||
test("frames already queued in the provider's receive queue drain before dispose's rejection", async (t) => {
|
||||
if (!nativeBridgeAvailable()) return void t.skip("no native bridge available");
|
||||
const provider = await startProvider();
|
||||
try {
|
||||
const consumer = await dialProvider(provider);
|
||||
try {
|
||||
await waitUntil(() => provider.connectionCount === 1);
|
||||
await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 1n }));
|
||||
await consumer.sendFrame(testFrame({ delivery: "reliable-ordered", sequence: 2n }));
|
||||
await waitUntil(() => provider.receiveQueueSize === 2);
|
||||
|
||||
// Dispose while two frames are still sitting in the queue, unread.
|
||||
provider.dispose();
|
||||
|
||||
const first = await provider.receive();
|
||||
const second = await provider.receive();
|
||||
assert.deepEqual([first.sequence, second.sequence], [1n, 2n], "already-queued frames must drain first");
|
||||
await assert.rejects(() => provider.receive(), /disposed/, "only a call past the drained backlog rejects");
|
||||
} finally {
|
||||
consumer.dispose();
|
||||
}
|
||||
} finally {
|
||||
provider.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
test("unreliable broadcast fails closed", async (t) => {
|
||||
if (!nativeBridgeAvailable()) return void t.skip("no native bridge available");
|
||||
const provider = await startProvider();
|
||||
|
|
|
|||
Loading…
Reference in a new issue