| 'use strict'; |
| const { mustCall, skipIfInspectorDisabled } = require('../common'); |
| |
| skipIfInspectorDisabled(); |
| |
| const assert = require('assert'); |
| const { URL } = require('url'); |
| const { spawn } = require('child_process'); |
| |
| function test(arg, port = '') { |
| const args = [arg, '-p', 'process.debugPort']; |
| const proc = spawn(process.execPath, args); |
| proc.stdout.setEncoding('utf8'); |
| proc.stderr.setEncoding('utf8'); |
| let stdout = ''; |
| let stderr = ''; |
| proc.stdout.on('data', (data) => stdout += data); |
| proc.stderr.on('data', (data) => stderr += data); |
| proc.stdout.on('close', (hadErr) => assert(!hadErr)); |
| proc.stderr.on('close', (hadErr) => assert(!hadErr)); |
| proc.stderr.on('data', () => { |
| if (!stderr.includes('\n')) return; |
| assert(/Debugger listening on (.+)/.test(stderr)); |
| port = new URL(RegExp.$1).port; |
| assert(+port > 0); |
| }); |
| if (/inspect-brk/.test(arg)) { |
| proc.stderr.on('data', () => { |
| if (stderr.includes('\n') && !proc.killed) proc.kill(); |
| }); |
| } else { |
| let onclose = () => { |
| onclose = () => assert.strictEqual(port, stdout.trim()); |
| }; |
| proc.stdout.on('close', mustCall(() => onclose())); |
| proc.stderr.on('close', mustCall(() => onclose())); |
| proc.on('exit', mustCall((exitCode, signal) => assert.strictEqual( |
| exitCode, |
| 0, |
| `exitCode: ${exitCode}, signal: ${signal}`))); |
| } |
| } |
| |
| test('--inspect=0'); |
| test('--inspect=127.0.0.1:0'); |
| test('--inspect=localhost:0'); |
| |
| test('--inspect-brk=0'); |
| test('--inspect-brk=127.0.0.1:0'); |
| test('--inspect-brk=localhost:0'); |
| |
| // In these cases, the inspector doesn't listen, so an ephemeral port is not |
| // allocated and the expected value of `process.debugPort` is `0`. |
| test('--inspect-port=0', '0'); |
| test('--inspect-port=127.0.0.1:0', '0'); |
| test('--inspect-port=localhost:0', '0'); |