aboutsummaryrefslogtreecommitdiff
path: root/pgo_tools/generate_pgo_profile_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'pgo_tools/generate_pgo_profile_test.py')
-rwxr-xr-xpgo_tools/generate_pgo_profile_test.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/pgo_tools/generate_pgo_profile_test.py b/pgo_tools/generate_pgo_profile_test.py
new file mode 100755
index 00000000..8265bf45
--- /dev/null
+++ b/pgo_tools/generate_pgo_profile_test.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+# Copyright 2023 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 generate_pgo_profile."""
+
+from pathlib import Path
+import shutil
+import tempfile
+import unittest
+from unittest import mock
+
+import generate_pgo_profile
+import pgo_tools
+
+
+class Test(unittest.TestCase):
+ """Tests for generate_pgo_profile."""
+
+ @mock.patch.object(pgo_tools, "run")
+ def test_find_missing_cross_libs_works_for_empty_results(self, mock_run):
+ mock_run.return_value.returncode = 3
+ mock_run.return_value.stdout = ""
+ self.assertEqual(
+ generate_pgo_profile.find_missing_cross_libs(),
+ generate_pgo_profile.ALL_NEEDED_CROSS_LIBS,
+ )
+
+ mock_run.return_value.returncode = 0
+ self.assertEqual(
+ generate_pgo_profile.find_missing_cross_libs(),
+ generate_pgo_profile.ALL_NEEDED_CROSS_LIBS,
+ )
+
+ @mock.patch.object(pgo_tools, "run")
+ def test_find_missing_cross_libs_filters_results_properly(self, mock_run):
+ mock_run.return_value.returncode = 0
+ mock_run.return_value.stdout = "\n".join(
+ generate_pgo_profile.ALL_NEEDED_CROSS_LIBS
+ )
+ self.assertEqual(generate_pgo_profile.find_missing_cross_libs(), set())
+
+ some_cross_libs = sorted(generate_pgo_profile.ALL_NEEDED_CROSS_LIBS)
+ del some_cross_libs[len(some_cross_libs) // 3 :]
+ mock_run.return_value.stdout = "\n".join(
+ some_cross_libs + ["cross-foo/bar"]
+ )
+
+ expected_result = generate_pgo_profile.ALL_NEEDED_CROSS_LIBS - set(
+ some_cross_libs
+ )
+ self.assertEqual(
+ generate_pgo_profile.find_missing_cross_libs(), expected_result
+ )
+
+ def make_tempdir(self) -> Path:
+ tempdir = Path(tempfile.mkdtemp(prefix="generate_pgo_profile_test_"))
+ self.addCleanup(lambda: shutil.rmtree(tempdir))
+ return tempdir
+
+ def test_read_exactly_one_dirent_works(self):
+ tempdir = self.make_tempdir()
+ ent = tempdir / "one-ent"
+ ent.touch()
+
+ self.assertEqual(
+ generate_pgo_profile.read_exactly_one_dirent(tempdir), ent
+ )
+
+ def test_read_exactly_one_dirent_fails_when_no_ents(self):
+ tempdir = self.make_tempdir()
+ with self.assertRaisesRegex(ValueError, "^Expected exactly one"):
+ generate_pgo_profile.read_exactly_one_dirent(tempdir)
+
+ def test_read_exactly_one_dirent_fails_when_multiple_ents(self):
+ tempdir = self.make_tempdir()
+ (tempdir / "a").touch()
+ (tempdir / "b").touch()
+ with self.assertRaisesRegex(ValueError, "^Expected exactly one"):
+ generate_pgo_profile.read_exactly_one_dirent(tempdir)
+
+ @mock.patch.object(pgo_tools, "run")
+ def test_profraw_conversion_works(self, mock_run):
+ tempdir = self.make_tempdir()
+ profiles = [
+ tempdir / "profile-foo.profraw",
+ tempdir / "profile-bar.profraw",
+ ]
+ not_a_profile = tempdir / "not-a-profile.profraw"
+ for f in profiles + [not_a_profile]:
+ f.touch()
+
+ result = generate_pgo_profile.convert_profraw_to_pgo_profile(tempdir)
+ self.assertNotEqual(result.stem, ".profraw")
+ try:
+ # is_relative_to was added in Py3.9; until the chroot has that,
+ # this code needs to use `relative_to` & check for exceptions.
+ result.relative_to(tempdir)
+ except ValueError:
+ self.fail(f"{result} should be relative to {tempdir}")
+
+ mock_run.assert_called_once()
+ run_cmd = mock_run.call_args[0][0]
+ for p in profiles:
+ self.assertIn(p, run_cmd)
+ self.assertNotIn(not_a_profile, run_cmd)
+ self.assertIn(f"--output={result}", run_cmd)
+
+
+if __name__ == "__main__":
+ unittest.main()