Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: split watch mode inspector tests to sequential
PR-URL: #44551
Backport-PR-URL: #44815
Reviewed-By: Kohei Ueno <kohei.ueno119@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Nitzan Uziely <linkgoron@gmail.com>
  • Loading branch information
MoLow committed Sep 29, 2022
commit 0c3e131bb3c80dd5ab923fe7a36454b239bf3d48
65 changes: 0 additions & 65 deletions test/parallel/test-watch-mode.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import { writeFileSync, readFileSync } from 'node:fs';
import { inspect } from 'node:util';
import { once } from 'node:events';
import { setTimeout } from 'node:timers/promises';
import { NodeInstance } from '../common/inspector-helper.js';


if (common.isIBMi)
common.skip('IBMi does not support `fs.watch()`');
Expand Down Expand Up @@ -236,67 +234,4 @@ describe('watch mode', { concurrency: false, timeout: 60_0000 }, () => {
`Completed running ${inspect(file)}`, `Restarting ${inspect(file)}`, `Completed running ${inspect(file)}`, '',
].join('\n'));
});

describe('inspect', {
skip: Boolean(process.config.variables.coverage || !process.features.inspector),
}, () => {
const silentLogger = { log: () => {}, error: () => {} };
async function getDebuggedPid(instance, waitForLog = true) {
const session = await instance.connectInspectorSession();
await session.send({ method: 'Runtime.enable' });
if (waitForLog) {
await session.waitForConsoleOutput('log', 'safe to debug now');
}
const { value: innerPid } = (await session.send({
'method': 'Runtime.evaluate', 'params': { 'expression': 'process.pid' }
})).result;
session.disconnect();
return innerPid;
}

it('should start debugger on inner process', async () => {
const file = fixtures.path('watch-mode/inspect.js');
const instance = new NodeInstance(['--inspect=0', '--watch'], undefined, file, silentLogger);
let stderr = '';
instance.on('stderr', (data) => { stderr += data; });

const pids = [instance.pid];
pids.push(await getDebuggedPid(instance));
instance.resetPort();
writeFileSync(file, readFileSync(file));
pids.push(await getDebuggedPid(instance));

await instance.kill();

// There should be 3 pids (one parent + 2 restarts).
// Message about Debugger should only appear twice.
assert.strictEqual(stderr.match(/Debugger listening on ws:\/\//g).length, 2);
assert.strictEqual(new Set(pids).size, 3);
});

it('should prevent attaching debugger with SIGUSR1 to outer process', { skip: common.isWindows }, async () => {
const file = fixtures.path('watch-mode/inspect_with_signal.js');
const instance = new NodeInstance(['--inspect-port=0', '--watch'], undefined, file, silentLogger);
let stderr = '';
instance.on('stderr', (data) => { stderr += data; });

const loggedPid = await new Promise((resolve) => {
instance.on('stdout', (data) => {
const matches = data.match(/pid is (\d+)/);
if (matches) resolve(Number(matches[1]));
});
});


process.kill(instance.pid, 'SIGUSR1');
process.kill(loggedPid, 'SIGUSR1');
const debuggedPid = await getDebuggedPid(instance, false);

await instance.kill();

// Message about Debugger should only appear once in inner process.
assert.strictEqual(stderr.match(/Debugger listening on ws:\/\//g).length, 1);
assert.strictEqual(loggedPid, debuggedPid);
});
});
});
73 changes: 73 additions & 0 deletions test/sequential/test-watch-mode-inspect.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import * as common from '../common/index.mjs';
import * as fixtures from '../common/fixtures.mjs';
import assert from 'node:assert';
import { describe, it } from 'node:test';
import { writeFileSync, readFileSync } from 'node:fs';
import { NodeInstance } from '../common/inspector-helper.js';


if (common.isIBMi)
common.skip('IBMi does not support `fs.watch()`');

common.skipIfInspectorDisabled();

describe('watch mode - inspect', () => {
const silentLogger = { log: () => {}, error: () => {} };
async function getDebuggedPid(instance, waitForLog = true) {
const session = await instance.connectInspectorSession();
await session.send({ method: 'Runtime.enable' });
if (waitForLog) {
await session.waitForConsoleOutput('log', 'safe to debug now');
}
const { value: innerPid } = (await session.send({
'method': 'Runtime.evaluate', 'params': { 'expression': 'process.pid' }
})).result;
session.disconnect();
return innerPid;
}

it('should start debugger on inner process', async () => {
const file = fixtures.path('watch-mode/inspect.js');
const instance = new NodeInstance(['--inspect=0', '--watch'], undefined, file, silentLogger);
let stderr = '';
instance.on('stderr', (data) => { stderr += data; });

const pids = [instance.pid];
pids.push(await getDebuggedPid(instance));
instance.resetPort();
writeFileSync(file, readFileSync(file));
pids.push(await getDebuggedPid(instance));

await instance.kill();

// There should be 3 pids (one parent + 2 restarts).
// Message about Debugger should only appear twice.
assert.strictEqual(stderr.match(/Debugger listening on ws:\/\//g).length, 2);
assert.strictEqual(new Set(pids).size, 3);
});

it('should prevent attaching debugger with SIGUSR1 to outer process', { skip: common.isWindows }, async () => {
const file = fixtures.path('watch-mode/inspect_with_signal.js');
const instance = new NodeInstance(['--inspect-port=0', '--watch'], undefined, file, silentLogger);
let stderr = '';
instance.on('stderr', (data) => { stderr += data; });

const loggedPid = await new Promise((resolve) => {
instance.on('stdout', (data) => {
const matches = data.match(/pid is (\d+)/);
if (matches) resolve(Number(matches[1]));
});
});


process.kill(instance.pid, 'SIGUSR1');
process.kill(loggedPid, 'SIGUSR1');
const debuggedPid = await getDebuggedPid(instance, false);

await instance.kill();

// Message about Debugger should only appear once in inner process.
assert.strictEqual(stderr.match(/Debugger listening on ws:\/\//g).length, 1);
assert.strictEqual(loggedPid, debuggedPid);
});
});