const inspector = require('inspector'); const path = require('path'); const { pathToFileURL } = require('url'); // This test case will set a breakpoint 4 lines below function debuggedFunction () { let i; let accum = 0; for (i = 0; i < 5; i++) { accum += i; } return accum; } let scopeCallback = null; function checkScope (session, scopeId) { session.post('Runtime.getProperties', { objectId: scopeId, ownProperties: false, accessorPropertiesOnly: false, generatePreview: true }, scopeCallback); } function debuggerPausedCallback (session, notification) { const params = notification.params; const callFrame = params.callFrames[0]; const scopeId = callFrame.scopeChain[0].object.objectId; checkScope(session, scopeId); } function testSampleDebugSession () { let cur = 0; const failures = []; const expects = { i: [0, 1, 2, 3, 4], accum: [0, 0, 1, 3, 6] }; scopeCallback = function (error, result) { if (error) failures.push(error); const i = cur++; let v, actual, expected; for (v of result.result) { actual = v.value.value; expected = expects[v.name][i]; if (actual !== expected) { failures.push(`Iteration ${i} variable: ${v.name} ` + `expected: ${expected} actual: ${actual}`); } } }; const session = new inspector.Session(); session.connect(); session.on('Debugger.paused', (notification) => debuggerPausedCallback(session, notification)); let cbAsSecondArgCalled = false; session.post('Debugger.enable', () => { cbAsSecondArgCalled = true; }); session.post('Debugger.setBreakpointByUrl', { lineNumber: 9, url: pathToFileURL(path.resolve(__dirname, __filename)).toString(), columnNumber: 0, condition: '' }); debuggedFunction(); scopeCallback = null; session.disconnect(); process.send({ cmd: 'assert', debuggerEnabled: cbAsSecondArgCalled, success: (cur === 5) && (failures.length === 0) }); } testSampleDebugSession();