v8/test/inspector/debugger/max-async-call-chain-depth.js
dgozman 7bbea08f66 [inspector] Refactor protocol-test.js
This refactoring makes it easier to write advanced tests and
gives full control over what's happening to the test code.
It also forces description for every test.

BUG=none

Review-Url: https://codereview.chromium.org/2891213002
Cr-Commit-Position: refs/heads/master@{#45412}
2017-05-19 00:35:45 +00:00

163 lines
5.9 KiB
JavaScript

// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// TODO(kozyatinskiy): fix or remove it later.
let {session, contextGroup, Protocol} = InspectorTest.start('Checks that we trim async call chains correctly.');
Protocol.Debugger.enable();
InspectorTest.log('set async chain depth to 8');
Protocol.Debugger.setAsyncCallStackDepth({maxDepth: 8});
InspectorTest.runAsyncTestSuite([
async function testDebuggerPaused() {
runWithAsyncChain(4, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithAsyncChain(8, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithAsyncChain(9, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithAsyncChain(32, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
},
async function testConsoleTrace() {
Protocol.Runtime.enable();
runWithAsyncChain(4, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithAsyncChain(8, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithAsyncChain(9, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithAsyncChain(32, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
},
async function testDebuggerPausedSetTimeout() {
runWithAsyncChainSetTimeout(4, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithAsyncChainSetTimeout(8, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithAsyncChainSetTimeout(9, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithAsyncChainSetTimeout(32, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
},
async function testConsoleTraceSetTimeout() {
runWithAsyncChainSetTimeout(4, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithAsyncChainSetTimeout(8, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithAsyncChainSetTimeout(9, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithAsyncChainSetTimeout(32, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
},
async function testConsoleTraceWithEmptySync() {
Protocol.Runtime.evaluate({
expression: 'new Promise(resolve => setTimeout(resolve, 0)).then(() => console.trace(42))'
});
InspectorTest.logMessage((await Protocol.Runtime.onceConsoleAPICalled()).params.stackTrace);
},
async function testDebuggerPausedThenableJob() {
runWithThenableJob(4, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithThenableJob(8, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithThenableJob(9, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
runWithThenableJob(32, 'debugger;');
dumpAsyncChainLength(await Protocol.Debugger.oncePaused());
await Protocol.Debugger.resume();
},
async function testConsoleTraceThenableJob() {
runWithThenableJob(4, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithThenableJob(8, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithThenableJob(9, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
runWithThenableJob(32, 'console.trace(42);');
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
},
async function twoConsoleAssert() {
Protocol.Runtime.evaluate({
expression: 'setTimeout(' +
'setTimeout.bind(null, ' +
'setTimeout.bind(null, () => { console.assert(); setTimeout(console.assert, 0) }, 0), 0), 0)'
});
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
dumpAsyncChainLength(await Protocol.Runtime.onceConsoleAPICalled());
}
]);
function runWithAsyncChain(len, source) {
InspectorTest.log(`Run expression '${source}' with async chain len: ${len}`);
let then = '.then(() => 1)';
let pause = `.then(() => { ${source} })`;
Protocol.Runtime.evaluate({
expression: `Promise.resolve()${then.repeat(len - 1)}${pause}`
});
}
function runWithAsyncChainSetTimeout(len, source) {
InspectorTest.log(`Run expression '${source}' with async chain len: ${len}`);
let setTimeout = 'setTimeout(() => {';
let suffix = '}, 0)';
Protocol.Runtime.evaluate({
expression: `${setTimeout.repeat(len)}${source}${suffix.repeat(len)}`
});
}
function runWithThenableJob(len, source) {
InspectorTest.log(`Run expression '${source}' with async chain len: ${len}`);
let then = '.then(Promise.resolve.bind(Promise, 0))';
let pause = `.then(() => { ${source} })`;
Protocol.Runtime.evaluate({
expression: `Promise.resolve()${then.repeat(len - 1)}${pause}`
});
}
function dumpAsyncChainLength(message) {
let stackTrace = message.params.asyncStackTrace || message.params.stackTrace.parent;
let asyncChainCount = 0;
while (stackTrace) {
++asyncChainCount;
stackTrace = stackTrace.parent;
}
InspectorTest.log(`actual async chain len: ${asyncChainCount}`);
}