From 74c219a6949d7bcee3720a33047f5dc3af5f9c86 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Tue, 5 May 2026 06:24:19 +0000 Subject: [PATCH] test: deflake connect-timeout watchdog --- test/connect-timeout.js | 75 ++++++++++++++++++++--------------------- test/parser-issues.js | 2 +- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/test/connect-timeout.js b/test/connect-timeout.js index 5000f38ea1d..4f0cac7d16b 100644 --- a/test/connect-timeout.js +++ b/test/connect-timeout.js @@ -1,7 +1,7 @@ 'use strict' const { tspl } = require('@matteo.collina/tspl') -const { test, after, describe } = require('node:test') +const { test, describe } = require('node:test') const { Client, Pool, errors } = require('..') const net = require('node:net') const assert = require('node:assert') @@ -32,52 +32,51 @@ net.connect = function (options) { return new net.Socket(options) } -test('connect-timeout', { skip }, async t => { - t = tspl(t, { plan: 3 }) - - const client = new Client('http://localhost:9000', { - connectTimeout: 1e3 +async function assertConnectTimeout (dispatcher, t) { + const tt = tspl(t, { plan: 3 }) + + await new Promise((resolve, reject) => { + // Connection timeouts use FastTimers, which have a deliberately low + // resolution, and Windows adds an extra setImmediate before timing out. + const timeout = setTimeout(() => { + dispatcher.destroy() + reject(new Error('connect-timeout callback did not fire')) + }, 5e3) + + dispatcher.request({ + path: '/', + method: 'GET' + }, (err) => { + try { + tt.ok(err instanceof errors.ConnectTimeoutError) + tt.strictEqual(err.code, 'UND_ERR_CONNECT_TIMEOUT') + tt.strictEqual(err.message, 'Connect Timeout Error (attempted address: localhost:9000, timeout: 1000ms)') + clearTimeout(timeout) + resolve() + } catch (error) { + clearTimeout(timeout) + reject(error) + } + }) }) - after(() => client.close()) - const timeout = setTimeout(() => { - t.fail() - }, 5e3) + await tt.completed +} - client.request({ - path: '/', - method: 'GET' - }, (err) => { - t.ok(err instanceof errors.ConnectTimeoutError) - t.strictEqual(err.code, 'UND_ERR_CONNECT_TIMEOUT') - t.strictEqual(err.message, 'Connect Timeout Error (attempted address: localhost:9000, timeout: 1000ms)') - clearTimeout(timeout) +test('connect-timeout (Client)', { skip }, async t => { + const client = new Client('http://localhost:9000', { + connectTimeout: 1e3 }) + t.after(() => client.close().catch(() => {})) - await t.completed + await assertConnectTimeout(client, t) }) -test('connect-timeout', { skip }, async t => { - t = tspl(t, { plan: 3 }) - +test('connect-timeout (Pool)', { skip }, async t => { const client = new Pool('http://localhost:9000', { connectTimeout: 1e3 }) - after(() => client.close()) - - const timeout = setTimeout(() => { - t.fail() - }, 5e3) - - client.request({ - path: '/', - method: 'GET' - }, (err) => { - t.ok(err instanceof errors.ConnectTimeoutError) - t.strictEqual(err.code, 'UND_ERR_CONNECT_TIMEOUT') - t.strictEqual(err.message, 'Connect Timeout Error (attempted address: localhost:9000, timeout: 1000ms)') - clearTimeout(timeout) - }) + t.after(() => client.close().catch(() => {})) - await t.completed + await assertConnectTimeout(client, t) }) diff --git a/test/parser-issues.js b/test/parser-issues.js index 651c4b69497..c1a83170b54 100644 --- a/test/parser-issues.js +++ b/test/parser-issues.js @@ -1,7 +1,7 @@ 'use strict' const { tspl } = require('@matteo.collina/tspl') -const { test, after } = require('node:test') +const { test } = require('node:test') const net = require('node:net') const { Client, errors, fetch } = require('..')