blob: 92c24da3bb8978103c79fe114e8507732add0929 [file] [log] [blame]
Chris Craik93216d02015-03-05 13:58:42 -08001<!DOCTYPE html>
2<!--
3Copyright (c) 2013 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7
8<link rel="import" href="/core/test_utils.html">
9<link rel="import" href="/core/trace_model/trace_model.html">
10<link rel="import" href="/extras/full_config.html">
11
12<script>
13'use strict';
14
15tv.b.unittest.testSuite(function() {
16 var ThreadSlice = tv.c.trace_model.ThreadSlice;
17 var TraceModel = tv.c.TraceModel;
18 var TitleFilter = tv.c.TitleFilter;
19
20 var createTraceModelWithOneOfEverything = function() {
21 var m = new TraceModel();
22 var cpu = m.kernel.getOrCreateCpu(1);
23 cpu.slices.push(tv.c.test_utils.newSlice(1, 3));
24
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(tv.c.test_utils.newAsyncSlice(0, 1, t, t));
29
30 var c = p.getOrCreateCounter('', 'ProcessCounter');
31 var aSeries = new tv.c.trace_model.CounterSeries('a', 0);
32 var bSeries = new tv.c.trace_model.CounterSeries('b', 0);
33 c.addSeries(aSeries);
34 c.addSeries(bSeries);
35
36 aSeries.addCounterSample(0, 5);
37 aSeries.addCounterSample(1, 6);
38 aSeries.addCounterSample(2, 5);
39 aSeries.addCounterSample(3, 7);
40
41 bSeries.addCounterSample(0, 10);
42 bSeries.addCounterSample(1, 15);
43 bSeries.addCounterSample(2, 12);
44 bSeries.addCounterSample(3, 16);
45
46 var c1 = cpu.getOrCreateCounter('', 'CpuCounter');
47 var aSeries = new tv.c.trace_model.CounterSeries('a', 0);
48 var bSeries = new tv.c.trace_model.CounterSeries('b', 0);
49 c1.addSeries(aSeries);
50 c1.addSeries(bSeries);
51
52 aSeries.addCounterSample(0, 5);
53 aSeries.addCounterSample(1, 6);
54 aSeries.addCounterSample(2, 5);
55 aSeries.addCounterSample(3, 7);
56
57 bSeries.addCounterSample(0, 10);
58 bSeries.addCounterSample(1, 15);
59 bSeries.addCounterSample(2, 12);
60 bSeries.addCounterSample(3, 16);
61
62 var gd = new tv.c.trace_model.GlobalMemoryDump(m, 2);
63 var pd = new tv.c.trace_model.ProcessMemoryDump(gd, p, 2);
64 gd.processMemoryDumps[1] = pd;
65 m.globalMemoryDumps.push(gd);
66 p.memoryDumps.push(pd);
67
68 m.updateBounds();
69
70 return m;
71 };
72
73 test('traceModelBounds_EmptyTraceModel', function() {
74 var m = new TraceModel();
75 m.updateBounds();
76 assertEquals(undefined, m.bounds.min);
77 assertEquals(undefined, m.bounds.max);
78 });
79
80 test('traceModelBounds_OneEmptyThread', function() {
81 var m = new TraceModel();
82 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
83 m.updateBounds();
84 assertEquals(undefined, m.bounds.min);
85 assertEquals(undefined, m.bounds.max);
86 });
87
88 test('traceModelBounds_OneThread', function() {
89 var m = new TraceModel();
90 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
91 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
92 m.updateBounds();
93 assertEquals(1, m.bounds.min);
94 assertEquals(4, m.bounds.max);
95 });
96
97 test('traceModelBounds_OneThreadAndOneEmptyThread', function() {
98 var m = new TraceModel();
99 var t1 = m.getOrCreateProcess(1).getOrCreateThread(1);
100 t1.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
101 var t2 = m.getOrCreateProcess(1).getOrCreateThread(1);
102 m.updateBounds();
103 assertEquals(1, m.bounds.min);
104 assertEquals(4, m.bounds.max);
105 });
106
107 test('traceModelBounds_OneCpu', function() {
108 var m = new TraceModel();
109 var cpu = m.kernel.getOrCreateCpu(1);
110 cpu.slices.push(tv.c.test_utils.newSlice(1, 3));
111 m.updateBounds();
112 assertEquals(1, m.bounds.min);
113 assertEquals(4, m.bounds.max);
114 });
115
116 test('traceModelBounds_OneCpuOneThread', function() {
117 var m = new TraceModel();
118 var cpu = m.kernel.getOrCreateCpu(1);
119 cpu.slices.push(tv.c.test_utils.newSlice(1, 3));
120
121 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
122 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
123
124 m.updateBounds();
125 assertEquals(1, m.bounds.min);
126 assertEquals(5, m.bounds.max);
127 });
128
129 test('traceModelBounds_GlobalMemoryDumps', function() {
130 var m = new TraceModel();
131 m.globalMemoryDumps.push(new tv.c.trace_model.GlobalMemoryDump(m, 1));
132 m.globalMemoryDumps.push(new tv.c.trace_model.GlobalMemoryDump(m, 3));
133 m.globalMemoryDumps.push(new tv.c.trace_model.GlobalMemoryDump(m, 5));
134
135 m.updateBounds();
136 assertEquals(1, m.bounds.min);
137 assertEquals(5, m.bounds.max);
138 });
139
140 test('traceModelBounds_ProcessMemoryDumps', function() {
141 var m = new TraceModel();
142 var p = m.getOrCreateProcess(1);
143 var gd = new tv.c.trace_model.GlobalMemoryDump(m, -1);
144 p.memoryDumps.push(new tv.c.trace_model.ProcessMemoryDump(gd, m, 1));
145 p.memoryDumps.push(new tv.c.trace_model.ProcessMemoryDump(gd, m, 3));
146 p.memoryDumps.push(new tv.c.trace_model.ProcessMemoryDump(gd, m, 5));
147
148 m.updateBounds();
149 assertEquals(1, m.bounds.min);
150 assertEquals(5, m.bounds.max);
151 });
152
153 test('traceModelCanImportEmpty', function() {
154 var m;
155 m = new TraceModel([]);
156 m = new TraceModel('');
157 });
158
159 test('traceModelCanImportSubtraces', function() {
160 var systraceLines = [
161 'SurfaceFlinger-2 [001] ...1 1000.0: 0: B|1|taskA',
162 'SurfaceFlinger-2 [001] ...1 2000.0: 0: E',
163 ' chrome-3 [001] ...1 2000.0: 0: trace_event_clock_sync: ' +
164 'parent_ts=0'
165 ];
166 var traceEvents = [
167 {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
168 my_object: {id_ref: '0x1000'}
169 }},
170 {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
171 ];
172
173 var combined = JSON.stringify({
174 traceEvents: traceEvents,
175 systemTraceEvents: systraceLines.join('\n')
176 });
177
178 var m = new TraceModel();
179 m.importTraces([combined]);
180 assertEquals(1, tv.b.dictionaryValues(m.processes).length);
181
182 var p1 = m.processes[1];
183 assertNotUndefined(p1);
184
185 var t2 = p1.threads[2];
186 var t3 = p1.threads[3];
187 assertNotUndefined(t2);
188 assertNotUndefined(t3);
189
190 assertEquals(1, t2.sliceGroup.length, 1);
191 assertEquals('taskA', t2.sliceGroup.slices[0].title);
192
193 assertEquals(1, t3.sliceGroup.length);
194 assertEquals('taskB', t3.sliceGroup.slices[0].title);
195 });
196
197 test('traceModelCanImportSubtracesRecursively', function() {
198 var systraceLines = [
199 'SurfaceFlinger-2 [001] ...1 1000.0: 0: B|1|taskA',
200 'SurfaceFlinger-2 [001] ...1 2000.0: 0: E',
201 ' chrome-3 [001] ...1 2000.0: 0: trace_event_clock_sync: ' +
202 'parent_ts=0'
203 ];
204 var outerTraceEvents = [
205 {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
206 my_object: {id_ref: '0x1000'}
207 }}
208 ];
209
210 var innerTraceEvents = [
211 {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
212 ];
213
214 var innerTrace = JSON.stringify({
215 traceEvents: innerTraceEvents,
216 systemTraceEvents: systraceLines.join('\n')
217 });
218
219 var outerTrace = JSON.stringify({
220 traceEvents: outerTraceEvents,
221 systemTraceEvents: innerTrace
222 });
223
224 var m = new TraceModel();
225 m.importTraces([outerTrace]);
226 assertEquals(1, tv.b.dictionaryValues(m.processes).length);
227
228 var p1 = m.processes[1];
229 assertNotUndefined(p1);
230
231 var t2 = p1.threads[2];
232 var t3 = p1.threads[3];
233 assertNotUndefined(t2);
234 assertNotUndefined(t3);
235
236 assertEquals(1, t2.sliceGroup.length, 1);
237 assertEquals('taskA', t2.sliceGroup.slices[0].title);
238
239 assertEquals(1, t3.sliceGroup.length);
240 assertEquals('taskB', t3.sliceGroup.slices[0].title);
241 });
242
243 test('traceModelWithImportFailure', function() {
244 var malformed = '{traceEvents: [{garbage';
245 var m = new TraceModel();
246 assertThrows(function() {
247 m.importTraces([malformed]);
248 });
249 });
250
251 test('titleFilter', function() {
252 var s0 = tv.c.test_utils.newSlice(1, 3);
253 assertTrue(new TitleFilter('a').matchSlice(s0));
254 assertFalse(new TitleFilter('x').matchSlice(s0));
255
256 var s1 = tv.c.test_utils.newSliceNamed('ba', 1, 3);
257 assertTrue(new TitleFilter('a').matchSlice(s1));
258 assertTrue(new TitleFilter('ba').matchSlice(s1));
259 assertFalse(new TitleFilter('x').matchSlice(s1));
260 });
261
262 test('traceModel_toJSON', function() {
263 var m = createTraceModelWithOneOfEverything();
264 assertNotNull(JSON.stringify(m));
265 });
266
267 test('traceModel_findAllThreadsNamed', function() {
268 var m = new TraceModel();
269 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
270 t.name = 'CrBrowserMain';
271
272 m.updateBounds();
273 var f = m.findAllThreadsNamed('CrBrowserMain');
274 assertArrayEquals([t], f);
275 f = m.findAllThreadsNamed('NoSuchThread');
276 assertEquals(0, f.length);
277 });
278
279 test('traceModel_updateCategories', function() {
280 var m = new TraceModel();
281 var t = m.getOrCreateProcess(1).getOrCreateThread(1);
282 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
283 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
284 t.sliceGroup.pushSlice(new ThreadSlice('categoryB', 'a', 0, 1, {}, 3));
285 t.sliceGroup.pushSlice(new ThreadSlice('categoryA', 'a', 0, 1, {}, 3));
286 t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 3));
287 m.updateCategories_();
288 assertArrayEquals(['categoryA', 'categoryB'], m.categories);
289 });
290
291 test('traceModel_iterateAllEvents', function() {
292 var m = createTraceModelWithOneOfEverything();
293 var wasCalled = false;
294 m.iterateAllEvents(function(event) {
295 assertTrue(event instanceof tv.c.trace_model.Event);
296 wasCalled = true;
297 });
298 assertTrue(wasCalled);
299 });
300
301 test('customizeCallback', function() {
302 var m = new tv.c.TraceModel();
303 m.importTraces([], false, false, function() {
304 var browserProcess = m.getOrCreateProcess(1);
305 var browserMain = browserProcess.getOrCreateThread(2);
306 browserMain.sliceGroup.beginSlice('cat', 'Task', 0);
307 browserMain.sliceGroup.beginSlice('cat', 'SubTask', 1);
308 browserMain.sliceGroup.endSlice(9);
309 browserMain.sliceGroup.endSlice(10);
310 browserMain.sliceGroup.beginSlice('cat', 'Task', 20);
311 browserMain.sliceGroup.endSlice(30);
312 });
313 var t2 = m.processes[1].threads[2];
314 assertEquals(3, t2.sliceGroup.length);
315 assertEquals(2, t2.sliceGroup.topLevelSlices.length);
316 });
317
318 test('traceModel_sortsSamples', function() {
319 var m = new tv.c.TraceModel();
320 // The 184, 0 and 185 are the tick-times
321 // and irrespective of the order
322 // in which the lines appear in the trace,
323 // the samples should always be sorted by sampling time.
324 m.importTraces(['tick,0x9a,184,0,0x0,5',
325 'tick,0x9b,0,0,0x0,5',
326 'tick,0x9c,185,0,0x0,5']);
327 assertEquals(0, m.samples[0].start);
328 assertEquals(0.184, m.samples[1].start);
329 assertEquals(0.185, m.samples[2].start);
330 });
331
332 test('traceModel_sortsGlobalMemoryDumps', function() {
333 var m = new tv.c.TraceModel();
334 m.importTraces([], true /* shiftWorldToZero */, false, function() {
335 m.globalMemoryDumps.push(new tv.c.trace_model.GlobalMemoryDump(m, 1));
336 m.globalMemoryDumps.push(new tv.c.trace_model.GlobalMemoryDump(m, 5));
337 m.globalMemoryDumps.push(new tv.c.trace_model.GlobalMemoryDump(m, 3));
338 });
339 assertEquals(0, m.globalMemoryDumps[0].start);
340 assertEquals(2, m.globalMemoryDumps[1].start);
341 assertEquals(4, m.globalMemoryDumps[2].start);
342 });
343
344 test('traceModel_sortsProcessMemoryDumps', function() {
345 var m = new tv.c.TraceModel();
346 var p = m.getOrCreateProcess(1);
347 m.importTraces([], true /* shiftWorldToZero */, false, function() {
348 var g = new tv.c.trace_model.GlobalMemoryDump(m, -1);
349 p.memoryDumps.push(new tv.c.trace_model.ProcessMemoryDump(g, p, 1));
350 p.memoryDumps.push(new tv.c.trace_model.ProcessMemoryDump(g, p, 5));
351 p.memoryDumps.push(new tv.c.trace_model.ProcessMemoryDump(g, p, 3));
352 });
353 assertEquals(0, p.memoryDumps[0].start);
354 assertEquals(2, p.memoryDumps[1].start);
355 assertEquals(4, p.memoryDumps[2].start);
356 });
357});
358</script>