summaryrefslogtreecommitdiff
path: root/test/inspector/test-inspector-break-when-eval.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/inspector/test-inspector-break-when-eval.js')
-rw-r--r--test/inspector/test-inspector-break-when-eval.js128
1 files changed, 128 insertions, 0 deletions
diff --git a/test/inspector/test-inspector-break-when-eval.js b/test/inspector/test-inspector-break-when-eval.js
new file mode 100644
index 0000000000..388edf6f5c
--- /dev/null
+++ b/test/inspector/test-inspector-break-when-eval.js
@@ -0,0 +1,128 @@
+'use strict';
+const common = require('../common');
+common.skipIfInspectorDisabled();
+const assert = require('assert');
+const helper = require('./inspector-helper.js');
+const path = require('path');
+
+const script = path.join(path.dirname(module.filename), 'global-function.js');
+
+
+function setupExpectBreakOnLine(line, url, session) {
+ return function(message) {
+ if ('Debugger.paused' === message['method']) {
+ const callFrame = message['params']['callFrames'][0];
+ const location = callFrame['location'];
+ assert.strictEqual(url, session.scriptUrlForId(location['scriptId']));
+ assert.strictEqual(line, location['lineNumber']);
+ return true;
+ }
+ };
+}
+
+function setupExpectConsoleOutputAndBreak(type, values) {
+ if (!(values instanceof Array))
+ values = [ values ];
+ let consoleLog = false;
+ function matchConsoleLog(message) {
+ if ('Runtime.consoleAPICalled' === message['method']) {
+ const params = message['params'];
+ if (params['type'] === type) {
+ let i = 0;
+ for (const value of params['args']) {
+ if (value['value'] !== values[i++])
+ return false;
+ }
+ return i === values.length;
+ }
+ }
+ }
+
+ return function(message) {
+ if (consoleLog)
+ return message['method'] === 'Debugger.paused';
+ consoleLog = matchConsoleLog(message);
+ return false;
+ };
+}
+
+function setupExpectContextDestroyed(id) {
+ return function(message) {
+ if ('Runtime.executionContextDestroyed' === message['method'])
+ return message['params']['executionContextId'] === id;
+ };
+}
+
+function setupDebugger(session) {
+ console.log('[test]', 'Setting up a debugger');
+ const commands = [
+ { 'method': 'Runtime.enable' },
+ { 'method': 'Debugger.enable' },
+ { 'method': 'Debugger.setAsyncCallStackDepth',
+ 'params': {'maxDepth': 0} },
+ { 'method': 'Runtime.runIfWaitingForDebugger' },
+ ];
+
+ session
+ .sendInspectorCommands(commands)
+ .expectMessages((message) => 'Runtime.consoleAPICalled' === message.method);
+}
+
+function breakOnLine(session) {
+ console.log('[test]', 'Breaking in the code');
+ const commands = [
+ { 'method': 'Debugger.setBreakpointByUrl',
+ 'params': { 'lineNumber': 9,
+ 'url': script,
+ 'columnNumber': 0,
+ 'condition': ''
+ }
+ },
+ { 'method': 'Runtime.evaluate',
+ 'params': { 'expression': 'sum()',
+ 'objectGroup': 'console',
+ 'includeCommandLineAPI': true,
+ 'silent': false,
+ 'contextId': 1,
+ 'returnByValue': false,
+ 'generatePreview': true,
+ 'userGesture': true,
+ 'awaitPromise': false
+ }
+ }
+ ];
+ helper.markMessageNoResponse(commands[1]);
+ session
+ .sendInspectorCommands(commands)
+ .expectMessages(setupExpectBreakOnLine(9, script, session));
+}
+
+function stepOverConsoleStatement(session) {
+ console.log('[test]', 'Step over console statement and test output');
+ session
+ .sendInspectorCommands({ 'method': 'Debugger.stepOver' })
+ .expectMessages(setupExpectConsoleOutputAndBreak('log', [0, 3]));
+}
+
+function testWaitsForFrontendDisconnect(session, harness) {
+ console.log('[test]', 'Verify node waits for the frontend to disconnect');
+ session.sendInspectorCommands({ 'method': 'Debugger.resume'})
+ .expectMessages(setupExpectContextDestroyed(1))
+ .expectStderrOutput('Waiting for the debugger to disconnect...')
+ .disconnect(true);
+}
+
+function runTests(harness) {
+ harness
+ .runFrontendSession([
+ setupDebugger,
+ breakOnLine,
+ stepOverConsoleStatement,
+ testWaitsForFrontendDisconnect
+ ]).expectShutDown(0);
+}
+
+helper.startNodeForInspectorTest(runTests,
+ ['--inspect'],
+ undefined,
+ script);