blob: 5f1d25de75685aafe4f1cb3699877be9e3d600e2 [file] [log] [blame]
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank('Test that heap tracking actually reports data fragments.');
await session.evaluate(`
const junkArray = new Array(1000);
function junkGenerator() {
for (let i = 0; i < junkArray.length; ++i)
junkArray[i] = '42 ' + i;
window.junkArray = junkArray;
}
setInterval(junkGenerator, 0)
`);
let lastSeenObjectIdEventCount = 0;
let heapStatsUpdateEventCount = 0;
let fragments = [];
const objectIdCallback = async messageObject => {
++lastSeenObjectIdEventCount;
if (lastSeenObjectIdEventCount <= 2) {
const params = messageObject['params'];
testRunner.log('HeapProfiler.lastSeenObjectId has params: ' + !!params);
testRunner.log('HeapProfiler.lastSeenObjectId has params.lastSeenObjectId: ' + !!params.lastSeenObjectId);
testRunner.log('HeapProfiler.lastSeenObjectId has timestamp: ' + !!params.timestamp);
testRunner.log('A heap stats fragment did arrive before HeapProfiler.lastSeenObjectId: ' + !!fragments.length);
testRunner.log('');
}
if (lastSeenObjectIdEventCount === 2) {
// Wait for two updates and then stop tracing. Turn off these callbacks.
// This callback is not awaited by the caller, meaning we can re-enter
// this callback while awaiting the below call. This would cause the count
// to get incremented again. We avoid this by de-registering the callback.
dp.HeapProfiler.offLastSeenObjectId(objectIdCallback);
await dp.HeapProfiler.stopTrackingHeapObjects();
testRunner.log('Number of heapStatsUpdate events >= number of lastSeenObjectId events: ' + (heapStatsUpdateEventCount >= lastSeenObjectIdEventCount));
testRunner.log('At least 2 lastSeenObjectId arrived: ' + (lastSeenObjectIdEventCount >= 2));
testRunner.log('SUCCESS: tracking stopped');
testRunner.completeTest();
}
};
dp.HeapProfiler.onLastSeenObjectId(objectIdCallback);
dp.HeapProfiler.onHeapStatsUpdate(messageObject => {
++heapStatsUpdateEventCount;
const params = messageObject['params'];
if (heapStatsUpdateEventCount <= 2) {
testRunner.log('HeapProfiler.heapStatsUpdate has params: ' + !!params);
}
const statsUpdate = params.statsUpdate;
if (heapStatsUpdateEventCount <= 2) {
testRunner.log('HeapProfiler.heapStatsUpdate has statsUpdate: ' + !!statsUpdate);
testRunner.log('statsUpdate length is not zero: ' + !!statsUpdate.length);
testRunner.log('statsUpdate length is a multiple of three: ' + !(statsUpdate.length % 3));
testRunner.log('statsUpdate: first fragmentIndex in first update: ' + statsUpdate[0]);
testRunner.log('statsUpdate: total count of objects is not zero: ' + !!statsUpdate[1]);
testRunner.log('statsUpdate: total size of objects is not zero: ' + !!statsUpdate[2]);
testRunner.log('');
}
fragments.push(statsUpdate);
});
await dp.HeapProfiler.startTrackingHeapObjects();
testRunner.log('SUCCESS: tracking started');
})