aboutsummaryrefslogtreecommitdiff
path: root/pgo_tools/pgo_tools_test.py
blob: ad0e853f24c2d1918ab7b9f54ed82c6fe16ef77b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/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 pgo_tools."""

from pathlib import Path
import textwrap
import unittest
from unittest import mock

import pgo_tools


class Test(unittest.TestCase):
    """Tests for pgo_tools."""

    @mock.patch.object(pgo_tools, "run")
    def test_pgo_generate_checking_works(self, mock_run):
        equery_u_output = textwrap.dedent(
            """\
            [ Legend : U - final flag setting for installation]
            [        : I - package is installed with flag     ]
            [ Colors : set, unset                             ]
             * Found these USE flags for sys-devel/llvm:
             U I
             - - llvm-next_pgo_use              : <unknown>
             - - llvm-tot                       : <unknown>
             - + llvm_pgo_generate              : <unknown>
             + - llvm_pgo_use                   : <unknown>
             """
        )
        mock_run.return_value.stdout = equery_u_output
        self.assertTrue(pgo_tools.installed_llvm_has_pgo_generate_enabled())

        mock_run.assert_called_once()

        mock_run.return_value.stdout = equery_u_output.replace(
            "+ llvm_pgo_generate", "- llvm_pgo_generate"
        )
        self.assertFalse(pgo_tools.installed_llvm_has_pgo_generate_enabled())

    @mock.patch.object(pgo_tools, "run")
    def test_pgo_generate_checking_raises_on_zero_pgo_updates(self, mock_run):
        mock_run.return_value.stdout = textwrap.dedent(
            """\
            [ Legend : U - final flag setting for installation]
             - - llvm-next_pgo_use              : <unknown>
             - - llvm-tot                       : <unknown>
             + - llvm_pgo_use                   : <unknown>
             """
        )
        with self.assertRaisesRegex(ValueError, "^No llvm_pgo_generate"):
            pgo_tools.installed_llvm_has_pgo_generate_enabled()

    @mock.patch.object(pgo_tools, "run")
    def test_pgo_generate_checking_raises_on_many_pgo_updates(self, mock_run):
        mock_run.return_value.stdout = textwrap.dedent(
            """\
            [ Legend : U - final flag setting for installation]
             - - llvm-next_pgo_use              : <unknown>
             - - llvm-tot                       : <unknown>
             - + llvm_pgo_generate              : <unknown>
             - + llvm_pgo_generate              : <unknown>
             + - llvm_pgo_use                   : <unknown>
             """
        )
        with self.assertRaisesRegex(ValueError, "^Multiple llvm_pgo_generate"):
            pgo_tools.installed_llvm_has_pgo_generate_enabled()

    @mock.patch.object(pgo_tools, "run")
    def test_pgo_generate_ignores_nonexact_use_flags(self, mock_run):
        mock_run.return_value.stdout = textwrap.dedent(
            """\
            [ Legend : U - final flag setting for installation]
             - - llvm-next_pgo_use              : <unknown>
             - - llvm-tot                       : <unknown>
             - + llvm_pgo_generate              : <unknown>
             - - llvm_pgo_generate2             : <unknown>
             - - 2llvm_pgo_generate             : <unknown>
             + - llvm_pgo_use                   : <unknown>
             """
        )
        self.assertTrue(pgo_tools.installed_llvm_has_pgo_generate_enabled())

    def test_quickpkg_restoration_works(self):
        self.assertEqual(
            pgo_tools.generate_quickpkg_restoration_command(
                Path("/path/to/sys-devel/llvm-1234-r1.tbz2")
            ),
            ["sudo", "emerge", "--usepkgonly", "=sys-devel/llvm-1234-r1"],
        )

    def test_temporary_file_creation_works(self):
        with pgo_tools.temporary_file("foo_bar_") as tmp:
            self.assertTrue(tmp.name.startswith("foo_bar_"), tmp.name)
            self.assertTrue(tmp.exists())
        self.assertFalse(tmp.exists())

    def test_temporary_file_deletion_is_fine_if_file_does_not_exist(self):
        # This test ensures this `with`'s `__exit__` block doesn't `raise`.
        with pgo_tools.temporary_file("foo_bar_") as tmp:
            tmp.unlink()


if __name__ == "__main__":
    unittest.main()