diff --git a/package-lock.json b/package-lock.json index c3b816b43..5a5bff00a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,6 +92,7 @@ "mocha": "9.2.2", "mustache": "4.2.0", "nyc": "15.1.0", + "portfinder": "^1.0.28", "prettier": "2.6.1", "reindent-template-literals": "1.1.0", "shx": "0.3.4", @@ -2038,6 +2039,15 @@ "repeat-string": "^1.6.1" } }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5052,6 +5062,18 @@ "node": ">= 6" } }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", @@ -5954,6 +5976,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9222,6 +9267,15 @@ "repeat-string": "^1.6.1" } }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -11520,6 +11574,15 @@ "kind-of": "^6.0.3" } }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", @@ -12203,6 +12266,28 @@ "irregular-plurals": "^3.2.0" } }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", diff --git a/package.json b/package.json index 32c267c5f..810146fee 100644 --- a/package.json +++ b/package.json @@ -274,6 +274,7 @@ "mocha": "9.2.2", "mustache": "4.2.0", "nyc": "15.1.0", + "portfinder": "^1.0.28", "prettier": "2.6.1", "reindent-template-literals": "1.1.0", "shx": "0.3.4", diff --git a/src/formatter/http_stream_spec.ts b/src/formatter/http_stream_spec.ts index a49ccfba1..6aafedf97 100644 --- a/src/formatter/http_stream_spec.ts +++ b/src/formatter/http_stream_spec.ts @@ -2,6 +2,7 @@ import assert from 'assert' import HttpStream from './http_stream' import FakeReportServer from '../../test/fake_report_server' import { Writable } from 'stream' +import { getPortPromise as getPort } from 'portfinder' type Callback = (err?: Error | null) => void @@ -10,8 +11,9 @@ describe('HttpStream', () => { let port: number beforeEach(async () => { - reportServer = new FakeReportServer(0) - port = await reportServer.start() + port = await getPort() + reportServer = new FakeReportServer(port) + await reportServer.start() }) it(`sends a PUT request with written data when the stream is closed`, (callback: Callback) => { diff --git a/test/fake_report_server.ts b/test/fake_report_server.ts index ffdfd893e..59acfabbb 100644 --- a/test/fake_report_server.ts +++ b/test/fake_report_server.ts @@ -1,8 +1,7 @@ -import { AddressInfo, Server, Socket } from 'net' +import { Server } from 'net' import express from 'express' import { pipeline, Writable } from 'stream' import http from 'http' -import { promisify } from 'util' import { doesHaveValue } from '../src/value_checker' type Callback = (err?: Error | null) => void @@ -12,12 +11,11 @@ type Callback = (err?: Error | null) => void * (https://messages.cucumber.io). Used for testing only. */ export default class FakeReportServer { - private readonly sockets = new Set() private readonly server: Server - private receivedBodies = Buffer.alloc(0) + public receivedBodies = Buffer.alloc(0) public receivedHeaders: http.IncomingHttpHeaders = {} - constructor(private port: number) { + constructor(private readonly port: number) { const app = express() app.put('/s3', (req, res) => { @@ -64,37 +62,19 @@ export default class FakeReportServer { }) this.server = http.createServer(app) - - this.server.on('connection', (socket) => { - this.sockets.add(socket) - socket.on('close', () => this.sockets.delete(socket)) - }) } - async start(): Promise { - const listen = promisify(this.server.listen.bind(this.server)) - await listen(this.port) - this.port = (this.server.address() as AddressInfo).port - return this.port + async start(): Promise { + return new Promise((resolve) => + this.server.listen(this.port, () => resolve()) + ) } /** * @return all the received request bodies */ async stop(): Promise { - // Wait for all sockets to be closed - await Promise.all( - Array.from(this.sockets).map( - // eslint-disable-next-line @typescript-eslint/promise-function-async - (socket) => - new Promise((resolve, reject) => { - if (socket.destroyed) return resolve() - socket.on('close', resolve) - socket.on('error', reject) - }) - ) - ) - return await new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.server.close((err) => { if (doesHaveValue(err)) return reject(err) resolve(this.receivedBodies)