| # 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 api/metrics library.""" |
| |
| from unittest import mock |
| |
| from chromite.api import metrics as api_metrics |
| from chromite.api.gen.chromite.api import build_api_test_pb2 |
| from chromite.lib import cros_test_lib |
| from chromite.lib import metrics_lib |
| |
| |
| class MetricsTest(cros_test_lib.TestCase): |
| """Test Metrics deserialization functionality at the API layer.""" |
| |
| def testDeserializeTimer(self) -> None: |
| """Test timer math and deserialization into proto objects.""" |
| response = build_api_test_pb2.TestResultMessage() |
| 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" |
| ), |
| ] |
| with mock.patch( |
| "chromite.api.metrics.metrics_lib.read_metrics_events", |
| return_value=mock_events, |
| ): |
| api_metrics.deserialize_metrics_log(response.events) |
| self.assertEqual(len(response.events), 1) |
| self.assertEqual(response.events[0].name, "a.b") |
| self.assertEqual(response.events[0].timestamp_milliseconds, 1000) |
| self.assertEqual( |
| response.events[0].duration_milliseconds, 1000 - 600 |
| ) |
| |
| def testDeserializeNamedEvent(self) -> None: |
| """Test deserialization of a named event. |
| |
| This test also includes a prefix to test for proper prepending. |
| """ |
| response = build_api_test_pb2.TestResultMessage() |
| mock_events = [ |
| metrics_lib.MetricEvent( |
| 1000, "a.named_event", metrics_lib.OP_NAMED_EVENT, arg=None |
| ), |
| ] |
| with mock.patch( |
| "chromite.api.metrics.metrics_lib.read_metrics_events", |
| return_value=mock_events, |
| ): |
| api_metrics.deserialize_metrics_log( |
| response.events, prefix="prefix" |
| ) |
| self.assertEqual(len(response.events), 1) |
| self.assertEqual(response.events[0].name, "prefix.a.named_event") |
| self.assertEqual(response.events[0].timestamp_milliseconds, 1000) |
| self.assertFalse(response.events[0].duration_milliseconds) |
| |
| def testDeserializeGauge(self) -> None: |
| """Test deserialization of a gauge.""" |
| response = build_api_test_pb2.TestResultMessage() |
| mock_events = [ |
| metrics_lib.MetricEvent( |
| 1000, "a.gauge", metrics_lib.OP_GAUGE, arg=17 |
| ), |
| ] |
| with mock.patch( |
| "chromite.api.metrics.metrics_lib.read_metrics_events", |
| return_value=mock_events, |
| ): |
| api_metrics.deserialize_metrics_log(response.events) |
| self.assertEqual(len(response.events), 1) |
| self.assertEqual(response.events[0].name, "a.gauge") |
| self.assertEqual(response.events[0].timestamp_milliseconds, 1000) |
| self.assertEqual(response.events[0].gauge, 17) |
| |
| def testDeserializeCounter(self) -> None: |
| """Test deserialization of a counter.""" |
| response = build_api_test_pb2.TestResultMessage() |
| 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 |
| ), |
| ] |
| with mock.patch( |
| "chromite.api.metrics.metrics_lib.read_metrics_events", |
| return_value=mock_events, |
| ): |
| api_metrics.deserialize_metrics_log(response.events) |
| self.assertEqual(len(response.events), 1) |
| self.assertEqual(response.events[0].name, "a.counter") |
| self.assertEqual(response.events[0].timestamp_milliseconds, 1003) |
| self.assertEqual(response.events[0].gauge, 2) |