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()