mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
dd52c05046
Comparing any value to any non-RegExp literal or undefined using strictEqual (or notStrictEqual) passes if and only if deepStrictEqual (or notDeepStrictEqual, respectively) passes. Unnecessarily using deep comparisons adds confusion. This patch adds an ESLint rule that forbids the use of deepStrictEqual and notDeepStrictEqual when the expected value (i.e., the second argument) is a non-RegExp literal or undefined. For reference, an ESTree literal is defined as follows. extend interface Literal <: Expression { type: "Literal"; value: string | boolean | null | number | RegExp | bigint; } The value `undefined` is an `Identifier` with `name: 'undefined'`. PR-URL: https://github.com/nodejs/node/pull/40634 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Voltrex <mohammadkeyvanzade94@gmail.com>
131 lines
3.7 KiB
JavaScript
131 lines
3.7 KiB
JavaScript
'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.strictEqual(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().then(common.mustCall());
|