Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: chrome/browser/resources/tracing/timeline_model_test.html

Issue 8342069: Add unit tests for about:tracing TimelineModel. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: . Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/resources/tracing/timeline_model.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <html>
3 <!--
4 Copyright (c) 2010 The Chromium Authors. All rights reserved.
5 Use of this source code is governed by a BSD-style license that can be
6 found in the LICENSE file.
7 -->
8 <head>
9 <title></title>
10 <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.j s"></script>
11 <script src="../shared/js/cr.js"></script>
12 <script src="../shared/js/cr/event_target.js"></script>
13 <script src="timeline_model.js"></script>
14 <script>
15 goog.require('goog.testing.jsunit');
16 </script>
17
18 </head>
19 <body>
20 <script>
21 function testBasicSingleThreadNonnestedParsing() {
22 var events = [
23 {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
24 {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
25 {name: 'b', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'B'},
26 {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}
27 ];
28 var m = new tracing.TimelineModel(events);
29 assertEquals(1, m.numProcesses);
30 var p = m.processes[52];
31 assertNotUndefined(p);
32
33 assertEquals(1, p.numThreads);
34 var t = p.threads[53];
35 assertNotUndefined(t);
36 assertEquals(1, t.subRows.length);
37 assertEquals(53, t.tid);
38 var subRow = t.subRows[0];
39 assertEquals(2, subRow.length);
40 var slice = subRow[0];
41 assertEquals('a', slice.title);
42 assertEquals(0, slice.start);
43 assertEquals((560 - 524) / 1000, slice.duration);
44 assertEquals(0, slice.subSlices.length);
45
46 slice = subRow[1];
47 assertEquals('b', slice.title);
48 assertEquals((629 - 524) / 1000, slice.start);
49 assertEquals((631 - 629) / 1000, slice.duration);
50 assertEquals(0, slice.subSlices.length);
51 }
52
53 function testNestedParsing() {
54 var events = [
55 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
56 {name: 'b', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'B'},
57 {name: 'b', args: {}, pid: 1, ts: 3, cat: 'foo', tid: 1, ph: 'E'},
58 {name: 'a', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 1, ph: 'E'},
59 ];
60 var m = new tracing.TimelineModel(events);
61 var p = m.processes[1];
62 var t = p.threads[1];
63 assertEquals(2, t.subRows.length);
64 var subRow = t.subRows[0];
65 assertEquals(1, subRow.length);
66 var slice = subRow[0];
67 assertEquals('a', slice.title);
68 assertEquals((4 - 1) / 1000, slice.duration);
69 assertEquals(1, slice.subSlices.length);
70
71 slice = slice.subSlices[0];
72 assertEquals('b', slice.title);
73 assertEquals((2 - 1) / 1000, slice.start);
74 assertEquals((3 - 2) / 1000, slice.duration);
75 assertEquals(0, slice.subSlices.length);
76
77 subRow = t.subRows[1];
78 slice = subRow[0];
79 assertEquals(t.subRows[0][0].subSlices[0], slice);
80 }
81
82 function testAutoclosing() {
83 var events = [
84 // Slice that doesn't finish
85 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
86
87 // Slice that does finish to give an 'end time' to make autoclosing work
88 {name: 'b', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 2, ph: 'B'},
89 {name: 'b', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 2, ph: 'E'},
90 ];
91 var m = new tracing.TimelineModel(events);
92 var p = m.processes[1];
93 var t = p.threads[1];
94 var subRow = t.subRows[0];
95 var slice = subRow[0];
96 assertEquals('a', slice.title);
97 assertTrue(slice.didNotFinish);
98 assertEquals(0, slice.start);
99 assertEquals((2 - 1) / 1000, slice.duration);
100 }
101
102
103 function testNestedAutoclosing() {
104 var events = [
105 // Tasks that dont finish
106 {name: 'a1', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
107 {name: 'a2', args: {}, pid: 1, ts: 1.5, cat: 'foo', tid: 1, ph: 'B'},
108
109 // Slice that does finish to give an 'end time' to make autoclosing work
110 {name: 'b', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 2, ph: 'B'},
111 {name: 'b', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 2, ph: 'E'},
112 ];
113 var m = new tracing.TimelineModel(events);
114 var p = m.processes[1];
115 var t = p.threads[1];
116 var subRow = t.subRows[0];
117 var slice = subRow[0];
118 assertEquals('a1', slice.title);
119 assertTrue(slice.didNotFinish);
120 assertEquals(0, slice.start);
121 assertEquals((2 - 1) / 1000, slice.duration);
122
123 var slice = slice.subSlices[0];
124 assertEquals('a2', slice.title);
125 assertTrue(slice.didNotFinish);
126 assertEquals((1.5 - 1) / 1000, slice.start);
127 assertEquals((2 - 1.5) / 1000, slice.duration);
128 }
129
130 function testTaskColoring() {
131 // The test below depends on hashing of 'a' != 'b'. Fail early if that
132 // assumption is incorrect.
133 assertNotEquals(tracing.getStringHash('a'), tracing.getStringHash('b'));
134
135 var events = [
136 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
137 {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
138 {name: 'b', args: {}, pid: 1, ts: 3, cat: 'foo', tid: 1, ph: 'B'},
139 {name: 'b', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 1, ph: 'E'},
140 {name: 'a', args: {}, pid: 1, ts: 5, cat: 'foo', tid: 1, ph: 'B'},
141 {name: 'a', args: {}, pid: 1, ts: 6, cat: 'foo', tid: 1, ph: 'E'},
142 ];
143 var m = new tracing.TimelineModel(events);
144 var p = m.processes[1];
145 var t = p.threads[1];
146 var subRow = t.subRows[0];
147 var a1 = subRow[0];
148 assertEquals('a', a1.title);
149 var b = subRow[1];
150 assertEquals('b', b.title);
151 assertNotEquals(a1.colorId, b.colorId);
152 var a2 = subRow[0];
153 assertEquals('a', a2.title);
154 assertEquals(a1.colorId, a2.colorId);
155 }
156
157 function testMultipleThreadParsing() {
158 var events = [
159 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
160 {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
161 {name: 'b', args: {}, pid: 1, ts: 3, cat: 'foo', tid: 2, ph: 'B'},
162 {name: 'b', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 2, ph: 'E'}
163 ];
164 var m = new tracing.TimelineModel(events);
165 assertEquals(1, m.numProcesses);
166 var p = m.processes[1];
167 assertNotUndefined(p);
168
169 assertEquals(2, p.numThreads);
170
171 // Check thread 1
172 var t = p.threads[1];
173 assertNotUndefined(t);
174 assertEquals(1, t.subRows.length);
175 assertEquals(1, t.tid);
176
177 var subRow = t.subRows[0];
178 assertEquals(1, subRow.length);
179 var slice = subRow[0];
180 assertEquals('a', slice.title);
181 assertEquals(0, slice.start);
182 assertEquals((2 - 1) / 1000, slice.duration);
183 assertEquals(0, slice.subSlices.length);
184
185 // Check thread 2
186 var t = p.threads[2];
187 assertNotUndefined(t);
188 assertEquals(1, t.subRows.length);
189 assertEquals(2, t.tid);
190
191 subRow = t.subRows[0];
192 assertEquals(1, subRow.length);
193 slice = subRow[0];
194 assertEquals('b', slice.title);
195 assertEquals((3 - 1) / 1000, slice.start);
196 assertEquals((4 - 3) / 1000, slice.duration);
197 assertEquals(0, slice.subSlices.length);
198 }
199
200 function testMultiplePidParsing() {
201 var events = [
202 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
203 {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
204 {name: 'b', args: {}, pid: 2, ts: 3, cat: 'foo', tid: 2, ph: 'B'},
205 {name: 'b', args: {}, pid: 2, ts: 4, cat: 'foo', tid: 2, ph: 'E'}
206 ];
207 var m = new tracing.TimelineModel(events);
208 assertEquals(2, m.numProcesses);
209 var p = m.processes[1];
210 assertNotUndefined(p);
211
212 assertEquals(1, p.numThreads);
213
214 // Check process 1 thread 1
215 var t = p.threads[1];
216 assertNotUndefined(t);
217 assertEquals(1, t.subRows.length);
218 assertEquals(1, t.tid);
219
220 var subRow = t.subRows[0];
221 assertEquals(1, subRow.length);
222 var slice = subRow[0];
223 assertEquals('a', slice.title);
224 assertEquals(0, slice.start);
225 assertEquals((2 - 1) / 1000, slice.duration);
226 assertEquals(0, slice.subSlices.length);
227
228 // Check process 2 thread 2
229 var p = m.processes[2];
230 assertNotUndefined(p);
231 assertEquals(1, p.numThreads);
232 var t = p.threads[2];
233 assertNotUndefined(t);
234 assertEquals(1, t.subRows.length);
235 assertEquals(2, t.tid);
236
237 subRow = t.subRows[0];
238 assertEquals(1, subRow.length);
239 slice = subRow[0];
240 assertEquals('b', slice.title);
241 assertEquals((3 - 1) / 1000, slice.start);
242 assertEquals((4 - 3) / 1000, slice.duration);
243 assertEquals(0, slice.subSlices.length);
244
245 // Check getAllThreads.
246 assertArrayEquals([m.processes[1].threads[1], m.processes[2].threads[2]],
247 m.getAllThreads())
248 }
249
250 // Thread names
251 function testThreadNames() {
252 var events = [
253 {name: 'thread_name', args: {name: 'Thread 1'},
254 pid: 1, ts: 0, tid: 1, ph: 'M'},
255 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
256 {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
257 {name: 'b', args: {}, pid: 2, ts: 3, cat: 'foo', tid: 2, ph: 'B'},
258 {name: 'b', args: {}, pid: 2, ts: 4, cat: 'foo', tid: 2, ph: 'E'},
259 {name: 'thread_name', args: {name: 'Thread 2'},
260 pid: 2, ts: 0, tid: 2, ph: 'M'},
261 ];
262 var m = new tracing.TimelineModel(events);
263 assertEquals('Thread 1', m.processes[1].threads[1].name);
264 assertEquals('Thread 2', m.processes[2].threads[2].name);
265 }
266
267
268 function testImmediateParsing() {
269 var events = [
270 // Need to include immediates inside a task so the timeline
271 // recentering/zeroing doesn't clobber their timestamp.
272 {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
273 {name: 'immediate', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'I'},
274 {name: 'a', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 1, ph: 'E'},
275 ];
276 var m = new tracing.TimelineModel(events);
277 var p = m.processes[1];
278 var t = p.threads[1];
279 assertEquals(2, t.subRows.length);
280 var subRow = t.subRows[0];
281 assertEquals(1, subRow.length);
282 var slice = subRow[0];
283 assertEquals('a', slice.title);
284 assertEquals((4 - 1) / 1000, slice.duration);
285 assertEquals(1, slice.subSlices.length);
286
287 var immed = slice.subSlices[0];
288 assertEquals('immediate', immed.title);
289 assertEquals((2 - 1) / 1000, immed.start);
290 assertEquals(0, immed.duration);
291 assertEquals(0, immed.subSlices.length);
292
293 subRow = t.subRows[1];
294 assertEquals(immed, subRow[0]);
295 }
296 </script>
297 </body>
298 </html>
OLDNEW
« no previous file with comments | « chrome/browser/resources/tracing/timeline_model.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698