| #!/usr/bin/env vpython3 |
| |
| # Copyright 2024 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """File for testing time_consumption.py.""" |
| |
| import os |
| import tempfile |
| import unittest |
| import unittest.mock as mock |
| |
| import google.protobuf.json_format as json_format |
| |
| from google.protobuf import any_pb2 |
| |
| import measures |
| |
| from test_script_metrics_pb2 import TestScriptMetric, TestScriptMetrics |
| |
| |
| class TimeConsumptionTest(unittest.TestCase): |
| """Test time_consumption.py.""" |
| |
| @mock.patch('time_consumption.time.time', side_effect=[100, 110]) |
| def test_by_dumping(self, time_patch) -> None: |
| before = len(measures._metric._metrics) |
| with measures.time_consumption('test', 'time', 'consumption'): |
| pass |
| with tempfile.TemporaryDirectory() as tmpdir: |
| measures.dump(tmpdir) |
| with open(os.path.join(tmpdir, |
| measures.TEST_SCRIPT_METRICS_JSONPB_FILENAME), |
| 'r', |
| encoding='utf-8') as rf: |
| any_msg = json_format.Parse(rf.read(), any_pb2.Any()) |
| message = TestScriptMetrics() |
| self.assertTrue(any_msg.Unpack(message)) |
| self.assertEqual(len(message.metrics), before + 1) |
| exp = TestScriptMetric() |
| exp.name = 'test/time/consumption (seconds)' |
| exp.value = 10 |
| self.assertEqual(message.metrics[-1], exp) |
| self.assertEqual(time_patch.call_count, 2) |
| |
| @mock.patch('time_consumption.time.time', side_effect=[100, 101, 102, 110]) |
| def test_exit_twice(self, time_patch) -> None: |
| # This is not a common use scenario, but it shouldn't crash. |
| before = len(measures._metric._metrics) |
| consumption = measures.time_consumption('test', 'time', 'consumption2') |
| with consumption: |
| pass |
| with consumption: |
| pass |
| with tempfile.TemporaryDirectory() as tmpdir: |
| measures.dump(tmpdir) |
| with open(os.path.join(tmpdir, |
| measures.TEST_SCRIPT_METRICS_JSONPB_FILENAME), |
| 'r', |
| encoding='utf-8') as rf: |
| any_msg = json_format.Parse(rf.read(), any_pb2.Any()) |
| message = TestScriptMetrics() |
| self.assertTrue(any_msg.Unpack(message)) |
| self.assertEqual(len(message.metrics), before + 1) |
| exp = TestScriptMetric() |
| exp.name = 'test/time/consumption2 (seconds)' |
| exp.value = 8 |
| self.assertEqual(message.metrics[-1], exp) |
| self.assertEqual(time_patch.call_count, 4) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |