// Copyright (c) 2013 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.
'use strict';
base.require('tracing.test_utils');
base.require('tracing.analysis.analysis_view');
base.require('tracing.analysis.stub_analysis_results');
base.require('tracing.selection');
base.require('tracing.trace_model');
base.unittest.testSuite('tracing.analysis.analyze_slices', function() {
var Model = tracing.TraceModel;
var Thread = tracing.trace_model.Thread;
var Selection = tracing.Selection;
var AnalysisView = tracing.analysis.AnalysisView;
var StubAnalysisResults = tracing.analysis.StubAnalysisResults;
var newSliceNamed = tracing.test_utils.newSliceNamed;
var newSliceCategory = tracing.test_utils.newSliceCategory;
var createSelectionWithSingleSlice = function(withCategory) {
var model = new Model();
var t53 = model.getOrCreateProcess(52).getOrCreateThread(53);
if (withCategory)
t53.sliceGroup.pushSlice(newSliceCategory('foo', 'b', 0, 0.002));
else
t53.sliceGroup.pushSlice(newSliceNamed('b', 0, 0.002));
var t53track = {};
t53track.thread = t53;
var selection = new Selection();
selection.addSlice(t53track, t53.sliceGroup.slices[0]);
assertEquals(1, selection.length);
return selection;
};
var createSelectionWithTwoSlices = function() {
var model = new Model();
var t53 = model.getOrCreateProcess(52).getOrCreateThread(53);
t53.sliceGroup.pushSlice(newSliceNamed('a', 0.0, 0.04));
t53.sliceGroup.pushSlice(newSliceNamed('aa', 0.120, 0.06));
var t53track = {};
t53track.thread = t53;
var selection = new Selection();
selection.addSlice(t53track, t53.sliceGroup.slices[0]);
selection.addSlice(t53track, t53.sliceGroup.slices[1]);
return selection;
};
var createSelectionWithTwoSlicesSameTitle = function() {
var model = new Model();
var t53 = model.getOrCreateProcess(52).getOrCreateThread(53);
t53.sliceGroup.pushSlice(newSliceNamed('c', 0.0, 0.04));
t53.sliceGroup.pushSlice(newSliceNamed('c', 0.12, 0.06));
var t53track = {};
t53track.thread = t53;
var selection = new Selection();
selection.addSlice(t53track, t53.sliceGroup.slices[0]);
selection.addSlice(t53track, t53.sliceGroup.slices[1]);
return selection;
};
test('instantiate_withSingleSlice', function() {
var selection = createSelectionWithSingleSlice();
var analysisEl = new AnalysisView();
analysisEl.selection = selection;
this.addHTMLOutput(analysisEl);
});
test('instantiate_withSingleSliceCategory', function() {
var selection = createSelectionWithSingleSlice(true);
var analysisEl = new AnalysisView();
analysisEl.selection = selection;
this.addHTMLOutput(analysisEl);
});
test('instantiate_withMultipleSlices', function() {
var selection = createSelectionWithTwoSlices();
var analysisEl = new AnalysisView();
analysisEl.selection = selection;
this.addHTMLOutput(analysisEl);
});
test('instantiate_withMultipleSlicesSameTitle', function() {
var selection = createSelectionWithTwoSlicesSameTitle();
var analysisEl = new AnalysisView();
analysisEl.selection = selection;
this.addHTMLOutput(analysisEl);
});
test('analyzeSelectionWithSingleSlice', function() {
var selection = createSelectionWithSingleSlice();
var results = new StubAnalysisResults();
tracing.analysis.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);
});
test('analyzeSelectionWithSingleSliceCategory', function() {
var selection = createSelectionWithSingleSlice(true);
var results = new StubAnalysisResults();
tracing.analysis.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);
});
test('analyzeSelectionWithTwoSlices', function() {
var selection = createSelectionWithTwoSlices();
var results = new StubAnalysisResults();
tracing.analysis.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);
});
test('analyzeSelectionWithTwoSlicesSameTitle', function() {
var selection = createSelectionWithTwoSlicesSameTitle();
var results = new StubAnalysisResults();
tracing.analysis.analyzeSelection(results, selection);
assertEquals(3, results.tables.length);
var t;
// Table 1.
t = results.tables[0];
assertEquals('Slices:', t.tableHeader);
assertObjectEquals(
{label: 'c',
duration: 0.1,
occurences: 2,
details: {min: 0.04, max: 0.06, avg: 0.05,
avg_stddev: 0.014142135623730947}
},
t.rows[0]);
assertObjectEquals({label: 'Selection start', time: 0}, t.rows[1]);
assertObjectEquals({label: 'Selection extent', time: 0.18}, t.rows[2]);
// Table 2.
var t = results.tables[1];
assertObjectEquals({label: 'Title', text: 'c'}, t.rows[0]);
assertObjectEquals({label: 'Start', time: 0}, t.rows[1]);
assertObjectEquals({label: 'Duration', time: 0.04}, t.rows[2]);
// Table 3.
var t = results.tables[2];
assertObjectEquals({label: 'Title', text: 'c'}, t.rows[0]);
assertObjectEquals({label: 'Start', time: 0.12}, t.rows[1]);
assertObjectEquals({label: 'Duration', time: 0.06}, t.rows[2]);
});
test('instantiate_withSingleSliceContainingIDRef', function() {
var model = new Model();
var p1 = model.getOrCreateProcess(1);
var myObjectSlice = p1.objects.addSnapshot(
'0x1000', 'cat', 'my_object', 0);
var t1 = p1.getOrCreateThread(1);
t1.sliceGroup.pushSlice(newSliceCategory('cat', 'b', 0, 2));
t1.sliceGroup.slices[0].args.my_object = myObjectSlice;
var t1track = {};
t1track.thread = t1;
var selection = new Selection();
selection.addSlice(t1track, t1.sliceGroup.slices[0]);
assertEquals(1, selection.length);
var analysisEl = new AnalysisView();
analysisEl.selection = selection;
this.addHTMLOutput(analysisEl);
});
});