blob: 1d6a73627d1f287e3dc03fec5b0848f52013fa37 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for trace_utils.py."""
import unittest
from typing import List
import test_utils
from reporting import metrics
from trace_processing import trace_model, trace_time, trace_utils
# Boilerplate-busting constants:
U = metrics.Unit
TCR = metrics.TestCaseResult
class TraceUtilsTest(unittest.TestCase):
"""Trace utils tests"""
def test_compute_stats(self) -> None:
self.assertAlmostEqual(
trace_utils.percentile(
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0], 25
),
3.0,
)
self.assertAlmostEqual(
trace_utils.percentile(
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0], 50
),
5.0,
)
self.assertAlmostEqual(
trace_utils.percentile(
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0], 75
),
7.0,
)
self.assertAlmostEqual(
trace_utils.percentile(
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], 25
),
3.25,
)
self.assertAlmostEqual(
trace_utils.percentile(
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], 50
),
5.5,
)
self.assertAlmostEqual(
trace_utils.percentile(
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], 75
),
7.75,
)
def test_filter_events(self) -> None:
events: List[trace_model.Event] = [
trace_model.DurationEvent(
duration=None,
parent=None,
child_durations=[],
child_flows=[],
base=trace_model.Event(
category="cat_a",
name="name_a",
start=trace_time.TimePoint.from_epoch_delta(
trace_time.TimeDelta.from_microseconds(
697778328.2160872
)
),
pid=7009,
tid=7022,
args={},
),
),
trace_model.DurationEvent(
duration=None,
parent=None,
child_durations=[],
child_flows=[],
base=trace_model.Event(
category="cat_b",
name="name_b",
start=trace_time.TimePoint.from_epoch_delta(
trace_time.TimeDelta.from_microseconds(
697778328.2160872
)
),
pid=7009,
tid=7022,
args={},
),
),
]
filtered = list(
trace_utils.filter_events(
events, category="cat_a", name="name_a", type=trace_model.Event
)
)
self.assertEqual(filtered, [events[0]])
filtered2 = list(
trace_utils.filter_events(
events, category="cat_c", name="name_c", type=trace_model.Event
)
)
self.assertEqual(filtered2, [])
def test_filter_events_with_type(self) -> None:
events: List[trace_model.Event] = [
trace_model.DurationEvent(
duration=None,
parent=None,
child_durations=[],
child_flows=[],
base=trace_model.Event(
category="cat_a",
name="name_a",
start=trace_time.TimePoint.from_epoch_delta(
trace_time.TimeDelta.from_microseconds(
697778328.2160872
)
),
pid=7009,
tid=7022,
args={},
),
),
trace_model.DurationEvent(
duration=None,
parent=None,
child_durations=[],
child_flows=[],
base=trace_model.Event(
category="cat_b",
name="name_b",
start=trace_time.TimePoint.from_epoch_delta(
trace_time.TimeDelta.from_microseconds(
697778328.2160872
)
),
pid=7009,
tid=7022,
args={},
),
),
]
filtered: List[trace_model.Event] = list(
trace_utils.filter_events(
events,
category="cat_a",
name="name_a",
type=trace_model.DurationEvent,
)
)
self.assertEqual(filtered, [events[0]])
filtered2: List[trace_model.Event] = list(
trace_utils.filter_events(
events,
category="cat_c",
name="name_c",
type=trace_model.DurationEvent,
)
)
self.assertEqual(filtered2, [])
filtered3: List[trace_model.Event] = list(
trace_utils.filter_events(
events,
category="cat_a",
name="name_a",
type=trace_model.InstantEvent,
)
)
self.assertEqual(filtered3, [])
def test_total_event_duration(self) -> None:
model: trace_model.Model = test_utils.get_test_model()
mode_duration: trace_time.TimeDelta = (
trace_time.TimeDelta.from_microseconds(
test_utils.TEST_MODEL_END_TIME_IN_US
)
- trace_time.TimeDelta.from_microseconds(
test_utils.TEST_MODEL_BEGIN_TIME_IN_US
)
)
self.assertEqual(
trace_utils.total_event_duration(model.all_events()), mode_duration
)
def test_standard_metrics_set(self) -> None:
values: list[float] = [0.0, 10.0]
unit = U.milliseconds
results = trace_utils.standard_metrics_set(
values=values, label_prefix="Foo", unit=unit
)
p_format_str = "{}, {}th percentile"
self.maxDiff = None
self.assertEqual(
results,
[
TCR("FooP5", unit, [0.5], p_format_str.format("Foo", 5)),
TCR("FooP25", unit, [2.5], p_format_str.format("Foo", 25)),
TCR("FooP50", unit, [5.0], p_format_str.format("Foo", 50)),
TCR("FooP75", unit, [7.5], p_format_str.format("Foo", 75)),
TCR("FooP95", unit, [9.5], p_format_str.format("Foo", 95)),
TCR("FooMin", unit, [0.0], "Foo, minimum"),
TCR("FooMax", unit, [10.0], "Foo, maximum"),
TCR("FooAverage", unit, [5.0], "Foo, mean"),
],
)
results = trace_utils.standard_metrics_set(
values=values, label_prefix="Foo", unit=unit, doc_prefix="Foo doc"
)
self.assertEqual(
results,
[
TCR("FooP5", unit, [0.5], p_format_str.format("Foo doc", 5)),
TCR("FooP25", unit, [2.5], p_format_str.format("Foo doc", 25)),
TCR("FooP50", unit, [5.0], p_format_str.format("Foo doc", 50)),
TCR("FooP75", unit, [7.5], p_format_str.format("Foo doc", 75)),
TCR("FooP95", unit, [9.5], p_format_str.format("Foo doc", 95)),
TCR("FooMin", unit, [0.0], "Foo doc, minimum"),
TCR("FooMax", unit, [10.0], "Foo doc, maximum"),
TCR("FooAverage", unit, [5.0], "Foo doc, mean"),
],
)