blob: 5b8e8373d8ade5a3e646c23f16c1f1081de08ed1 [file] [log] [blame]
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for the lib/metrics_lib module."""
import os
from unittest import mock
from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import metrics_lib
class MetricsTest(cros_test_lib.MockTestCase):
"""Tests for metrics_lib."""
def testEndToEnd(self) -> None:
"""Test the normal usage pattern, end-to-end."""
# We should start in a clean, unmeasured state.
env = os.environ.copy()
env.pop(constants.CROS_METRICS_DIR_ENVVAR, None)
self.PatchObject(os, "environ", new=env)
with mock.patch(
"chromite.lib.metrics_lib.current_milli_time"
) as mock_time:
mock_time.side_effect = [128000, 256000, 512300]
events = []
# Create a fake usage site of the metrics.
@metrics_lib.collect_metrics
def measure_things() -> None:
# Now, in here, we should have set up this env-var. This is a
# bit of invasive white-box testing.
self.assertTrue(
os.environ.get(constants.CROS_METRICS_DIR_ENVVAR)
)
# Now, with our pretend timer, let's record some events.
with metrics_lib.timer("test.timer"):
metrics_lib.event("test.named_event")
for event in metrics_lib.read_metrics_events():
events.append(event)
# Run the fake scenario.
measure_things()
self.assertEqual(len(events), 3)
self.assertEqual(events[0].timestamp_epoch_millis, 128000)
self.assertEqual(events[0].op, metrics_lib.OP_START_TIMER)
self.assertEqual(events[0].name, "test.timer")
self.assertEqual(events[1].timestamp_epoch_millis, 256000)
self.assertEqual(events[1].op, metrics_lib.OP_NAMED_EVENT)
self.assertEqual(events[1].name, "test.named_event")
self.assertEqual(events[2].timestamp_epoch_millis, 512300)
self.assertEqual(events[2].op, metrics_lib.OP_STOP_TIMER)
self.assertEqual(events[2].name, "test.timer")
def test_deserialize_timer(monkeypatch) -> None:
"""Test timer math and deserialization into proto objects."""
mock_events = [
metrics_lib.MetricEvent(
600, "a.b", metrics_lib.OP_START_TIMER, arg="100"
),
metrics_lib.MetricEvent(
1000, "a.b", metrics_lib.OP_STOP_TIMER, arg="100"
),
]
monkeypatch.setattr(metrics_lib, "read_metrics_events", lambda: mock_events)
result = metrics_lib.deserialize_metrics_log()
assert len(result) == 1
assert result[0].name == "a.b"
assert result[0].timestamp_epoch_millis == 1000
assert result[0].value == 400
def test_deserialize_named_event(monkeypatch) -> None:
"""Test deserialization of a named event."""
mock_events = [
metrics_lib.MetricEvent(
1000, "a.named_event", metrics_lib.OP_NAMED_EVENT, arg=None
),
]
monkeypatch.setattr(metrics_lib, "read_metrics_events", lambda: mock_events)
result = metrics_lib.deserialize_metrics_log(prefix="prefix")
assert len(result) == 1
assert result[0].name == "prefix.a.named_event"
assert result[0].timestamp_epoch_millis == 1000
def test_deserialize_gauge(monkeypatch) -> None:
"""Test deserialization of a gauge."""
mock_events = [
metrics_lib.MetricEvent(1000, "a.gauge", metrics_lib.OP_GAUGE, arg=17),
]
monkeypatch.setattr(metrics_lib, "read_metrics_events", lambda: mock_events)
result = metrics_lib.deserialize_metrics_log()
assert len(result) == 1
assert result[0].name == "a.gauge"
assert result[0].timestamp_epoch_millis == 1000
assert result[0].value == 17
def test_deserialize_counter(monkeypatch) -> None:
"""Test deserialization of a counter."""
mock_events = [
metrics_lib.MetricEvent(
1000, "a.counter", metrics_lib.OP_INCREMENT_COUNTER, arg=1
),
metrics_lib.MetricEvent(
1001, "a.counter", metrics_lib.OP_INCREMENT_COUNTER, arg=2
),
metrics_lib.MetricEvent(
1002, "a.counter", metrics_lib.OP_INCREMENT_COUNTER, arg=3
),
metrics_lib.MetricEvent(
1003, "a.counter", metrics_lib.OP_DECREMENT_COUNTER, arg=4
),
]
monkeypatch.setattr(metrics_lib, "read_metrics_events", lambda: mock_events)
result = metrics_lib.deserialize_metrics_log()
assert len(result) == 1
assert result[0].name == "a.counter"
assert result[0].timestamp_epoch_millis == 1003
assert result[0].value == 2