1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7base.require('tracing.test_utils');
8base.require('tracing.timeline_track_view');
9base.require('tracing.importer.trace_event_importer');
10
11base.unittest.testSuite('tracing.timeline_track_view', function() {
12  var NoCountersFilter = function() {
13  };
14
15  NoCountersFilter.prototype = {
16    __proto__: tracing.Filter.prototype,
17    matchCounter: function(c) {
18      return false;
19    }
20  };
21
22  var NoCpusFilter = function() {
23  };
24
25  NoCpusFilter.prototype = {
26    __proto__: tracing.Filter.prototype,
27    matchCpu: function(c) {
28      return false;
29    }
30  };
31
32  var NoProcessesFilter = function() {
33  };
34
35  NoProcessesFilter.prototype = {
36    __proto__: tracing.Filter.prototype,
37    matchProcess: function(c) {
38      return false;
39    }
40  };
41
42  var NoThreadsFilter = function() {
43  };
44
45  NoThreadsFilter.prototype = {
46    __proto__: tracing.Filter.prototype,
47    matchThread: function(c) {
48      return false;
49    }
50  };
51
52  test('instantiate', function() {
53    var events = [
54      {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
55      {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
56      {name: 'b', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'B'},
57      {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}
58    ];
59    var model = new tracing.TraceModel(events);
60    var timeline = new tracing.TimelineTrackView();
61    timeline.model = model;
62    timeline.focusElement = timeline;
63    timeline.tabIndex = 0;
64    this.addHTMLOutput(timeline);
65  });
66
67  test('addAllObjectsMatchingFilterToSelection', function() {
68    var model = new tracing.TraceModel();
69    var p1 = model.getOrCreateProcess(1);
70    var t1 = p1.getOrCreateThread(1);
71
72    t1.sliceGroup.pushSlice(
73        new tracing.trace_model.ThreadSlice('', 'a', 0, 1, {}, 3));
74    t1.sliceGroup.pushSlice(
75        new tracing.trace_model.ThreadSlice('', 'b', 0, 1.1, {}, 2.8));
76
77    var t1asg = t1.asyncSliceGroup;
78    t1asg.slices.push(
79        tracing.test_utils.newAsyncSliceNamed('a', 0, 1, t1, t1));
80    t1asg.slices.push(
81        tracing.test_utils.newAsyncSliceNamed('b', 1, 2, t1, t1));
82
83    var timeline = new tracing.TimelineTrackView();
84    timeline.model = model;
85
86    var expected = [{slice: t1asg.slices[0].subSlices[0]},
87                    {slice: t1.sliceGroup.slices[0]}];
88    var result = new tracing.Selection();
89    timeline.addAllObjectsMatchingFilterToSelection(
90        new tracing.TitleFilter('a'), result);
91    assertEquals(2, result.length);
92    assertEquals(expected[0].slice, result[0].slice);
93    assertEquals(expected[1].slice, result[1].slice);
94
95    var expected = [{slice: t1asg.slices[1].subSlices[0]},
96                    {slice: t1.sliceGroup.slices[1]}];
97    var result = new tracing.Selection();
98    timeline.addAllObjectsMatchingFilterToSelection(
99        new tracing.TitleFilter('b'), result);
100    assertEquals(2, result.length);
101    assertEquals(expected[0].slice, result[0].slice);
102    assertEquals(expected[1].slice, result[1].slice);
103  });
104
105  test('emptyThreadsDeleted', function() {
106    var model = new tracing.TraceModel();
107    var p1 = model.getOrCreateProcess(1);
108    var t1 = p1.getOrCreateThread(1);
109
110    var timeline = new tracing.TimelineTrackView();
111    timeline.model = model;
112
113    assertFalse(timeline.hasVisibleContent);
114  });
115
116  test('filteredCounters', function() {
117    var model = new tracing.TraceModel();
118    var c1 = model.kernel.getOrCreateCpu(0);
119    c1.getOrCreateCounter('', 'b');
120
121    var p1 = model.getOrCreateProcess(1);
122    var ctr = p1.getOrCreateCounter('', 'a');
123    var series = new tracing.trace_model.CounterSeries('a', 0);
124    series.addSample(0, 1);
125    ctr.addSeries(series);
126
127    var timeline = new tracing.TimelineTrackView();
128    timeline.model = model;
129
130    assertTrue(timeline.hasVisibleContent);
131
132    timeline.categoryFilter = new NoCountersFilter();
133    assertFalse(timeline.hasVisibleContent);
134  });
135
136  test('filteredCpus', function() {
137    var model = new tracing.TraceModel();
138    var c1 = model.kernel.getOrCreateCpu(1);
139    c1.getOrCreateCounter('', 'a');
140
141    var timeline = new tracing.TimelineTrackView();
142    timeline.model = model;
143
144    assertTrue(timeline.hasVisibleContent);
145
146    timeline.categoryFilter = new NoCpusFilter();
147    assertFalse(timeline.hasVisibleContent);
148  });
149
150  test('filteredProcesses', function() {
151    var model = new tracing.TraceModel();
152    var p1 = model.getOrCreateProcess(1);
153    p1.getOrCreateCounter('', 'a');
154
155    var timeline = new tracing.TimelineTrackView();
156    timeline.model = model;
157
158    assertTrue(timeline.hasVisibleContent);
159
160    timeline.categoryFilter = new NoProcessesFilter();
161    assertFalse(timeline.hasVisibleContent);
162  });
163
164  test('filteredThreads', function() {
165    var model = new tracing.TraceModel();
166    var p1 = model.getOrCreateProcess(1);
167    var t1 = p1.getOrCreateThread(2);
168    t1.sliceGroup.pushSlice(tracing.test_utils.newSlice(0, 1));
169
170    var timeline = new tracing.TimelineTrackView();
171    timeline.model = model;
172
173    assertTrue(timeline.hasVisibleContent);
174
175    timeline.categoryFilter = new NoThreadsFilter();
176    assertFalse(timeline.hasVisibleContent);
177  });
178});
179