'use strict'; const common = require('../common'); common.skipIfInspectorDisabled(); const assert = require('assert'); const { resolve: UrlResolve } = require('url'); const fixtures = require('../common/fixtures'); const { NodeInstance } = require('../common/inspector-helper.js'); function assertScopeValues({ result }, expected) { const unmatched = new Set(Object.keys(expected)); for (const actual of result) { const value = expected[actual.name]; assert.strictEqual(actual.value.value, value); unmatched.delete(actual.name); } assert.deepStrictEqual(Array.from(unmatched.values()), []); } async function testBreakpointOnStart(session) { console.log('[test]', 'Verifying debugger stops on start (--inspect-brk option)'); const commands = [ { 'method': 'Runtime.enable' }, { 'method': 'Debugger.enable' }, { 'method': 'Debugger.setPauseOnExceptions', 'params': { 'state': 'none' } }, { 'method': 'Debugger.setAsyncCallStackDepth', 'params': { 'maxDepth': 0 } }, { 'method': 'Profiler.enable' }, { 'method': 'Profiler.setSamplingInterval', 'params': { 'interval': 100 } }, { 'method': 'Debugger.setBlackboxPatterns', 'params': { 'patterns': [] } }, { 'method': 'Runtime.runIfWaitingForDebugger' } ]; await session.send(commands); await session.waitForBreakOnLine( 0, UrlResolve(session.scriptURL().toString(), 'message.mjs')); } async function testBreakpoint(session) { console.log('[test]', 'Setting a breakpoint and verifying it is hit'); const commands = [ { 'method': 'Debugger.setBreakpointByUrl', 'params': { 'lineNumber': 7, 'url': session.scriptURL(), 'columnNumber': 0, 'condition': '' } }, { 'method': 'Debugger.resume' }, ]; await session.send(commands); const { scriptSource } = await session.send({ 'method': 'Debugger.getScriptSource', 'params': { 'scriptId': session.mainScriptId } }); assert(scriptSource && (scriptSource.includes(session.script())), `Script source is wrong: ${scriptSource}`); await session.waitForConsoleOutput('log', ['A message', 5]); const paused = await session.waitForBreakOnLine(7, session.scriptURL()); const scopeId = paused.params.callFrames[0].scopeChain[0].object.objectId; console.log('[test]', 'Verify we can read current application state'); const response = await session.send({ 'method': 'Runtime.getProperties', 'params': { 'objectId': scopeId, 'ownProperties': false, 'accessorPropertiesOnly': false, 'generatePreview': true } }); assertScopeValues(response, { t: 1001, k: 1, message: 'A message' }); let { result } = await session.send({ 'method': 'Debugger.evaluateOnCallFrame', 'params': { 'callFrameId': '{"ordinal":0,"injectedScriptId":1}', 'expression': 'k + t', 'objectGroup': 'console', 'includeCommandLineAPI': true, 'silent': false, 'returnByValue': false, 'generatePreview': true } }); assert.strictEqual(result.value, 1002); result = (await session.send({ 'method': 'Runtime.evaluate', 'params': { 'expression': '5 * 5' } })).result; assert.strictEqual(result.value, 25); } async function runTest() { const child = new NodeInstance(['--inspect-brk=0'], '', fixtures.path('es-modules/loop.mjs')); const session = await child.connectInspectorSession(); await testBreakpointOnStart(session); await testBreakpoint(session); await session.runToCompletion(); assert.strictEqual((await child.expectShutdown()).exitCode, 55); } runTest();