<!DOCTYPE HTML>
<html>
<!--
Copyright (c) 2012 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.
-->
<head i18n-values="dir:textdirection;">
<title>TimelineAnalysisView tests</title>
<script src="base.js"></script>
<style>
  .view {
    border: 1px solid black;
    margin: 10px;
  }
  .find-dialog {
    border: 1px solid black;
    margin: 10px;
  }
</style>
</head>
<body>
  <script>
    base.require('unittest');
    base.require('tracing_controller');
    base.require('test_utils');
    base.require('model');
    base.require('importer.trace_event_importer');
    base.require('timeline_analysis_view');
    base.require('filter');
    base.require('tracks.counter_track');
    base.require('tracks.slice_track');
    base.require('tracks.thread_track');
    base.require('timeline_track_view'); /* TODO(nduca): reduce dependency */
  </script>
  <script>
    'use strict';

    var Counter = tracing.model.Counter;
    var Thread = tracing.model.Thread;
    var AnalysisView = tracing.TimelineAnalysisView;
    var Model = tracing.Model;
    var ThreadTrack = tracing.tracks.ThreadTrack;
    var Selection = tracing.Selection;
    var TitleFilter = tracing.TitleFilter;
    var CounterTrack = tracing.tracks.CounterTrack;
    var SliceTrack = tracing.tracks.SliceTrack;
    var newSliceNamed = test_utils.newSliceNamed;
    var newSliceCategory = test_utils.newSliceCategory;

    function createSelectionWithSingleSlice(withCategory) {
      var model = new Model();
      var t53 = model.getOrCreateProcess(52).getOrCreateThread(53);
      if (withCategory)
        t53.pushSlice(newSliceCategory('foo', 'b', 0, 0.002));
      else
        t53.pushSlice(newSliceNamed('b', 0, 0.002));

      var t53track = new ThreadTrack();
      t53track.thread = t53;

      var selection = new Selection();
      t53track.addAllObjectsMatchingFilterToSelection(
        new TitleFilter('b'), selection);
      assertEquals(1, selection.length);

      return selection;
    }

    function createSelectionWithTwoSlices() {
      var events = [
        {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
        {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
        {name: 'aa', args: {}, pid: 52, ts: 640, cat: 'foo', tid: 53, ph: 'B'},
        {name: 'aa', args: {}, pid: 52, ts: 700, cat: 'foo', tid: 53, ph: 'E'}
      ];
      var model = new Model(events);

      var t53track = new ThreadTrack();
      t53track.thread = model.processes[52].threads[53];

      var selection = new Selection();
      t53track.addAllObjectsMatchingFilterToSelection(
        new TitleFilter('a'), selection);
      assertEquals(2, selection.length);

      return selection;
    }

    function createSelectionWithTwoSlicesSameTitle() {
      var events = [
        {name: 'c', args: {}, pid: 52, ts: 620, cat: 'foo', tid: 53, ph: 'B'},
        {name: 'c', args: {}, pid: 52, ts: 660, cat: 'foo', tid: 53, ph: 'E'},
        {name: 'c', args: {}, pid: 52, ts: 740, cat: 'foo', tid: 53, ph: 'B'},
        {name: 'c', args: {}, pid: 52, ts: 800, cat: 'foo', tid: 53, ph: 'E'}
      ];
      var model = new Model(events);

      var t53track = new ThreadTrack();
      t53track.thread = model.processes[52].threads[53];

      var selection = new Selection();
      t53track.addAllObjectsMatchingFilterToSelection(
        new TitleFilter('c'), selection);
      assertEquals(2, selection.length);

      return selection;
    }

    function createSelectionWithCounters(numSamples) {
      if (numSamples > 2 || numSamples < 1)
        throw new Error('This function only supports 1 or 2 samples');
      var events = [
        {name: 'ctr', args: {'value': 0}, pid: 1, ts: 0, cat: 'foo', tid: 1,
         ph: 'C', id: 0},
        {name: 'ctr', args: {'value': 10}, pid: 1, ts: 10, cat: 'foo', tid: 1,
         ph: 'C', id: 0}
      ];
      var model = new Model(events);
      var p = model.processes[1];
      var ctr = model.processes[1].counters['foo.ctr[0]'];
      assertEquals('ctr[0]', ctr.name);
      assertEquals(2, ctr.numSamples);
      assertEquals(1, ctr.numSeries);
      assertArrayEquals([0, 0.01], ctr.timestamps);
      assertArrayEquals([0, 10], ctr.samples);

      var selection = new Selection();
      var t1track = new ThreadTrack();
      selection.addCounterSample(t1track, ctr, 1);

      if (numSamples == 1)
        return selection;

      selection.addCounterSample(t1track, ctr, 0);
      return selection;
    }

    function createSelectionWithTwoSeriesSingleCounter() {
      var events = [
        {name: 'ctr', args: {'bytesallocated': 0, 'bytesfree': 25}, pid: 1,
         ts: 0, cat: 'foo', tid: 1, ph: 'C', id: 0},
        {name: 'ctr', args: {'bytesallocated': 10, 'bytesfree': 15}, pid: 1,
         ts: 10, cat: 'foo', tid: 1, ph: 'C', id: 0},
        {name: 'ctr', args: {'bytesallocated': 20, 'bytesfree': 5}, pid: 1,
         ts: 20, cat: 'foo', tid: 1, ph: 'C', id: 0}
      ];
      var model = new Model(events);
      var p = model.processes[1];
      var ctr = model.processes[1].counters['foo.ctr[0]'];
      assertEquals('ctr[0]', ctr.name);
      assertEquals(3, ctr.numSamples);
      assertEquals(2, ctr.numSeries);

      var selection = new Selection();
      var t1track = new ThreadTrack();
      selection.addCounterSample(t1track, ctr, 1);

      return selection;
    }

    function createSelectionWithTwoSeriesTwoCounters() {
      var ctr1 = new Counter(null, 0, '', 'ctr1');
      ctr1.seriesNames.push('bytesallocated', 'bytesfree');
      ctr1.seriesColors.push(0, 1);
      ctr1.timestamps.push(0, 10, 20);
      ctr1.samples.push(0, 25, 10, 15, 20, 5);

      var ctr2 = new Counter(null, 0, '', 'ctr2');
      ctr2.seriesNames.push('bytesallocated', 'bytesfree');
      ctr2.seriesColors.push(0, 1);
      ctr2.timestamps.push(0, 10, 20);
      ctr2.samples.push(0, 25, 10, 15, 20, 5);

      var selection = new Selection();
      var t1track = new ThreadTrack();
      selection.addCounterSample(t1track, ctr1, 1);
      selection.addCounterSample(t1track, ctr2, 2);

      return selection;
    }

    function createSelectionWithTwoCountersDiffSeriesDiffHits() {
      var ctr1 = new Counter(null, 0, '', 'a');
      ctr1.seriesNames.push('bytesallocated');
      ctr1.seriesColors.push(0);
      ctr1.timestamps.push(0, 10, 20);
      ctr1.samples.push(0, 25, 10);
      assertEquals('a', ctr1.name);
      assertEquals(3, ctr1.numSamples);
      assertEquals(1, ctr1.numSeries);

      var ctr2 = new Counter(null, 0, '', 'b');
      ctr2.seriesNames.push('bytesallocated', 'bytesfree');
      ctr2.seriesColors.push(0, 1);
      ctr2.timestamps.push(0, 10, 20, 30);
      ctr2.samples.push(0, 25, 10, 15, 20, 5, 25, 0);
      assertEquals('b', ctr2.name);
      assertEquals(4, ctr2.numSamples);
      assertEquals(2, ctr2.numSeries);

      var selection = new Selection();
      var t1track = new ThreadTrack();
      selection.addCounterSample(t1track, ctr1, 1);
      selection.addCounterSample(t1track, ctr2, 2);

      return selection;
    }

    function createSelectionWithSingleSliceSingleCounter() {
      var model = new Model();
      var thread = model.getOrCreateProcess(1).getOrCreateThread(1);
      thread.pushSlice(newSliceNamed('b', 1, 5));

      var ctr1 = model.getOrCreateProcess(1).getOrCreateCounter('cat', 'ctr1');
      ctr1.seriesNames.push('bytesallocated', 'bytesfree');
      ctr1.seriesColors.push(0, 1);
      ctr1.timestamps.push(0, 10, 20);
      ctr1.samples.push(0, 25, 10, 15, 20, 5);
      assertEquals('ctr1', ctr1.name);
      assertEquals(3, ctr1.numSamples);
      assertEquals(2, ctr1.numSeries);

      var ctr1track = new CounterTrack();
      ctr1track.counter = ctr1;

      var threadTrack = new SliceTrack();
      threadTrack.slices = thread.slices;

      var selection = new Selection();
      selection.addCounterSample(ctr1track, ctr1, 1);
      threadTrack.addAllObjectsMatchingFilterToSelection(
        new TitleFilter('b'), selection);
      assertEquals(2, selection.length);
      return selection;
    }

    function createSelectionWithNormallyDistributedSamples(numSlices) {
      // Distance between start times is normally distributed, with mu = 16ms
      // and sigma = 3ms.
      var startTimes = [
        0, 18.4362262859, 32.5378088645, 44.8978868054,
        63.4772725504, 77.438888345, 92.0102867913, 99.6208686689,
        119.150576393, 137.54545468, 153.991587743, 175.456095568,
        193.395772651, 205.691644582, 218.740054982, 239.308480724,
        250.880949151, 268.528689601, 281.950478133, 296.791635722,
        315.862427391, 333.954888221, 342.392899581, 362.364373939,
        377.593380892, 392.296896748, 415.779941407, 435.517713864,
        454.581222491, 470.329018858, 488.37029095, 502.283017166,
        521.15141113, 534.36224697, 554.425018316, 574.89913248,
        589.60294439, 604.780562233, 615.481610668, 630.055628965,
        645.908449096, 661.776084055, 673.276049017, 689.776401428,
        704.440135004, 716.33262401, 732.380086528, 743.970715322,
        756.506690025, 772.391485532, 794.636984401, 803.801415494,
        819.006502926, 837.610127549, 854.551103283, 875.170613672,
        891.508235124, 905.263299017, 929.309555683, 943.417968804,
        957.289319239, 972.302910569, 986.669355637, 1002.71558868,
        1013.83359637, 1030.16840733, 1040.39503139, 1057.61583325,
        1075.64709686, 1086.67671319, 1100.4617455, 1118.4871842,
        1129.98143488, 1144.52318588, 1160.36966285, 1179.50049042,
        1195.03088169, 1215.98199401, 1226.66591838, 1245.83650314,
        1268.18058265, 1285.11047342, 1301.71570575, 1316.40723345,
        1329.94342488, 1343.7569577, 1358.28267513, 1371.17560308,
        1386.42247119, 1401.51767749, 1417.52489051, 1440.98712348,
        1457.80113781, 1475.66079406, 1494.64137536, 1509.52941903,
        1524.54762552, 1545.42960714, 1565.19444597, 1580.56308936,
        1596.72211651];

      var durations = [
        1.56308936, 1.4362262859, 1.5378088645, 1.8978868054,
        1.4772725504, 1.438888345, 1.0102867913, 1.6208686689,
        1.150576393, 1.54545468, 1.991587743, 1.456095568,
        1.395772651, 1.691644582, 1.740054982, 1.308480724,
        1.880949151, 1.528689601, 1.950478133, 1.791635722,
        1.862427391, 1.954888221, 1.392899581, 1.364373939,
        1.593380892, 1.296896748, 1.779941407, 1.517713864,
        1.581222491, 1.329018858, 1.37029095, 1.283017166,
        1.15141113, 1.36224697, 1.425018316, 1.89913248,
        1.60294439, 1.780562233, 1.481610668, 1.055628965,
        1.908449096, 1.776084055, 1.276049017, 1.776401428,
        1.440135004, 1.33262401, 1.380086528, 1.970715322,
        1.506690025, 1.391485532, 1.636984401, 1.801415494,
        1.006502926, 1.610127549, 1.551103283, 1.170613672,
        1.508235124, 1.263299017, 1.309555683, 1.417968804,
        1.289319239, 1.302910569, 1.669355637, 1.71558868,
        1.83359637, 1.16840733, 1.39503139, 1.61583325,
        1.64709686, 1.67671319, 1.4617455, 1.4871842,
        1.98143488, 1.52318588, 1.36966285, 1.50049042,
        1.03088169, 1.98199401, 1.66591838, 1.83650314,
        1.18058265, 1.11047342, 1.71570575, 1.40723345,
        1.94342488, 1.7569577, 1.28267513, 1.17560308,
        1.42247119, 1.51767749, 1.52489051, 1.98712348,
        1.80113781, 1.66079406, 1.64137536, 1.52941903,
        1.54762552, 1.42960714, 1.19444597, 1.56308936,
        1.72211651];

      var events = [];

      var model = new Model();
      var thread = model.getOrCreateProcess(52).getOrCreateThread(53);

      for (var i = 0; i < startTimes.length; ++i) {
        for (var j = 0; j < numSlices; ++j) {
          var name = 'slice' + String(numSlices - 1 - j);
          thread.slices.push(newSliceNamed(name, startTimes[i], durations[i]));
        }
      }

      var t53track = new ThreadTrack();
      t53track.thread = model.processes[52].threads[53];

      var selection = new Selection();
      t53track.addAllObjectsMatchingFilterToSelection(
        new TitleFilter('slice'), selection);
      assertEquals(101 * numSlices, selection.length);

      return selection;
    }

    function testAnalysisViewWithSingleSlice() {
      var selection = createSelectionWithSingleSlice();

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testAnalysisViewWithSingleSliceCategory() {
      var selection = createSelectionWithSingleSlice(true);

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testAnalysisViewWithMultipleSlices() {
      var selection = createSelectionWithTwoSlices();

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testAnalysisViewWithMultipleSlicesSameTitle() {
      var selection = createSelectionWithTwoSlicesSameTitle();

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testAnalysisViewWithSingleCounterWithTwoSeries() {
      var selection = createSelectionWithTwoSeriesSingleCounter();

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testAnalysisViewWithTwoCountersWithTwoSeries() {
      var selection = createSelectionWithTwoSeriesTwoCounters();

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testAnalysisViewWithSingleSliceSingleCounter() {
      var selection = createSelectionWithSingleSliceSingleCounter();

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function testSelectionWithNormallyDistributedSamples() {
      var numSlices = 1;
      var selection = createSelectionWithNormallyDistributedSamples(numSlices);

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
    }

    function StubAnalysisResults() {
      this.tables = [];
    }
    StubAnalysisResults.prototype = {
      __proto__: Object.protoype,

      appendTable: function(parent, className) {
        var table = {
          className: className,
          rows: []
        };
        table.className = className;
        this.tables.push(table);
        return table;
      },

      appendTableHeader: function(table, label) {
        if (table.tableHeader)
          throw new Error('Only one summary header allowed.');
        table.tableHeader = label;
      },

      appendSummaryRow: function(table, label, opt_text) {
        table.rows.push({label: label,
                         text: opt_text});
      },

      appendSpacingRow: function(table) {
        table.rows.push({spacing: true});
      },

      appendSummaryRowTime: function(table, label, time) {
        table.rows.push({label: label,
                         time: time});
      },

      appendDataRow: function(table, label, duration, occurences, details) {
        table.rows.push({label: label,
                         duration: duration,
                         occurences: occurences,
                         details: details});
      }
    };

    function testAnalyzeSelectionWithSingleSlice() {
      var selection = createSelectionWithSingleSlice();

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];
      assertEquals('Selected slice:', table.tableHeader);
      assertEquals(3, table.rows.length);

      assertEquals('b', table.rows[0].text);
      assertEquals(0, table.rows[1].time);
      assertAlmostEquals(0.002, table.rows[2].time);
    }

    function testAnalyzeSelectionWithFalsyArgs() {
      var model = new Model();
      var t53 = model.getOrCreateProcess(52).getOrCreateThread(53);
      var slice = newSliceNamed('b', 0, 0.002);
      slice.args.bar = 0;
      slice.args.foo = false;
      t53.pushSlice(slice);
      var t53track = new ThreadTrack();
      t53track.thread = t53;
      var selection = new Selection();
      t53track.addAllObjectsMatchingFilterToSelection(
        new TitleFilter('b'), selection);
      assertEquals(1, selection.length);

      var analysisEl = new AnalysisView();
      analysisEl.selection = selection;
      this.addHTMLOutput(undefined, analysisEl);
      var rows = analysisEl.querySelectorAll('tr');
      assertEquals(rows.length, 7);
      assertEquals(' bar', rows[5].children[0].textContent);
      assertEquals('0', rows[5].children[1].textContent);
      assertEquals(' foo', rows[6].children[0].textContent);
      assertEquals('false', rows[6].children[1].textContent);
    }

    function testAnalyzeSelectionWithSingleSliceCategory() {
      var selection = createSelectionWithSingleSlice(true);

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];
      assertEquals('Selected slice:', table.tableHeader);
      assertEquals(4, table.rows.length);

      assertEquals('b', table.rows[0].text);
      assertEquals('foo', table.rows[1].text);
      assertEquals(0, table.rows[2].time);
      assertAlmostEquals(0.002, table.rows[3].time);
    }

    function testAnalyzeSelectionWithTwoSlices() {
      var selection = createSelectionWithTwoSlices();

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];
      assertEquals('Slices:', table.tableHeader);
      assertEquals(6, table.rows.length);

      assertEquals('a', table.rows[0].label);
      assertEquals(1, table.rows[0].occurences);
      assertAlmostEquals(0.04, table.rows[0].duration);
      assertEquals('aa', table.rows[1].label);
      assertEquals(1, table.rows[1].occurences);
      assertAlmostEquals(0.06, table.rows[1].duration);
      assertEquals('*Totals', table.rows[2].label);
      assertEquals(2, table.rows[2].occurences);
      assertAlmostEquals(0.1, table.rows[2].duration);

      assertEquals('Selection start', table.rows[4].label);
      assertAlmostEquals(0, table.rows[4].time);

      assertEquals('Selection extent', table.rows[5].label);
      assertAlmostEquals(0.18, table.rows[5].time);
    }

    function testAnalyzeSelectionWithTwoSlicesSameTitle() {
      var selection = createSelectionWithTwoSlicesSameTitle();

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];

      assertEquals('Slices:', table.tableHeader);
      assertEquals(5, table.rows.length);

      assertEquals('c', table.rows[0].label);
      assertEquals('2', table.rows[0].occurences);
      assertAlmostEquals(0.04, table.rows[0].details.min);
      assertAlmostEquals(0.05, table.rows[0].details.avg);
      assertAlmostEquals(0.06, table.rows[0].details.max);
      assertAlmostEquals(0.1, table.rows[0].duration);
      assertEquals('*Totals', table.rows[1].label);
      assertAlmostEquals(0.1, table.rows[1].duration);
      assertEquals('Selection start', table.rows[3].label);
      assertAlmostEquals(0, table.rows[3].time);
      assertEquals('Selection extent', table.rows[4].label);
      assertAlmostEquals(0.18, table.rows[4].time);
    }

    function testAnalyzeSelectionWithSingleCounter() {
      var selection = createSelectionWithCounters(1);

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];
      assertEquals('Selected counter:', table.tableHeader);
      assertEquals(3, table.rows.length);

      assertEquals('Title', table.rows[0].label);
      assertEquals('Timestamp', table.rows[1].label);
      assertEquals('value', table.rows[2].label);
      assertEquals(10, table.rows[2].text);
    }

    function testAnalyzeSelectionWithBasicTwoSeriesTwoCounters() {
      var selection = createSelectionWithTwoSeriesTwoCounters();

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];
      assertEquals('Counters:', table.tableHeader);
      assertEquals(4, table.rows.length);

      assertEquals('ctr1: bytesallocated', table.rows[0].label);
      assertEquals('ctr1: bytesfree', table.rows[1].label);
      assertEquals('ctr2: bytesallocated', table.rows[2].label);
      assertEquals('ctr2: bytesfree', table.rows[3].label);
    }

    function testAnalyzeSelectionWithComplexSeriesTwoCounters() {
      var selection = createSelectionWithTwoCountersDiffSeriesDiffHits();

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);
      var table = results.tables[0];
      assertEquals('Counters:', table.tableHeader);
      assertEquals(3, table.rows.length);

      assertEquals('a: bytesallocated', table.rows[0].label);
      assertEquals('b: bytesallocated', table.rows[1].label);
      assertEquals('b: bytesfree', table.rows[2].label);
    }

    function testAnalyzeSelectionWithCounterAndSlices() {
      var selection = createSelectionWithSingleSliceSingleCounter();

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(2, results.tables.length);
      var sliceTable = results.tables[0];
      var counterTable = results.tables[1];

      assertEquals('Selected slice:', sliceTable.tableHeader);
      assertEquals(3, sliceTable.rows.length);

      assertEquals('Selected counter:', counterTable.tableHeader);
      assertEquals(4, counterTable.rows.length);
    }

    function testAnalyzeSelectionWithNormallyDistributedSamples() {
      var numSlices = 2;
      var selection = createSelectionWithNormallyDistributedSamples(numSlices);

      var results = new StubAnalysisResults();
      tracing.analyzeSelection_(results, selection);
      assertEquals(1, results.tables.length);

      assertEquals('slice0', results.tables[0].rows[0].label);
      assertEquals(
          63, Math.round(results.tables[0].rows[0].details.frequency));
      assertEquals(
          16, Math.round(results.tables[0].rows[0].details.frequency_stddev));
      assertEquals(
          250, Math.round(results.tables[0].rows[0].details.avg_stddev * 1000));


      assertEquals('slice1', results.tables[0].rows[1].label);
      assertEquals(
          63, Math.round(results.tables[0].rows[1].details.frequency));
      assertEquals(
          16, Math.round(results.tables[0].rows[1].details.frequency_stddev));
      assertEquals(
          250, Math.round(results.tables[0].rows[1].details.avg_stddev * 1000));
    }
  </script>
</body>
</html>
