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.
7 tvcm.require('tracing.test_utils');
8 tvcm.require('tracing.importer.v8_log_importer');
10 tvcm.unittest.testSuite('tracing.importer.v8_log_importer_test', function() {
11 var V8LogImporter = tracing.importer.V8LogImporter;
13 test('tickEventInSharedLibrary', function() {
15 'shared-library,"/usr/lib/libc++.1.dylib",0x99d8aae0,0x99dce729',
16 'tick,0x99d8aae4,12158,0,0x0,5'];
17 var m = new tracing.TraceModel(lines.join('\n'), false);
18 var p = m.processes[-32];
19 var t = p.findAllThreadsNamed('V8')[0];
20 assertEquals(1, t.samples.length);
21 assertEquals('V8 PC', t.samples[0].title);
22 assertEquals(12158 / 1000, t.samples[0].start);
23 assertEquals('/usr/lib/libc++.1.dylib', t.samples[0].leafStackFrame.title);
26 test('tickEventInGeneratedCode', function() {
28 'shared-library,"/usr/lib/libc++.1.dylib",0x99d8aae0,0x99dce729',
29 'code-creation,Stub,2,0x5b60ce80,1259,"StringAddStub"',
30 'tick,0x5b60ce84,12158,0,0x0,5'];
31 var m = new tracing.TraceModel(lines.join('\n'), false);
32 var p = m.processes[-32];
33 var threads = p.findAllThreadsNamed('V8');
35 assertEquals(1, t.samples.length);
36 assertEquals('StringAddStub', t.samples[0].leafStackFrame.title);
39 test('tickEventInUknownCode', function() {
41 'shared-library,"/usr/lib/libc++.1.dylib",0x99d8aae0,0x99dce729',
42 'code-creation,Stub,2,0x5b60ce80,1259,"StringAddStub"',
43 'tick,0x4,0xbff02f08,12158,0,0x0,5'];
44 var m = new tracing.TraceModel(lines.join('\n'), false);
45 var p = m.processes[-32];
46 var threads = p.findAllThreadsNamed('V8');
48 assertEquals(1, t.samples.length);
49 assertEquals('Unknown', t.samples[0].leafStackFrame.title);
52 test('tickEventWithStack', function() {
54 'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
55 'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304'];
56 var m = new tracing.TraceModel(lines.join('\n'), false);
57 var p = m.processes[-32];
58 var t = p.findAllThreadsNamed('V8')[0];
59 assertEquals(1, t.samples.length);
61 ['v8: InstantiateFunction native apinatives.js:26:29'],
62 t.samples[0].getUserFriendlyStackTrace());
65 test('twoTickEventsWithStack', function() {
67 'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
68 'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304',
69 'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304'];
70 var m = new tracing.TraceModel(lines.join('\n'), false);
71 var p = m.processes[-32];
72 var t = p.findAllThreadsNamed('V8')[0];
73 assertEquals(2, t.samples.length);
74 assertEquals(528674 / 1000, t.samples[0].start);
75 assertEquals(536213 / 1000, t.samples[1].start);
77 ['v8: InstantiateFunction native apinatives.js:26:29'],
78 t.samples[0].getUserFriendlyStackTrace());
80 ['v8: InstantiateFunction native apinatives.js:26:29'],
81 t.samples[1].getUserFriendlyStackTrace());
82 assertEquals(t.samples[0].leafStackFrame,
83 t.samples[1].leafStackFrame);
86 test('twoTickEventsWithTwoStackFrames', function() {
88 'code-creation,LazyCompile,0,0x2904d560,876,"Instantiate native apinatives.js:9:21",0x56b190c8,~', // @suppress longLineCheck
89 'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
90 'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304,0x2904d6e8',
91 'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304,0x2904d6e8'];
92 var m = new tracing.TraceModel(lines.join('\n'), false);
93 var p = m.processes[-32];
94 var t = p.findAllThreadsNamed('V8')[0];
95 assertEquals(2, t.samples.length);
97 assertEquals(528674 / 1000, t.samples[0].start);
98 assertEquals(536213 / 1000, t.samples[1].start);
100 ['v8: Instantiate native apinatives.js:9:21',
101 'v8: InstantiateFunction native apinatives.js:26:29'],
102 t.samples[0].getUserFriendlyStackTrace());
104 ['v8: Instantiate native apinatives.js:9:21',
105 'v8: InstantiateFunction native apinatives.js:26:29'],
106 t.samples[1].getUserFriendlyStackTrace());
108 var childStackFrame = t.samples[0].leafStackFrame;
109 assertEquals(childStackFrame, t.samples[1].leafStackFrame);
110 assertEquals(0, childStackFrame.children.length);
112 var parentStackFrame = childStackFrame.parentFrame;
113 assertEquals(1, parentStackFrame.children.length);
114 assertEquals(childStackFrame, parentStackFrame.children[0]);
118 test('threeTickEventsWithTwoStackFrames', function() {
120 'code-creation,LazyCompile,0,0x2904d560,876,"Instantiate native apinatives.js:9:21",0x56b190c8,~', // @suppress longLineCheck
121 'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
122 'tick,0x7fd7f75c,518328,0,0x81d86da8,2,0x2904d6e8',
123 'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304,0x2904d6e8',
124 'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304,0x2904d6e8'];
125 var m = new tracing.TraceModel(lines.join('\n'), false);
126 var p = m.processes[-32];
127 var threads = p.findAllThreadsNamed('V8');
130 assertEquals(3, t.samples.length);
131 assertEquals(518328 / 1000, t.samples[0].start);
132 assertEquals(528674 / 1000, t.samples[1].start);
133 assertEquals(536213 / 1000, t.samples[2].start);
135 ['v8: Instantiate native apinatives.js:9:21'],
136 t.samples[0].getUserFriendlyStackTrace());
138 ['v8: Instantiate native apinatives.js:9:21',
139 'v8: InstantiateFunction native apinatives.js:26:29'],
140 t.samples[1].getUserFriendlyStackTrace());
142 ['v8: Instantiate native apinatives.js:9:21',
143 'v8: InstantiateFunction native apinatives.js:26:29'],
144 t.samples[2].getUserFriendlyStackTrace());
146 var topLevelStackFrame = t.samples[0].leafStackFrame;
147 var childStackFrame = t.samples[1].leafStackFrame;
148 assertEquals(childStackFrame, t.samples[2].leafStackFrame);
149 assertEquals(topLevelStackFrame, childStackFrame.parentFrame);
150 assertEquals(1, topLevelStackFrame.children.length);
151 assertEquals(0, childStackFrame.children.length);
152 assertEquals(childStackFrame, topLevelStackFrame.children[0]);
155 test('twoSubStacks', function() {
157 'code-creation,LazyCompile,0,0x2904d560,876,"Instantiate native apinatives.js:9:21",0x56b190c8,~', // @suppress longLineCheck
158 'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
159 'tick,0x7fd7f75c,518328,0,0x81d86da8,2,0x2904d6e8',
160 'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304,0x2904d6e8',
161 'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304,0x2904d6e8',
162 'code-creation,Script,0,0x2906a7c0,792,"http://www.google.com/",0x5b12fe50,~', // @suppress longLineCheck
163 'tick,0xb6f51d30,794049,0,0xb6f7b368,2,0x2906a914',
164 'tick,0xb6f51d30,799146,0,0xb6f7b368,0,0x2906a914'
166 var m = new tracing.TraceModel(lines.join('\n'), false);
167 var p = m.processes[-32];
168 var threads = p.findAllThreadsNamed('V8');
170 assertEquals(5, t.samples.length);
172 assertEquals(518328 / 1000, t.samples[0].start);
173 assertEquals(528674 / 1000, t.samples[1].start);
174 assertEquals(536213 / 1000, t.samples[2].start);
175 assertEquals(794049 / 1000, t.samples[3].start);
176 assertEquals(799146 / 1000, t.samples[4].start);
179 ['v8: Instantiate native apinatives.js:9:21'],
180 t.samples[0].getUserFriendlyStackTrace());
182 ['v8: Instantiate native apinatives.js:9:21',
183 'v8: InstantiateFunction native apinatives.js:26:29'],
184 t.samples[1].getUserFriendlyStackTrace());
186 ['v8: Instantiate native apinatives.js:9:21',
187 'v8: InstantiateFunction native apinatives.js:26:29'],
188 t.samples[2].getUserFriendlyStackTrace());
189 assertArrayEquals(['v8: http://www.google.com/'],
190 t.samples[3].getUserFriendlyStackTrace());
191 assertArrayEquals(['v8: http://www.google.com/'],
192 t.samples[4].getUserFriendlyStackTrace());
194 var firsStackTopLevelStackFrame = t.samples[0].leafStackFrame;
195 var firsStackChildStackFrame = t.samples[1].leafStackFrame;
196 assertEquals(firsStackChildStackFrame, t.samples[2].leafStackFrame);
197 assertEquals(firsStackTopLevelStackFrame,
198 firsStackChildStackFrame.parentFrame);
199 assertEquals(1, firsStackTopLevelStackFrame.children.length);
200 assertEquals(0, firsStackChildStackFrame.children.length);
201 assertEquals(firsStackChildStackFrame,
202 firsStackTopLevelStackFrame.children[0]);
204 var secondStackStackFrame = t.samples[3].leafStackFrame;
205 assertEquals(secondStackStackFrame, t.samples[4].leafStackFrame);
206 assertEquals(0, secondStackStackFrame.children.length);
207 assertEquals(undefined, secondStackStackFrame.parentFrame);
210 test('timerEventSliceCreation', function() {
211 var lines = ['timer-event,"V8.External",38189483,3'];
212 var m = new tracing.TraceModel(lines.join('\n'), false);
213 var p = m.processes[-32];
214 var threads = p.findAllThreadsNamed('V8 Timers');
215 assertNotUndefined(threads);
216 assertEquals(1, threads.length);
218 assertEquals(1, t.sliceGroup.length);
221 test('processThreadCreation', function() {
222 var lines = ['timer-event,"V8.External",38189483,3'];
223 var m = new tracing.TraceModel(lines.join('\n'), false);
224 assertNotUndefined(m);
225 var p = m.processes[-32];
226 assertNotUndefined(p);
227 var threads = p.findAllThreadsNamed('V8 Timers');
228 assertNotUndefined(threads);
229 assertEquals(threads.length, 1);
231 assertEquals(t.name, 'V8 Timers');
234 test('canImport', function() {
235 assertTrue(V8LogImporter.canImport(
236 'timer-event,"V8.External",38189483,3'));
237 assertFalse(V8LogImporter.canImport(''));
238 assertFalse(V8LogImporter.canImport([]));