Upstream version 7.35.139.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / trace_viewer / tracing / trace_model_test.js
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
7 tvcm.require('tracing.test_utils');
8 tvcm.require('tracing.trace_model');
9 tvcm.require('tracing.importer');
10
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;
15
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));
20
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));
25
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);
29     c.addSeries(aSeries);
30     c.addSeries(bSeries);
31
32     aSeries.addSample(0, 5);
33     aSeries.addSample(1, 6);
34     aSeries.addSample(2, 5);
35     aSeries.addSample(3, 7);
36
37     bSeries.addSample(0, 10);
38     bSeries.addSample(1, 15);
39     bSeries.addSample(2, 12);
40     bSeries.addSample(3, 16);
41
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);
47
48     aSeries.addSample(0, 5);
49     aSeries.addSample(1, 6);
50     aSeries.addSample(2, 5);
51     aSeries.addSample(3, 7);
52
53     bSeries.addSample(0, 10);
54     bSeries.addSample(1, 15);
55     bSeries.addSample(2, 12);
56     bSeries.addSample(3, 16);
57
58     m.updateBounds();
59
60     return m;
61   };
62
63   test('traceModelBounds_EmptyTraceModel', function() {
64     var m = new TraceModel();
65     m.updateBounds();
66     assertEquals(undefined, m.bounds.min);
67     assertEquals(undefined, m.bounds.max);
68   });
69
70   test('traceModelBounds_OneEmptyThread', function() {
71     var m = new TraceModel();
72     var t = m.getOrCreateProcess(1).getOrCreateThread(1);
73     m.updateBounds();
74     assertEquals(undefined, m.bounds.min);
75     assertEquals(undefined, m.bounds.max);
76   });
77
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));
82     m.updateBounds();
83     assertEquals(1, m.bounds.min);
84     assertEquals(4, m.bounds.max);
85   });
86
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);
92     m.updateBounds();
93     assertEquals(1, m.bounds.min);
94     assertEquals(4, m.bounds.max);
95   });
96
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));
101     m.updateBounds();
102     assertEquals(1, m.bounds.min);
103     assertEquals(4, m.bounds.max);
104   });
105
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));
110
111     var t = m.getOrCreateProcess(1).getOrCreateThread(1);
112     t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
113
114     m.updateBounds();
115     assertEquals(1, m.bounds.min);
116     assertEquals(5, m.bounds.max);
117   });
118
119   test('traceModelCanImportEmpty', function() {
120     var m;
121     m = new TraceModel([]);
122     m = new TraceModel('');
123   });
124
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: ' +
130           'parent_ts=0'
131     ];
132     var traceEvents = [
133       {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
134         my_object: {id_ref: '0x1000'}
135       }},
136       {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
137     ];
138
139     var combined = JSON.stringify({
140       traceEvents: traceEvents,
141       systemTraceEvents: systraceLines.join('\n')
142     });
143
144     var m = new TraceModel();
145     m.importTraces([combined]);
146     assertEquals(1, tvcm.dictionaryValues(m.processes).length);
147
148     var p1 = m.processes[1];
149     assertNotUndefined(p1);
150
151     var t2 = p1.threads[2];
152     var t3 = p1.threads[3];
153     assertNotUndefined(t2);
154     assertNotUndefined(t3);
155
156     assertEquals(1, t2.sliceGroup.length, 1);
157     assertEquals('taskA', t2.sliceGroup.slices[0].title);
158
159     assertEquals(1, t3.sliceGroup.length);
160     assertEquals('taskB', t3.sliceGroup.slices[0].title);
161   });
162
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: ' +
168           'parent_ts=0'
169     ];
170     var outerTraceEvents = [
171       {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
172         my_object: {id_ref: '0x1000'}
173       }}
174     ];
175
176     var innerTraceEvents = [
177       {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
178     ];
179
180     var innerTrace = JSON.stringify({
181       traceEvents: innerTraceEvents,
182       systemTraceEvents: systraceLines.join('\n')
183     });
184
185     var outerTrace = JSON.stringify({
186       traceEvents: outerTraceEvents,
187       systemTraceEvents: innerTrace
188     });
189
190     var m = new TraceModel();
191     m.importTraces([outerTrace]);
192     assertEquals(1, tvcm.dictionaryValues(m.processes).length);
193
194     var p1 = m.processes[1];
195     assertNotUndefined(p1);
196
197     var t2 = p1.threads[2];
198     var t3 = p1.threads[3];
199     assertNotUndefined(t2);
200     assertNotUndefined(t3);
201
202     assertEquals(1, t2.sliceGroup.length, 1);
203     assertEquals('taskA', t2.sliceGroup.slices[0].title);
204
205     assertEquals(1, t3.sliceGroup.length);
206     assertEquals('taskB', t3.sliceGroup.slices[0].title);
207   });
208
209   test('traceModelWithImportFailure', function() {
210     var malformed = '{traceEvents: [{garbage';
211     var m = new TraceModel();
212     assertThrows(function() {
213       m.importTraces([malformed]);
214     });
215   });
216
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));
221
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));
226   });
227
228   test('traceModel_toJSON', function() {
229     var m = createTraceModelWithOneOfEverything();
230     assertNotNull(JSON.stringify(m));
231   });
232
233   test('traceModel_findAllThreadsNamed', function() {
234     var m = new TraceModel();
235     var t = m.getOrCreateProcess(1).getOrCreateThread(1);
236     t.name = 'CrBrowserMain';
237
238     m.updateBounds();
239     var f = m.findAllThreadsNamed('CrBrowserMain');
240     assertArrayEquals([t], f);
241     f = m.findAllThreadsNamed('NoSuchThread');
242     assertEquals(0, f.length);
243   });
244
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);
255   });
256
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);
262       wasCalled = true;
263     });
264     assertTrue(wasCalled);
265   });
266
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);
278     });
279     var t2 = m.processes[1].threads[2];
280     assertEquals(3, t2.sliceGroup.length);
281     assertEquals(2, t2.sliceGroup.topLevelSlices.length);
282   });
283 });