mirror of
https://github.com/nodejs/node.git
synced 2025-04-28 13:40:37 +00:00

Expose `CppHeap` data via `cppgc::CppHeap::CollectStatistics()` in the v8 module. PR-URL: https://github.com/nodejs/node/pull/57146 Fixes: https://github.com/nodejs/node/issues/56533 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Stephen Belanger <admin@stephenbelanger.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
126 lines
4.6 KiB
JavaScript
126 lines
4.6 KiB
JavaScript
'use strict';
|
|
// Tests that v8.getCppHeapStatistics() returns an object with an expected shape.
|
|
|
|
require('../common');
|
|
const assert = require('assert');
|
|
const v8 = require('v8');
|
|
|
|
// Detailed heap statistics
|
|
const heapStatsDetailed = v8.getCppHeapStatistics('detailed');
|
|
assert.strictEqual(heapStatsDetailed.detail_level, 'detailed');
|
|
const expectedTopLevelKeys = [
|
|
'committed_size_bytes',
|
|
'resident_size_bytes',
|
|
'used_size_bytes',
|
|
'detail_level',
|
|
'space_statistics',
|
|
'type_names',
|
|
].sort();
|
|
|
|
// Check top level properties
|
|
const actualTopLevelKeys = Object.keys(heapStatsDetailed).sort();
|
|
assert.deepStrictEqual(actualTopLevelKeys, expectedTopLevelKeys);
|
|
|
|
// Check types of top level properties
|
|
assert.strictEqual(typeof heapStatsDetailed.committed_size_bytes, 'number');
|
|
assert.strictEqual(typeof heapStatsDetailed.resident_size_bytes, 'number');
|
|
assert.strictEqual(typeof heapStatsDetailed.used_size_bytes, 'number');
|
|
assert.strictEqual(typeof heapStatsDetailed.detail_level, 'string');
|
|
assert.strictEqual(Array.isArray(heapStatsDetailed.space_statistics), true);
|
|
assert.strictEqual(Array.isArray(heapStatsDetailed.type_names), true);
|
|
|
|
|
|
// Check space statistics array
|
|
const expectedSpaceKeys = [
|
|
'name',
|
|
'committed_size_bytes',
|
|
'resident_size_bytes',
|
|
'used_size_bytes',
|
|
'page_stats',
|
|
'free_list_stats',
|
|
].sort();
|
|
|
|
heapStatsDetailed.space_statistics.forEach((space) => {
|
|
const actualSpaceKeys = Object.keys(space).sort();
|
|
assert.deepStrictEqual(actualSpaceKeys, expectedSpaceKeys);
|
|
assert.strictEqual(typeof space.name, 'string');
|
|
assert.strictEqual(typeof space.committed_size_bytes, 'number');
|
|
assert.strictEqual(typeof space.resident_size_bytes, 'number');
|
|
assert.strictEqual(typeof space.used_size_bytes, 'number');
|
|
assert.strictEqual(Array.isArray(space.page_stats), true);
|
|
assert.strictEqual(typeof space.free_list_stats, 'object');
|
|
});
|
|
|
|
// Check page statistics array
|
|
const expectedPageKeys = [
|
|
'committed_size_bytes',
|
|
'resident_size_bytes',
|
|
'used_size_bytes',
|
|
'object_statistics',
|
|
].sort();
|
|
|
|
heapStatsDetailed.space_statistics.forEach((space) => {
|
|
space.page_stats.forEach((page) => {
|
|
const actualPageKeys = Object.keys(page).sort();
|
|
assert.deepStrictEqual(actualPageKeys, expectedPageKeys);
|
|
assert.strictEqual(typeof page.committed_size_bytes, 'number');
|
|
assert.strictEqual(typeof page.resident_size_bytes, 'number');
|
|
assert.strictEqual(typeof page.used_size_bytes, 'number');
|
|
assert.strictEqual(Array.isArray(page.object_statistics), true);
|
|
});
|
|
});
|
|
|
|
// Check free list statistics
|
|
const expectedFreeListKeys = ['bucket_size', 'free_count', 'free_size'].sort();
|
|
|
|
heapStatsDetailed.space_statistics.forEach((space) => {
|
|
const actualFreeListKeys = Object.keys(space.free_list_stats).sort();
|
|
assert.deepStrictEqual(actualFreeListKeys, expectedFreeListKeys);
|
|
assert.strictEqual(Array.isArray(space.free_list_stats.bucket_size), true);
|
|
assert.strictEqual(Array.isArray(space.free_list_stats.free_count), true);
|
|
assert.strictEqual(Array.isArray(space.free_list_stats.free_size), true);
|
|
});
|
|
|
|
// Check object statistics
|
|
const expectedObjectStatsKeys = ['allocated_bytes', 'object_count'].sort();
|
|
|
|
heapStatsDetailed.space_statistics.forEach((space) => {
|
|
space.page_stats.forEach((page) => {
|
|
page.object_statistics.forEach((objectStats) => {
|
|
const actualObjectStatsKeys = Object.keys(objectStats).sort();
|
|
assert.deepStrictEqual(actualObjectStatsKeys, expectedObjectStatsKeys);
|
|
assert.strictEqual(typeof objectStats.allocated_bytes, 'number');
|
|
assert.strictEqual(typeof objectStats.object_count, 'number');
|
|
});
|
|
});
|
|
});
|
|
|
|
// Check type names
|
|
heapStatsDetailed.type_names.forEach((typeName) => {
|
|
assert.strictEqual(typeof typeName, 'string');
|
|
});
|
|
|
|
// Brief heap statistics
|
|
const heapStatsBrief = v8.getCppHeapStatistics('brief');
|
|
const expectedBriefKeys = [
|
|
'committed_size_bytes',
|
|
'resident_size_bytes',
|
|
'used_size_bytes',
|
|
'detail_level',
|
|
'space_statistics',
|
|
'type_names',
|
|
].sort();
|
|
|
|
// Check top level properties
|
|
const actualBriefKeys = Object.keys(heapStatsBrief).sort();
|
|
assert.strictEqual(heapStatsBrief.detail_level, 'brief');
|
|
assert.deepStrictEqual(actualBriefKeys, expectedBriefKeys);
|
|
|
|
// Check types of top level properties
|
|
assert.strictEqual(typeof heapStatsBrief.committed_size_bytes, 'number');
|
|
assert.strictEqual(typeof heapStatsBrief.resident_size_bytes, 'number');
|
|
assert.strictEqual(typeof heapStatsBrief.used_size_bytes, 'number');
|
|
assert.strictEqual(typeof heapStatsBrief.detail_level, 'string');
|
|
assert.strictEqual(Array.isArray(heapStatsBrief.space_statistics), true);
|
|
assert.strictEqual(Array.isArray(heapStatsBrief.type_names), true);
|