| // 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}`); |
| } |