electron/spec/cpp-heap-spec.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

80 lines
3.3 KiB
TypeScript
Raw Normal View History

import { expect } from 'chai';
import * as path from 'node:path';
import { startRemoteControlApp } from './lib/spec-helpers';
describe('cpp heap', () => {
describe('app module', () => {
it('should not allocate on every require', async () => {
const { remotely } = await startRemoteControlApp();
const [usedBefore, usedAfter] = await remotely(async () => {
const { getCppHeapStatistics } = require('node:v8');
const heapStatsBefore = getCppHeapStatistics('brief');
{
const { app } = require('electron');
console.log(app.name);
}
{
const { app } = require('electron');
console.log(app.dock);
}
const heapStatsAfter = getCppHeapStatistics('brief');
return [heapStatsBefore.used_size_bytes, heapStatsAfter.used_size_bytes];
});
expect(usedBefore).to.be.equal(usedAfter);
});
it('should record as node in heap snapshot', async () => {
const { remotely } = await startRemoteControlApp(['--expose-internals']);
const result = await remotely(async (heap: string, snapshotHelper: string) => {
const { recordState } = require(heap);
const { containsRetainingPath } = require(snapshotHelper);
const state = recordState();
return containsRetainingPath(state.snapshot, ['C++ Persistent roots', 'Electron / App']);
}, path.join(__dirname, '../../third_party/electron_node/test/common/heap'),
path.join(__dirname, 'lib', 'heapsnapshot-helpers.js'));
expect(result).to.equal(true);
});
});
describe('session module', () => {
it('should record as node in heap snapshot', async () => {
const { remotely } = await startRemoteControlApp(['--expose-internals']);
const result = await remotely(async (heap: string, snapshotHelper: string) => {
const { session, BrowserWindow } = require('electron');
const { once } = require('node:events');
const assert = require('node:assert');
const { recordState } = require(heap);
const { containsRetainingPath } = require(snapshotHelper);
const session1 = session.defaultSession;
console.log(session1.getStoragePath());
const session2 = session.fromPartition('cppheap1');
const session3 = session.fromPartition('cppheap1');
const session4 = session.fromPartition('cppheap2');
console.log(session2.cookies);
assert.strictEqual(session2, session3);
assert.notStrictEqual(session2, session4);
const w = new BrowserWindow({
show: false,
webPreferences: {
session: session.fromPartition('cppheap1')
}
});
await w.loadURL('about:blank');
const state = recordState();
const isClosed = once(w, 'closed');
w.destroy();
await isClosed;
const numSessions = containsRetainingPath(state.snapshot, ['C++ Persistent roots', 'Electron / Session'], {
occurrences: 4
});
const canTraceJSReferences = containsRetainingPath(state.snapshot, ['C++ Persistent roots', 'Electron / Session', 'Cookies']);
return numSessions && canTraceJSReferences;
}, path.join(__dirname, '../../third_party/electron_node/test/common/heap'),
path.join(__dirname, 'lib', 'heapsnapshot-helpers.js'));
expect(result).to.equal(true);
});
});
});