summaryrefslogtreecommitdiff
path: root/test/parallel/test-inspector-bindings.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/parallel/test-inspector-bindings.js')
-rw-r--r--test/parallel/test-inspector-bindings.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/test/parallel/test-inspector-bindings.js b/test/parallel/test-inspector-bindings.js
new file mode 100644
index 0000000000..c632bb8840
--- /dev/null
+++ b/test/parallel/test-inspector-bindings.js
@@ -0,0 +1,130 @@
+'use strict';
+const common = require('../common');
+common.skipIfInspectorDisabled();
+const assert = require('assert');
+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 waitForWarningSkipAsyncStackTraces(resolve) {
+ process.once('warning', function(warning) {
+ if (warning.code === 'INSPECTOR_ASYNC_STACK_TRACES_NOT_AVAILABLE') {
+ waitForWarningSkipAsyncStackTraces(resolve);
+ } else {
+ resolve(warning);
+ }
+ });
+}
+
+async function testNoCrashWithExceptionInCallback() {
+ // There is a deliberate exception in the callback
+ const session = new inspector.Session();
+ session.connect();
+ const error = new Error('We expect this');
+ console.log('Expecting warning to be emitted');
+ const promise = new Promise(waitForWarningSkipAsyncStackTraces);
+ session.post('Console.enable', () => { throw error; });
+ assert.strictEqual(await promise, error);
+ session.disconnect();
+}
+
+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) {
+ 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;
+ assert.throws(() => {
+ session.post('Debugger.enable', function() {}, function() {});
+ }, TypeError);
+ session.post('Debugger.enable', () => cbAsSecondArgCalled = true);
+ session.post('Debugger.setBreakpointByUrl', {
+ 'lineNumber': 13,
+ 'url': pathToFileURL(path.resolve(__dirname, __filename)).toString(),
+ 'columnNumber': 0,
+ 'condition': ''
+ });
+
+ debuggedFunction();
+ assert.deepStrictEqual(cbAsSecondArgCalled, true);
+ assert.deepStrictEqual(failures, []);
+ assert.strictEqual(cur, 5);
+ scopeCallback = null;
+ session.disconnect();
+ assert.throws(() => session.post('Debugger.enable'), (e) => !!e);
+}
+
+async function testNoCrashConsoleLogBeforeThrow() {
+ const session = new inspector.Session();
+ session.connect();
+ let attempt = 1;
+ process.on('warning', common.mustCall(3));
+ session.on('inspectorNotification', () => {
+ if (attempt++ > 3)
+ return;
+ console.log('console.log in handler');
+ throw new Error('Exception in handler');
+ });
+ session.post('Runtime.enable');
+ console.log('Did not crash');
+ session.disconnect();
+}
+
+async function doTests() {
+ await testNoCrashWithExceptionInCallback();
+ testSampleDebugSession();
+ let breakpointHit = false;
+ scopeCallback = () => (breakpointHit = true);
+ debuggedFunction();
+ assert.strictEqual(breakpointHit, false);
+ testSampleDebugSession();
+ await testNoCrashConsoleLogBeforeThrow();
+}
+
+doTests();