forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-inspector-contexts.js
73 lines (57 loc) · 2.25 KB
/
test-inspector-contexts.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
'use strict';
// Flags: --expose-gc
const common = require('../common');
common.skipIfInspectorDisabled();
const { strictEqual } = require('assert');
const { runInNewContext } = require('vm');
const { Session } = require('inspector');
const session = new Session();
session.connect();
function notificationPromise(method) {
return new Promise((resolve) => session.once(method, resolve));
}
async function testContextCreatedAndDestroyed() {
console.log('Testing context created/destroyed notifications');
const mainContextPromise =
notificationPromise('Runtime.executionContextCreated');
session.post('Runtime.enable');
let contextCreated = await mainContextPromise;
{
const { name } = contextCreated.params.context;
if (common.isSunOS || common.isWindows) {
// uv_get_process_title() is unimplemented on Solaris-likes, it returns
// an empty string. On the Windows CI buildbots it returns
// "Administrator: Windows PowerShell[42]" because of a GetConsoleTitle()
// quirk. Not much we can do about either, just verify that it contains
// the PID.
strictEqual(name.includes(`[${process.pid}]`), true);
} else {
strictEqual(`${process.argv0}[${process.pid}]`, name);
}
}
const secondContextCreatedPromise =
notificationPromise('Runtime.executionContextCreated');
let contextDestroyed = null;
session.once('Runtime.executionContextDestroyed',
(notification) => contextDestroyed = notification);
runInNewContext('1 + 1', {});
contextCreated = await secondContextCreatedPromise;
strictEqual('VM Context 1',
contextCreated.params.context.name,
JSON.stringify(contextCreated));
// GC is unpredictable...
while (!contextDestroyed)
global.gc();
strictEqual(contextCreated.params.context.id,
contextDestroyed.params.executionContextId,
JSON.stringify(contextDestroyed));
}
async function testBreakpointHit() {
console.log('Testing breakpoint is hit in a new context');
session.post('Debugger.enable');
const pausedPromise = notificationPromise('Debugger.paused');
runInNewContext('debugger', {});
await pausedPromise;
}
common.crashOnUnhandledRejection();
testContextCreatedAndDestroyed().then(testBreakpointHit);