blob: 821367296b1372eb159c9a95e2957b24280f6735 [file] [log] [blame]
<!DOCTYPE html>
<!--
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.
-->
<link rel="import" href="/base/task.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/timeline_track_view.html">
<link rel="import" href="/extras/importer/trace_event_importer.html">
<script>
'use strict';
tv.b.unittest.testSuite(function() {
var Selection = tv.c.Selection;
var SelectionState = tv.c.trace_model.SelectionState;
var Task = tv.b.Task;
test('instantiate', function() {
var model = new tv.c.TraceModel();
var num_threads = 500;
model.importTraces([], false, false, function() {
var p100 = model.getOrCreateProcess(100);
for (var i = 0; i < num_threads; i++) {
var t = p100.getOrCreateThread(101 + i);
if (i % 2 == 0) {
t.sliceGroup.beginSlice('cat', 'a', 100);
t.sliceGroup.endSlice(110);
} else {
t.sliceGroup.beginSlice('cat', 'b', 50);
t.sliceGroup.endSlice(120);
}
}
});
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
timeline.focusElement = timeline;
timeline.tabIndex = 0;
timeline.style.maxHeight = '600px';
this.addHTMLOutput(timeline);
});
test('addAllEventsMatchingFilterToSelectionAsTask', function() {
var model = new tv.c.TraceModel();
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(1);
t1.sliceGroup.pushSlice(
new tv.c.trace_model.ThreadSlice('', 'a', 0, 1, {}, 3));
t1.sliceGroup.pushSlice(
new tv.c.trace_model.ThreadSlice('', 'b', 0, 1.1, {}, 2.8));
var t1asg = t1.asyncSliceGroup;
t1asg.slices.push(
tv.c.test_utils.newAsyncSliceNamed('a', 0, 1, t1, t1));
t1asg.slices.push(
tv.c.test_utils.newAsyncSliceNamed('b', 1, 2, t1, t1));
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
var expected = [t1asg.slices[0],
t1.sliceGroup.slices[0]];
var result = new tv.c.Selection();
var filterTask = timeline.addAllEventsMatchingFilterToSelectionAsTask(
new tv.c.TitleOrCategoryFilter('a'), result);
Task.RunSynchronously(filterTask);
assert.equal(result.length, 2);
assert.equal(result[0], expected[0]);
assert.equal(result[1], expected[1]);
var expected = [t1asg.slices[1],
t1.sliceGroup.slices[1]];
var result = new tv.c.Selection();
var filterTask = timeline.addAllEventsMatchingFilterToSelectionAsTask(
new tv.c.TitleOrCategoryFilter('b'), result);
Task.RunSynchronously(filterTask);
assert.equal(result.length, 2);
assert.equal(result[0], expected[0]);
assert.equal(result[1], expected[1]);
});
test('emptyThreadsDeleted', function() {
var model = new tv.c.TraceModel();
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(1);
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
assert.isFalse(timeline.hasVisibleContent);
});
test('filteredCounters', function() {
var model = new tv.c.TraceModel();
var c1 = model.kernel.getOrCreateCpu(0);
c1.getOrCreateCounter('', 'b');
var p1 = model.getOrCreateProcess(1);
var ctr = p1.getOrCreateCounter('', 'a');
var series = new tv.c.trace_model.CounterSeries('a', 0);
series.addCounterSample(0, 1);
ctr.addSeries(series);
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
assert.isTrue(timeline.hasVisibleContent);
});
test('filteredCpus', function() {
var model = new tv.c.TraceModel();
var c1 = model.kernel.getOrCreateCpu(1);
c1.getOrCreateCounter('', 'a');
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
assert.isTrue(timeline.hasVisibleContent);
});
test('filteredProcesses', function() {
var model = new tv.c.TraceModel();
var p1 = model.getOrCreateProcess(1);
p1.getOrCreateCounter('', 'a');
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
assert.isTrue(timeline.hasVisibleContent);
});
test('filteredThreads', function() {
var model = new tv.c.TraceModel();
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(2);
t1.sliceGroup.pushSlice(tv.c.test_utils.newSlice(0, 1));
var timeline = new tv.c.TimelineTrackView();
timeline.model = model;
assert.isTrue(timeline.hasVisibleContent);
});
test('interestRange', function() {
var events = [
{name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
{name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
{name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
{name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'},
{name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
{name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'}
];
var model = new tv.c.TraceModel(events);
var trackView = new tv.c.TimelineTrackView();
trackView.model = model;
this.addHTMLOutput(trackView);
var slice = model.processes[52].threads[53].sliceGroup.slices[2];
trackView.viewport.interestRange.setMinAndMax(slice.start, slice.end);
});
test('emptyInterestRange', function() {
var events = [
{name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
{name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
{name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
{name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'},
{name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
{name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'}
];
var model = new tv.c.TraceModel(events);
var trackView = new tv.c.TimelineTrackView();
trackView.model = model;
this.addHTMLOutput(trackView);
trackView.viewport.interestRange.reset();
});
test('thinnestInterestRange', function() {
var events = [
{name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
{name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
{name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
{name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'},
{name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
{name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'}
];
var model = new tv.c.TraceModel(events);
var trackView = new tv.c.TimelineTrackView();
trackView.model = model;
this.addHTMLOutput(trackView);
trackView.viewport.interestRange.reset();
var slice = model.processes[52].threads[53].sliceGroup.slices[2];
trackView.viewport.interestRange.setMinAndMax(slice.start, slice.start);
});
});
</script>