diff --git a/test/parallel/test-inspect-address-in-use.js b/test/parallel/test-inspect-address-in-use.js new file mode 100644 index 00000000000000..eb076b21c9beaa --- /dev/null +++ b/test/parallel/test-inspect-address-in-use.js @@ -0,0 +1,64 @@ +'use strict'; +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const { spawnSync } = require('child_process'); +const { createServer } = require('http'); +const assert = require('assert'); +const tmpdir = require('../common/tmpdir'); +const fixtures = require('../common/fixtures'); +const entry = fixtures.path('empty.js'); +const { Worker } = require('worker_threads'); + +function testOnServerListen(fn) { + const server = createServer((socket) => { + socket.end('echo'); + }); + + server.on('listening', () => { + fn(server); + server.close(); + }); + server.listen(0, '127.0.0.1'); +} + +function testChildProcess(getArgs, exitCode, options) { + testOnServerListen((server) => { + const { port } = server.address(); + const child = spawnSync(process.execPath, getArgs(port), options); + const stderr = child.stderr.toString().trim(); + const stdout = child.stdout.toString().trim(); + console.log('[STDERR]'); + console.log(stderr); + console.log('[STDOUT]'); + console.log(stdout); + const match = stderr.match( + /Starting inspector on 127\.0\.0\.1:(\d+) failed: address already in use/ + ); + assert.notStrictEqual(match, null); + assert.strictEqual(match[1], port + ''); + assert.strictEqual(child.status, exitCode); + }); +} + +tmpdir.refresh(); + +testChildProcess( + (port) => [`--inspect=${port}`, '--build-snapshot', entry], 0, + { cwd: tmpdir.path }); + +testChildProcess( + (port) => [`--inspect=${port}`, entry], 0); + +testOnServerListen((server) => { + const { port } = server.address(); + const worker = new Worker(entry, { + execArgv: [`--inspect=${port}`] + }); + + worker.on('error', common.mustNotCall()); + + worker.on('exit', common.mustCall((code) => { + assert.strictEqual(code, 0); + })); +});