summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/trace-viewer/src/tracing/importer/trace_event_importer_test.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/trace-viewer/src/tracing/importer/trace_event_importer_test.js')
-rw-r--r--chromium/third_party/trace-viewer/src/tracing/importer/trace_event_importer_test.js1554
1 files changed, 0 insertions, 1554 deletions
diff --git a/chromium/third_party/trace-viewer/src/tracing/importer/trace_event_importer_test.js b/chromium/third_party/trace-viewer/src/tracing/importer/trace_event_importer_test.js
deleted file mode 100644
index f399e2d8a53..00000000000
--- a/chromium/third_party/trace-viewer/src/tracing/importer/trace_event_importer_test.js
+++ /dev/null
@@ -1,1554 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-base.require('tracing.test_utils');
-base.require('tracing.importer.trace_event_importer');
-
-base.unittest.testSuite('tracing.importer.trace_event_importer', function() {
- var findSliceNamed = tracing.test_utils.findSliceNamed;
-
- test('canImportEmpty', function() {
- self.assertFalse(tracing.importer.TraceEventImporter.canImport([]));
- self.assertFalse(tracing.importer.TraceEventImporter.canImport(''));
- });
-
- test('basicSingleThreadNonnestedParsing', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
- {name: 'b', args: {}, pid: 52, ts: 629, cat: 'bar', tid: 53, ph: 'B'},
- {name: 'b', args: {}, pid: 52, ts: 631, cat: 'bar', tid: 53, ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(2, t.sliceGroup.length);
- assertEquals(53, t.tid);
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertAlmostEquals((560 - 520) / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
-
- slice = t.sliceGroup.slices[1];
- assertEquals('b', slice.title);
- assertEquals('bar', slice.category);
- assertAlmostEquals((629 - 520) / 1000, slice.start);
- assertAlmostEquals((631 - 629) / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
- });
-
- test('basicSingleThreadNonnestedParsingWiththreadDuration', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B', tts: 221}, // @suppress longLineCheck
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E', tts: 259}, // @suppress longLineCheck
- {name: 'b', args: {}, pid: 52, ts: 629, cat: 'bar', tid: 53, ph: 'B', tts: 329}, // @suppress longLineCheck
- {name: 'b', args: {}, pid: 52, ts: 631, cat: 'bar', tid: 53, ph: 'E', tts: 331} // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(2, t.sliceGroup.length);
- assertEquals(53, t.tid);
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertAlmostEquals((560 - 520) / 1000, slice.duration);
- assertAlmostEquals((259 - 221) / 1000, slice.threadDuration);
- assertEquals(0, slice.subSlices.length);
-
- slice = t.sliceGroup.slices[1];
- assertEquals('b', slice.title);
- assertEquals('bar', slice.category);
- assertAlmostEquals((629 - 520) / 1000, slice.start);
- assertAlmostEquals((631 - 629) / 1000, slice.duration);
- assertAlmostEquals((331 - 329) / 1000, slice.threadDuration);
- assertEquals(0, slice.subSlices.length);
- });
-
- test('argumentDupeCreatesNonFailingImportError', function() {
- var events = [
- {name: 'a',
- args: {'x': 1},
- pid: 1,
- ts: 520,
- cat: 'foo',
- tid: 1,
- ph: 'B'},
- {name: 'a',
- args: {'x': 2},
- pid: 1,
- ts: 560,
- cat: 'foo',
- tid: 1,
- ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[1].threads[1];
- var sA = findSliceNamed(t.sliceGroup, 'a');
-
- assertEquals(2, sA.args.x);
- assertTrue(m.hasImportWarnings);
- assertEquals(m.importWarnings.length, 1);
- });
-
- test('importMissingArgs', function() {
- var events = [
- {name: 'a', pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
- {name: 'b', pid: 52, ts: 629, cat: 'bar', tid: 53, ph: 'I'}
- ];
-
- // This should not throw an exception.
- new tracing.TraceModel(events);
- });
-
- test('categoryBeginEndMismatchPrefersBegin', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'bar', tid: 53, ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.sliceGroup.length);
- assertEquals(53, t.tid);
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- });
-
- test('nestedParsing', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 2, cat: 'bar', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 3, cat: 'bar', tid: 1, ph: 'E'},
- {name: 'a', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 1, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var t = m.processes[1].threads[1];
-
- var sA = findSliceNamed(t.sliceGroup, 'a');
- var sB = findSliceNamed(t.sliceGroup, 'b');
-
- assertEquals('a', sA.title);
- assertEquals('foo', sA.category);
- assertEquals(0.001, sA.start);
- assertEquals(0.003, sA.duration);
- assertEquals(0.002, sA.selfTime);
-
- assertEquals('b', sB.title);
- assertEquals('bar', sB.category);
- assertEquals(0.002, sB.start);
- assertEquals(0.001, sB.duration);
-
- assertTrue(sA.subSlices.length == 1);
- assertTrue(sA.subSlices[0] == sB);
- assertTrue(sB.parentSlice == sA);
- });
-
- test('nestedParsingWithTwoSubSlices', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 2, cat: 'bar', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 3, cat: 'bar', tid: 1, ph: 'E'},
- {name: 'c', args: {}, pid: 1, ts: 5, cat: 'baz', tid: 1, ph: 'B'},
- {name: 'c', args: {}, pid: 1, ts: 7, cat: 'baz', tid: 1, ph: 'E'},
- {name: 'a', args: {}, pid: 1, ts: 8, cat: 'foo', tid: 1, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var t = m.processes[1].threads[1];
-
- var sA = findSliceNamed(t.sliceGroup, 'a');
- var sB = findSliceNamed(t.sliceGroup, 'b');
- var sC = findSliceNamed(t.sliceGroup, 'c');
-
- assertEquals('a', sA.title);
- assertEquals('foo', sA.category);
- assertEquals(0.001, sA.start);
- assertEquals(0.007, sA.duration);
- assertEquals(0.004, sA.selfTime);
-
- assertEquals('b', sB.title);
- assertEquals('bar', sB.category);
- assertEquals(0.002, sB.start);
- assertEquals(0.001, sB.duration);
-
- assertEquals('c', sC.title);
- assertEquals('baz', sC.category);
- assertEquals(0.005, sC.start);
- assertEquals(0.002, sC.duration);
-
- assertTrue(sA.subSlices.length == 2);
- assertTrue(sA.subSlices[0] == sB);
- assertTrue(sA.subSlices[1] == sC);
- assertTrue(sB.parentSlice == sA);
- assertTrue(sC.parentSlice == sA);
- });
-
- test('nestedParsingWithDoubleNesting', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 2, cat: 'bar', tid: 1, ph: 'B'},
- {name: 'c', args: {}, pid: 1, ts: 3, cat: 'baz', tid: 1, ph: 'B'},
- {name: 'c', args: {}, pid: 1, ts: 5, cat: 'baz', tid: 1, ph: 'E'},
- {name: 'b', args: {}, pid: 1, ts: 7, cat: 'bar', tid: 1, ph: 'E'},
- {name: 'a', args: {}, pid: 1, ts: 8, cat: 'foo', tid: 1, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var t = m.processes[1].threads[1];
-
- var sA = findSliceNamed(t.sliceGroup, 'a');
- var sB = findSliceNamed(t.sliceGroup, 'b');
- var sC = findSliceNamed(t.sliceGroup, 'c');
-
- assertEquals('a', sA.title);
- assertEquals('foo', sA.category);
- assertEquals(0.001, sA.start);
- assertEquals(0.007, sA.duration);
- assertEquals(0.002, sA.selfTime);
-
- assertEquals('b', sB.title);
- assertEquals('bar', sB.category);
- assertEquals(0.002, sB.start);
- assertEquals(0.005, sB.duration);
- assertEquals(0.002, sA.selfTime);
-
- assertEquals('c', sC.title);
- assertEquals('baz', sC.category);
- assertEquals(0.003, sC.start);
- assertEquals(0.002, sC.duration);
-
- assertTrue(sA.subSlices.length == 1);
- assertTrue(sA.subSlices[0] == sB);
- assertTrue(sB.parentSlice == sA);
-
- assertTrue(sB.subSlices.length == 1);
- assertTrue(sB.subSlices[0] == sC);
- assertTrue(sC.parentSlice == sB);
- });
-
-
- test('autoclosing', function() {
- var events = [
- // Slice that doesn't finish.
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
-
- // Slice that does finish to give an 'end time' to make autoclosing work.
- {name: 'b', args: {}, pid: 1, ts: 1, cat: 'bar', tid: 2, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 2, cat: 'bar', tid: 2, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[1];
- var t = p.threads[1];
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertTrue(slice.didNotFinish);
- assertEquals(0, slice.start);
- assertEquals((2 - 1) / 1000, slice.duration);
- });
-
- test('autoclosingLoneBegin', function() {
- var events = [
- // Slice that doesn't finish.
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'}
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[1];
- var t = p.threads[1];
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertTrue(slice.didNotFinish);
- assertEquals(0, slice.start);
- assertEquals(0, slice.duration);
- });
-
- test('autoclosingWithSubTasks', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'b1', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'b1', args: {}, pid: 1, ts: 3, cat: 'foo', tid: 1, ph: 'E'},
- {name: 'b2', args: {}, pid: 1, ts: 3, cat: 'foo', tid: 1, ph: 'B'}
- ];
- var m = new tracing.TraceModel(events, false);
- var t = m.processes[1].threads[1];
-
- var sA = findSliceNamed(t.sliceGroup, 'a');
- var sB1 = findSliceNamed(t.sliceGroup, 'b1');
- var sB2 = findSliceNamed(t.sliceGroup, 'b2');
-
- assertEquals(0.003, sA.end);
- assertEquals(0.003, sB1.end);
- assertEquals(0.003, sB2.end);
- });
-
- test('autoclosingWithEventsOutsideBounds', function() {
- var events = [
- // Slice that begins before min and ends after max of the other threads.
- {name: 'a', args: {}, pid: 1, ts: 0, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 3, cat: 'foo', tid: 1, ph: 'B'},
-
- // Slice that does finish to give an 'end time' to establish a basis
- {name: 'c', args: {}, pid: 1, ts: 1, cat: 'bar', tid: 2, ph: 'B'},
- {name: 'c', args: {}, pid: 1, ts: 2, cat: 'bar', tid: 2, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var p = m.processes[1];
- var t = p.threads[1];
- assertEquals(2, t.sliceGroup.length);
-
- var slice = findSliceNamed(t.sliceGroup, 'a');
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertEquals(0.003, slice.duration);
-
- var t2 = p.threads[2];
- var slice2 = findSliceNamed(t2.sliceGroup, 'c');
- assertEquals('c', slice2.title);
- assertEquals('bar', slice2.category);
- assertEquals(0.001, slice2.start);
- assertEquals(0.001, slice2.duration);
-
- assertEquals(0.000, m.bounds.min);
- assertEquals(0.003, m.bounds.max);
- });
-
- test('nestedAutoclosing', function() {
- var events = [
- // Tasks that don't finish.
- {name: 'a1', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'a2', args: {}, pid: 1, ts: 1.5, cat: 'foo', tid: 1, ph: 'B'},
-
- // Slice that does finish to give an 'end time' to make autoclosing work.
- {name: 'b', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 2, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 2, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var t1 = m.processes[1].threads[1];
- var t2 = m.processes[1].threads[2];
-
- var sA1 = findSliceNamed(t1.sliceGroup, 'a1');
- var sA2 = findSliceNamed(t1.sliceGroup, 'a2');
- var sB = findSliceNamed(t2.sliceGroup, 'b');
-
- assertEquals(0.002, sA1.end);
- assertEquals(0.002, sA2.end);
- });
-
- test('taskColoring', function() {
- // The test below depends on hashing of 'a' != 'b'. Fail early if that
- // assumption is incorrect.
- assertNotEquals(tracing.getStringHash('a'), tracing.getStringHash('b'));
-
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
- {name: 'b', args: {}, pid: 1, ts: 3, cat: 'bar', tid: 1, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 4, cat: 'bar', tid: 1, ph: 'E'},
- {name: 'a', args: {}, pid: 1, ts: 5, cat: 'baz', tid: 1, ph: 'B'},
- {name: 'a', args: {}, pid: 1, ts: 6, cat: 'baz', tid: 1, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[1];
- var t = p.threads[1];
- var a1 = t.sliceGroup.slices[0];
- assertEquals('a', a1.title);
- assertEquals('foo', a1.category);
- var b = t.sliceGroup.slices[1];
- assertEquals('b', b.title);
- assertEquals('bar', b.category);
- assertNotEquals(a1.colorId, b.colorId);
- var a2 = t.sliceGroup.slices[2];
- assertEquals('a', a2.title);
- assertEquals('baz', a2.category);
- assertEquals(a1.colorId, a2.colorId);
- });
-
- test('multipleThreadParsing', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
- {name: 'b', args: {}, pid: 1, ts: 3, cat: 'bar', tid: 2, ph: 'B'},
- {name: 'b', args: {}, pid: 1, ts: 4, cat: 'bar', tid: 2, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[1];
- assertNotUndefined(p);
-
- assertEquals(2, p.numThreads);
-
- // Check thread 1.
- var t = p.threads[1];
- assertNotUndefined(t);
- assertEquals(1, t.sliceGroup.length);
- assertEquals(1, t.tid);
-
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertEquals((2 - 1) / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
-
- // Check thread 2.
- var t = p.threads[2];
- assertNotUndefined(t);
- assertEquals(1, t.sliceGroup.length);
- assertEquals(2, t.tid);
-
- slice = t.sliceGroup.slices[0];
- assertEquals('b', slice.title);
- assertEquals('bar', slice.category);
- assertEquals((3 - 1) / 1000, slice.start);
- assertEquals((4 - 3) / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
- });
-
- test('multiplePidParsing', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'a', args: {}, pid: 1, ts: 2, cat: 'foo', tid: 1, ph: 'E'},
- {name: 'b', args: {}, pid: 2, ts: 3, cat: 'bar', tid: 2, ph: 'B'},
- {name: 'b', args: {}, pid: 2, ts: 4, cat: 'bar', tid: 2, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events);
- assertEquals(2, m.numProcesses);
- var p = m.processes[1];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
-
- // Check process 1 thread 1.
- var t = p.threads[1];
- assertNotUndefined(t);
- assertEquals(1, t.sliceGroup.length);
- assertEquals(1, t.tid);
-
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertEquals((2 - 1) / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
-
- // Check process 2 thread 2.
- var p = m.processes[2];
- assertNotUndefined(p);
- assertEquals(1, p.numThreads);
- var t = p.threads[2];
- assertNotUndefined(t);
- assertEquals(1, t.sliceGroup.length);
- assertEquals(2, t.tid);
-
- slice = t.sliceGroup.slices[0];
- assertEquals('b', slice.title);
- assertEquals('bar', slice.category);
- assertEquals((3 - 1) / 1000, slice.start);
- assertEquals((4 - 3) / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
-
- // Check getAllThreads.
- assertArrayEquals([m.processes[1].threads[1], m.processes[2].threads[2]],
- m.getAllThreads());
- });
-
- // Process names.
- test('processNames', function() {
- var events = [
- {name: 'process_name', args: {name: 'SomeProcessName'},
- pid: 1, ts: 0, tid: 1, ph: 'M'},
- {name: 'process_name', args: {name: 'SomeProcessName'},
- pid: 2, ts: 0, tid: 1, ph: 'M'}
- ];
- var m = new tracing.TraceModel();
- m.importTraces([events], false, false);
- assertEquals('SomeProcessName', m.processes[1].name);
- });
-
- // Process labels.
- test('processLabels', function() {
- var events = [
- {name: 'process_labels', args: {labels: 'foo,bar'},
- pid: 1, ts: 0, tid: 1, ph: 'M'},
- {name: 'process_labels', args: {labels: 'baz'},
- pid: 2, ts: 0, tid: 1, ph: 'M'}
- ];
- var m = new tracing.TraceModel();
- m.importTraces([events], false, false);
- assertArrayEquals(['foo', 'bar'], m.processes[1].labels);
- assertArrayEquals(['baz'], m.processes[2].labels);
- });
-
- // Process sort index.
- test('processSortIndex', function() {
- var events = [
- {name: 'process_name', args: {name: 'First'},
- pid: 2, ts: 0, tid: 1, ph: 'M'},
- {name: 'process_name', args: {name: 'Second'},
- pid: 2, ts: 0, tid: 1, ph: 'M'},
- {name: 'process_sort_index', args: {sort_index: 1},
- pid: 1, ts: 0, tid: 1, ph: 'M'}
- ];
- var m = new tracing.TraceModel();
- m.importTraces([events], false, false);
-
- // By name, p1 is before p2. But, its sort index overrides that.
- assertTrue(m.processes[1].compareTo(m.processes[2]) > 0);
- });
-
- // Thread names.
- test('threadNames', function() {
- var events = [
- {name: 'thread_name', args: {name: 'Thread 1'},
- pid: 1, ts: 0, tid: 1, ph: 'M'},
- {name: 'thread_name', args: {name: 'Thread 2'},
- pid: 2, ts: 0, tid: 2, ph: 'M'}
- ];
- var m = new tracing.TraceModel(events);
- m.importTraces([events], false, false);
- assertEquals('Thread 1', m.processes[1].threads[1].name);
- assertEquals('Thread 2', m.processes[2].threads[2].name);
- });
-
- // Thread sort index.
- test('threadSortIndex', function() {
- var events = [
- {name: 'thread_name', args: {name: 'Thread 1'},
- pid: 1, ts: 0, tid: 1, ph: 'M'},
- {name: 'thread_name', args: {name: 'Thread 2'},
- pid: 1, ts: 0, tid: 2, ph: 'M'},
- {name: 'thread_sort_index', args: {sort_index: 1},
- pid: 1, ts: 0, tid: 1, ph: 'M'}
- ];
- var m = new tracing.TraceModel();
- m.importTraces([events], false, false);
-
- // By name, t1 is before t2. But, its sort index overrides that.
- var t1 = m.processes[1].threads[1];
- var t2 = m.processes[1].threads[2];
- assertTrue(t1.compareTo(t2) > 0);
- });
-
- test('parsingWhenEndComesFirst', function() {
- var events = [
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'E'},
- {name: 'a', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'a', args: {}, pid: 1, ts: 5, cat: 'foo', tid: 1, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var p = m.processes[1];
- var t = p.threads[1];
- assertEquals(1, t.sliceGroup.length);
- assertEquals('a', t.sliceGroup.slices[0].title);
- assertEquals('foo', t.sliceGroup.slices[0].category);
- assertEquals(0.004, t.sliceGroup.slices[0].start);
- assertEquals(0.001, t.sliceGroup.slices[0].duration);
- assertTrue(m.hasImportWarnings);
- assertEquals(1, m.importWarnings.length);
- });
-
- test('immediateParsing', function() {
- var events = [
- // Need to include immediates inside a task so the timeline
- // recentering/zeroing doesn't clobber their timestamp.
- {name: 'a', args: {}, pid: 1, ts: 1, cat: 'foo', tid: 1, ph: 'B'},
- {name: 'immediate', args: {}, pid: 1, ts: 2, cat: 'bar', tid: 1, ph: 'I'},
- {name: 'slower', args: {}, pid: 1, ts: 4, cat: 'baz', tid: 1, ph: 'i'},
- {name: 'a', args: {}, pid: 1, ts: 4, cat: 'foo', tid: 1, ph: 'E'}
- ];
- var m = new tracing.TraceModel(events, false);
- var p = m.processes[1];
- var t = p.threads[1];
-
- assertEquals(3, t.sliceGroup.length);
- assertEquals(0.001, t.sliceGroup.slices[0].start);
- assertEquals(0.003, t.sliceGroup.slices[0].duration);
- assertEquals(0.002, t.sliceGroup.slices[1].start);
- assertEquals(0, t.sliceGroup.slices[1].duration);
- assertEquals(0.004, t.sliceGroup.slices[2].start);
-
- var slice = findSliceNamed(t.sliceGroup, 'a');
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0.003, slice.duration);
-
- var immed = findSliceNamed(t.sliceGroup, 'immediate');
- assertEquals('immediate', immed.title);
- assertEquals('bar', immed.category);
- assertEquals(0.002, immed.start);
- assertEquals(0, immed.duration);
-
- var slower = findSliceNamed(t.sliceGroup, 'slower');
- assertEquals('slower', slower.title);
- assertEquals('baz', slower.category);
- assertEquals(0.004, slower.start);
- assertEquals(0, slower.duration);
- });
-
- test('simpleCounter', function() {
- var events = [
- {name: 'ctr', args: {'value': 0}, pid: 1, ts: 0, cat: 'foo', tid: 1,
- ph: 'C'},
- {name: 'ctr', args: {'value': 10}, pid: 1, ts: 10, cat: 'foo', tid: 1,
- ph: 'C'},
- {name: 'ctr', args: {'value': 0}, pid: 1, ts: 20, cat: 'foo', tid: 1,
- ph: 'C'}
-
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[1];
- var ctr = m.processes[1].counters['foo.ctr'];
-
- assertEquals('ctr', ctr.name);
- assertEquals('foo', ctr.category);
- assertEquals(3, ctr.numSamples);
- assertEquals(1, ctr.numSeries);
-
- assertEquals('value', ctr.series[0].name);
- assertEquals(tracing.getStringColorId('ctr.value'), ctr.series[0].color);
-
- assertArrayEquals([0, 0.01, 0.02], ctr.timestamps);
-
- var samples = [];
- ctr.series[0].samples.forEach(function(sample) {
- samples.push(sample.value);
- });
- assertArrayEquals([0, 10, 0], samples);
-
- assertArrayEquals([0, 10, 0], ctr.totals);
- assertEquals(10, ctr.maxTotal);
- });
-
- test('instanceCounter', function() {
- var events = [
- {name: 'ctr', args: {'value': 0}, pid: 1, ts: 0, cat: 'foo', tid: 1,
- ph: 'C', id: 0},
- {name: 'ctr', args: {'value': 10}, pid: 1, ts: 10, cat: 'foo', tid: 1,
- ph: 'C', id: 0},
- {name: 'ctr', args: {'value': 10}, pid: 1, ts: 10, cat: 'foo', tid: 1,
- ph: 'C', id: 1},
- {name: 'ctr', args: {'value': 20}, pid: 1, ts: 15, cat: 'foo', tid: 1,
- ph: 'C', id: 1},
- {name: 'ctr', args: {'value': 30}, pid: 1, ts: 18, cat: 'foo', tid: 1,
- ph: 'C', id: 1},
- {name: 'ctr', args: {'value': 40}, pid: 1, ts: 20, cat: 'bar', tid: 1,
- ph: 'C', id: 2}
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[1];
- var ctr = m.processes[1].counters['foo.ctr[0]'];
- assertEquals('ctr[0]', ctr.name);
- assertEquals('foo', ctr.category);
- assertEquals(2, ctr.numSamples);
- assertEquals(1, ctr.numSeries);
-
- assertArrayEquals([0, 0.01], ctr.timestamps);
- var samples = [];
- ctr.series[0].samples.forEach(function(sample) {
- samples.push(sample.value);
- });
- assertArrayEquals([0, 10], samples);
-
- ctr = m.processes[1].counters['foo.ctr[1]'];
- assertEquals('ctr[1]', ctr.name);
- assertEquals('foo', ctr.category);
- assertEquals(3, ctr.numSamples);
- assertEquals(1, ctr.numSeries);
- assertArrayEquals([0.01, 0.015, 0.018], ctr.timestamps);
-
- samples = [];
- ctr.series[0].samples.forEach(function(sample) {
- samples.push(sample.value);
- });
- assertArrayEquals([10, 20, 30], samples);
-
- ctr = m.processes[1].counters['bar.ctr[2]'];
- assertEquals('ctr[2]', ctr.name);
- assertEquals('bar', ctr.category);
- assertEquals(1, ctr.numSamples);
- assertEquals(1, ctr.numSeries);
- assertArrayEquals([0.02], ctr.timestamps);
- var samples = [];
- ctr.series[0].samples.forEach(function(sample) {
- samples.push(sample.value);
- });
- assertArrayEquals([40], samples);
- });
-
- test('multiCounterUpdateBounds', function() {
- var ctr = new tracing.trace_model.Counter(undefined, 'testBasicCounter',
- '', 'testBasicCounter');
- var value1Series = new tracing.trace_model.CounterSeries(
- 'value1', 'testBasicCounter.value1');
- var value2Series = new tracing.trace_model.CounterSeries(
- 'value2', 'testBasicCounter.value2');
- ctr.addSeries(value1Series);
- ctr.addSeries(value2Series);
-
- value1Series.addSample(0, 0);
- value1Series.addSample(1, 1);
- value1Series.addSample(2, 1);
- value1Series.addSample(3, 2);
- value1Series.addSample(4, 3);
- value1Series.addSample(5, 1);
- value1Series.addSample(6, 3);
- value1Series.addSample(7, 3.1);
-
- value2Series.addSample(0, 0);
- value2Series.addSample(1, 0);
- value2Series.addSample(2, 1);
- value2Series.addSample(3, 1.1);
- value2Series.addSample(4, 0);
- value2Series.addSample(5, 7);
- value2Series.addSample(6, 0);
- value2Series.addSample(7, 0.5);
-
- ctr.updateBounds();
-
- assertEquals(0, ctr.bounds.min);
- assertEquals(7, ctr.bounds.max);
- assertEquals(8, ctr.maxTotal);
- assertArrayEquals([0, 0,
- 1, 1,
- 1, 2,
- 2, 3.1,
- 3, 3,
- 1, 8,
- 3, 3,
- 3.1, 3.6], ctr.totals);
- });
-
- test('multiCounter', function() {
- var events = [
- {name: 'ctr', args: {'value1': 0, 'value2': 7}, pid: 1, ts: 0, cat: 'foo', tid: 1, ph: 'C'}, // @suppress longLineCheck
- {name: 'ctr', args: {'value1': 10, 'value2': 4}, pid: 1, ts: 10, cat: 'foo', tid: 1, ph: 'C'}, // @suppress longLineCheck
- {name: 'ctr', args: {'value1': 0, 'value2': 1 }, pid: 1, ts: 20, cat: 'foo', tid: 1, ph: 'C'} // @suppress longLineCheck
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[1];
- var ctr = m.processes[1].counters['foo.ctr'];
- assertEquals('ctr', ctr.name);
-
- assertEquals('ctr', ctr.name);
- assertEquals('foo', ctr.category);
- assertEquals(3, ctr.numSamples);
- assertEquals(2, ctr.numSeries);
-
- assertEquals('value1', ctr.series[0].name);
- assertEquals('value2', ctr.series[1].name);
- assertEquals(tracing.getStringColorId('ctr.value1'), ctr.series[0].color);
- assertEquals(tracing.getStringColorId('ctr.value2'), ctr.series[1].color);
-
- assertArrayEquals([0, 0.01, 0.02], ctr.timestamps);
- var samples = [];
- ctr.series[0].samples.forEach(function(sample) {
- samples.push(sample.value);
- });
- assertArrayEquals([0, 10, 0], samples);
-
- var samples1 = [];
- ctr.series[1].samples.forEach(function(sample) {
- samples1.push(sample.value);
- });
- assertArrayEquals([7, 4, 1], samples1);
- assertArrayEquals([0, 7,
- 10, 14,
- 0, 1], ctr.totals);
- assertEquals(14, ctr.maxTotal);
- });
-
- test('importObjectInsteadOfArray', function() {
- var events = { traceEvents: [
- {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'}
- ] };
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- });
-
- test('importString', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(JSON.stringify(events));
- assertEquals(1, m.numProcesses);
- });
-
- test('importStringWithTrailingNewLine', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(JSON.stringify(events) + '\n');
- assertEquals(1, m.numProcesses);
- });
-
- test('importStringWithMissingCloseSquareBracket', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'}
- ];
-
- var tmp = JSON.stringify(events);
- assertEquals(']', tmp[tmp.length - 1]);
-
- // Drop off the trailing ]
- var dropped = tmp.substring(0, tmp.length - 1);
- var m = new tracing.TraceModel(dropped);
- assertEquals(1, m.numProcesses);
- });
-
- test('importStringWithEndingCommaButMissingCloseSquareBracket', function() {
- var lines = [
- '[',
- '{"name": "a", "args": {}, "pid": 52, "ts": 524, "cat": "foo", "tid": 53, "ph": "B"},', // @suppress longLineCheck
- '{"name": "a", "args": {}, "pid": 52, "ts": 560, "cat": "foo", "tid": 53, "ph": "E"},' // @suppress longLineCheck
- ];
- var text = lines.join('\n');
-
- var m = new tracing.TraceModel(text);
- assertEquals(1, m.numProcesses);
- assertEquals(1, m.processes[52].threads[53].sliceGroup.length);
- });
-
- test('importStringWithMissingCloseSquareBracketAndNewline', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'}
- ];
-
- var tmp = JSON.stringify(events);
- assertEquals(']', tmp[tmp.length - 1]);
-
- // Drop off the trailing ] and add a newline
- var dropped = tmp.substring(0, tmp.length - 1);
- var m = new tracing.TraceModel(dropped + '\n');
- assertEquals(1, m.numProcesses);
- });
-
- test('ImportStringEndingCommaButMissingCloseSquareBracketCRLF', function() {
- var lines = [
- '[',
- '{"name": "a", "args": {}, "pid": 52, "ts": 524, "cat": "foo", "tid": 53, "ph": "B"},', // @suppress longLineCheck
- '{"name": "a", "args": {}, "pid": 52, "ts": 560, "cat": "foo", "tid": 53, "ph": "E"},' // @suppress longLineCheck
- ];
- var text = lines.join('\r\n');
-
- var m = new tracing.TraceModel(text);
- assertEquals(1, m.numProcesses);
- assertEquals(1, m.processes[52].threads[53].sliceGroup.length);
- });
-
- test('importOldFormat', function() {
- var lines = [
- '[',
- '{"cat":"a","pid":9,"tid":8,"ts":194,"ph":"E","name":"I","args":{}},',
- '{"cat":"b","pid":9,"tid":8,"ts":194,"ph":"B","name":"I","args":{}}',
- ']'
- ];
- var text = lines.join('\n');
- var m = new tracing.TraceModel(text);
- assertEquals(1, m.numProcesses);
- assertEquals(1, m.processes[9].threads[8].sliceGroup.length);
- });
-
- test('startFinishOneSliceOneThread', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'a', args: {}, pid: 52, ts: 560, cat: 'cat', tid: 53,
- ph: 'F', id: 72},
- {name: 'a', pid: 52, ts: 524, cat: 'cat', tid: 53,
- ph: 'S', id: 72, args: {'foo': 'bar'}}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.asyncSliceGroup.slices.length);
- assertEquals('a', t.asyncSliceGroup.slices[0].title);
- assertEquals('cat', t.asyncSliceGroup.slices[0].category);
- assertEquals(72, t.asyncSliceGroup.slices[0].id);
- assertEquals('bar', t.asyncSliceGroup.slices[0].args.foo);
- assertEquals(0, t.asyncSliceGroup.slices[0].start);
- assertAlmostEquals((60 - 24) / 1000, t.asyncSliceGroup.slices[0].duration);
- assertEquals(t, t.asyncSliceGroup.slices[0].startThread);
- assertEquals(t, t.asyncSliceGroup.slices[0].endThread);
- });
-
- test('endArgsAddedToSlice', function() {
- var events = [
- {name: 'a', args: {x: 1}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'a', args: {y: 2}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.sliceGroup.length);
- assertEquals(53, t.tid);
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertEquals(0, slice.subSlices.length);
- assertEquals(1, slice.args['x']);
- assertEquals(2, slice.args['y']);
- });
-
- test('endArgOverrwritesOriginalArgValueIfDuplicated', function() {
- var events = [
- {name: 'b', args: {z: 3}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'B'},
- {name: 'b', args: {z: 4}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- var slice = t.sliceGroup.slices[0];
- assertEquals('b', slice.title);
- assertEquals('foo', slice.category);
- assertEquals(0, slice.start);
- assertEquals(0, slice.subSlices.length);
- assertEquals(4, slice.args['z']);
- });
-
- test('asyncEndArgsAddedToSlice', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'c', args: {y: 2}, pid: 52, ts: 560, cat: 'foo', tid: 53,
- ph: 'F', id: 72},
- {name: 'c', args: {x: 1}, pid: 52, ts: 524, cat: 'foo', tid: 53,
- ph: 'S', id: 72}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.asyncSliceGroup.slices.length);
- var parentSlice = t.asyncSliceGroup.slices[0];
- assertEquals('c', parentSlice.title);
- assertEquals('foo', parentSlice.category);
-
- assertNotUndefined(parentSlice.subSlices);
- assertEquals(1, parentSlice.subSlices.length);
- var subSlice = parentSlice.subSlices[0];
- assertEquals(1, subSlice.args['x']);
- assertEquals(2, subSlice.args['y']);
- });
-
- test('asyncEndArgOverrwritesOriginalArgValueIfDuplicated', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'd', args: {z: 4}, pid: 52, ts: 560, cat: 'foo', tid: 53,
- ph: 'F', id: 72},
- {name: 'd', args: {z: 3}, pid: 52, ts: 524, cat: 'foo', tid: 53,
- ph: 'S', id: 72}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.asyncSliceGroup.slices.length);
- var parentSlice = t.asyncSliceGroup.slices[0];
- assertEquals('d', parentSlice.title);
- assertEquals('foo', parentSlice.category);
-
- assertNotUndefined(parentSlice.subSlices);
- assertEquals(1, parentSlice.subSlices.length);
- var subSlice = parentSlice.subSlices[0];
- assertEquals(4, subSlice.args['z']);
- });
-
- test('asyncStepsInOneThread', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'a', args: {z: 3}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'F', id: 72}, // @suppress longLineCheck
- {name: 'a', args: {step: 's1', y: 2}, pid: 52, ts: 548, cat: 'foo', tid: 53, ph: 'T', id: 72}, // @suppress longLineCheck
- {name: 'a', args: {x: 1}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'S', id: 72} // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.asyncSliceGroup.slices.length);
- var parentSlice = t.asyncSliceGroup.slices[0];
- assertEquals('a', parentSlice.title);
- assertEquals('foo', parentSlice.category);
- assertEquals(0, parentSlice.start);
-
- assertNotUndefined(parentSlice.subSlices);
- assertEquals(2, parentSlice.subSlices.length);
- var subSlice = parentSlice.subSlices[0];
- assertEquals('a', subSlice.title);
- assertEquals('foo', subSlice.category);
- assertEquals(0, subSlice.start);
- assertAlmostEquals((548 - 524) / 1000, subSlice.duration);
- assertEquals(1, subSlice.args['x']);
-
- var subSlice = parentSlice.subSlices[1];
- assertEquals('a:s1', subSlice.title);
- assertEquals('foo', subSlice.category);
- assertAlmostEquals((548 - 524) / 1000, subSlice.start);
- assertAlmostEquals((560 - 548) / 1000, subSlice.duration);
- assertEquals(1, subSlice.args['x']);
- assertEquals(2, subSlice.args['y']);
- assertEquals(3, subSlice.args['z']);
- });
-
- test('asyncStepsMissingStart', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'a', args: {z: 3}, pid: 52, ts: 560, cat: 'foo', tid: 53,
- ph: 'F', id: 72},
- {name: 'a', args: {step: 's1', y: 2}, pid: 52, ts: 548, cat: 'foo',
- tid: 53, ph: 'T', id: 72}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertUndefined(t);
- });
-
- test('asyncStepsMissingFinish', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'a', args: {step: 's1', y: 2}, pid: 52, ts: 548, cat: 'foo',
- tid: 53, ph: 'T', id: 72},
- {name: 'a', args: {z: 3}, pid: 52, ts: 560, cat: 'foo', tid: 53,
- ph: 'S', id: 72}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertUndefined(t);
- });
-
- test('asyncStepEndEvent', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'a', args: {z: 3}, pid: 52, ts: 560, cat: 'foo', tid: 53,
- ph: 'F', id: 72},
- {name: 'a', args: {step: 's1', y: 2}, pid: 52, ts: 548, cat: 'foo',
- tid: 53, ph: 'p', id: 72},
- {name: 'a', args: {x: 1}, pid: 52, ts: 524, cat: 'foo', tid: 53,
- ph: 'S', id: 72}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertNotUndefined(t);
- assertEquals(1, t.asyncSliceGroup.slices.length);
- var parentSlice = t.asyncSliceGroup.slices[0];
- assertEquals('a', parentSlice.title);
- assertEquals('foo', parentSlice.category);
- assertEquals(0, parentSlice.start);
-
- assertNotUndefined(parentSlice.subSlices);
- assertEquals(2, parentSlice.subSlices.length);
- var subSlice = parentSlice.subSlices[0];
- assertEquals('a:s1', subSlice.title);
- assertEquals('foo', subSlice.category);
- assertEquals(0, subSlice.start);
- assertAlmostEquals((548 - 524) / 1000, subSlice.duration);
- assertEquals(1, subSlice.args['x']);
- assertEquals(2, subSlice.args['y']);
-
- var subSlice = parentSlice.subSlices[1];
- assertEquals('a', subSlice.title);
- assertEquals('foo', subSlice.category);
- assertAlmostEquals((548 - 524) / 1000, subSlice.start);
- assertAlmostEquals((560 - 548) / 1000, subSlice.duration);
- assertEquals(1, subSlice.args['x']);
- assertEquals(3, subSlice.args['z']);
- });
-
- test('asyncStepMismatch', function() {
- var events = [
- // Time is intentionally out of order.
- {name: 'a', args: {z: 3}, pid: 52, ts: 560, cat: 'foo', tid: 53,
- ph: 'F', id: 72},
- {name: 'a', args: {step: 's2'}, pid: 52, ts: 548, cat: 'foo', tid: 53,
- ph: 'T', id: 72},
- {name: 'a', args: {step: 's1'}, pid: 52, ts: 548, cat: 'foo', tid: 53,
- ph: 'p', id: 72},
- {name: 'a', args: {x: 1}, pid: 52, ts: 524, cat: 'foo', tid: 53,
- ph: 'S', id: 72}
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
- assertUndefined(t);
- assertTrue(m.hasImportWarnings);
- });
-
- test('importSamples', function() {
- var events = [
- {name: 'a', args: {}, pid: 52, ts: 548, cat: 'test', tid: 53, ph: 'P'},
- {name: 'b', args: {}, pid: 52, ts: 548, cat: 'test', tid: 53, ph: 'P'},
- {name: 'c', args: {}, pid: 52, ts: 558, cat: 'test', tid: 53, ph: 'P'}
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[52];
- assertNotUndefined(p);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(3, t.samples_.length);
- assertEquals(0.0, t.samples_[0].start);
- assertEquals(0.0, t.samples_[1].start);
- assertApproxEquals(0.01, t.samples_[2].start);
- assertEquals('a', t.samples_[0].title);
- assertEquals('b', t.samples_[1].title);
- assertEquals('c', t.samples_[2].title);
- assertFalse(m.hasImportWarnings);
- });
-
- test('importSamplesMissingArgs', function() {
- var events = [
- {name: 'a', pid: 52, ts: 548, cat: 'test', tid: 53, ph: 'P'},
- {name: 'b', pid: 52, ts: 548, cat: 'test', tid: 53, ph: 'P'},
- {name: 'c', pid: 52, ts: 549, cat: 'test', tid: 53, ph: 'P'}
- ];
- var m = new tracing.TraceModel(events);
- var p = m.processes[52];
- assertNotUndefined(p);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertNotUndefined(t);
- assertEquals(3, t.samples_.length);
- assertFalse(m.hasImportWarnings);
- });
-
- test('importSimpleObject', function() {
- var events = [
- {ts: 10000, pid: 1, tid: 1, ph: 'N', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: {snapshot: 15}}, // @suppress longLineCheck
- {ts: 20000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: {snapshot: 20}}, // @suppress longLineCheck
- {ts: 50000, pid: 1, tid: 1, ph: 'D', cat: 'c', id: '0x1000', name: 'a', args: {}} // @suppress longLineCheck
- ];
- var m = new tracing.TraceModel();
- m.importTraces([events], false);
- assertEquals(10, m.bounds.min);
- assertEquals(50, m.bounds.max);
- assertFalse(m.hasImportWarnings);
-
- var p = m.processes[1];
- assertNotUndefined(p);
-
- var i10 = p.objects.getObjectInstanceAt('0x1000', 10);
- assertEquals('c', i10.category);
- assertEquals(10, i10.creationTs);
- assertEquals(50, i10.deletionTs);
- assertEquals(2, i10.snapshots.length);
-
- var s15 = i10.snapshots[0];
- assertEquals(15, s15.ts);
- assertEquals(15, s15.args);
-
- var s20 = i10.snapshots[1];
- assertEquals(20, s20.ts);
- assertEquals(20, s20.args);
- });
-
- test('importImplicitObjects', function() {
- var events = [
- {ts: 10000, pid: 1, tid: 1, ph: 'N', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a',
- args: { snapshot: [
- { id: 'subObject/0x1',
- foo: 1
- }
- ]}},
- {ts: 20000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a',
- args: { snapshot: [
- { id: 'subObject/0x1',
- foo: 2
- },
- { id: 'subObject/0x2',
- foo: 1
- }
- ]}}
- ];
-
- var m = new tracing.TraceModel();
- m.importTraces([events], false);
- var p1 = m.processes[1];
-
- var iA = p1.objects.getObjectInstanceAt('0x1000', 10);
- var subObjectInstances = p1.objects.getAllInstancesByTypeName()[
- 'subObject'];
-
- assertEquals(2, subObjectInstances.length);
- var subObject1 = p1.objects.getObjectInstanceAt('0x1', 15);
- assertEquals('subObject', subObject1.name);
- assertEquals(15, subObject1.creationTs);
-
- assertEquals(2, subObject1.snapshots.length);
- assertEquals(15, subObject1.snapshots[0].ts);
- assertEquals(1, subObject1.snapshots[0].args.foo);
- assertEquals(20, subObject1.snapshots[1].ts);
- assertEquals(2, subObject1.snapshots[1].args.foo);
-
- var subObject2 = p1.objects.getObjectInstanceAt('0x2', 20);
- assertEquals('subObject', subObject2.name);
- assertEquals(20, subObject2.creationTs);
- assertEquals(1, subObject2.snapshots.length);
- assertEquals(20, subObject2.snapshots[0].ts);
- });
-
- test('importImplicitObjectWithCategoryOverride', function() {
- var events = [
- {ts: 10000, pid: 1, tid: 1, ph: 'N', cat: 'cat', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'otherCat', id: '0x1000', name: 'a', // @suppress longLineCheck
- args: { snapshot: [
- { id: 'subObject/0x1',
- cat: 'cat',
- foo: 1
- }
- ]}}
- ];
-
- var m = new tracing.TraceModel();
- m.importTraces([events], false);
- var p1 = m.processes[1];
-
- var iA = p1.objects.getObjectInstanceAt('0x1000', 10);
- var subObjectInstances = p1.objects.getAllInstancesByTypeName()[
- 'subObject'];
-
- assertEquals(1, subObjectInstances.length);
- });
-
- test('importIDRefs', function() {
- var events = [
- // An object with two snapshots.
- {ts: 10000, pid: 1, tid: 1, ph: 'N', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: {snapshot: 15}}, // @suppress longLineCheck
- {ts: 20000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: {snapshot: 20}}, // @suppress longLineCheck
- {ts: 50000, pid: 1, tid: 1, ph: 'D', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
-
- // A slice that references the object.
- {ts: 17000, pid: 1, tid: 1, ph: 'B', cat: 'c', name: 'taskSlice', args: {my_object: {id_ref: '0x1000'}}}, // @suppress longLineCheck
- {ts: 17500, pid: 1, tid: 1, ph: 'E', cat: 'c', name: 'taskSlice', args: {}} // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel();
- m.importTraces([events], false);
- var p1 = m.processes[1];
-
- var iA = p1.objects.getObjectInstanceAt('0x1000', 10);
- var s15 = iA.getSnapshotAt(15);
-
- var taskSlice = p1.threads[1].sliceGroup.slices[0];
- assertEquals(s15, taskSlice.args.my_object);
- });
-
- test('importIDRefsThatPointAtEachOther', function() {
- var events = [
- // An object.
- {ts: 10000, pid: 1, tid: 1, ph: 'N', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: { // @suppress longLineCheck
- snapshot: { x: {
- id: 'foo/0x1001',
- value: 'bar'
- }}}},
- {ts: 50000, pid: 1, tid: 1, ph: 'D', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
-
- // A slice that references the object.
- {ts: 17000, pid: 1, tid: 1, ph: 'B', cat: 'c', name: 'taskSlice', args: {my_object: {id_ref: '0x1001'}}}, // @suppress longLineCheck
- {ts: 17500, pid: 1, tid: 1, ph: 'E', cat: 'c', name: 'taskSlice', args: {}} // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel();
- m.importTraces([events], false);
- var p1 = m.processes[1];
-
- var iA = p1.objects.getObjectInstanceAt('0x1000', 15);
- var iFoo = p1.objects.getObjectInstanceAt('0x1001', 15);
- assertNotUndefined(iA);
- assertNotUndefined(iFoo);
-
- var a15 = iA.getSnapshotAt(15);
- var foo15 = iFoo.getSnapshotAt(15);
-
- var taskSlice = p1.threads[1].sliceGroup.slices[0];
- assertEquals(foo15, taskSlice.args.my_object);
- });
-
- test('importArrayWithIDs', function() {
- var events = [
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: { // @suppress longLineCheck
- snapshot: { x: [
- {id: 'foo/0x1001', value: 'bar1'},
- {id: 'foo/0x1002', value: 'bar2'},
- {id: 'foo/0x1003', value: 'bar3'}
- ]}}}
- ];
-
- var m = new tracing.TraceModel();
- m.importTraces([events], false);
- var p1 = m.processes[1];
-
- var sA = p1.objects.getSnapshotAt('0x1000', 15);
- assertTrue(sA.args.x instanceof Array);
- assertEquals(3, sA.args.x.length);
- assertTrue(sA.args.x[0] instanceof tracing.trace_model.ObjectSnapshot);
- assertTrue(sA.args.x[1] instanceof tracing.trace_model.ObjectSnapshot);
- assertTrue(sA.args.x[2] instanceof tracing.trace_model.ObjectSnapshot);
- });
-
- test('importDoesNotMutateEventList', function() {
- var events = [
- // An object.
- {ts: 10000, pid: 1, tid: 1, ph: 'N', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
- {ts: 15000, pid: 1, tid: 1, ph: 'O', cat: 'c', id: '0x1000', name: 'a', args: { // @suppress longLineCheck
- snapshot: {foo: 15}}},
- {ts: 50000, pid: 1, tid: 1, ph: 'D', cat: 'c', id: '0x1000', name: 'a', args: {}}, // @suppress longLineCheck
-
- // A slice that references the object.
- {ts: 17000, pid: 1, tid: 1, ph: 'B', cat: 'c', name: 'taskSlice', args: {
- my_object: {id_ref: '0x1000'}}
- },
- {ts: 17500, pid: 1, tid: 1, ph: 'E', cat: 'c', name: 'taskSlice', args: {}} // @suppress longLineCheck
- ];
-
- // The A type family exists to mutate the args list provided to
- // snapshots.
- function ASnapshot() {
- tracing.trace_model.ObjectSnapshot.apply(this, arguments);
- this.args.foo = 7;
- }
- ASnapshot.prototype = {
- __proto__: tracing.trace_model.ObjectSnapshot.prototype
- };
-
- // Import event while the A types are registered, causing the
- // arguments of the snapshots to be mutated.
- var m = new tracing.TraceModel();
- try {
- tracing.trace_model.ObjectSnapshot.register('a', ASnapshot);
- m.importTraces([events], false);
- } finally {
- tracing.trace_model.ObjectSnapshot.unregister('a');
- }
- assertFalse(m.hasImportWarnings);
-
- // Verify that the events array wasn't modified.
- assertObjectEquals(
- events[1].args,
- {snapshot: {foo: 15}});
- assertObjectEquals(
- events[3].args,
- {my_object: {id_ref: '0x1000'}});
- });
-
- test('importFlowEvent', function() {
- var events = [
- { name: 'a', cat: 'foo', id: 72, pid: 52, tid: 53, ts: 548, ph: 's', args: {} }, // @suppress longLineCheck
- { name: 'a', cat: 'foo', id: 72, pid: 52, tid: 53, ts: 560, ph: 't', args: {} }, // @suppress longLineCheck
- { name: 'a', cat: 'foo', id: 72, pid: 52, tid: 53, ts: 580, ph: 'f', args: {} } // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel(events);
- var t = m.processes[52].threads[53];
-
- assertNotUndefined(t);
- assertEquals(3, t.sliceGroup.slices.length);
- assertEquals(2, m.flowEvents.length);
-
- var start = m.flowEvents[0][0];
- var step = m.flowEvents[0][1];
- var finish = m.flowEvents[1][1];
-
- assertEquals('a', start.title);
- assertEquals('foo', start.category);
- assertEquals(72, start.id);
- assertEquals(0, start.start);
- assertEquals(0, start.duration);
-
- assertEquals(start.title, step.title);
- assertEquals(start.category, step.category);
- assertEquals(start.id, step.id);
- assertAlmostEquals(12 / 1000, step.start);
- assertEquals(0, step.duration);
-
- assertEquals(start.title, finish.title);
- assertEquals(start.category, finish.category);
- assertEquals(start.id, finish.id);
- assertAlmostEquals((20 + 12) / 1000, finish.start);
- assertEquals(0, finish.duration);
-
- assertEquals(2, m.flowIntervalTree.size);
- });
-
- test('importOutOfOrderFlowEvent', function() {
- var events = [
- { name: 'a', cat: 'foo', id: 72, pid: 52, tid: 53, ts: 548, ph: 's', args: {} }, // @suppress longLineCheck
- { name: 'b', cat: 'foo', id: 73, pid: 52, tid: 53, ts: 148, ph: 's', args: {} }, // @suppress longLineCheck
- { name: 'b', cat: 'foo', id: 73, pid: 52, tid: 53, ts: 570, ph: 'f', args: {} }, // @suppress longLineCheck
- { name: 'a', cat: 'foo', id: 72, pid: 52, tid: 53, ts: 560, ph: 't', args: {} }, // @suppress longLineCheck
- { name: 'a', cat: 'foo', id: 72, pid: 52, tid: 53, ts: 580, ph: 'f', args: {} } // @suppress longLineCheck
- ];
-
- var expected = [0.4, 0.0, 0.412];
- var m = new tracing.TraceModel(events);
- assertEquals(3, m.flowIntervalTree.size);
-
- var order = m.flowEvents.map(function(x) { return x[0].start });
- for (var i = 0; i < expected.length; ++i)
- assertAlmostEquals(expected[i], order[i]);
- });
-
- test('importCompleteEvent', function() {
- var events = [
- { name: 'a', args: {}, pid: 52, ts: 629, dur: 1, cat: 'baz', tid: 53, ph: 'X' }, // @suppress longLineCheck
- { name: 'b', args: {}, pid: 52, ts: 730, dur: 20, cat: 'foo', tid: 53, ph: 'X' }, // @suppress longLineCheck
- { name: 'c', args: {}, pid: 52, ts: 740, cat: 'baz', tid: 53, ph: 'X' }
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(3, t.sliceGroup.slices.length);
- assertEquals(53, t.tid);
-
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('baz', slice.category);
- assertAlmostEquals(0, slice.start);
- assertAlmostEquals(1 / 1000, slice.duration);
- assertEquals(0, slice.subSlices.length);
-
- slice = t.sliceGroup.slices[1];
- assertEquals('b', slice.title);
- assertEquals('foo', slice.category);
- assertAlmostEquals((730 - 629) / 1000, slice.start);
- assertAlmostEquals(20 / 1000, slice.duration);
- assertEquals(1, slice.subSlices.length);
-
- slice = t.sliceGroup.slices[2];
- assertEquals('c', slice.title);
- assertTrue(slice.didNotFinish);
- assertAlmostEquals(10 / 1000, slice.duration);
- });
-
- test('importCompleteEventWithThreadDuration', function() {
- var events = [
- { name: 'a', args: {}, pid: 52, ts: 629, dur: 1, cat: 'baz', tid: 53, ph: 'X', tts: 12, tdur: 1 }, // @suppress longLineCheck
- { name: 'b', args: {}, pid: 52, ts: 730, dur: 20, cat: 'foo', tid: 53, ph: 'X', tts: 110, tdur: 16 }, // @suppress longLineCheck
- { name: 'c', args: {}, pid: 52, ts: 740, cat: 'baz', tid: 53, ph: 'X', tts: 115 } // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel(events);
- assertEquals(1, m.numProcesses);
- var p = m.processes[52];
- assertNotUndefined(p);
-
- assertEquals(1, p.numThreads);
- var t = p.threads[53];
- assertNotUndefined(t);
- assertEquals(3, t.sliceGroup.slices.length);
- assertEquals(53, t.tid);
-
- var slice = t.sliceGroup.slices[0];
- assertEquals('a', slice.title);
- assertEquals('baz', slice.category);
- assertAlmostEquals(0, slice.start);
- assertAlmostEquals(1 / 1000, slice.duration);
- assertAlmostEquals(12 / 1000, slice.threadStart);
- assertAlmostEquals(1 / 1000, slice.threadDuration);
- assertEquals(0, slice.subSlices.length);
-
- slice = t.sliceGroup.slices[1];
- assertEquals('b', slice.title);
- assertEquals('foo', slice.category);
- assertAlmostEquals((730 - 629) / 1000, slice.start);
- assertAlmostEquals(20 / 1000, slice.duration);
- assertAlmostEquals(110 / 1000, slice.threadStart);
- assertAlmostEquals(16 / 1000, slice.threadDuration);
- assertEquals(1, slice.subSlices.length);
-
- slice = t.sliceGroup.slices[2];
- assertEquals('c', slice.title);
- assertTrue(slice.didNotFinish);
- assertAlmostEquals(10 / 1000, slice.duration);
- });
-
- test('importNestedCompleteEventWithTightBounds', function() {
- var events = [
- { name: 'a', args: {}, pid: 52, ts: 244654227065, dur: 36075, cat: 'baz', tid: 53, ph: 'X' }, // @suppress longLineCheck
- { name: 'b', args: {}, pid: 52, ts: 244654227095, dur: 36045, cat: 'foo', tid: 53, ph: 'X' } // @suppress longLineCheck
- ];
-
- var m = new tracing.TraceModel(events, false);
- var t = m.processes[52].threads[53];
-
- var sA = findSliceNamed(t.sliceGroup, 'a');
- var sB = findSliceNamed(t.sliceGroup, 'b');
-
- assertEquals('a', sA.title);
- assertEquals('baz', sA.category);
- assertEquals(244654227.065, sA.start);
- assertEquals(36.075, sA.duration);
- assertAlmostEquals(0.03, sA.selfTime);
-
- assertEquals('b', sB.title);
- assertEquals('foo', sB.category);
- assertEquals(244654227.095, sB.start);
- assertEquals(36.045, sB.duration);
-
- assertTrue(sA.subSlices.length == 1);
- assertTrue(sA.subSlices[0] == sB);
- assertTrue(sB.parentSlice == sA);
- });
-
- // TODO(nduca): one slice, two threads
- // TODO(nduca): one slice, two pids
-
-});