// Flags: --expose-internals 'use strict'; const common = require('../common'); const assert = require('assert'); const initHooks = require('./init-hooks'); const { checkInvocations } = require('./hook-checks'); const hooks = initHooks(); hooks.enable(); const { internalBinding } = require('internal/test/binding'); const { Zlib } = internalBinding('zlib'); const constants = require('zlib').constants; const handle = new Zlib(constants.DEFLATE); const as = hooks.activitiesOfTypes('ZLIB'); assert.strictEqual(as.length, 1); const hdl = as[0]; assert.strictEqual(hdl.type, 'ZLIB'); assert.strictEqual(typeof hdl.uid, 'number'); assert.strictEqual(typeof hdl.triggerAsyncId, 'number'); checkInvocations(hdl, { init: 1 }, 'when created handle'); // Store all buffers together so that they do not get // garbage collected. const buffers = { writeResult: new Uint32Array(2), dictionary: new Uint8Array(0), inBuf: new Uint8Array([0x78]), outBuf: new Uint8Array(1), }; handle.init( constants.Z_DEFAULT_WINDOWBITS, constants.Z_MIN_LEVEL, constants.Z_DEFAULT_MEMLEVEL, constants.Z_DEFAULT_STRATEGY, buffers.writeResult, function processCallback() { this.cb(); }, buffers.dictionary, ); checkInvocations(hdl, { init: 1 }, 'when initialized handle'); let count = 2; handle.cb = common.mustCall(onwritten, 2); handle.write(true, buffers.inBuf, 0, 1, buffers.outBuf, 0, 1); checkInvocations(hdl, { init: 1 }, 'when invoked write() on handle'); function onwritten() { if (--count) { // first write checkInvocations(hdl, { init: 1, before: 1 }, 'when wrote to handle the first time'); handle.write(true, buffers.inBuf, 0, 1, buffers.outBuf, 0, 1); } else { // second write checkInvocations(hdl, { init: 1, before: 2, after: 1 }, 'when wrote to handle the second time'); } } process.on('exit', onexit); function onexit() { hooks.disable(); hooks.sanityCheck('ZLIB'); // TODO: destroy never called here even with large amounts of ticks // is that correct? checkInvocations(hdl, { init: 1, before: 2, after: 2 }, 'when process exits'); // Do something with `buffers` to keep them alive until here. buffers.buffers = buffers; }