166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved. 266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be 366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file. 466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict'; 666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tcmalloc.heap'); 866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.unittest.testSuite('tcmalloc.heap', function() { 1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var HeapSnapshot = tcmalloc.HeapSnapshot; 1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Tests total allocation count. 1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis test('totals', function() { 1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var snapshot = new HeapSnapshot({}, 1, [ 1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis { 1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_allocs': 10, 1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_allocs': 100, 1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_bytes': 10000, 1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'trace': '', 2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_bytes': 100000 2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis { 2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_allocs': 2, 2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_allocs': 22, 2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_bytes': 200, 2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'trace': 'TestObject::TestMethod ', 2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_bytes': 2200 2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ]); 3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis snapshot.preInitialize(); 3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis snapshot.initialize(); 3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Base class got the timestamp. 3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(1, snapshot.ts); 3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // The first entry in the list is for totals. 3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(10, snapshot.total_.currentAllocs); 3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(10000, snapshot.total_.currentBytes); 3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }); 4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Tests multi-level trace stacks. 4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis test('multiLevel', function() { 4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var snapshot = new HeapSnapshot({}, 1, [ 4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis { 4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_allocs': 10, 4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_allocs': 100, 4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_bytes': 10000, 4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'trace': '', 4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_bytes': 100000 5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis { 5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_allocs': 2, 5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_allocs': 22, 5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_bytes': 200, 5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'trace': 'TestObject::TestMethod ', 5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_bytes': 2200 5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis { 5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_allocs': 3, 6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_allocs': 33, 6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_bytes': 300, 6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'trace': 'TestObject2::TestMethod2 ', 6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_bytes': 3300 6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis { 6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_allocs': 5, 6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_allocs': 55, 6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'current_bytes': 500, 6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'trace': 'TestObject2::TestMethod2 TestObject3::TestMethod3 ', 7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 'total_bytes': 5500 7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ]); 7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis snapshot.preInitialize(); 7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis snapshot.initialize(); 7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Our heap has two top-level stacks. 7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var heap = snapshot.heap_; 7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var childKeys = Object.keys(heap.children); 7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(2, childKeys.length); 8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Both methods exist as children. 8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotEquals(-1, childKeys.indexOf('TestObject::TestMethod')); 8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotEquals(-1, childKeys.indexOf('TestObject2::TestMethod2')); 8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Verify the first trace entry stack. 8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var trace = heap.children['TestObject::TestMethod']; 8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(2, trace.currentAllocs); 8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(200, trace.currentBytes); 8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // One child for "(here)". 8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(1, Object.keys(trace.children).length); 9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotNull(trace.children['(here)']); 9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Verify the second trace entry stack. 9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis trace = heap.children['TestObject2::TestMethod2']; 9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Memory should have summed up. 9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(8, trace.currentAllocs); 9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(800, trace.currentBytes); 9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis // Two children, "(here)" and another stack. 9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(2, Object.keys(trace.children).length); 9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotNull(trace.children['TestObject3::TestMethod3']); 10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertNotNull(trace.children['(here)']); 10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis trace = trace.children['TestObject3::TestMethod3']; 10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(5, trace.currentAllocs); 10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(500, trace.currentBytes); 10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis assertEquals(1, Object.keys(trace.children).length); 10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }); 10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}); 108