From 9c1236eb5d368ef146245530b88423549a7306df Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Tue, 18 Jul 2023 12:17:18 +0100 Subject: [PATCH] test(remix): Test Remix SDK on Node 20. --- .github/workflows/build.yml | 2 +- .../node-integration-tests/utils/index.ts | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a5523a861eee..0c024683bd4e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -706,7 +706,7 @@ jobs: strategy: fail-fast: false matrix: - node: [14, 16, 18] + node: [14, 16, 18, 20] remix: [1, 2] steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) diff --git a/packages/node-integration-tests/utils/index.ts b/packages/node-integration-tests/utils/index.ts index 88120853ee69..467dc4d2179c 100644 --- a/packages/node-integration-tests/utils/index.ts +++ b/packages/node-integration-tests/utils/index.ts @@ -10,6 +10,8 @@ import type { AddressInfo } from 'net'; import nock from 'nock'; import * as path from 'path'; +const NODE_VERSION = parseSemver(process.versions.node).major; + export type TestServerConfig = { url: string; server: http.Server; @@ -40,7 +42,6 @@ export type DataCollectorOptions = { * @return {*} {jest.Describe} */ export const conditionalTest = (allowedVersion: { min?: number; max?: number }): jest.Describe => { - const NODE_VERSION = parseSemver(process.versions.node).major; if (!NODE_VERSION) { return describe.skip; } @@ -127,6 +128,16 @@ export class TestEnv { public constructor(public readonly server: http.Server, public readonly url: string) { this.server = server; this.url = url; + + // We need to destroy the socket after the response has been sent + // to prevent the server.close (called inside nock interceptor) from hanging in tests. + // Otherwise the tests may timeout. (Happening on Node 20) + // See: https://github.com/nodejs/node/issues/2642 + this.server.on('request', (req, res) => { + res.on('finish', () => { + req.socket.end(); + }); + }); } /** @@ -244,9 +255,7 @@ export class TestEnv { // Ex: Remix scope bleed tests. nock.cleanAll(); - this.server.close(() => { - resolve(envelopes); - }); + this._closeServer(); } resolve(envelopes); @@ -291,12 +300,19 @@ export class TestEnv { nock.cleanAll(); - this.server.close(() => { - resolve(reqCount); - }); - + this._closeServer(); resolve(reqCount); }, options.timeout || 1000); }); } + + private _closeServer(): void { + this.server.close(() => { + // @ts-ignore closeAllConnections() is only available from Node v18.2.0 + if (NODE_VERSION >= 18 && this.server.closeAllConnections) { + // @ts-ignore (Only available in Node 18+) + this.server.closeAllConnections(); + } + }); + } }