current commit
251107.4 · v8: adding total_allocated_bytes to HeapStatistics
'use strict';

const common = require('../common');
const fixtures = require('../common/fixtures');

common.skipIfInspectorDisabled();

const {
  Worker,
  isMainThread,
} = require('worker_threads');

if (!isMainThread) {
  common.skip('This test only works on a main thread');
}

// Ensures that worker.getHeapStatistics() returns valid data

const assert = require('assert');

if (isMainThread) {
  const name = 'Hello Thread';
  const worker = new Worker(fixtures.path('worker-name.js'), {
    name,
  });
  worker.once('message', common.mustCall(async (message) => {
    const stats = await worker.getHeapStatistics();
    const keys = [
      `total_heap_size`,
      `total_heap_size_executable`,
      `total_physical_size`,
      `total_available_size`,
      `used_heap_size`,
      `heap_size_limit`,
      `malloced_memory`,
      `peak_malloced_memory`,
      `does_zap_garbage`,
      `number_of_native_contexts`,
      `number_of_detached_contexts`,
      `total_global_handles_size`,
      `used_global_handles_size`,
      `external_memory`,
      `total_allocated_bytes`,
    ].sort();
    assert.deepStrictEqual(keys, Object.keys(stats).sort());
    for (const key of keys) {
      if (key === 'does_zap_garbage') {
        assert.strictEqual(typeof stats[key], 'boolean', `Expected ${key} to be a boolean`);
        continue;
      }
      assert.strictEqual(typeof stats[key], 'number', `Expected ${key} to be a number`);
      assert.ok(stats[key] >= 0, `Expected ${key} to be >= 0`);
    }

    worker.postMessage('done');
  }));

  worker.once('exit', common.mustCall(async (code) => {
    assert.strictEqual(code, 0);
    await assert.rejects(worker.getHeapStatistics(), {
      code: 'ERR_WORKER_NOT_RUNNING'
    });
  }));
}