mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-13 14:02:16 +00:00
Main's rewritten test_tui_npm_install.py tests call _make_tui_argv expecting the Ink/npm flow unconditionally; with the dual-engine dispatch merged in, _resolve_tui_engine() auto-selects opentui whenever ui-opentui/dist is built in the repo, routing the call away from the path under test (first subprocess became 'node --version' instead of 'npm run build'). Pin the engine to ink via an autouse fixture, mirroring the existing pinning precedent in test_tui_resume_flow.py.
77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
/**
|
|
* Tests for electron/port-pool.cjs.
|
|
*
|
|
* Run with: node --test electron/port-pool.test.cjs
|
|
*
|
|
* PortPool is the in-process reservation that closes the pickPort() TOCTOU
|
|
* window. These cover selection order, skipping reserved/unavailable ports,
|
|
* release/reuse, exhaustion, and async probes — without real sockets.
|
|
*/
|
|
|
|
const test = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
|
|
const { PortPool } = require('./port-pool.cjs')
|
|
|
|
const allFree = () => true
|
|
|
|
test('reserve returns the lowest free port and reserves it', async () => {
|
|
const pool = new PortPool(9120, 9199)
|
|
const port = await pool.reserve(allFree)
|
|
assert.equal(port, 9120)
|
|
assert.ok(pool.has(9120))
|
|
assert.equal(pool.size, 1)
|
|
})
|
|
|
|
test('reserve skips ports already reserved in-process', async () => {
|
|
const pool = new PortPool(9120, 9199)
|
|
const first = await pool.reserve(allFree)
|
|
const second = await pool.reserve(allFree)
|
|
assert.equal(first, 9120)
|
|
assert.equal(second, 9121)
|
|
})
|
|
|
|
test('reserve skips ports the probe rejects', async () => {
|
|
const pool = new PortPool(9120, 9199)
|
|
const busy = new Set([9120, 9121])
|
|
const port = await pool.reserve(p => !busy.has(p))
|
|
assert.equal(port, 9122)
|
|
})
|
|
|
|
test('reserve returns null when every port is taken', async () => {
|
|
const pool = new PortPool(9120, 9121)
|
|
await pool.reserve(allFree)
|
|
await pool.reserve(allFree)
|
|
assert.equal(await pool.reserve(allFree), null)
|
|
})
|
|
|
|
test('release frees a reserved port for reuse', async () => {
|
|
const pool = new PortPool(9120, 9120)
|
|
assert.equal(await pool.reserve(allFree), 9120)
|
|
assert.equal(await pool.reserve(allFree), null) // exhausted
|
|
pool.release(9120)
|
|
assert.ok(!pool.has(9120))
|
|
assert.equal(await pool.reserve(allFree), 9120) // reusable
|
|
})
|
|
|
|
test('release is a no-op for an unreserved port', () => {
|
|
const pool = new PortPool(9120, 9199)
|
|
pool.release(9120)
|
|
assert.equal(pool.size, 0)
|
|
})
|
|
|
|
test('reserve awaits an async probe', async () => {
|
|
const pool = new PortPool(9120, 9199)
|
|
const busy = new Set([9120])
|
|
const port = await pool.reserve(p => Promise.resolve(!busy.has(p)))
|
|
assert.equal(port, 9121)
|
|
})
|
|
|
|
test('clear drops all reservations', async () => {
|
|
const pool = new PortPool(9120, 9199)
|
|
await pool.reserve(allFree)
|
|
await pool.reserve(allFree)
|
|
assert.equal(pool.size, 2)
|
|
pool.clear()
|
|
assert.equal(pool.size, 0)
|
|
})
|