current commit
260925.61 · src: add --process-timeout=N
'use strict';

// Tests that the inspector cannot be activated, and that sessions that could
// pause the main thread cannot be connected, while --process-timeout is used.

const common = require('../common');
common.skipIfInspectorDisabled();

const assert = require('assert');
const { spawn } = require('child_process');
const { once } = require('events');
const inspector = require('inspector');
const readline = require('readline');
const { Worker } = require('worker_threads');
const { spawnSyncAndAssert } = require('../common/child_process');

async function testActivationRequestIsIgnored() {
  // Activation via SIGUSR1 (or its Windows equivalent) is ignored. The warning
  // is printed from another thread, so wait for it before checking whether the
  // inspector was activated.
  const child = spawn(process.execPath, [
    '--process-timeout=10m',
    '-e',
    `process._debugProcess(process.pid);
     process.stdin.once('data', () => {
       process.stdout.write(String(require('inspector').url()));
       process.stdin.destroy();
     });`,
  ]);
  let stdout = '';
  child.stdout.setEncoding('utf8');
  child.stdout.on('data', (data) => { stdout += data; });
  const lines = readline.createInterface({ input: child.stderr });

  const [warning] = await once(lines, 'line');
  assert.match(warning,
               /^\(node:\d+\) Warning: Ignoring the request to activate the inspector because --process-timeout is used\.$/);
  child.stdin.end('check');

  const [code, signal] = await once(child, 'close');
  assert.strictEqual(signal, null);
  assert.strictEqual(code, 0);
  assert.strictEqual(stdout, 'undefined');
}

if (process.argv[2] !== 'child') {
  spawnSyncAndAssert(process.execPath, [
    '--process-timeout=10m',
    __filename,
    'child',
  ], {
    stderr: '',
  });

  testActivationRequestIsIgnored().then(common.mustCall());
  return;
}

assert.throws(() => inspector.open(0), {
  code: 'ERR_INSPECTOR_NOT_AVAILABLE',
  message: 'The inspector cannot be activated when --process-timeout is used',
});
assert.strictEqual(inspector.url(), undefined);

// Sessions on the same thread cannot keep the thread paused, so they work.
const session = new inspector.Session();
session.connect();
session.post('Runtime.evaluate', { expression: '1 + 2' }, common.mustSucceed(({ result }) => {
  assert.strictEqual(result.value, 3);
  session.disconnect();
}));

const worker = new Worker(`
  const assert = require('assert');
  const { Session } = require('inspector');
  assert.throws(() => new Session().connectToMainThread(), {
    code: 'ERR_INSPECTOR_NOT_AVAILABLE',
    message: 'Sessions cannot be connected to the main thread when ' +
             '--process-timeout is used',
  });
`, { eval: true });
worker.on('exit', common.mustCall((code) => assert.strictEqual(code, 0)));