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.
7 base.require('tracing.test_utils');
8 base.require('tracing.timeline_track_view');
9 base.require('tracing.importer.trace_event_importer');
11 base.unittest.testSuite('tracing.timeline_track_view', function() {
13 var Selection = tracing.Selection;
14 var SelectionState = tracing.trace_model.SelectionState;
16 function contains(array, element) {
17 for (var i = 0; i < array.length; i++) {
18 if (array[i] === element) {
25 function checkSelectionStates(timeline, selection, highlight) {
26 selection = selection || [];
27 highlight = highlight || [];
29 assertEquals(selection.length, timeline.selection.length);
30 assertEquals(highlight.length, timeline.highlight.length);
32 assertArrayEquals(selection, timeline.selection);
33 assertArrayEquals(highlight, timeline.highlight);
35 timeline.model.iterateAllEvents(function(event) {
36 if (contains(selection, event))
37 assertEquals(SelectionState.SELECTED, event.selectionState);
38 else if (contains(highlight, event))
39 assertEquals(SelectionState.HIGHLIGHTED, event.selectionState);
40 else if (highlight.length)
41 assertEquals(SelectionState.DIMMED, event.selectionState);
43 assertEquals(SelectionState.NONE, event.selectionState);
47 test('instantiate', function() {
49 {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
50 {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
51 {name: 'b', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'B'},
52 {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}
54 var model = new tracing.TraceModel(events);
55 var timeline = new tracing.TimelineTrackView();
56 timeline.model = model;
57 timeline.focusElement = timeline;
58 timeline.tabIndex = 0;
59 this.addHTMLOutput(timeline);
62 test('addAllObjectsMatchingFilterToSelection', function() {
63 var model = new tracing.TraceModel();
64 var p1 = model.getOrCreateProcess(1);
65 var t1 = p1.getOrCreateThread(1);
67 t1.sliceGroup.pushSlice(
68 new tracing.trace_model.ThreadSlice('', 'a', 0, 1, {}, 3));
69 t1.sliceGroup.pushSlice(
70 new tracing.trace_model.ThreadSlice('', 'b', 0, 1.1, {}, 2.8));
72 var t1asg = t1.asyncSliceGroup;
74 tracing.test_utils.newAsyncSliceNamed('a', 0, 1, t1, t1));
76 tracing.test_utils.newAsyncSliceNamed('b', 1, 2, t1, t1));
78 var timeline = new tracing.TimelineTrackView();
79 timeline.model = model;
81 var expected = [t1asg.slices[0].subSlices[0],
82 t1.sliceGroup.slices[0]];
83 var result = new tracing.Selection();
84 timeline.addAllObjectsMatchingFilterToSelection(
85 new tracing.TitleFilter('a'), result);
86 assertEquals(2, result.length);
87 assertEquals(expected[0], result[0]);
88 assertEquals(expected[1], result[1]);
90 var expected = [t1asg.slices[1].subSlices[0],
91 t1.sliceGroup.slices[1]];
92 var result = new tracing.Selection();
93 timeline.addAllObjectsMatchingFilterToSelection(
94 new tracing.TitleFilter('b'), result);
95 assertEquals(2, result.length);
96 assertEquals(expected[0], result[0]);
97 assertEquals(expected[1], result[1]);
100 test('emptyThreadsDeleted', function() {
101 var model = new tracing.TraceModel();
102 var p1 = model.getOrCreateProcess(1);
103 var t1 = p1.getOrCreateThread(1);
105 var timeline = new tracing.TimelineTrackView();
106 timeline.model = model;
108 assertFalse(timeline.hasVisibleContent);
111 test('filteredCounters', function() {
112 var model = new tracing.TraceModel();
113 var c1 = model.kernel.getOrCreateCpu(0);
114 c1.getOrCreateCounter('', 'b');
116 var p1 = model.getOrCreateProcess(1);
117 var ctr = p1.getOrCreateCounter('', 'a');
118 var series = new tracing.trace_model.CounterSeries('a', 0);
119 series.addSample(0, 1);
120 ctr.addSeries(series);
122 var timeline = new tracing.TimelineTrackView();
123 timeline.model = model;
125 assertTrue(timeline.hasVisibleContent);
128 test('filteredCpus', function() {
129 var model = new tracing.TraceModel();
130 var c1 = model.kernel.getOrCreateCpu(1);
131 c1.getOrCreateCounter('', 'a');
133 var timeline = new tracing.TimelineTrackView();
134 timeline.model = model;
136 assertTrue(timeline.hasVisibleContent);
139 test('filteredProcesses', function() {
140 var model = new tracing.TraceModel();
141 var p1 = model.getOrCreateProcess(1);
142 p1.getOrCreateCounter('', 'a');
144 var timeline = new tracing.TimelineTrackView();
145 timeline.model = model;
147 assertTrue(timeline.hasVisibleContent);
150 test('filteredThreads', function() {
151 var model = new tracing.TraceModel();
152 var p1 = model.getOrCreateProcess(1);
153 var t1 = p1.getOrCreateThread(2);
154 t1.sliceGroup.pushSlice(tracing.test_utils.newSlice(0, 1));
156 var timeline = new tracing.TimelineTrackView();
157 timeline.model = model;
159 assertTrue(timeline.hasVisibleContent);
162 test('selectionAndHighlight', function() {
164 {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
165 {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
166 {name: 'ab', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
167 {name: 'b', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'B'},
168 {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'B'}
170 var model = new tracing.TraceModel(events);
171 var timeline = new tracing.TimelineTrackView();
172 timeline.model = model;
174 var selection = new Selection();
175 timeline.addAllObjectsMatchingFilterToSelection(
176 new tracing.TitleFilter('a'), selection);
178 var highlight = new Selection();
179 timeline.addAllObjectsMatchingFilterToSelection(
180 new tracing.TitleFilter('b'), highlight);
182 // Test for faulty input.
183 assertThrows(function() {
184 timeline.selection = 'selection';
187 assertThrows(function() {
188 timeline.highlight = 1;
191 assertThrows(function() {
192 timeline.setSelectionAndHighlight(0, false);
195 // Check state after reset.
196 timeline.setSelectionAndHighlight(null, null);
197 checkSelectionStates(timeline, null, null);
199 // Add selection only.
200 timeline.selection = selection;
201 assertEquals(selection, timeline.selection);
202 checkSelectionStates(timeline, selection, null);
205 timeline.selection = null;
206 assertEquals(0, timeline.selection.length);
207 checkSelectionStates(timeline, null, null);
209 // Add highlight only.
210 timeline.highlight = highlight;
211 assertEquals(highlight, timeline.highlight);
212 checkSelectionStates(timeline, null, highlight);
215 timeline.highlight = null;
216 assertEquals(0, timeline.highlight.length);
217 checkSelectionStates(timeline, null, null);
219 // Add selection and highlight.
220 timeline.setSelectionAndHighlight(selection, highlight);
221 checkSelectionStates(timeline, selection, highlight);
223 // Selection replaces old selection.
224 var subSelection = selection.subSelection(0, 1);
225 timeline.selection = subSelection;
226 checkSelectionStates(timeline, subSelection, highlight);
228 // Highlight replaces old highlight.
229 var subHighlight = highlight.subSelection(1, 2);
230 timeline.highlight = subHighlight;
231 checkSelectionStates(timeline, subSelection, subHighlight);
233 // Set selection and clear highlight.
234 timeline.setSelectionAndClearHighlight(selection);
235 checkSelectionStates(timeline, selection, null);
237 // Set highlight and clear selection.
238 timeline.setHighlightAndClearSelection(highlight);
239 checkSelectionStates(timeline, null, highlight);
242 timeline.setSelectionAndHighlight(null, null);
243 checkSelectionStates(timeline, null, null);