3 Copyright (c) 2013 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
8 <link rel="import" href="/tracing/test_utils.html">
9 <link rel="import" href="/tracing/trace_model.html">
10 <link rel="import" href="/tracing/importer.html">
15 tv.unittest.testSuite(function() {
16 var ThreadSlice = tracing.trace_model.ThreadSlice;
17 var TraceModel = tracing.TraceModel;
18 var TitleFilter = tracing.TitleFilter;
20 var createTraceModelWithOneOfEverything = function() {
21 var m = new TraceModel();
22 var cpu = m.kernel.getOrCreateCpu(1);
23 cpu.slices.push(tracing.test_utils.newSlice(1, 3));
25 var p = m.getOrCreateProcess(1);
26 var t = p.getOrCreateThread(1);
27 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
28 t.asyncSliceGroup.push(tracing.test_utils.newAsyncSlice(0, 1, t, t));
30 var c = p.getOrCreateCounter('', 'ProcessCounter');
31 var aSeries = new tracing.trace_model.CounterSeries('a', 0);
32 var bSeries = new tracing.trace_model.CounterSeries('b', 0);
36 aSeries.addCounterSample(0, 5);
37 aSeries.addCounterSample(1, 6);
38 aSeries.addCounterSample(2, 5);
39 aSeries.addCounterSample(3, 7);
41 bSeries.addCounterSample(0, 10);
42 bSeries.addCounterSample(1, 15);
43 bSeries.addCounterSample(2, 12);
44 bSeries.addCounterSample(3, 16);
46 var c1 = cpu.getOrCreateCounter('', 'CpuCounter');
47 var aSeries = new tracing.trace_model.CounterSeries('a', 0);
48 var bSeries = new tracing.trace_model.CounterSeries('b', 0);
49 c1.addSeries(aSeries);
50 c1.addSeries(bSeries);
52 aSeries.addCounterSample(0, 5);
53 aSeries.addCounterSample(1, 6);
54 aSeries.addCounterSample(2, 5);
55 aSeries.addCounterSample(3, 7);
57 bSeries.addCounterSample(0, 10);
58 bSeries.addCounterSample(1, 15);
59 bSeries.addCounterSample(2, 12);
60 bSeries.addCounterSample(3, 16);
67 test('traceModelBounds_EmptyTraceModel', function() {
68 var m = new TraceModel();
70 assertEquals(undefined, m.bounds.min);
71 assertEquals(undefined, m.bounds.max);
74 test('traceModelBounds_OneEmptyThread', function() {
75 var m = new TraceModel();
76 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
78 assertEquals(undefined, m.bounds.min);
79 assertEquals(undefined, m.bounds.max);
82 test('traceModelBounds_OneThread', function() {
83 var m = new TraceModel();
84 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
85 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
87 assertEquals(1, m.bounds.min);
88 assertEquals(4, m.bounds.max);
91 test('traceModelBounds_OneThreadAndOneEmptyThread', function() {
92 var m = new TraceModel();
93 var t1 = m.getOrCreateProcess(1).getOrCreateThread(1);
94 t1.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
95 var t2 = m.getOrCreateProcess(1).getOrCreateThread(1);
97 assertEquals(1, m.bounds.min);
98 assertEquals(4, m.bounds.max);
101 test('traceModelBounds_OneCpu', function() {
102 var m = new TraceModel();
103 var cpu = m.kernel.getOrCreateCpu(1);
104 cpu.slices.push(tracing.test_utils.newSlice(1, 3));
106 assertEquals(1, m.bounds.min);
107 assertEquals(4, m.bounds.max);
110 test('traceModelBounds_OneCpuOneThread', function() {
111 var m = new TraceModel();
112 var cpu = m.kernel.getOrCreateCpu(1);
113 cpu.slices.push(tracing.test_utils.newSlice(1, 3));
115 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
116 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
119 assertEquals(1, m.bounds.min);
120 assertEquals(5, m.bounds.max);
123 test('traceModelCanImportEmpty', function() {
125 m = new TraceModel([]);
126 m = new TraceModel('');
129 test('traceModelCanImportSubtraces', function() {
130 var systraceLines = [
131 'SurfaceFlinger-2 [001] ...1 1000.0: 0: B|1|taskA',
132 'SurfaceFlinger-2 [001] ...1 2000.0: 0: E',
133 ' chrome-3 [001] ...1 2000.0: 0: trace_event_clock_sync: ' +
137 {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
138 my_object: {id_ref: '0x1000'}
140 {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
143 var combined = JSON.stringify({
144 traceEvents: traceEvents,
145 systemTraceEvents: systraceLines.join('\n')
148 var m = new TraceModel();
149 m.importTraces([combined]);
150 assertEquals(1, tv.dictionaryValues(m.processes).length);
152 var p1 = m.processes[1];
153 assertNotUndefined(p1);
155 var t2 = p1.threads[2];
156 var t3 = p1.threads[3];
157 assertNotUndefined(t2);
158 assertNotUndefined(t3);
160 assertEquals(1, t2.sliceGroup.length, 1);
161 assertEquals('taskA', t2.sliceGroup.slices[0].title);
163 assertEquals(1, t3.sliceGroup.length);
164 assertEquals('taskB', t3.sliceGroup.slices[0].title);
167 test('traceModelCanImportSubtracesRecursively', function() {
168 var systraceLines = [
169 'SurfaceFlinger-2 [001] ...1 1000.0: 0: B|1|taskA',
170 'SurfaceFlinger-2 [001] ...1 2000.0: 0: E',
171 ' chrome-3 [001] ...1 2000.0: 0: trace_event_clock_sync: ' +
174 var outerTraceEvents = [
175 {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
176 my_object: {id_ref: '0x1000'}
180 var innerTraceEvents = [
181 {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
184 var innerTrace = JSON.stringify({
185 traceEvents: innerTraceEvents,
186 systemTraceEvents: systraceLines.join('\n')
189 var outerTrace = JSON.stringify({
190 traceEvents: outerTraceEvents,
191 systemTraceEvents: innerTrace
194 var m = new TraceModel();
195 m.importTraces([outerTrace]);
196 assertEquals(1, tv.dictionaryValues(m.processes).length);
198 var p1 = m.processes[1];
199 assertNotUndefined(p1);
201 var t2 = p1.threads[2];
202 var t3 = p1.threads[3];
203 assertNotUndefined(t2);
204 assertNotUndefined(t3);
206 assertEquals(1, t2.sliceGroup.length, 1);
207 assertEquals('taskA', t2.sliceGroup.slices[0].title);
209 assertEquals(1, t3.sliceGroup.length);
210 assertEquals('taskB', t3.sliceGroup.slices[0].title);
213 test('traceModelWithImportFailure', function() {
214 var malformed = '{traceEvents: [{garbage';
215 var m = new TraceModel();
216 assertThrows(function() {
217 m.importTraces([malformed]);
221 test('titleFilter', function() {
222 var s0 = tracing.test_utils.newSlice(1, 3);
223 assertTrue(new TitleFilter('a').matchSlice(s0));
224 assertFalse(new TitleFilter('x').matchSlice(s0));
226 var s1 = tracing.test_utils.newSliceNamed('ba', 1, 3);
227 assertTrue(new TitleFilter('a').matchSlice(s1));
228 assertTrue(new TitleFilter('ba').matchSlice(s1));
229 assertFalse(new TitleFilter('x').matchSlice(s1));
232 test('traceModel_toJSON', function() {
233 var m = createTraceModelWithOneOfEverything();
234 assertNotNull(JSON.stringify(m));
237 test('traceModel_findAllThreadsNamed', function() {
238 var m = new TraceModel();
239 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
240 t.name = 'CrBrowserMain';
243 var f = m.findAllThreadsNamed('CrBrowserMain');
244 assertArrayEquals([t], f);
245 f = m.findAllThreadsNamed('NoSuchThread');
246 assertEquals(0, f.length);
249 test('traceModel_updateCategories', function() {
250 var m = new TraceModel();
251 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
252 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
253 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
254 t.sliceGroup.pushSlice(new ThreadSlice('categoryB', 'a', 0, 1, {}, 3));
255 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
256 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
257 m.updateCategories_();
258 assertArrayEquals(['categoryA', 'categoryB'], m.categories);
261 test('traceModel_iterateAllEvents', function() {
262 var m = createTraceModelWithOneOfEverything();
263 var wasCalled = false;
264 m.iterateAllEvents(function(event) {
265 assertTrue(event instanceof tracing.trace_model.Event);
268 assertTrue(wasCalled);
271 test('customizeCallback', function() {
272 var m = new tracing.TraceModel();
273 m.importTraces([], false, false, function() {
274 var browserProcess = m.getOrCreateProcess(1);
275 var browserMain = browserProcess.getOrCreateThread(2);
276 browserMain.sliceGroup.beginSlice('cat', 'Task', 0);
277 browserMain.sliceGroup.beginSlice('cat', 'SubTask', 1);
278 browserMain.sliceGroup.endSlice(9);
279 browserMain.sliceGroup.endSlice(10);
280 browserMain.sliceGroup.beginSlice('cat', 'Task', 20);
281 browserMain.sliceGroup.endSlice(30);
283 var t2 = m.processes[1].threads[2];
284 assertEquals(3, t2.sliceGroup.length);
285 assertEquals(2, t2.sliceGroup.topLevelSlices.length);
288 test('traceModel_sortsSamples', function() {
289 var m = new tracing.TraceModel();
290 // The 184, 0 and 185 are the tick-times
291 // and irrespective of the order
292 // in which the lines appear in the trace,
293 // the samples should always be sorted by sampling time.
294 m.importTraces(['tick,0x9a,184,0,0x0,5',
295 'tick,0x9b,0,0,0x0,5',
296 'tick,0x9c,185,0,0x0,5']);
297 assertEquals(0, m.samples[0].start);
298 assertEquals(0.184, m.samples[1].start);
299 assertEquals(0.185, m.samples[2].start);