| // Copyright (c) 2013 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. |
| |
| 'use strict'; |
| |
| base.require('tcmalloc.heap'); |
| |
| base.unittest.testSuite('tcmalloc.heap', function() { |
| var HeapSnapshot = tcmalloc.HeapSnapshot; |
| |
| // Tests total allocation count. |
| test('totals', function() { |
| var snapshot = new HeapSnapshot({}, 1, [ |
| { |
| 'current_allocs': 10, |
| 'total_allocs': 100, |
| 'current_bytes': 10000, |
| 'trace': '', |
| 'total_bytes': 100000 |
| }, |
| { |
| 'current_allocs': 2, |
| 'total_allocs': 22, |
| 'current_bytes': 200, |
| 'trace': 'TestObject::TestMethod ', |
| 'total_bytes': 2200 |
| } |
| ]); |
| snapshot.preInitialize(); |
| snapshot.initialize(); |
| |
| // Base class got the timestamp. |
| assertEquals(1, snapshot.ts); |
| |
| // The first entry in the list is for totals. |
| assertEquals(10, snapshot.total_.currentAllocs); |
| assertEquals(10000, snapshot.total_.currentBytes); |
| }); |
| |
| // Tests multi-level trace stacks. |
| test('multiLevel', function() { |
| var snapshot = new HeapSnapshot({}, 1, [ |
| { |
| 'current_allocs': 10, |
| 'total_allocs': 100, |
| 'current_bytes': 10000, |
| 'trace': '', |
| 'total_bytes': 100000 |
| }, |
| { |
| 'current_allocs': 2, |
| 'total_allocs': 22, |
| 'current_bytes': 200, |
| 'trace': 'TestObject::TestMethod ', |
| 'total_bytes': 2200 |
| }, |
| { |
| 'current_allocs': 3, |
| 'total_allocs': 33, |
| 'current_bytes': 300, |
| 'trace': 'TestObject2::TestMethod2 ', |
| 'total_bytes': 3300 |
| }, |
| { |
| 'current_allocs': 5, |
| 'total_allocs': 55, |
| 'current_bytes': 500, |
| 'trace': 'TestObject2::TestMethod2 TestObject3::TestMethod3 ', |
| 'total_bytes': 5500 |
| } |
| ]); |
| snapshot.preInitialize(); |
| snapshot.initialize(); |
| |
| // Our heap has two top-level stacks. |
| var heap = snapshot.heap_; |
| var childKeys = Object.keys(heap.children); |
| assertEquals(2, childKeys.length); |
| // Both methods exist as children. |
| assertNotEquals(-1, childKeys.indexOf('TestObject::TestMethod')); |
| assertNotEquals(-1, childKeys.indexOf('TestObject2::TestMethod2')); |
| |
| // Verify the first trace entry stack. |
| var trace = heap.children['TestObject::TestMethod']; |
| assertEquals(2, trace.currentAllocs); |
| assertEquals(200, trace.currentBytes); |
| // One child for "(here)". |
| assertEquals(1, Object.keys(trace.children).length); |
| assertNotNull(trace.children['(here)']); |
| |
| // Verify the second trace entry stack. |
| trace = heap.children['TestObject2::TestMethod2']; |
| // Memory should have summed up. |
| assertEquals(8, trace.currentAllocs); |
| assertEquals(800, trace.currentBytes); |
| // Two children, "(here)" and another stack. |
| assertEquals(2, Object.keys(trace.children).length); |
| assertNotNull(trace.children['TestObject3::TestMethod3']); |
| assertNotNull(trace.children['(here)']); |
| |
| trace = trace.children['TestObject3::TestMethod3']; |
| assertEquals(5, trace.currentAllocs); |
| assertEquals(500, trace.currentBytes); |
| assertEquals(1, Object.keys(trace.children).length); |
| }); |
| }); |