'use strict'; if (process.argv[2] === 'child') { const common = require('../../common'); const test_general = require(`./build/${common.buildType}/test_general`); // The second argument to `envCleanupWrap()` is an index into the global // static string array named `env_cleanup_finalizer_messages` on the native // side. A reverse mapping is reproduced here for clarity. const finalizerMessages = { 'simple wrap': 0, 'wrap, removeWrap': 1, 'first wrap': 2, 'second wrap': 3 }; // We attach the three objects we will test to `module.exports` to ensure they // will not be garbage-collected before the process exits. // Make sure the finalizer for a simple wrap will be called at env cleanup. module.exports['simple wrap'] = test_general.envCleanupWrap({}, finalizerMessages['simple wrap']); // Make sure that a removed wrap does not result in a call to its finalizer at // env cleanup. module.exports['wrap, removeWrap'] = test_general.envCleanupWrap({}, finalizerMessages['wrap, removeWrap']); test_general.removeWrap(module.exports['wrap, removeWrap']); // Make sure that only the latest attached version of a re-wrapped item's // finalizer gets called at env cleanup. module.exports['first wrap'] = test_general.envCleanupWrap({}, finalizerMessages['first wrap']), test_general.removeWrap(module.exports['first wrap']); test_general.envCleanupWrap(module.exports['first wrap'], finalizerMessages['second wrap']); } else { const assert = require('assert'); const { spawnSync } = require('child_process'); const child = spawnSync(process.execPath, [__filename, 'child'], { stdio: [ process.stdin, 'pipe', process.stderr ] }); // Grab the child's output and construct an object whose keys are the rows of // the output and whose values are `true`, so we can compare the output while // ignoring the order in which the lines of it were produced. assert.deepStrictEqual( child.stdout.toString().split(/\r\n|\r|\n/g).reduce((obj, item) => Object.assign(obj, item ? { [item]: true } : {}), {}), { 'finalize at env cleanup for simple wrap': true, 'finalize at env cleanup for second wrap': true }); // Ensure that the child exited successfully. assert.strictEqual(child.status, 0); }