taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 4e3645e6de61b26c888bbc59e4a1c716d83c8fc7
parent efb714f76eca75dfb7ad1b5f0e27d2d87b481440
Author: Florian Dold <dold@taler.net>
Date:   Mon, 14 Sep 2026 01:42:38 +0200

taler-harness: wait for socket release in worker cleanup checks

Keep port reuse bounded by the existing cleanup deadline after the
worker and service processes have exited.

Diffstat:
Mpackages/taler-harness/src/integrationtests/worker-supervisor.test.ts | 28++++++++++++++++++++++------
1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/packages/taler-harness/src/integrationtests/worker-supervisor.test.ts b/packages/taler-harness/src/integrationtests/worker-supervisor.test.ts @@ -98,12 +98,28 @@ async function assertCleaned(root: string, name: string, workerPid: number) { await delay(10); assert.equal(isRunning(pid), false, "service survived cleanup"); assert.equal(isRunning(workerPid), false, "worker survived cleanup"); - const server = net.createServer(); - server.listen(port, "127.0.0.1"); - await once(server, "listening"); - await new Promise<void>((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + // Socket release can lag behind the process disappearing from /proc. + // Require the port to become reusable within the same cleanup deadline. + for (;;) { + const server = net.createServer(); + server.listen(port, "127.0.0.1"); + try { + await once(server, "listening"); + } catch (error) { + if ( + (error as NodeJS.ErrnoException).code !== "EADDRINUSE" || + Date.now() >= deadline + ) { + throw error; + } + await delay(10); + continue; + } + await new Promise<void>((resolve, reject) => + server.close((error) => (error ? reject(error) : resolve())), + ); + break; + } } for (const name of ["fail", "rejection", "crash", "sigkill", "shell"]) {