| // Flags: --inspect=0 |
| 'use strict'; |
| const common = require('../common'); |
| |
| common.skipIfInspectorDisabled(); |
| common.skipIfWorker(); |
| |
| // Assert that even when started with `--inspect=0` workers are assigned |
| // consecutive (i.e. deterministically predictable) debug ports |
| |
| const assert = require('assert'); |
| const cluster = require('cluster'); |
| |
| function serialFork() { |
| return new Promise((res) => { |
| const worker = cluster.fork(); |
| worker.on('exit', common.mustCall((code, signal) => { |
| // code 0 is normal |
| // code 12 can happen if inspector could not bind because of a port clash |
| if (code !== 0 && code !== 12) |
| assert.fail(`code: ${code}, signal: ${signal}`); |
| const port = worker.process.spawnargs |
| .map((a) => (/=(?:.*:)?(\d{2,5})$/.exec(a) || [])[1]) |
| .filter((p) => p) |
| .pop(); |
| res(Number(port)); |
| })); |
| }); |
| } |
| |
| if (cluster.isMaster) { |
| Promise.all([serialFork(), serialFork(), serialFork()]) |
| .then(common.mustCall((ports) => { |
| ports.splice(0, 0, process.debugPort); |
| // 4 = [master, worker1, worker2, worker3].length() |
| assert.strictEqual(ports.length, 4); |
| assert(ports.every((port) => port > 0)); |
| assert(ports.every((port) => port < 65536)); |
| assert.strictEqual(ports[0] === 65535 ? 1024 : ports[0] + 1, ports[1]); |
| assert.strictEqual(ports[1] === 65535 ? 1024 : ports[1] + 1, ports[2]); |
| assert.strictEqual(ports[2] === 65535 ? 1024 : ports[2] + 1, ports[3]); |
| })) |
| .catch( |
| (err) => { |
| console.error(err); |
| process.exit(1); |
| }); |
| } else { |
| process.exit(0); |
| } |