blob: eaa5d1fe65d513ec1c47558a6b7e4bd922220a12 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/trace_model/attribute.html">
<link rel="import" href="/core/trace_model/trace_model.html">
<link rel="import" href="/core/trace_model/global_memory_dump.html">
<link rel="import" href="/core/trace_model/process_memory_dump.html">
<script>
'use strict';
tv.b.unittest.testSuite(function() {
var TraceModel = tv.c.TraceModel;
var GlobalMemoryDump = tv.c.trace_model.GlobalMemoryDump;
var ProcessMemoryDump = tv.c.trace_model.ProcessMemoryDump;
var MemoryAllocatorDump = tv.c.trace_model.MemoryAllocatorDump;
var VMRegion = tv.c.trace_model.VMRegion;
var ScalarAttribute = tv.c.trace_model.ScalarAttribute;
var createProcessMemoryDump = function(timestamp, model) {
var gmd = new GlobalMemoryDump(model, timestamp);
model.globalMemoryDumps.push(gmd);
var p = model.getOrCreateProcess(123);
var pmd = new ProcessMemoryDump(gmd, p, timestamp + 1);
p.memoryDumps.push(pmd);
return pmd;
}
var createFinalizedProcessMemoryDump = function(timestamp, createdCallback) {
var model = tv.c.test_utils.newModel(function(model) {
createdCallback(createProcessMemoryDump(timestamp, model));
});
var pmds = model.getProcess(123).memoryDumps;
assert.lengthOf(pmds, 1);
return pmds[0];
}
function checkProtectionFlagsToString(protectionFlags, expectedString) {
var vmRegion = VMRegion.fromDict({
startAddress: 256,
sizeInBytes: 336,
protectionFlags: protectionFlags,
mappedFile: '[stack:20310]',
byteStats: {
privateResident: 96,
sharedResident: 144,
proportionalResident: 158
}
});
assert.strictEqual(vmRegion.protectionFlagsToString, expectedString);
}
test('totalResidentSizeInBytes_undefinedVmRegions', function() {
var pmd = createFinalizedProcessMemoryDump(42, function(pmd) {});
assert.isUndefined(pmd.mostRecentTotalProportionalResidentSizeInBytes);
assert.isUndefined(pmd.mostRecentTotalPrivateResidentSizeInBytes);
assert.isUndefined(pmd.mostRecentTotalSharedResidentSizeInBytes);
});
test('totalResidentSizeInBytes_zeroVmRegions', function() {
var pmd = createFinalizedProcessMemoryDump(42, function(pmd) {
pmd.vmRegions = [];
});
assert.equal(pmd.mostRecentTotalProportionalResidentSizeInBytes, 0);
assert.equal(pmd.mostRecentTotalPrivateResidentSizeInBytes, 0);
assert.equal(pmd.mostRecentTotalSharedResidentSizeInBytes, 0);
});
test('totalResidentSizeInBytes_oneVmRegion', function() {
var pmd = createFinalizedProcessMemoryDump(42, function(pmd) {
pmd.vmRegions = [
VMRegion.fromDict({
startAddress: 256,
sizeInBytes: 336,
protectionFlags: VMRegion.PROTECTION_FLAG_READ |
VMRegion.PROTECTION_FLAG_WRITE,
mappedFile: '[stack:20310]',
byteStats: {
privateResident: 96,
sharedResident: 144,
proportionalResident: 158
}
})
];
});
assert.equal(pmd.mostRecentTotalProportionalResidentSizeInBytes, 158);
assert.equal(pmd.mostRecentTotalPrivateResidentSizeInBytes, 96);
assert.equal(pmd.mostRecentTotalSharedResidentSizeInBytes, 144);
});
test('totalResidentSizeInBytes_twoVmRegions', function() {
var pmd = createFinalizedProcessMemoryDump(42, function(pmd) {
pmd.vmRegions = [
VMRegion.fromDict({
startAddress: 256,
sizeInBytes: 336,
protectionFlags: VMRegion.PROTECTION_FLAG_READ |
VMRegion.PROTECTION_FLAG_WRITE,
mappedFile: '[stack:20310]',
byteStats: {
privateResident: 96,
sharedResident: 144,
proportionalResident: 158
}
}),
VMRegion.fromDict({
startAddress: 848,
sizeInBytes: 592,
protectionFlags: VMRegion.PROTECTION_FLAG_READ |
VMRegion.PROTECTION_FLAG_EXECUTE,
mappedFile: '/dev/ashmem/dalvik',
byteStats: {
privateResident: 205,
sharedResident: 0,
proportionalResident: 205
}
})
];
});
assert.equal(pmd.mostRecentTotalProportionalResidentSizeInBytes, 363);
assert.equal(pmd.mostRecentTotalPrivateResidentSizeInBytes, 301);
assert.equal(pmd.mostRecentTotalSharedResidentSizeInBytes, 144);
});
test('hookUpMostRecentVmRegionsLinks_emptyArray', function() {
var dumps = [];
ProcessMemoryDump.hookUpMostRecentVmRegionsLinks(dumps);
assert.lengthOf(dumps, 0);
});
test('hookUpMostRecentVmRegionsLinks_nonEmptyArray', function() {
var m = new TraceModel();
// A dump with no VM regions or allocator dumps.
var dump1 = createProcessMemoryDump(1, m);
// A dump with VM regions and malloc and Oilpan allocator dumps.
var dump2 = createProcessMemoryDump(2, m);
dump2.vmRegions = [];
dump2.memoryAllocatorDumps = (function() {
var oilpanDump = new MemoryAllocatorDump('oilpan');
oilpanDump.addAttribute('outer_size', new ScalarAttribute('bytes', 1024));
oilpanDump.addAttribute('objects_count',
new ScalarAttribute('objects', 7));
oilpanDump.addAttribute('inner_size', new ScalarAttribute('bytes', 768));
var v8Dump = new MemoryAllocatorDump('v8');
v8Dump.addAttribute('outer_size', new ScalarAttribute('bytes', 2048));
v8Dump.addAttribute('objects_count', new ScalarAttribute('objects', 15));
v8Dump.addAttribute('inner_size', new ScalarAttribute('bytes', 1999));
return [oilpanDump. v8Dump];
})();
// A dump with malloc and V8 allocator dumps.
var dump3 = createProcessMemoryDump(3, m);
dump3.memoryAllocatorDumps = (function() {
var mallocDump = new MemoryAllocatorDump('malloc');
mallocDump.addAttribute('outer_size', new ScalarAttribute('bytes', 1024));
mallocDump.addAttribute('objects_count',
new ScalarAttribute('objects', 7));
mallocDump.addAttribute('inner_size', new ScalarAttribute('bytes', 768));
var v8Dump = new MemoryAllocatorDump('v8');
v8Dump.addAttribute('outer_size', new ScalarAttribute('bytes', 2048));
v8Dump.addAttribute('objects_count', new ScalarAttribute('objects', 15));
v8Dump.addAttribute('inner_size', new ScalarAttribute('bytes', 1999));
return [mallocDump. v8Dump];
})();
// A dump with VM regions.
var dump4 = createProcessMemoryDump(4, m);
dump4.vmRegions = [
VMRegion.fromDict({
startAddress: 256,
sizeInBytes: 336,
protectionFlags: VMRegion.PROTECTION_FLAG_READ |
VMRegion.PROTECTION_FLAG_WRITE,
mappedFile: '[stack:20310]',
byteStats: {
privateResident: 96,
sharedResident: 144,
proportionalResident: 158
}
})
];
var dumps = [dump1, dump2, dump3, dump4];
ProcessMemoryDump.hookUpMostRecentVmRegionsLinks(dumps);
assert.lengthOf(dumps, 4);
assert.equal(dumps[0], dump1);
assert.isUndefined(dump1.mostRecentVmRegions);
assert.equal(dumps[1], dump2);
assert.equal(dump2.mostRecentVmRegions, dump2.vmRegions_);
assert.equal(dumps[2], dump3);
assert.equal(dump3.mostRecentVmRegions, dump2.vmRegions_);
assert.equal(dumps[3], dump4);
assert.equal(dump4.mostRecentVmRegions, dump4.vmRegions_);
});
test('vmRegion_protectionFlagsToString', function() {
checkProtectionFlagsToString(undefined, undefined);
checkProtectionFlagsToString(0, '---');
checkProtectionFlagsToString(VMRegion.PROTECTION_FLAG_READ, 'r--');
checkProtectionFlagsToString(
VMRegion.PROTECTION_FLAG_READ | VMRegion.PROTECTION_FLAG_EXECUTE,
'r-x');
checkProtectionFlagsToString(
VMRegion.PROTECTION_FLAG_READ | VMRegion.PROTECTION_FLAG_WRITE,
'rw-');
});
});
</script>