#!/usr/bin/env python3 # Copyright (C) 2022 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import dataclasses import unittest from perf_metrics import _get_column_headers def to_row(concatenated_keys: str) -> dict: return {c: None for c in concatenated_keys} class PerfMetricsTest(unittest.TestCase): """Tests utility functions. This is not Perf Test itself.""" def test_get_column_headers(self): @dataclasses.dataclass class Example: # each string = concatenated keys of the row object row_keysets: list[str] # concatenated headers expected_headers: str examples: list[Example] = [ Example(["a"], "a"), Example(["ac", "bd"], "abcd"), Example(["abe", "cde"], "abcde"), Example(["ab", "ba"], "ab"), Example(["abcde", "edcba"], "abcde"), Example(["ac", "abc"], "abc"), ] for e in examples: rows = [to_row(kz) for kz in e.row_keysets] expected_headers = [*e.expected_headers] with self.subTest(rows=rows, expected_headers=expected_headers): self.assertEqual( _get_column_headers(rows, allow_cycles=True), expected_headers ) def test_cycles(self): examples = [(["ab", "ba"], "a->b->a"), (["abcd", "db"], "b->c->d->b")] for e, cycle in examples: rows = [to_row(kz) for kz in e] with self.subTest(rows=rows, cycle=cycle): with self.assertRaisesRegex( ValueError, f"event ordering has a cycle {cycle}" ): _get_column_headers(rows, allow_cycles=False) if __name__ == "__main__": unittest.main()