diff --git a/test/parallel/test-inspector-heap-allocation-tracker.js b/test/parallel/test-inspector-heap-allocation-tracker.js new file mode 100644 index 00000000000000..0003a8fb694f1d --- /dev/null +++ b/test/parallel/test-inspector-heap-allocation-tracker.js @@ -0,0 +1,46 @@ +'use strict'; +const common = require('../common'); + +common.skipIfInspectorDisabled(); + +const assert = require('assert'); +const inspector = require('inspector'); +const stream = require('stream'); +const { Worker, workerData } = require('worker_threads'); + +const session = new inspector.Session(); +session.connect(); +session.post('HeapProfiler.enable'); +session.post('HeapProfiler.startTrackingHeapObjects', + { trackAllocations: true }); + +// Perform some silly heap allocations for the next 100 ms. +const interval = setInterval(() => { + new stream.PassThrough().end('abc').on('data', common.mustCall()); +}, 1); + +setTimeout(() => { + clearInterval(interval); + + // Once the main test is done, we re-run it from inside a Worker thread + // and stop early, as that is a good way to make sure the timer handles + // internally created by the inspector are cleaned up properly. + if (workerData === 'stopEarly') + process.exit(); + + let data = ''; + session.on('HeapProfiler.addHeapSnapshotChunk', + common.mustCallAtLeast((event) => { + data += event.params.chunk; + })); + + // TODO(addaleax): Using `{ reportProgress: true }` crashes the process + // because the progress indication event would mean calling into JS while + // a heap snapshot is being taken, which is forbidden. + // What can we do about that? + session.post('HeapProfiler.stopTrackingHeapObjects'); + + assert(data.includes('PassThrough'), data); + + new Worker(__filename, { workerData: 'stopEarly' }); +}, 100);