Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / trace_viewer / tracing / trace_model_test.html
1 <!DOCTYPE html>
2 <!--
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.
6 -->
7
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">
11
12 <script>
13 'use strict';
14
15 tv.unittest.testSuite(function() {
16   var ThreadSlice = tracing.trace_model.ThreadSlice;
17   var TraceModel = tracing.TraceModel;
18   var TitleFilter = tracing.TitleFilter;
19
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));
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(tracing.test_utils.newAsyncSlice(0, 1, t, t));
29
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);
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 tracing.trace_model.CounterSeries('a', 0);
48     var bSeries = new tracing.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     m.updateBounds();
63
64     return m;
65   };
66
67   test('traceModelBounds_EmptyTraceModel', function() {
68     var m = new TraceModel();
69     m.updateBounds();
70     assertEquals(undefined, m.bounds.min);
71     assertEquals(undefined, m.bounds.max);
72   });
73
74   test('traceModelBounds_OneEmptyThread', function() {
75     var m = new TraceModel();
76     var t = m.getOrCreateProcess(1).getOrCreateThread(1);
77     m.updateBounds();
78     assertEquals(undefined, m.bounds.min);
79     assertEquals(undefined, m.bounds.max);
80   });
81
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));
86     m.updateBounds();
87     assertEquals(1, m.bounds.min);
88     assertEquals(4, m.bounds.max);
89   });
90
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);
96     m.updateBounds();
97     assertEquals(1, m.bounds.min);
98     assertEquals(4, m.bounds.max);
99   });
100
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));
105     m.updateBounds();
106     assertEquals(1, m.bounds.min);
107     assertEquals(4, m.bounds.max);
108   });
109
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));
114
115     var t = m.getOrCreateProcess(1).getOrCreateThread(1);
116     t.sliceGroup.pushSlice(new ThreadSlice('', 'a', 0, 1, {}, 4));
117
118     m.updateBounds();
119     assertEquals(1, m.bounds.min);
120     assertEquals(5, m.bounds.max);
121   });
122
123   test('traceModelCanImportEmpty', function() {
124     var m;
125     m = new TraceModel([]);
126     m = new TraceModel('');
127   });
128
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: ' +
134           'parent_ts=0'
135     ];
136     var traceEvents = [
137       {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
138         my_object: {id_ref: '0x1000'}
139       }},
140       {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
141     ];
142
143     var combined = JSON.stringify({
144       traceEvents: traceEvents,
145       systemTraceEvents: systraceLines.join('\n')
146     });
147
148     var m = new TraceModel();
149     m.importTraces([combined]);
150     assertEquals(1, tv.dictionaryValues(m.processes).length);
151
152     var p1 = m.processes[1];
153     assertNotUndefined(p1);
154
155     var t2 = p1.threads[2];
156     var t3 = p1.threads[3];
157     assertNotUndefined(t2);
158     assertNotUndefined(t3);
159
160     assertEquals(1, t2.sliceGroup.length, 1);
161     assertEquals('taskA', t2.sliceGroup.slices[0].title);
162
163     assertEquals(1, t3.sliceGroup.length);
164     assertEquals('taskB', t3.sliceGroup.slices[0].title);
165   });
166
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: ' +
172           'parent_ts=0'
173     ];
174     var outerTraceEvents = [
175       {ts: 1000, pid: 1, tid: 3, ph: 'B', cat: 'c', name: 'taskB', args: {
176         my_object: {id_ref: '0x1000'}
177       }}
178     ];
179
180     var innerTraceEvents = [
181       {ts: 2000, pid: 1, tid: 3, ph: 'E', cat: 'c', name: 'taskB', args: {}}
182     ];
183
184     var innerTrace = JSON.stringify({
185       traceEvents: innerTraceEvents,
186       systemTraceEvents: systraceLines.join('\n')
187     });
188
189     var outerTrace = JSON.stringify({
190       traceEvents: outerTraceEvents,
191       systemTraceEvents: innerTrace
192     });
193
194     var m = new TraceModel();
195     m.importTraces([outerTrace]);
196     assertEquals(1, tv.dictionaryValues(m.processes).length);
197
198     var p1 = m.processes[1];
199     assertNotUndefined(p1);
200
201     var t2 = p1.threads[2];
202     var t3 = p1.threads[3];
203     assertNotUndefined(t2);
204     assertNotUndefined(t3);
205
206     assertEquals(1, t2.sliceGroup.length, 1);
207     assertEquals('taskA', t2.sliceGroup.slices[0].title);
208
209     assertEquals(1, t3.sliceGroup.length);
210     assertEquals('taskB', t3.sliceGroup.slices[0].title);
211   });
212
213   test('traceModelWithImportFailure', function() {
214     var malformed = '{traceEvents: [{garbage';
215     var m = new TraceModel();
216     assertThrows(function() {
217       m.importTraces([malformed]);
218     });
219   });
220
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));
225
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));
230   });
231
232   test('traceModel_toJSON', function() {
233     var m = createTraceModelWithOneOfEverything();
234     assertNotNull(JSON.stringify(m));
235   });
236
237   test('traceModel_findAllThreadsNamed', function() {
238     var m = new TraceModel();
239     var t = m.getOrCreateProcess(1).getOrCreateThread(1);
240     t.name = 'CrBrowserMain';
241
242     m.updateBounds();
243     var f = m.findAllThreadsNamed('CrBrowserMain');
244     assertArrayEquals([t], f);
245     f = m.findAllThreadsNamed('NoSuchThread');
246     assertEquals(0, f.length);
247   });
248
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);
259   });
260
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);
266       wasCalled = true;
267     });
268     assertTrue(wasCalled);
269   });
270
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);
282     });
283     var t2 = m.processes[1].threads[2];
284     assertEquals(3, t2.sliceGroup.length);
285     assertEquals(2, t2.sliceGroup.topLevelSlices.length);
286   });
287
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);
300   });
301 });
302 </script>