v8_log_importer_test.html revision 46b43bff003ceda46cf9a5d40a47f7674996d2e0
1<!DOCTYPE html>
2<!--
3Copyright (c) 2013 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7
8<link rel="import" href="/tracing/core/test_utils.html">
9<link rel="import" href="/tracing/extras/importer/v8/v8_log_importer.html">
10
11<script>
12
13'use strict';
14
15tr.b.unittest.testSuite(function() {
16  var V8LogImporter = tr.e.importer.v8.V8LogImporter;
17
18  function newModel(events) {
19    return tr.c.TestUtils.newModelWithEvents([events], {
20      shiftWorldToZero: false
21    });
22  }
23
24  test('tickEventInSharedLibrary', function() {
25    var lines = [
26      'shared-library,"/usr/lib/libc++.1.dylib",0x99d8aae0,0x99dce729',
27      'tick,0x99d8aae4,12158,0,0x0,5'];
28    var m = newModel(lines.join('\n'));
29    var p = m.processes[-32];
30    var t = p.findAllThreadsNamed('V8')[0];
31    assert.equal(t.samples.length, 1);
32    assert.equal(t.samples[0].title, 'V8 PC');
33    assert.equal(t.samples[0].start, 12158 / 1000);
34    assert.equal(t.samples[0].leafStackFrame.title, '/usr/lib/libc++.1.dylib');
35  });
36
37  test('tickEventInGeneratedCode', function() {
38    var lines = [
39      'shared-library,"/usr/lib/libc++.1.dylib",0x99d8aae0,0x99dce729',
40      'code-creation,Stub,2,0x5b60ce80,1259,"StringAddStub"',
41      'tick,0x5b60ce84,12158,0,0x0,5'];
42    var m = newModel(lines.join('\n'));
43    var p = m.processes[-32];
44    var threads = p.findAllThreadsNamed('V8');
45    var t = threads[0];
46    assert.equal(t.samples.length, 1);
47    assert.equal(t.samples[0].leafStackFrame.title, 'StringAddStub');
48  });
49
50  test('tickEventInUknownCode', function() {
51    var lines = [
52      'shared-library,"/usr/lib/libc++.1.dylib",0x99d8aae0,0x99dce729',
53      'code-creation,Stub,2,0x5b60ce80,1259,"StringAddStub"',
54      'tick,0x4,0xbff02f08,12158,0,0x0,5'];
55    var m = newModel(lines.join('\n'));
56    var p = m.processes[-32];
57    var threads = p.findAllThreadsNamed('V8');
58    var t = threads[0];
59    assert.equal(t.samples.length, 1);
60    assert.equal(t.samples[0].leafStackFrame.title, 'Unknown');
61  });
62
63  test('tickEventWithStack', function() {
64    var lines = [
65      'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
66      'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304'];
67    var m = newModel(lines.join('\n'));
68    var p = m.processes[-32];
69    var t = p.findAllThreadsNamed('V8')[0];
70    assert.equal(t.samples.length, 1);
71    assert.deepEqual(
72        ['v8: InstantiateFunction native apinatives.js:26:29'],
73        t.samples[0].getUserFriendlyStackTrace());
74  });
75
76  test('twoTickEventsWithStack', function() {
77    var lines = [
78      'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
79      'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304',
80      'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304'];
81    var m = newModel(lines.join('\n'));
82    var p = m.processes[-32];
83    var t = p.findAllThreadsNamed('V8')[0];
84    assert.equal(t.samples.length, 2);
85    assert.equal(t.samples[0].start, 528674 / 1000);
86    assert.equal(t.samples[1].start, 536213 / 1000);
87    assert.deepEqual(
88        ['v8: InstantiateFunction native apinatives.js:26:29'],
89        t.samples[0].getUserFriendlyStackTrace());
90    assert.deepEqual(
91        ['v8: InstantiateFunction native apinatives.js:26:29'],
92        t.samples[1].getUserFriendlyStackTrace());
93    assert.equal(t.samples[0].leafStackFrame,
94                 t.samples[1].leafStackFrame);
95  });
96
97  test('twoTickEventsWithTwoStackFrames', function() {
98    var lines = [
99      'code-creation,LazyCompile,0,0x2904d560,876,"Instantiate native apinatives.js:9:21",0x56b190c8,~', // @suppress longLineCheck
100      'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
101      'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304,0x2904d6e8',
102      'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304,0x2904d6e8'];
103    var m = newModel(lines.join('\n'));
104    var p = m.processes[-32];
105    var t = p.findAllThreadsNamed('V8')[0];
106    assert.equal(t.samples.length, 2);
107
108    assert.equal(t.samples[0].start, 528674 / 1000);
109    assert.equal(t.samples[1].start, 536213 / 1000);
110    assert.deepEqual(
111        ['v8: InstantiateFunction native apinatives.js:26:29',
112        'v8: Instantiate native apinatives.js:9:21'],
113        t.samples[0].getUserFriendlyStackTrace());
114    assert.deepEqual(
115        ['v8: InstantiateFunction native apinatives.js:26:29',
116        'v8: Instantiate native apinatives.js:9:21'],
117        t.samples[1].getUserFriendlyStackTrace());
118
119    var childStackFrame = t.samples[0].leafStackFrame;
120    assert.equal(childStackFrame, t.samples[1].leafStackFrame);
121    assert.equal(childStackFrame.children.length, 0);
122
123    var parentStackFrame = childStackFrame.parentFrame;
124    assert.equal(parentStackFrame.children.length, 1);
125    assert.equal(childStackFrame, parentStackFrame.children[0]);
126
127  });
128
129  test('threeTickEventsWithTwoStackFrames', function() {
130    var lines = [
131      'code-creation,LazyCompile,0,0x2904d560,876,"Instantiate native apinatives.js:9:21",0x56b190c8,~', // @suppress longLineCheck
132      'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
133      'tick,0x7fd7f75c,518328,0,0x81d86da8,2,0x2904d6e8',
134      'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304,0x2904d6e8',
135      'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304,0x2904d6e8'];
136    var m = newModel(lines.join('\n'));
137    var p = m.processes[-32];
138    var threads = p.findAllThreadsNamed('V8');
139
140    var t = threads[0];
141    assert.equal(t.samples.length, 3);
142    assert.equal(t.samples[0].start, 518328 / 1000);
143    assert.equal(t.samples[1].start, 528674 / 1000);
144    assert.equal(t.samples[2].start, 536213 / 1000);
145    assert.deepEqual(
146        ['v8: Instantiate native apinatives.js:9:21'],
147        t.samples[0].getUserFriendlyStackTrace());
148    assert.deepEqual(
149        ['v8: InstantiateFunction native apinatives.js:26:29',
150        'v8: Instantiate native apinatives.js:9:21'],
151        t.samples[1].getUserFriendlyStackTrace());
152    assert.deepEqual(
153        ['v8: InstantiateFunction native apinatives.js:26:29',
154        'v8: Instantiate native apinatives.js:9:21'],
155        t.samples[2].getUserFriendlyStackTrace());
156
157    var topLevelStackFrame = t.samples[0].leafStackFrame;
158    var childStackFrame = t.samples[1].leafStackFrame;
159    assert.equal(t.samples[2].leafStackFrame, childStackFrame);
160    assert.equal(topLevelStackFrame, childStackFrame.parentFrame);
161    assert.equal(topLevelStackFrame.children.length, 1);
162    assert.equal(childStackFrame.children.length, 0);
163    assert.equal(childStackFrame, topLevelStackFrame.children[0]);
164  });
165
166  test('twoSubStacks', function() {
167    var lines = [
168      'code-creation,LazyCompile,0,0x2904d560,876,"Instantiate native apinatives.js:9:21",0x56b190c8,~', // @suppress longLineCheck
169      'code-creation,LazyCompile,0,0x2905d0c0,1800,"InstantiateFunction native apinatives.js:26:29",0x56b19124,', // @suppress longLineCheck
170      'tick,0x7fd7f75c,518328,0,0x81d86da8,2,0x2904d6e8',
171      'tick,0x7fc6fe34,528674,0,0x3,0,0x2905d304,0x2904d6e8',
172      'tick,0x7fd2a534,536213,0,0x81d8d080,0,0x2905d304,0x2904d6e8',
173      'code-creation,Script,0,0x2906a7c0,792,"http://www.google.com/",0x5b12fe50,~', // @suppress longLineCheck
174      'tick,0xb6f51d30,794049,0,0xb6f7b368,2,0x2906a914',
175      'tick,0xb6f51d30,799146,0,0xb6f7b368,0,0x2906a914'
176    ];
177    var m = newModel(lines.join('\n'));
178    var p = m.processes[-32];
179    var threads = p.findAllThreadsNamed('V8');
180    var t = threads[0];
181    assert.equal(t.samples.length, 5);
182
183    assert.equal(t.samples[0].start, 518328 / 1000);
184    assert.equal(t.samples[1].start, 528674 / 1000);
185    assert.equal(t.samples[2].start, 536213 / 1000);
186    assert.equal(t.samples[3].start, 794049 / 1000);
187    assert.equal(t.samples[4].start, 799146 / 1000);
188
189    assert.deepEqual(
190        ['v8: Instantiate native apinatives.js:9:21'],
191        t.samples[0].getUserFriendlyStackTrace());
192    assert.deepEqual(
193        ['v8: InstantiateFunction native apinatives.js:26:29',
194        'v8: Instantiate native apinatives.js:9:21'],
195        t.samples[1].getUserFriendlyStackTrace());
196    assert.deepEqual(
197        ['v8: InstantiateFunction native apinatives.js:26:29',
198        'v8: Instantiate native apinatives.js:9:21'],
199        t.samples[2].getUserFriendlyStackTrace());
200    assert.deepEqual(['v8: http://www.google.com/'],
201                      t.samples[3].getUserFriendlyStackTrace());
202    assert.deepEqual(['v8: http://www.google.com/'],
203                      t.samples[4].getUserFriendlyStackTrace());
204
205    var firsStackTopLevelStackFrame = t.samples[0].leafStackFrame;
206    var firsStackChildStackFrame = t.samples[1].leafStackFrame;
207    assert.equal(firsStackChildStackFrame, t.samples[2].leafStackFrame);
208    assert.equal(firsStackTopLevelStackFrame,
209                 firsStackChildStackFrame.parentFrame);
210    assert.equal(firsStackTopLevelStackFrame.children.length, 1);
211    assert.equal(firsStackChildStackFrame.children.length, 0);
212    assert.equal(firsStackChildStackFrame,
213                 firsStackTopLevelStackFrame.children[0]);
214
215    var secondStackStackFrame = t.samples[3].leafStackFrame;
216    assert.equal(secondStackStackFrame, t.samples[4].leafStackFrame);
217    assert.equal(secondStackStackFrame.children.length, 0);
218    assert.isUndefined(secondStackStackFrame.parentFrame);
219  });
220
221  test('timerEventSliceCreation', function() {
222    var lines = ['timer-event,"V8.External",38189483,3'];
223    var m = newModel(lines.join('\n'));
224    var p = m.processes[-32];
225    var threads = p.findAllThreadsNamed('V8 Timers');
226    assert.isDefined(threads);
227    assert.equal(threads.length, 1);
228    var t = threads[0];
229    assert.equal(t.sliceGroup.length, 1);
230  });
231
232  test('processThreadCreation', function() {
233    var lines = ['timer-event,"V8.External",38189483,3'];
234    var m = newModel(lines.join('\n'));
235    assert.isDefined(m);
236    var p = m.processes[-32];
237    assert.isDefined(p);
238    var threads = p.findAllThreadsNamed('V8 Timers');
239    assert.isDefined(threads);
240    assert.equal(1, threads.length);
241    var t = threads[0];
242    assert.equal('V8 Timers', t.name);
243  });
244
245  test('canImport', function() {
246    assert.isTrue(V8LogImporter.canImport(
247        'timer-event,"V8.External",38189483,3'));
248    assert.isTrue(V8LogImporter.canImport('v8-version,4,3,66,0,0'));
249    assert.isFalse(V8LogImporter.canImport(''));
250    assert.isFalse(V8LogImporter.canImport([]));
251  });
252});
253</script>
254
255