| Index: tools/telemetry/telemetry/core/timeline/tracing/trace_event_importer_unittest.py
|
| diff --git a/tools/telemetry/telemetry/core/timeline/tracing/trace_event_importer_unittest.py b/tools/telemetry/telemetry/core/timeline/tracing/trace_event_importer_unittest.py
|
| deleted file mode 100644
|
| index 52de6c5c8e2d8eb532b2f6354651b45d643ada45..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/core/timeline/tracing/trace_event_importer_unittest.py
|
| +++ /dev/null
|
| @@ -1,930 +0,0 @@
|
| -# Copyright 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.
|
| -
|
| -import json
|
| -import unittest
|
| -
|
| -from telemetry.core.timeline.tracing import trace_event_importer
|
| -import telemetry.core.timeline.model as timeline_model
|
| -import telemetry.core.timeline.tracing.counter as tracing_counter
|
| -import telemetry.core.timeline.tracing.process as tracing_process
|
| -import telemetry.core.timeline.tracing.thread as tracing_thread
|
| -
|
| -def FindEventNamed(events, name):
|
| - for event in events:
|
| - if event.name == name:
|
| - return event
|
| - raise ValueError('No event found with name %s' % name)
|
| -
|
| -def GetAllProcesses(model):
|
| - return [e for e in model.GetRootEvents() if isinstance(
|
| - e, tracing_process.Process)]
|
| -
|
| -def GetAllThreads(model):
|
| - return [e for e in model.GetAllEvents() if isinstance(
|
| - e, tracing_thread.Thread)]
|
| -
|
| -class TraceEventTimelineImporterTest(unittest.TestCase):
|
| - def testCanImportEmpty(self):
|
| - self.assertFalse(
|
| - trace_event_importer.TraceEventTimelineImporter.CanImport([]))
|
| - self.assertFalse(
|
| - trace_event_importer.TraceEventTimelineImporter.CanImport(''))
|
| -
|
| - def testBasicSingleThreadNonnestedParsing(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - p = processes[0]
|
| - self.assertEqual(52, p.pid)
|
| -
|
| - self.assertEqual(1, len(p.threads))
|
| - t = p.GetThreadWithId(53)
|
| - self.assertEqual(2, len(t.slices))
|
| - self.assertEqual(53, t.tid)
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertAlmostEqual(0, slice_event.start)
|
| - self.assertAlmostEqual((560 - 520) / 1000.0, slice_event.duration)
|
| - self.assertEqual(0, len(slice_event.children))
|
| -
|
| - slice_event = t.slices[1]
|
| - self.assertEqual('b', slice_event.name)
|
| - self.assertEqual('bar', slice_event.category)
|
| - self.assertAlmostEqual((629 - 520) / 1000.0, slice_event.start)
|
| - self.assertAlmostEqual((631 - 629) / 1000.0, slice_event.duration)
|
| - self.assertEqual(0, len(slice_event.children))
|
| -
|
| - def testArgumentDupeCreatesNonFailingImportError(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - t = processes[0].GetThreadWithId(1)
|
| - slice_a = FindEventNamed(t.slices, 'a')
|
| -
|
| - self.assertEqual(2, slice_a.args['x'])
|
| - self.assertEqual(1, len(m.import_errors))
|
| -
|
| - def testCategoryBeginEndMismatchPreferslice_begin(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - p = processes[0]
|
| - self.assertEqual(52, p.pid)
|
| -
|
| - self.assertEqual(1, len(p.threads))
|
| - t = p.GetThreadWithId(53)
|
| - self.assertEqual(1, len(t.slices))
|
| - self.assertEqual(53, t.tid)
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| -
|
| - def testNestedParsing(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(1)
|
| -
|
| - slice_a = FindEventNamed(t.slices, 'a')
|
| - slice_b = FindEventNamed(t.slices, 'b')
|
| -
|
| - self.assertEqual('a', slice_a.name)
|
| - self.assertEqual('foo', slice_a.category)
|
| - self.assertAlmostEqual(0.001, slice_a.start)
|
| - self.assertAlmostEqual(0.003, slice_a.duration)
|
| -
|
| - self.assertEqual('b', slice_b.name)
|
| - self.assertEqual('bar', slice_b.category)
|
| - self.assertAlmostEqual(0.002, slice_b.start)
|
| - self.assertAlmostEqual(0.001, slice_b.duration)
|
| -
|
| - def testAutoclosing(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(1)
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertTrue(slice_event.did_not_finish)
|
| - self.assertAlmostEqual(0, slice_event.start)
|
| - self.assertAlmostEqual((2 - 1) / 1000.0, slice_event.duration)
|
| -
|
| - def testAutoclosingLoneBegin(self):
|
| - events = [
|
| - # Slice that doesn't finish.
|
| - {'name': 'a', 'args': {}, 'pid': 1, 'ts': 1, 'cat': 'foo',
|
| - 'tid': 1, 'ph': 'B'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(1)
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertTrue(slice_event.did_not_finish)
|
| - self.assertAlmostEqual(0, slice_event.start)
|
| - self.assertAlmostEqual(0, slice_event.duration)
|
| -
|
| - def testAutoclosingWithSubTasks(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(1)
|
| -
|
| - slice_a = FindEventNamed(t.slices, 'a')
|
| - slice_b1 = FindEventNamed(t.slices, 'b1')
|
| - slice_b2 = FindEventNamed(t.slices, 'b2')
|
| -
|
| - self.assertAlmostEqual(0.003, slice_a.end)
|
| - self.assertAlmostEqual(0.003, slice_b1.end)
|
| - self.assertAlmostEqual(0.003, slice_b2.end)
|
| -
|
| - def testAutoclosingWithEventsOutsideBounds(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(1)
|
| - self.assertEqual(2, len(t.slices))
|
| -
|
| - slice_event = FindEventNamed(t.slices, 'a')
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertAlmostEqual(0, slice_event.start)
|
| - self.assertAlmostEqual(0.003, slice_event.duration)
|
| -
|
| - t2 = p.GetThreadWithId(2)
|
| - slice2 = FindEventNamed(t2.slices, 'c')
|
| - self.assertEqual('c', slice2.name)
|
| - self.assertEqual('bar', slice2.category)
|
| - self.assertAlmostEqual(0.001, slice2.start)
|
| - self.assertAlmostEqual(0.001, slice2.duration)
|
| -
|
| - self.assertAlmostEqual(0.000, p.start)
|
| - self.assertAlmostEqual(0.003, p.end)
|
| -
|
| - self.assertAlmostEqual(0.000, m.min_timestamp)
|
| - self.assertAlmostEqual(0.003, m.max_timestamp)
|
| -
|
| - def testNestedAutoclosing(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - t1 = GetAllProcesses(m)[0].GetThreadWithId(1)
|
| - t2 = GetAllProcesses(m)[0].GetThreadWithId(2)
|
| -
|
| - slice_a1 = FindEventNamed(t1.slices, 'a1')
|
| - slice_a2 = FindEventNamed(t1.slices, 'a2')
|
| - FindEventNamed(t2.slices, 'b')
|
| -
|
| - self.assertAlmostEqual(0.002, slice_a1.end)
|
| - self.assertAlmostEqual(0.002, slice_a2.end)
|
| -
|
| - def testMultipleThreadParsing(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - p = processes[0]
|
| -
|
| - self.assertEqual(2, len(p.threads))
|
| -
|
| - # Check thread 1.
|
| - t = p.GetThreadWithId(1)
|
| - self.assertAlmostEqual(1, len(t.slices))
|
| - self.assertAlmostEqual(1, t.tid)
|
| -
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertAlmostEqual(0, slice_event.start)
|
| - self.assertAlmostEqual((2 - 1) / 1000.0, slice_event.duration)
|
| -
|
| - # Check thread 2.
|
| - t = p.GetThreadWithId(2)
|
| - self.assertAlmostEqual(1, len(t.slices))
|
| - self.assertAlmostEqual(2, t.tid)
|
| -
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('b', slice_event.name)
|
| - self.assertEqual('bar', slice_event.category)
|
| - self.assertAlmostEqual((3 - 1) / 1000.0, slice_event.start)
|
| - self.assertAlmostEqual((4 - 3) / 1000.0, slice_event.duration)
|
| -
|
| - def testMultiplePidParsing(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(2, len(processes))
|
| -
|
| - p = processes[0]
|
| - self.assertEqual(1, p.pid)
|
| - self.assertEqual(1, len(p.threads))
|
| -
|
| - # Check process 1 thread 1.
|
| - t = p.GetThreadWithId(1)
|
| - self.assertEqual(1, len(t.slices))
|
| - self.assertEqual(1, t.tid)
|
| -
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertAlmostEqual(0, slice_event.start)
|
| - self.assertAlmostEqual((2 - 1) / 1000.0, slice_event.duration)
|
| -
|
| - # Check process 2 thread 2.
|
| - # TODO: will this be in deterministic order?
|
| - p = processes[1]
|
| - self.assertEqual(2, p.pid)
|
| - self.assertEqual(1, len(p.threads))
|
| - t = p.GetThreadWithId(2)
|
| - self.assertEqual(1, len(t.slices))
|
| - self.assertEqual(2, t.tid)
|
| -
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('b', slice_event.name)
|
| - self.assertEqual('bar', slice_event.category)
|
| - self.assertAlmostEqual((3 - 1) / 1000.0, slice_event.start)
|
| - self.assertAlmostEqual((4 - 3) / 1000.0, slice_event.duration)
|
| -
|
| - # Check getAllThreads.
|
| - self.assertEqual([processes[0].GetThreadWithId(1),
|
| - processes[1].GetThreadWithId(2)],
|
| - GetAllThreads(m))
|
| -
|
| - def testThreadNames(self):
|
| - events = [
|
| - {'name': 'thread_name', 'args': {'name': 'Thread 1'},
|
| - 'pid': 1, 'ts': 0, 'tid': 1, 'ph': 'M'},
|
| - {'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': 'foo',
|
| - 'tid': 2, 'ph': 'B'},
|
| - {'name': 'b', 'args': {}, 'pid': 2, 'ts': 4, 'cat': 'foo',
|
| - 'tid': 2, 'ph': 'E'},
|
| - {'name': 'thread_name', 'args': {'name': 'Thread 2'},
|
| - 'pid': 2, 'ts': 0, 'tid': 2, 'ph': 'M'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual('Thread 1', processes[0].GetThreadWithId(1).name)
|
| - self.assertEqual('Thread 2', processes[1].GetThreadWithId(2).name)
|
| -
|
| - def testParsingWhenEndComesFirst(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(1)
|
| - self.assertEqual(1, len(t.slices))
|
| - self.assertEqual('a', t.slices[0].name)
|
| - self.assertEqual('foo', t.slices[0].category)
|
| - self.assertEqual(0.004, t.slices[0].start)
|
| - self.assertEqual(0.001, t.slices[0].duration)
|
| - self.assertEqual(1, len(m.import_errors))
|
| -
|
| - def testImmediateParsing(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(1)
|
| - self.assertEqual(3, len(t.slices))
|
| - self.assertAlmostEqual(0.002, t.slices[0].start)
|
| - self.assertAlmostEqual(0, t.slices[0].duration)
|
| - self.assertAlmostEqual(0.004, t.slices[1].start)
|
| - self.assertAlmostEqual(0.001, t.slices[2].start)
|
| - self.assertAlmostEqual(0.003, t.slices[2].duration)
|
| -
|
| - slice_event = FindEventNamed(t.slices, 'a')
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertEqual(0.003, slice_event.duration)
|
| -
|
| - immed = FindEventNamed(t.slices, 'immediate')
|
| - self.assertEqual('immediate', immed.name)
|
| - self.assertEqual('bar', immed.category)
|
| - self.assertAlmostEqual(0.002, immed.start)
|
| - self.assertAlmostEqual(0, immed.duration)
|
| -
|
| - slower = FindEventNamed(t.slices, 'slower')
|
| - self.assertEqual('slower', slower.name)
|
| - self.assertEqual('baz', slower.category)
|
| - self.assertAlmostEqual(0.004, slower.start)
|
| - self.assertAlmostEqual(0, slower.duration)
|
| -
|
| - def testSimpleCounter(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - ctr = p.counters['foo.ctr']
|
| -
|
| - self.assertEqual('ctr', ctr.name)
|
| - self.assertEqual('foo', ctr.category)
|
| - self.assertEqual(3, ctr.num_samples)
|
| - self.assertEqual(1, ctr.num_series)
|
| -
|
| - self.assertEqual(['value'], ctr.series_names)
|
| - self.assertEqual([0, 0.01, 0.02], ctr.timestamps)
|
| - self.assertEqual([0, 10, 0], ctr.samples)
|
| - self.assertEqual([0, 10, 0], ctr.totals)
|
| - self.assertEqual(10, ctr.max_total)
|
| -
|
| - def testInstanceCounter(self):
|
| - 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}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - ctr = p.counters['foo.ctr[0]']
|
| - self.assertEqual('ctr[0]', ctr.name)
|
| - self.assertEqual('foo', ctr.category)
|
| - self.assertEqual(2, ctr.num_samples)
|
| - self.assertEqual(1, ctr.num_series)
|
| - self.assertEqual([0, 0.01], ctr.timestamps)
|
| - self.assertEqual([0, 10], ctr.samples)
|
| -
|
| - ctr = GetAllProcesses(m)[0].counters['foo.ctr[1]']
|
| - self.assertEqual('ctr[1]', ctr.name)
|
| - self.assertEqual('foo', ctr.category)
|
| - self.assertEqual(3, ctr.num_samples)
|
| - self.assertEqual(1, ctr.num_series)
|
| - self.assertEqual([0.01, 0.015, 0.018], ctr.timestamps)
|
| - self.assertEqual([10, 20, 30], ctr.samples)
|
| -
|
| - ctr = GetAllProcesses(m)[0].counters['bar.ctr[2]']
|
| - self.assertEqual('ctr[2]', ctr.name)
|
| - self.assertEqual('bar', ctr.category)
|
| - self.assertEqual(1, ctr.num_samples)
|
| - self.assertEqual(1, ctr.num_series)
|
| - self.assertEqual([0.02], ctr.timestamps)
|
| - self.assertEqual([40], ctr.samples)
|
| -
|
| - def testMultiCounterUpdateBounds(self):
|
| - ctr = tracing_counter.Counter(None, 'testBasicCounter',
|
| - 'testBasicCounter')
|
| - ctr.series_names = ['value1', 'value2']
|
| - ctr.timestamps = [0, 1, 2, 3, 4, 5, 6, 7]
|
| - ctr.samples = [0, 0,
|
| - 1, 0,
|
| - 1, 1,
|
| - 2, 1.1,
|
| - 3, 0,
|
| - 1, 7,
|
| - 3, 0,
|
| - 3.1, 0.5]
|
| - ctr.UpdateBounds()
|
| - self.assertEqual(0, ctr.min_timestamp)
|
| - self.assertEqual(7, ctr.max_timestamp)
|
| - self.assertEqual(8, ctr.max_total)
|
| - self.assertEqual([0, 0,
|
| - 1, 1,
|
| - 1, 2,
|
| - 2, 3.1,
|
| - 3, 3,
|
| - 1, 8,
|
| - 3, 3,
|
| - 3.1, 3.6], ctr.totals)
|
| -
|
| - def testMultiCounter(self):
|
| - events = [
|
| - {'name': 'ctr', 'args': {'value1': 0, 'value2': 7}, 'pid': 1, 'ts': 0,
|
| - 'cat': 'foo', 'tid': 1, 'ph': 'C'},
|
| - {'name': 'ctr', 'args': {'value1': 10, 'value2': 4}, 'pid': 1, 'ts': 10,
|
| - 'cat': 'foo', 'tid': 1, 'ph': 'C'},
|
| - {'name': 'ctr', 'args': {'value1': 0, 'value2': 1 }, 'pid': 1, 'ts': 20,
|
| - 'cat': 'foo', 'tid': 1, 'ph': 'C'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - ctr = p.counters['foo.ctr']
|
| - self.assertEqual('ctr', ctr.name)
|
| -
|
| - self.assertEqual('ctr', ctr.name)
|
| - self.assertEqual('foo', ctr.category)
|
| - self.assertEqual(3, ctr.num_samples)
|
| - self.assertEqual(2, ctr.num_series)
|
| -
|
| - self.assertEqual(sorted(['value1', 'value2']), sorted(ctr.series_names))
|
| - self.assertEqual(sorted([0, 0.01, 0.02]), sorted(ctr.timestamps))
|
| - self.assertEqual(sorted([0, 7, 10, 4, 0, 1]), sorted(ctr.samples))
|
| - # We can't check ctr.totals here because it can change depending on
|
| - # the order in which the series names are added.
|
| - self.assertEqual(14, ctr.max_total)
|
| -
|
| - def testImportObjectInsteadOfArray(self):
|
| - 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'}
|
| - ] }
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - self.assertEqual(1, len(GetAllProcesses(m)))
|
| -
|
| - def testImportString(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=json.dumps(events))
|
| - self.assertEqual(1, len(GetAllProcesses(m)))
|
| -
|
| - def testImportStringWithTrailingNewLine(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=json.dumps(events) + '\n')
|
| - self.assertEqual(1, len(GetAllProcesses(m)))
|
| -
|
| - def testImportStringWithMissingCloseSquareBracket(self):
|
| - 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'}
|
| - ]
|
| -
|
| - tmp = json.dumps(events)
|
| - self.assertEqual(']', tmp[-1])
|
| -
|
| - # Drop off the trailing ]
|
| - dropped = tmp[:-1]
|
| - m = timeline_model.TimelineModel(event_data=dropped)
|
| - self.assertEqual(1, len(GetAllProcesses(m)))
|
| -
|
| - def testImportStringWithEndingCommaButMissingCloseSquareBracket(self):
|
| - lines = [
|
| - '[',
|
| - '{"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"},'
|
| - ]
|
| - text = '\n'.join(lines)
|
| -
|
| - m = timeline_model.TimelineModel(event_data=text)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - self.assertEqual(1, len(processes[0].GetThreadWithId(53).slices))
|
| -
|
| - def testImportStringWithMissingCloseSquareBracketAndNewline(self):
|
| - 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'}
|
| - ]
|
| -
|
| - tmp = json.dumps(events)
|
| - self.assertEqual(']', tmp[-1])
|
| -
|
| - # Drop off the trailing ] and add a newline
|
| - dropped = tmp[:-1]
|
| - m = timeline_model.TimelineModel(event_data=dropped + '\n')
|
| - self.assertEqual(1, len(GetAllProcesses(m)))
|
| -
|
| - def testImportStringWithEndingCommaButMissingCloseSquareBracketCRLF(self):
|
| - lines = [
|
| - '[',
|
| - '{"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"},'
|
| - ]
|
| - text = '\r\n'.join(lines)
|
| -
|
| - m = timeline_model.TimelineModel(event_data=text)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - self.assertEqual(1, len(processes[0].GetThreadWithId(53).slices))
|
| -
|
| - def testImportOldFormat(self):
|
| - 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":{}}',
|
| - ']'
|
| - ]
|
| - text = '\n'.join(lines)
|
| - m = timeline_model.TimelineModel(event_data=text)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - self.assertEqual(1, len(processes[0].GetThreadWithId(8).slices))
|
| -
|
| - def testStartFinishOneSliceOneThread(self):
|
| - 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'}}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - t = processes[0].GetThreadWithId(53)
|
| - slices = t.async_slices
|
| - self.assertEqual(1, len(slices))
|
| - self.assertEqual('a', slices[0].name)
|
| - self.assertEqual('cat', slices[0].category)
|
| - self.assertEqual(72, slices[0].id)
|
| - self.assertEqual('bar', slices[0].args['foo'])
|
| - self.assertEqual(0, slices[0].start)
|
| - self.assertAlmostEqual((60 - 24) / 1000.0, slices[0].duration)
|
| - self.assertEqual(t, slices[0].start_thread)
|
| - self.assertEqual(t, slices[0].end_thread)
|
| -
|
| - def testEndArgsAddedToSlice(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - p = processes[0]
|
| -
|
| - self.assertEqual(1, len(p.threads))
|
| - t = p.GetThreadWithId(53)
|
| - self.assertEqual(1, len(t.slices))
|
| - self.assertEqual(53, t.tid)
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('a', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertEqual(0, slice_event.start)
|
| - self.assertEqual(1, slice_event.args['x'])
|
| - self.assertEqual(2, slice_event.args['y'])
|
| -
|
| - def testEndArgOverrwritesOriginalArgValueIfDuplicated(self):
|
| - 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'}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - p = processes[0]
|
| -
|
| - self.assertEqual(1, len(p.threads))
|
| - t = p.GetThreadWithId(53)
|
| - slice_event = t.slices[0]
|
| - self.assertEqual('b', slice_event.name)
|
| - self.assertEqual('foo', slice_event.category)
|
| - self.assertEqual(0, slice_event.start)
|
| - self.assertEqual(4, slice_event.args['z'])
|
| -
|
| - def testSliceHierarchy(self):
|
| - ''' The slice hierarchy should look something like this:
|
| - [ a ]
|
| - [ b ] [ d ]
|
| - [ c ] [ e ]
|
| - '''
|
| - events = [
|
| - {'name': 'a', 'args': {}, 'pid': 52, 'ts': 100, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'B'},
|
| - {'name': 'a', 'args': {}, 'pid': 52, 'ts': 200, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'E'},
|
| - {'name': 'b', 'args': {}, 'pid': 52, 'ts': 125, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'B'},
|
| - {'name': 'b', 'args': {}, 'pid': 52, 'ts': 165, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'E'},
|
| - {'name': 'c', 'args': {}, 'pid': 52, 'ts': 125, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'B'},
|
| - {'name': 'c', 'args': {}, 'pid': 52, 'ts': 135, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'E'},
|
| - {'name': 'd', 'args': {}, 'pid': 52, 'ts': 175, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'B'},
|
| - {'name': 'd', 'args': {}, 'pid': 52, 'ts': 190, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'E'},
|
| - {'name': 'e', 'args': {}, 'pid': 52, 'ts': 155, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'B'},
|
| - {'name': 'e', 'args': {}, 'pid': 52, 'ts': 165, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'E'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events,
|
| - shift_world_to_zero=False)
|
| - processes = GetAllProcesses(m)
|
| - self.assertEqual(1, len(processes))
|
| - p = processes[0]
|
| -
|
| - self.assertEqual(1, len(p.threads))
|
| - t = p.GetThreadWithId(53)
|
| -
|
| - slice_a = t.slices[0]
|
| - self.assertEqual(4, len(slice_a.GetAllSubSlices()))
|
| - self.assertEqual('a', slice_a.name)
|
| - self.assertEqual(100 / 1000.0, slice_a.start)
|
| - self.assertEqual(200 / 1000.0, slice_a.end)
|
| - self.assertEqual(2, len(slice_a.sub_slices))
|
| -
|
| - slice_b = slice_a.sub_slices[0]
|
| - self.assertEqual('b', slice_b.name)
|
| - self.assertEqual(2, len(slice_b.sub_slices))
|
| - self.assertEqual('c', slice_b.sub_slices[0].name)
|
| - self.assertEqual('e', slice_b.sub_slices[1].name)
|
| -
|
| - slice_d = slice_a.sub_slices[1]
|
| - self.assertEqual('d', slice_d.name)
|
| - self.assertEqual(0, len(slice_d.sub_slices))
|
| -
|
| - def testAsyncEndArgAddedToSlice(self):
|
| - 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}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(53)
|
| - self.assertEqual(1, len(t.async_slices))
|
| - parent_slice = t.async_slices[0]
|
| - self.assertEqual('c', parent_slice.name)
|
| - self.assertEqual('foo', parent_slice.category)
|
| -
|
| - self.assertEqual(1, len(parent_slice.sub_slices))
|
| - sub_slice = parent_slice.sub_slices[0]
|
| - self.assertEqual(1, sub_slice.args['x'])
|
| - self.assertEqual(2, sub_slice.args['y'])
|
| -
|
| - def testAsyncEndArgOverrwritesOriginalArgValueIfDuplicated(self):
|
| - 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}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(53)
|
| - self.assertEqual(1, len(t.async_slices))
|
| - parent_slice = t.async_slices[0]
|
| - self.assertEqual('d', parent_slice.name)
|
| - self.assertEqual('foo', parent_slice.category)
|
| -
|
| - self.assertEqual(1, len(parent_slice.sub_slices))
|
| - sub_slice = parent_slice.sub_slices[0]
|
| - self.assertEqual(4, sub_slice.args['z'])
|
| -
|
| - def testAsyncStepsInOneThread(self):
|
| - 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},
|
| - {'name': 'a', 'args': {'x': 1}, 'pid': 52, 'ts': 524, 'cat': 'foo',
|
| - 'tid': 53, 'ph': 'S', 'id': 72}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(53)
|
| - self.assertEqual(1, len(t.async_slices))
|
| - parent_slice = t.async_slices[0]
|
| - self.assertEqual('a', parent_slice.name)
|
| - self.assertEqual('foo', parent_slice.category)
|
| - self.assertEqual(0, parent_slice.start)
|
| -
|
| - self.assertEqual(2, len(parent_slice.sub_slices))
|
| - sub_slice = parent_slice.sub_slices[0]
|
| - self.assertEqual('a', sub_slice.name)
|
| - self.assertEqual('foo', sub_slice.category)
|
| - self.assertAlmostEqual(0, sub_slice.start)
|
| - self.assertAlmostEqual((548 - 524) / 1000.0, sub_slice.duration)
|
| - self.assertEqual(1, sub_slice.args['x'])
|
| -
|
| - sub_slice = parent_slice.sub_slices[1]
|
| - self.assertEqual('a:s1', sub_slice.name)
|
| - self.assertEqual('foo', sub_slice.category)
|
| - self.assertAlmostEqual((548 - 524) / 1000.0, sub_slice.start)
|
| - self.assertAlmostEqual((560 - 548) / 1000.0, sub_slice.duration)
|
| - self.assertEqual(2, sub_slice.args['y'])
|
| - self.assertEqual(3, sub_slice.args['z'])
|
| -
|
| - def testAsyncStepsMissingStart(self):
|
| - 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}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(53)
|
| - self.assertTrue(t is not None)
|
| -
|
| - def testAsyncStepsMissingFinish(self):
|
| - 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}
|
| - ]
|
| -
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - t = GetAllProcesses(m)[0].GetThreadWithId(53)
|
| - self.assertTrue(t is not None)
|
| -
|
| - def testImportSamples(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(53)
|
| - self.assertEqual(3, len(t.samples))
|
| - self.assertEqual(0.0, t.samples[0].start)
|
| - self.assertEqual(0.0, t.samples[1].start)
|
| - self.assertAlmostEqual(0.01, t.samples[2].start)
|
| - self.assertEqual('a', t.samples[0].name)
|
| - self.assertEqual('b', t.samples[1].name)
|
| - self.assertEqual('c', t.samples[2].name)
|
| - self.assertEqual(0, len(m.import_errors))
|
| -
|
| - def testImportSamplesMissingArgs(self):
|
| - 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'}
|
| - ]
|
| - m = timeline_model.TimelineModel(event_data=events)
|
| - p = GetAllProcesses(m)[0]
|
| - t = p.GetThreadWithId(53)
|
| - self.assertEqual(3, len(t.samples))
|
| - self.assertEqual(0, len(m.import_errors))
|
|
|