<!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="/base/deep_utils.html">
<link rel="import" href="/core/analysis/memory_dump_overview_pane.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/trace_model/attribute.html">
<link rel="import" href="/core/trace_model/global_memory_dump.html">
<link rel="import" href="/core/trace_model/process_memory_dump.html">
<link rel="import" href="/core/trace_model/trace_model.html">

<script>
'use strict';

tv.b.unittest.testSuite(function() {
  var TraceModel = tv.c.TraceModel;
  var Selection = tv.c.Selection;
  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 VMRegionByteStats = tv.c.trace_model.VMRegionByteStats;
  var ScalarAttribute = tv.c.trace_model.ScalarAttribute;

  function createProcessMemoryDumps() {
    var model = tv.c.test_utils.newModel(function(model) {
      var p1 = model.getOrCreateProcess(1);
      var p2 = model.getOrCreateProcess(2);

      var gmd = new GlobalMemoryDump(model, 42);
      model.globalMemoryDumps.push(gmd);

      // One process with VM regions.
      var pmd1 = new ProcessMemoryDump(gmd, p1, 41);
      p1.memoryDumps.push(pmd1);
      gmd.processMemoryDumps[p1.pid] = pmd1;
      pmd1.vmRegions = [
        VMRegion.fromDict({
            startAddress: 1024,
            sizeInBytes: 20971520, /* 20 MiB */
            protectionFlags: VMRegion.PROTECTION_FLAG_READ,
            mappedFile: '[stack]',
            byteStats: VMRegionByteStats.fromDict({
                privateResident: 8388608, /* 8 MiB */
                sharedResident: 12582912, /* 12 MiB */
                proportionalResident: 10485760 /* 10 MiB */
            })
        })
      ];

      // One process with allocator dumps.
      var pmd2 = new ProcessMemoryDump(gmd, p2, 43);
      p2.memoryDumps.push(pmd2);
      gmd.processMemoryDumps[p2.pid] = pmd2;
      pmd2.memoryAllocatorDumps = (function() {
        var oilpanDump = new MemoryAllocatorDump('oilpan');
        oilpanDump.addAttribute('outer_size',
            new ScalarAttribute('bytes', 2147483648) /* 2 GiB */);
        oilpanDump.addAttribute('inner_size',
            new ScalarAttribute('bytes', 5242880) /* 5 MiB */);
        oilpanDump.addAttribute('objects_count',
            new ScalarAttribute('objects', 2015));

        var v8Dump = new MemoryAllocatorDump('v8');
        v8Dump.addAttribute('outer_size',
            new ScalarAttribute('bytes', 1073741824) /* 1 GiB */);
        v8Dump.addAttribute('inner_size',
            new ScalarAttribute('bytes', 2097152) /* 2 MiB */);
        v8Dump.addAttribute('objects_count',
            new ScalarAttribute('objects', 204));

        return [oilpanDump, v8Dump];
      })();
    });

    return tv.b.dictionaryValues(model.globalMemoryDumps[0].processMemoryDumps);
  }

  test('instantiate', function() {
    var processMemoryDumps = createProcessMemoryDumps();

    var viewEl = document.createElement('tv-c-memory-dump-overview-pane');
    viewEl.processMemoryDumps = processMemoryDumps;
    this.addHTMLOutput(viewEl);

    var table = tv.b.findDeepElementMatching(
        viewEl, 'tracing-analysis-nested-table');

    var rows = table.tableRows;
    var columns = table.tableColumns;
    assert.lengthOf(rows, 2);
    assert.lengthOf(columns, 6);

    var titleColumn = columns[0];
    var proportionalColumn = columns[1];
    var privateColumn = columns[2];
    var sharedColumn = columns[3];
    var oilpanColumn = columns[4];
    var v8Column = columns[5];

    // Check the rows of the table.
    assert.equal(titleColumn.value(rows[0]).label, 'Process 1');
    assert.equal(proportionalColumn.value(rows[0]).numBytes, 10485760);
    assert.equal(privateColumn.value(rows[0]).numBytes, 8388608);
    assert.equal(sharedColumn.value(rows[0]).numBytes, 12582912);
    assert.equal(oilpanColumn.value(rows[0]), '');
    assert.equal(v8Column.value(rows[0]), '');

    assert.equal(titleColumn.value(rows[1]).label, 'Process 2');
    assert.equal(proportionalColumn.value(rows[1]), '');
    assert.equal(privateColumn.value(rows[1]), '');
    assert.equal(sharedColumn.value(rows[1]), '');
    assert.equal(oilpanColumn.value(rows[1]).numBytes, 2147483648);
    assert.equal(v8Column.value(rows[1]).numBytes, 1073741824);
  });

  test('selection', function() {
    var processMemoryDumps = createProcessMemoryDumps();

    var viewEl = document.createElement('tv-c-memory-dump-overview-pane');
    viewEl.processMemoryDumps = processMemoryDumps;
    this.addHTMLOutput(viewEl);

    var didFireSelectedDumpChanged;
    viewEl.addEventListener('selected-memory-dump-changed',
        function(e) {
      didFireSelectedDumpChanged = true;
    });

    var table = tv.b.findDeepElementMatching(
        viewEl, 'tracing-analysis-nested-table');

    // Simulate clicking on the 'oilpan' cell of the second process.
    didFireSelectedDumpChanged = false;
    table.selectedTableRow = table.tableRows[1];
    table.selectedColumnIndex = 4;
    assert.isTrue(didFireSelectedDumpChanged);
    assert.strictEqual(viewEl.selectedMemoryDump,
        processMemoryDumps[1].getMemoryAllocatorDumpByFullName('oilpan'));

    // Simulate clicking on the 'shared_resident' cell of the first process.
    didFireSelectedDumpChanged = false;
    table.selectedColumnIndex = 3;
    assert.isTrue(didFireSelectedDumpChanged);
    assert.isUndefined(viewEl.selectedMemoryDump);
  });
});
</script>
