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