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 tvcm.require('tracing.test_utils');
8 tvcm.require('tracing.trace_model');
9 tvcm.require('tracing.importer');
11 tvcm.unittest.testSuite('tracing.trace_model_test', function() {
12 var ThreadSlice = tracing.trace_model.ThreadSlice;
13 var TraceModel = tracing.TraceModel;
14 var TitleFilter = tracing.TitleFilter;
16 var createTraceModelWithOneOfEverything = function() {
17 var m = new TraceModel();
18 var cpu = m.kernel.getOrCreateCpu(1);
19 cpu.slices.push(tracing.test_utils.newSlice(1, 3));
21 var p = m.getOrCreateProcess(1);
22 var t = p.getOrCreateThread(1);
23 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
24 t.asyncSliceGroup.push(tracing.test_utils.newAsyncSlice(0, 1, t, t));
26 var c = p.getOrCreateCounter('', 'ProcessCounter');
27 var aSeries = new tracing.trace_model.CounterSeries('a', 0);
28 var bSeries = new tracing.trace_model.CounterSeries('b', 0);
32 aSeries.addSample(0, 5);
33 aSeries.addSample(1, 6);
34 aSeries.addSample(2, 5);
35 aSeries.addSample(3, 7);
37 bSeries.addSample(0, 10);
38 bSeries.addSample(1, 15);
39 bSeries.addSample(2, 12);
40 bSeries.addSample(3, 16);
42 var c1 = cpu.getOrCreateCounter('', 'CpuCounter');
43 var aSeries = new tracing.trace_model.CounterSeries('a', 0);
44 var bSeries = new tracing.trace_model.CounterSeries('b', 0);
45 c1.addSeries(aSeries);
46 c1.addSeries(bSeries);
48 aSeries.addSample(0, 5);
49 aSeries.addSample(1, 6);
50 aSeries.addSample(2, 5);
51 aSeries.addSample(3, 7);
53 bSeries.addSample(0, 10);
54 bSeries.addSample(1, 15);
55 bSeries.addSample(2, 12);
56 bSeries.addSample(3, 16);
63 test('traceModelBounds_EmptyTraceModel', function() {
64 var m = new TraceModel();
66 assertEquals(undefined, m.bounds.min);
67 assertEquals(undefined, m.bounds.max);
70 test('traceModelBounds_OneEmptyThread', function() {
71 var m = new TraceModel();
72 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
74 assertEquals(undefined, m.bounds.min);
75 assertEquals(undefined, m.bounds.max);
78 test('traceModelBounds_OneThread', function() {
79 var m = new TraceModel();
80 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
81 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
83 assertEquals(1, m.bounds.min);
84 assertEquals(4, m.bounds.max);
87 test('traceModelBounds_OneThreadAndOneEmptyThread', function() {
88 var m = new TraceModel();
89 var t1 = m.getOrCreateProcess(1).getOrCreateThread(1);
90 t1.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
91 var t2 = m.getOrCreateProcess(1).getOrCreateThread(1);
93 assertEquals(1, m.bounds.min);
94 assertEquals(4, m.bounds.max);
97 test('traceModelBounds_OneCpu', function() {
98 var m = new TraceModel();
99 var cpu = m.kernel.getOrCreateCpu(1);
100 cpu.slices.push(tracing.test_utils.newSlice(1, 3));
102 assertEquals(1, m.bounds.min);
103 assertEquals(4, m.bounds.max);
106 test('traceModelBounds_OneCpuOneThread', function() {
107 var m = new TraceModel();
108 var cpu = m.kernel.getOrCreateCpu(1);
109 cpu.slices.push(tracing.test_utils.newSlice(1, 3));
111 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
112 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
115 assertEquals(1, m.bounds.min);
116 assertEquals(5, m.bounds.max);
119 test('traceModelCanImportEmpty', function() {
121 m = new TraceModel([]);
122 m = new TraceModel('');
125 test('traceModelCanImportSubtraces', function() {
126 var systraceLines = [
127 'SurfaceFlinger-2 [001] ...1 1000.0: 0: B|1|taskA',
128 'SurfaceFlinger-2 [001] ...1 2000.0: 0: E',
129 ' chrome-3 [001] ...1 2000.0: 0: trace_event_clock_sync: ' +
133 {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
134 my_object: {id_ref: '0x1000'}
136 {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
139 var combined = JSON.stringify({
140 traceEvents: traceEvents,
141 systemTraceEvents: systraceLines.join('\n')
144 var m = new TraceModel();
145 m.importTraces([combined]);
146 assertEquals(1, tvcm.dictionaryValues(m.processes).length);
148 var p1 = m.processes[1];
149 assertNotUndefined(p1);
151 var t2 = p1.threads[2];
152 var t3 = p1.threads[3];
153 assertNotUndefined(t2);
154 assertNotUndefined(t3);
156 assertEquals(1, t2.sliceGroup.length, 1);
157 assertEquals('taskA', t2.sliceGroup.slices[0].title);
159 assertEquals(1, t3.sliceGroup.length);
160 assertEquals('taskB', t3.sliceGroup.slices[0].title);
163 test('traceModelCanImportSubtracesRecursively', function() {
164 var systraceLines = [
165 'SurfaceFlinger-2 [001] ...1 1000.0: 0: B|1|taskA',
166 'SurfaceFlinger-2 [001] ...1 2000.0: 0: E',
167 ' chrome-3 [001] ...1 2000.0: 0: trace_event_clock_sync: ' +
170 var outerTraceEvents = [
171 {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
172 my_object: {id_ref: '0x1000'}
176 var innerTraceEvents = [
177 {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
180 var innerTrace = JSON.stringify({
181 traceEvents: innerTraceEvents,
182 systemTraceEvents: systraceLines.join('\n')
185 var outerTrace = JSON.stringify({
186 traceEvents: outerTraceEvents,
187 systemTraceEvents: innerTrace
190 var m = new TraceModel();
191 m.importTraces([outerTrace]);
192 assertEquals(1, tvcm.dictionaryValues(m.processes).length);
194 var p1 = m.processes[1];
195 assertNotUndefined(p1);
197 var t2 = p1.threads[2];
198 var t3 = p1.threads[3];
199 assertNotUndefined(t2);
200 assertNotUndefined(t3);
202 assertEquals(1, t2.sliceGroup.length, 1);
203 assertEquals('taskA', t2.sliceGroup.slices[0].title);
205 assertEquals(1, t3.sliceGroup.length);
206 assertEquals('taskB', t3.sliceGroup.slices[0].title);
209 test('traceModelWithImportFailure', function() {
210 var malformed = '{traceEvents: [{garbage';
211 var m = new TraceModel();
212 assertThrows(function() {
213 m.importTraces([malformed]);
217 test('titleFilter', function() {
218 var s0 = tracing.test_utils.newSlice(1, 3);
219 assertTrue(new TitleFilter('a').matchSlice(s0));
220 assertFalse(new TitleFilter('x').matchSlice(s0));
222 var s1 = tracing.test_utils.newSliceNamed('ba', 1, 3);
223 assertTrue(new TitleFilter('a').matchSlice(s1));
224 assertTrue(new TitleFilter('ba').matchSlice(s1));
225 assertFalse(new TitleFilter('x').matchSlice(s1));
228 test('traceModel_toJSON', function() {
229 var m = createTraceModelWithOneOfEverything();
230 assertNotNull(JSON.stringify(m));
233 test('traceModel_findAllThreadsNamed', function() {
234 var m = new TraceModel();
235 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
236 t.name = 'CrBrowserMain';
239 var f = m.findAllThreadsNamed('CrBrowserMain');
240 assertArrayEquals([t], f);
241 f = m.findAllThreadsNamed('NoSuchThread');
242 assertEquals(0, f.length);
245 test('traceModel_updateCategories', function() {
246 var m = new TraceModel();
247 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
248 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
249 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
250 t.sliceGroup.pushSlice(new ThreadSlice('categoryB', 'a', 0, 1, {}, 3));
251 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
252 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
253 m.updateCategories_();
254 assertArrayEquals(['categoryA', 'categoryB'], m.categories);
257 test('traceModel_iterateAllEvents', function() {
258 var m = createTraceModelWithOneOfEverything();
259 var wasCalled = false;
260 m.iterateAllEvents(function(event) {
261 assertTrue(event instanceof tracing.trace_model.Event);
264 assertTrue(wasCalled);
267 test('customizeCallback', function() {
268 var m = new tracing.TraceModel();
269 m.importTraces([], false, false, function() {
270 var browserProcess = m.getOrCreateProcess(1);
271 var browserMain = browserProcess.getOrCreateThread(2);
272 browserMain.sliceGroup.beginSlice('cat', 'Task', 0);
273 browserMain.sliceGroup.beginSlice('cat', 'SubTask', 1);
274 browserMain.sliceGroup.endSlice(9);
275 browserMain.sliceGroup.endSlice(10);
276 browserMain.sliceGroup.beginSlice('cat', 'Task', 20);
277 browserMain.sliceGroup.endSlice(30);
279 var t2 = m.processes[1].threads[2];
280 assertEquals(3, t2.sliceGroup.length);
281 assertEquals(2, t2.sliceGroup.topLevelSlices.length);