test: stop guessing port numbers
Twenty test servers picked a port with `NNNN + Math.floor(Math.random() * 500)`
and hoped it was free. Several files guessed inside the *same* range —
sdk.test.ts and gates.test.ts both on 19500, three files on 22000, and
webrtc-integration.test.ts used 22000 twice within itself — so with test files
serving in parallel the collision was not unlikely, it was scheduled.
Found from the outside, in Nova, where Shade is vendored: across eight runs of
an unchanged tree, two had failures and six were clean. The visible error was
Failed to start server. Is port 24287 in use? EADDRINUSE
and then a second, louder one: `teardownRig` ran on a rig that setup had never
finished building and died on `rig.alice`, so the TypeError from cleanup is
what you read first and the real cause scrolled past above it.
`Bun.serve({ port: 0 })` lets the OS hand out a free port and `server.port`
reads it back. There is no range to collide inside.
teardownRig now tolerates a rig that was never built. Cleanup must never be the
loudest thing in a failing test.
A suite that fails a quarter of the time is worse than a suite that fails: it
teaches everyone to re-run it, and then a real regression looks like the flake.
Verified: 1198 pass / 0 fail here, and the same fix is going into Nova's
vendored copy so the next sync does not bring the guessing back.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014489bKUtUEY1Zgs9xN9mt7
This commit is contained in:
@@ -41,8 +41,12 @@ describe('Resume protocol — kill-restart-verify', () => {
|
||||
myAddress: 'bob',
|
||||
});
|
||||
const receiverApp = await createTransferRoutes(receiverEngine);
|
||||
const port = 22000 + Math.floor(Math.random() * 500);
|
||||
const server = Bun.serve({ port, fetch: receiverApp.fetch });
|
||||
// Port 0 lets the OS hand out a free one. This guessed inside a 500-wide
|
||||
// range and hoped — and several files here guessed inside the SAME range,
|
||||
// so with test files serving in parallel the collision arrived about a
|
||||
// quarter of the time as EADDRINUSE.
|
||||
const server = Bun.serve({ port: 0, fetch: receiverApp.fetch });
|
||||
const port = server.port;
|
||||
const baseUrl = `http://localhost:${port}`;
|
||||
|
||||
// Receiver accepts incoming.
|
||||
|
||||
@@ -39,8 +39,12 @@ describe('WS opt-in transport with HTTP fallback', () => {
|
||||
myAddress: 'bob',
|
||||
});
|
||||
const httpApp = await createTransferRoutes(receiverEngine);
|
||||
const httpPort = 23000 + Math.floor(Math.random() * 500);
|
||||
const httpServer = Bun.serve({ port: httpPort, fetch: httpApp.fetch });
|
||||
// Port 0 lets the OS hand out a free one. This guessed inside a 500-wide
|
||||
// range and hoped — and several files here guessed inside the SAME range,
|
||||
// so with test files serving in parallel the collision arrived about a
|
||||
// quarter of the time as EADDRINUSE.
|
||||
const httpServer = Bun.serve({ port: 0, fetch: httpApp.fetch });
|
||||
const httpPort = httpServer.port;
|
||||
const httpBaseUrl = `http://localhost:${httpPort}`;
|
||||
cleanups.push(() => httpServer.stop());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user