// Flags: --expose-internals 'use strict'; // This tests that Environment is tracked in heap snapshots. require('../common'); const { validateSnapshotNodes } = require('../common/heap'); const assert = require('assert'); // This is just using ContextifyScript as an example here, it can be replaced // with any BaseObject that we can easily instantiate here and register in // cleanup hooks. // These can all be changed to reflect the status of how these objects // are captured in the snapshot. const context = require('vm').createScript('const foo = 123'); validateSnapshotNodes('Node / Environment', [{ children: [ cleanupHooksFilter, { node_name: 'Node / cleanup_hooks', edge_name: 'cleanup_hooks' }, { node_name: 'process', edge_name: 'process_object' }, { node_name: 'Node / IsolateData', edge_name: 'isolate_data' }, ] }]); function cleanupHooksFilter(edge) { if (edge.name !== 'cleanup_hooks') { return false; } if (edge.to.type === 'native') { verifyCleanupHooksInSnapshot(edge.to); } else { verifyCleanupHooksInGraph(edge.to); } return true; } function verifyCleanupHooksInSnapshot(node) { assert.strictEqual(node.name, 'Node / cleanup_hooks'); const baseObjects = []; for (const hook of node.outgoingEdges) { for (const hookEdge of hook.to.outgoingEdges) { if (hookEdge.name === 'arg') { baseObjects.push(hookEdge.to); } } } // Make sure our ContextifyScript show up. assert(baseObjects.some((node) => node.name === 'Node / ContextifyScript')); } function verifyCleanupHooksInGraph(node) { assert.strictEqual(node.name, 'Node / cleanup_hooks'); const baseObjects = []; for (const hook of node.edges) { for (const hookEdge of hook.to.edges) { if (hookEdge.name === 'arg') { baseObjects.push(hookEdge.to); } } } // Make sure our ContextifyScript show up. assert(baseObjects.some((node) => node.name === 'Node / ContextifyScript')); } console.log(context); // Make sure it's not GC'ed