OLD | NEW |
---|---|
(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':9524,'cat':'foo','tid':53,'ph':'B'}, | |
arv (Not doing code reviews)
2011/10/21 17:09:18
space after :
nduca
2011/10/21 19:50:40
Done.
| |
24 {'name':'a','args':{},'pid':52,'ts':9560,'cat':'foo','tid':53,'ph':'E'}, | |
25 {'name':'b','args':{},'pid':52,'ts':9629,'cat':'foo','tid':53,'ph':'B'}, | |
26 {'name':'b','args':{},'pid':52,'ts':9631,'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((9560 - 9524) / 1000, slice.duration); | |
44 assertEquals(0, slice.subSlices.length); | |
45 | |
46 slice = subRow[1]; | |
47 assertEquals('b', slice.title); | |
48 assertEquals((9629-9524) / 1000, slice.start); | |
49 assertEquals((9631 - 9629) / 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); | |
arv (Not doing code reviews)
2011/10/21 17:09:18
whitespace
nduca
2011/10/21 19:50:40
Done.
| |
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 assumpt ion is incorrect. | |
132 assertNotEquals(tracing.getStringHash('a'), tracing.getStringHash('b')); | |
133 | |
134 var events = [ | |
135 {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, | |
136 {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, | |
137 {'name':'b','args':{},'pid':1,'ts':3,'cat':'foo','tid':1,'ph':'B'}, | |
138 {'name':'b','args':{},'pid':1,'ts':4,'cat':'foo','tid':1,'ph':'E'}, | |
139 {'name':'a','args':{},'pid':1,'ts':5,'cat':'foo','tid':1,'ph':'B'}, | |
140 {'name':'a','args':{},'pid':1,'ts':6,'cat':'foo','tid':1,'ph':'E'}, | |
141 ]; | |
142 var m = new tracing.TimelineModel(events); | |
143 var p = m.processes[1]; | |
144 var t = p.threads[1]; | |
145 var subRow = t.subRows[0]; | |
146 var a1 = subRow[0]; | |
147 assertEquals('a', a1.title); | |
148 var b = subRow[1]; | |
149 assertEquals('b', b.title); | |
150 assertNotEquals(a1.colorId, b.colorId); | |
151 var a2 = subRow[0]; | |
152 assertEquals('a', a2.title); | |
153 assertEquals(a1.colorId, a2.colorId); | |
154 } | |
155 | |
156 function testMultipleThreadParsing() { | |
157 var events = [ | |
158 {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, | |
159 {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, | |
160 {'name':'b','args':{},'pid':1,'ts':3,'cat':'foo','tid':2,'ph':'B'}, | |
161 {'name':'b','args':{},'pid':1,'ts':4,'cat':'foo','tid':2,'ph':'E'} | |
162 ]; | |
163 var m = new tracing.TimelineModel(events); | |
164 assertEquals(1, m.numProcesses); | |
165 var p = m.processes[1]; | |
166 assertNotUndefined(p); | |
167 | |
168 assertEquals(2, p.numThreads); | |
169 | |
170 // Check thread 1 | |
171 var t = p.threads[1]; | |
172 assertNotUndefined(t); | |
173 assertEquals(1, t.subRows.length); | |
174 assertEquals(1, t.tid); | |
175 | |
176 var subRow = t.subRows[0]; | |
177 assertEquals(1, subRow.length); | |
178 var slice = subRow[0]; | |
179 assertEquals('a', slice.title); | |
180 assertEquals(0, slice.start); | |
181 assertEquals((2-1) / 1000, slice.duration); | |
182 assertEquals(0, slice.subSlices.length); | |
183 | |
184 // Check thread 2 | |
185 var t = p.threads[2]; | |
186 assertNotUndefined(t); | |
187 assertEquals(1, t.subRows.length); | |
188 assertEquals(2, t.tid); | |
189 | |
190 subRow = t.subRows[0]; | |
191 assertEquals(1, subRow.length); | |
192 slice = subRow[0]; | |
193 assertEquals('b', slice.title); | |
194 assertEquals((3-1) / 1000, slice.start); | |
195 assertEquals((4 - 3) / 1000, slice.duration); | |
196 assertEquals(0, slice.subSlices.length); | |
197 } | |
198 | |
199 function testMultiplePidParsing() { | |
200 var events = [ | |
201 {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, | |
202 {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, | |
203 {'name':'b','args':{},'pid':2,'ts':3,'cat':'foo','tid':2,'ph':'B'}, | |
204 {'name':'b','args':{},'pid':2,'ts':4,'cat':'foo','tid':2,'ph':'E'} | |
205 ]; | |
206 var m = new tracing.TimelineModel(events); | |
207 assertEquals(2, m.numProcesses); | |
208 var p = m.processes[1]; | |
209 assertNotUndefined(p); | |
210 | |
211 assertEquals(1, p.numThreads); | |
212 | |
213 // Check process 1 thread 1 | |
214 var t = p.threads[1]; | |
215 assertNotUndefined(t); | |
216 assertEquals(1, t.subRows.length); | |
217 assertEquals(1, t.tid); | |
218 | |
219 var subRow = t.subRows[0]; | |
220 assertEquals(1, subRow.length); | |
221 var slice = subRow[0]; | |
222 assertEquals('a', slice.title); | |
223 assertEquals(0, slice.start); | |
224 assertEquals((2-1) / 1000, slice.duration); | |
225 assertEquals(0, slice.subSlices.length); | |
226 | |
227 // Check process 2 thread 2 | |
228 var p = m.processes[2]; | |
229 assertNotUndefined(p); | |
230 assertEquals(1, p.numThreads); | |
231 var t = p.threads[2]; | |
232 assertNotUndefined(t); | |
233 assertEquals(1, t.subRows.length); | |
234 assertEquals(2, t.tid); | |
235 | |
236 subRow = t.subRows[0]; | |
237 assertEquals(1, subRow.length); | |
238 slice = subRow[0]; | |
239 assertEquals('b', slice.title); | |
240 assertEquals((3-1) / 1000, slice.start); | |
241 assertEquals((4 - 3) / 1000, slice.duration); | |
242 assertEquals(0, slice.subSlices.length); | |
243 | |
244 // Check getAllThreads. | |
245 assertArrayEquals([m.processes[1].threads[1], m.processes[2].threads[2]], | |
246 m.getAllThreads()) | |
247 } | |
248 | |
249 // Thread names | |
250 function testThreadNames() { | |
251 var events = [ | |
252 {'name': 'thread_name', args: {'name': 'Thread 1'}, 'pid': 1, 'ts': 0, 'tid' : 1, 'ph': 'M'}, | |
253 {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, | |
254 {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, | |
255 {'name':'b','args':{},'pid':2,'ts':3,'cat':'foo','tid':2,'ph':'B'}, | |
256 {'name':'b','args':{},'pid':2,'ts':4,'cat':'foo','tid':2,'ph':'E'}, | |
257 {'name': 'thread_name', args: {'name': 'Thread 2'}, 'pid': 2, 'ts': 0, 'tid' : 2, 'ph': 'M'}, | |
258 ]; | |
259 var m = new tracing.TimelineModel(events); | |
260 assertEquals('Thread 1', m.processes[1].threads[1].name); | |
261 assertEquals('Thread 2', m.processes[2].threads[2].name); | |
262 } | |
263 | |
264 | |
265 function testImmediateParsing() { | |
266 var events = [ | |
267 // Need to include immediates inside a task so the timeline | |
268 // recentering/zeroing doesn't clobber their timestamp. | |
269 {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, | |
270 {'name':'immediate','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'I'}, | |
271 {'name':'a','args':{},'pid':1,'ts':4,'cat':'foo','tid':1,'ph':'E'}, | |
272 ]; | |
273 var m = new tracing.TimelineModel(events); | |
274 var p = m.processes[1]; | |
275 var t = p.threads[1]; | |
276 assertEquals(2, t.subRows.length); | |
277 var subRow = t.subRows[0]; | |
278 assertEquals(1, subRow.length); | |
279 var slice = subRow[0]; | |
280 assertEquals('a', slice.title); | |
281 assertEquals((4-1) / 1000, slice.duration); | |
282 assertEquals(1, slice.subSlices.length); | |
283 | |
284 var immed = slice.subSlices[0]; | |
285 assertEquals('immediate', immed.title); | |
286 assertEquals((2-1) / 1000, immed.start); | |
287 assertEquals(0, immed.duration); | |
288 assertEquals(0, immed.subSlices.length); | |
289 | |
290 subRow = t.subRows[1]; | |
291 assertEquals(immed, subRow[0]); | |
292 } | |
293 </script> | |
294 </body> | |
295 </html> | |
OLD | NEW |