<!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="/tracing/base/unit.html">
<link rel="import" href="/tracing/model/container_memory_dump.html">
<link rel="import" href="/tracing/model/memory_allocator_dump.html">
<link rel="import" href="/tracing/model/memory_dump_test_utils.html">
<link rel="import" href="/tracing/value/numeric.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var ContainerMemoryDump = tr.model.ContainerMemoryDump;
  var MemoryAllocatorDump = tr.model.MemoryAllocatorDump;
  var ScalarNumeric = tr.v.ScalarNumeric;
  var unitlessNumber_smallerIsBetter =
      tr.b.Unit.byName.unitlessNumber_smallerIsBetter;
  var newAllocatorDump = tr.model.MemoryDumpTestUtils.newAllocatorDump;
  var addChildDump = tr.model.MemoryDumpTestUtils.addChildDump;

  test('memoryAllocatorDumps_undefined', function() {
    var md = new ContainerMemoryDump(42);

    assert.isUndefined(md.memoryAllocatorDumps);
    assert.isUndefined(md.getMemoryAllocatorDumpByFullName('malloc'));
  });

  test('memoryAllocatorDumps_zero', function() {
    var md = new ContainerMemoryDump(42);
    md.memoryAllocatorDumps = [];

    assert.lengthOf(md.memoryAllocatorDumps, 0);
    assert.isUndefined(md.getMemoryAllocatorDumpByFullName('malloc'));
  });

  test('memoryAllocatorDumps_flat', function() {
    var md = new ContainerMemoryDump(42);

    var oilpanDump = newAllocatorDump(md, 'oilpan', {
      size: 1024,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 7),
      inner_size: 768
    });
    var v8Dump = newAllocatorDump(md, 'v8', {
      size: 2048,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 15),
      inner_size: 1999
    });
    md.memoryAllocatorDumps = [oilpanDump, v8Dump];

    assert.lengthOf(md.memoryAllocatorDumps, 2);
    assert.equal(md.memoryAllocatorDumps[0], oilpanDump);
    assert.equal(md.memoryAllocatorDumps[1], v8Dump);

    assert.equal(md.getMemoryAllocatorDumpByFullName('oilpan'), oilpanDump);
    assert.equal(md.getMemoryAllocatorDumpByFullName('v8'), v8Dump);
    assert.isUndefined(md.getMemoryAllocatorDumpByFullName('malloc'));
  });

  test('memoryAllocatorDumps_nested', function() {
    var md = new ContainerMemoryDump(42);

    var oilpanDump = newAllocatorDump(md, 'oilpan', {
      size: 1024,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 7),
      inner_size: 768
    });

    var oilpanBucket1Dump = addChildDump(oilpanDump, 'bucket1', {
      size: 512,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 3),
      inner_size: 256
    });

    var oilpanBucket2Dump = addChildDump(oilpanDump, 'bucket2', {
      size: 512,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 4),
      inner_size: 512
    });

    var oilpanBucket2StringsDump = addChildDump(oilpanBucket2Dump, 'strings', {
      size: 512,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 4),
      inner_size: 512
    });

    var v8Dump = newAllocatorDump(md, 'v8', {
      size: 2048,
      objects_count: new ScalarNumeric(unitlessNumber_smallerIsBetter, 15),
      inner_size: 1999
    });

    md.memoryAllocatorDumps = [oilpanDump, v8Dump];

    assert.lengthOf(md.memoryAllocatorDumps, 2);
    assert.equal(md.memoryAllocatorDumps[0], oilpanDump);
    assert.equal(md.memoryAllocatorDumps[1], v8Dump);

    assert.equal(md.getMemoryAllocatorDumpByFullName('oilpan'), oilpanDump);
    assert.equal(md.getMemoryAllocatorDumpByFullName('oilpan/bucket1'),
        oilpanBucket1Dump);
    assert.equal(md.getMemoryAllocatorDumpByFullName('oilpan/bucket2'),
        oilpanBucket2Dump);
    assert.equal(md.getMemoryAllocatorDumpByFullName('oilpan/bucket2/strings'),
        oilpanBucket2StringsDump);
    assert.equal(md.getMemoryAllocatorDumpByFullName('v8'), v8Dump);
    assert.isUndefined(md.getMemoryAllocatorDumpByFullName('malloc'));
  });

  test('iterateRootAllocatorDumps', function() {
    var containerDump = new ContainerMemoryDump(42);

    var oilpanDump = new MemoryAllocatorDump(containerDump, 'oilpan');
    var v8Dump = new MemoryAllocatorDump(containerDump, 'v8');
    addChildDump(v8Dump, 'heaps');

    containerDump.memoryAllocatorDumps = [oilpanDump, v8Dump];

    var visitedAllocatorDumps = [];
    containerDump.iterateRootAllocatorDumps(
        function(dump) { this.visitedAllocatorDumps.push(dump); },
        { visitedAllocatorDumps: visitedAllocatorDumps });
    assert.sameMembers(visitedAllocatorDumps, [oilpanDump, v8Dump]);
  });

  test('forceRebuildingMemoryAllocatorDumpByFullNameIndex', function() {
    var containerDump = new ContainerMemoryDump(42);

    var v8Dump = new MemoryAllocatorDump(containerDump, 'v8');
    var v8HeapsDump = addChildDump(v8Dump, 'heaps');
    var v8HeapSmallDump = addChildDump(v8HeapsDump, 'S');

    // Setting the memory allocator dumps should update the index properly.
    containerDump.memoryAllocatorDumps = [v8Dump];
    assert.strictEqual(
        containerDump.getMemoryAllocatorDumpByFullName('v8'), v8Dump);
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps'), v8HeapsDump);
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps/S'), v8HeapSmallDump);

    // Add a second grandchild (v8/heaps/L).
    var v8HeapLargeDump = addChildDump(v8HeapsDump, 'L');

    // Setting the memory allocator dumps again should update the index
    // properly again.
    containerDump.memoryAllocatorDumps = [v8Dump];
    assert.strictEqual(
        containerDump.getMemoryAllocatorDumpByFullName('v8'), v8Dump);
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps'), v8HeapsDump);
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps/S'), v8HeapSmallDump);
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps/L'), v8HeapLargeDump);

    // Remove the first grandchild (v8/heaps/S).
    v8HeapsDump.children.splice(0, 1);

    // Force rebuilding the index and check that it was updated properly.
    containerDump.forceRebuildingMemoryAllocatorDumpByFullNameIndex();
    assert.strictEqual(
        containerDump.getMemoryAllocatorDumpByFullName('v8'), v8Dump);
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps'), v8HeapsDump);
    assert.isUndefined(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps/S'));
    assert.strictEqual(containerDump.getMemoryAllocatorDumpByFullName(
        'v8/heaps/L'), v8HeapLargeDump);
  });
});
</script>
