1'use strict'; 2const { mustCall, skipIfInspectorDisabled } = require('../common'); 3 4skipIfInspectorDisabled(); 5 6const assert = require('assert'); 7const { URL } = require('url'); 8const { spawn } = require('child_process'); 9 10function test(arg, port = '') { 11 const args = [arg, '-p', 'process.debugPort']; 12 const proc = spawn(process.execPath, args); 13 proc.stdout.setEncoding('utf8'); 14 proc.stderr.setEncoding('utf8'); 15 let stdout = ''; 16 let stderr = ''; 17 proc.stdout.on('data', (data) => stdout += data); 18 proc.stderr.on('data', (data) => stderr += data); 19 proc.stdout.on('close', (hadErr) => assert(!hadErr)); 20 proc.stderr.on('close', (hadErr) => assert(!hadErr)); 21 proc.stderr.on('data', () => { 22 if (!stderr.includes('\n')) return; 23 assert(/Debugger listening on (.+)/.test(stderr)); 24 port = new URL(RegExp.$1).port; 25 assert(+port > 0); 26 }); 27 if (/inspect-brk/.test(arg)) { 28 proc.stderr.on('data', () => { 29 if (stderr.includes('\n') && !proc.killed) proc.kill(); 30 }); 31 } else { 32 let onclose = () => { 33 onclose = () => assert.strictEqual(port, stdout.trim()); 34 }; 35 proc.stdout.on('close', mustCall(() => onclose())); 36 proc.stderr.on('close', mustCall(() => onclose())); 37 proc.on('exit', mustCall((exitCode, signal) => assert.strictEqual( 38 exitCode, 39 0, 40 `exitCode: ${exitCode}, signal: ${signal}`))); 41 } 42} 43 44test('--inspect=0'); 45test('--inspect=127.0.0.1:0'); 46test('--inspect=localhost:0'); 47 48test('--inspect-brk=0'); 49test('--inspect-brk=127.0.0.1:0'); 50test('--inspect-brk=localhost:0'); 51 52// In these cases, the inspector doesn't listen, so an ephemeral port is not 53// allocated and the expected value of `process.debugPort` is `0`. 54test('--inspect-port=0', '0'); 55test('--inspect-port=127.0.0.1:0', '0'); 56test('--inspect-port=localhost:0', '0'); 57