HS E36: RPC timeout tests (10, 11, 14) — 16/16 complete
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 16s

All 16 socket tests now green.

Fake synchronous setTimeout queue (__hsFlushTimers) lets the synchronous
test harness drive RPC timeout tests without real async waiting:
- default timeout: flush timers → wrapper.pending emptied (rejected)
- noTimeout: flush timers → wrapper.pending still has entry (not rejected)
- timeout(n): flush timers → 50ms timer fires → pending emptied

_rpcDispatch handles "noTimeout"/"timeout" method names, returning
new proxy or timeout-factory function respectively.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-26 17:56:19 +00:00
parent de493e41d8
commit 8915eeaf5e
4 changed files with 117 additions and 4 deletions

View File

@@ -18,6 +18,28 @@ const K = globalThis.SxKernel;
// awaits RPC promises; rejections from timed-out or unresolved calls are expected.
process.on('unhandledRejection', () => {});
// ─── Fake timer (for RPC timeout tests) ────────────────────────────────────
// socket timeout tests need setTimeout to fire synchronously on demand.
// Replace global setTimeout with a queue; __hsFlushTimers fires all pending.
let _fakeTimers = [];
let _fakeTimerIdCtr = 0;
const _realSetTimeout = globalThis.setTimeout;
globalThis.setTimeout = function(cb, _delay) {
const id = ++_fakeTimerIdCtr;
_fakeTimers.push({ id, cb });
return id;
};
globalThis.clearTimeout = function(id) {
const idx = _fakeTimers.findIndex(t => t.id === id);
if (idx >= 0) _fakeTimers.splice(idx, 1);
};
// __hsFlushTimers — drain all pending timers synchronously.
// Exposed as a plain object so host-call o "call" works.
globalThis.__hsFlushTimers = { call: function() {
const batch = _fakeTimers.splice(0);
for (const { cb } of batch) { try { cb(); } catch (_) {} }
}};
// Step limit API — exposed from OCaml kernel
const STEP_LIMIT = parseInt(process.env.HS_STEP_LIMIT || '200000');
@@ -760,6 +782,7 @@ for(let i=startTest;i<Math.min(endTest,testCount);i++){
globalThis.__hsMutationRegistry.length = 0;
globalThis.__hsMutationActive = false;
globalThis.__currentHsTestName = name;
_fakeTimers = []; // reset timer queue between tests
// Enable step limit for timeout protection
setStepLimit(STEP_LIMIT);