1#!/usr/bin/env vpython3 2 3# Copyright 2024 The Chromium Authors 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6"""File for testing measures.py.""" 7 8import os 9import tempfile 10import unittest 11 12import google.protobuf.json_format as json_format 13 14from google.protobuf import any_pb2 15 16import measures 17 18from measure import Measure 19from test_script_metrics_pb2 import TestScriptMetric, TestScriptMetrics 20 21 22class MeasuresTest(unittest.TestCase): 23 """Test measure.py.""" 24 25 def test_create_average(self) -> None: 26 ave = measures.average('a', 'b', 'c') 27 ave.record(1) 28 ave.record(2) 29 exp = TestScriptMetric() 30 exp.name = 'a/b/c' 31 exp.value = 1.5 32 self.assertEqual(ave.dump(), exp) 33 34 def test_create_single_name_piece(self) -> None: 35 self.assertEqual(measures.average('a')._name, 'a') 36 37 def test_create_no_name_piece(self) -> None: 38 self.assertRaises(ValueError, lambda: measures.average()) 39 40 def test_create_none_in_name_pieces(self) -> None: 41 self.assertRaises(TypeError, lambda: measures.average('a', None)) 42 43 def test_create_count(self) -> None: 44 self.assertIsInstance(measures.count('a'), Measure) 45 46 def test_create_data_points(self) -> None: 47 self.assertIsInstance(measures.data_points('a'), Measure) 48 49 def test_register(self) -> None: 50 before = len(measures._metric._metrics) 51 for x in range(3): 52 measures.average('a') 53 self.assertEqual(len(measures._metric._metrics), before + 3) 54 55 def test_dump(self) -> None: 56 before = len(measures._metric._metrics) 57 count = measures.count('test', 'dump') 58 for _ in range(101): 59 count.record() 60 with tempfile.TemporaryDirectory() as tmpdir: 61 measures.dump(tmpdir) 62 with open(os.path.join(tmpdir, 63 measures.TEST_SCRIPT_METRICS_JSONPB_FILENAME), 64 'r', 65 encoding='utf-8') as rf: 66 any_msg = json_format.Parse(rf.read(), any_pb2.Any()) 67 message = TestScriptMetrics() 68 self.assertTrue(any_msg.Unpack(message)) 69 self.assertEqual(len(message.metrics), before + 1) 70 exp = TestScriptMetric() 71 exp.name = 'test/dump' 72 exp.value = 101 73 self.assertEqual(message.metrics[-1], exp) 74 75 def test_dump_with_type(self) -> None: 76 with tempfile.TemporaryDirectory() as tmpdir: 77 measures.dump(tmpdir) 78 with open(os.path.join(tmpdir, 79 measures.TEST_SCRIPT_METRICS_JSONPB_FILENAME), 80 'r', 81 encoding='utf-8') as rf: 82 txt = rf.read() 83 self.assertTrue('"@type":' in txt) 84 self.assertTrue(TestScriptMetrics().DESCRIPTOR.full_name in txt) 85 86 def test_dump_create_dir(self) -> None: 87 with tempfile.TemporaryDirectory() as tmpdir: 88 dir_path = os.path.join(tmpdir, 'hello', 'this', 'dir', 'should', 'not', 89 'exist') 90 measures.dump(dir_path) 91 self.assertTrue(os.path.isdir(dir_path)) 92 93 94if __name__ == '__main__': 95 unittest.main() 96