blob: ae98f55037b56fdf3a1eada1408305797a6f938e [file] [log] [blame]
// 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}`);
}