xref: /llvm-project/llvm/utils/revert_checker_test.py (revision 0a53f43c0c7e33cde07b24169e8f45db7eba2fea)
181ee4952SGeorge Burgess IV#!/usr/bin/env python3
281ee4952SGeorge Burgess IV# -*- coding: utf-8 -*-
381ee4952SGeorge Burgess IV# ===----------------------------------------------------------------------===##
481ee4952SGeorge Burgess IV#
581ee4952SGeorge Burgess IV# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
681ee4952SGeorge Burgess IV# See https://llvm.org/LICENSE.txt for license information.
781ee4952SGeorge Burgess IV# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
881ee4952SGeorge Burgess IV#
981ee4952SGeorge Burgess IV# ===----------------------------------------------------------------------===##
1081ee4952SGeorge Burgess IV"""Tests for revert_checker.
1181ee4952SGeorge Burgess IV
1281ee4952SGeorge Burgess IVNote that these tests require having LLVM's git history available, since our
1381ee4952SGeorge Burgess IVrepository has a few interesting instances of edge-cases.
1481ee4952SGeorge Burgess IV"""
1581ee4952SGeorge Burgess IV
1681ee4952SGeorge Burgess IVimport os
1781ee4952SGeorge Burgess IVimport logging
1881ee4952SGeorge Burgess IVimport unittest
1981ee4952SGeorge Burgess IVfrom typing import List
2081ee4952SGeorge Burgess IV
2181ee4952SGeorge Burgess IVimport revert_checker
2281ee4952SGeorge Burgess IV
2381ee4952SGeorge Burgess IV# pylint: disable=protected-access
2481ee4952SGeorge Burgess IV
2581ee4952SGeorge Burgess IV
2681ee4952SGeorge Burgess IVdef get_llvm_project_path() -> str:
2781ee4952SGeorge Burgess IV    """Returns the path to llvm-project's root."""
2881ee4952SGeorge Burgess IV    my_dir = os.path.dirname(__file__)
29b71edfaaSTobias Hieta    return os.path.realpath(os.path.join(my_dir, "..", ".."))
3081ee4952SGeorge Burgess IV
3181ee4952SGeorge Burgess IV
3281ee4952SGeorge Burgess IVclass _SilencingFilter(logging.Filter):
3381ee4952SGeorge Burgess IV    """Silences all log messages.
3481ee4952SGeorge Burgess IV
3581ee4952SGeorge Burgess IV    Also collects info about log messages that would've been emitted.
3681ee4952SGeorge Burgess IV    """
3781ee4952SGeorge Burgess IV
3881ee4952SGeorge Burgess IV    def __init__(self) -> None:
3981ee4952SGeorge Burgess IV        self.messages: List[str] = []
4081ee4952SGeorge Burgess IV
4181ee4952SGeorge Burgess IV    def filter(self, record: logging.LogRecord) -> bool:
4281ee4952SGeorge Burgess IV        self.messages.append(record.getMessage())
4381ee4952SGeorge Burgess IV        return False
4481ee4952SGeorge Burgess IV
4581ee4952SGeorge Burgess IV
4681ee4952SGeorge Burgess IVclass Test(unittest.TestCase):
4781ee4952SGeorge Burgess IV    """Tests for revert_checker."""
4881ee4952SGeorge Burgess IV
4981ee4952SGeorge Burgess IV    def silence_logging(self) -> _SilencingFilter:
5081ee4952SGeorge Burgess IV        root = logging.getLogger()
5181ee4952SGeorge Burgess IV        filt = _SilencingFilter()
5281ee4952SGeorge Burgess IV        root.addFilter(filt)
5381ee4952SGeorge Burgess IV        self.addCleanup(root.removeFilter, filt)
5481ee4952SGeorge Burgess IV        return filt
5581ee4952SGeorge Burgess IV
5681ee4952SGeorge Burgess IV    def test_log_stream_with_known_sha_range(self) -> None:
57b71edfaaSTobias Hieta        start_sha = "e241573d5972d34a323fa5c64774c4207340beb3"
58b71edfaaSTobias Hieta        end_sha = "a7a37517751ffb0f5529011b4ba96e67fcb27510"
5981ee4952SGeorge Burgess IV        commits = [
6081ee4952SGeorge Burgess IV            revert_checker._LogEntry(
61b71edfaaSTobias Hieta                "e241573d5972d34a323fa5c64774c4207340beb3",
62b71edfaaSTobias Hieta                "\n".join(
63b71edfaaSTobias Hieta                    (
64b71edfaaSTobias Hieta                        "[mlir] NFC: remove IntegerValueSet / MutableIntegerSet",
65b71edfaaSTobias Hieta                        "",
66b71edfaaSTobias Hieta                        "Summary:",
67b71edfaaSTobias Hieta                        "- these are unused and really not needed now given flat "
68b71edfaaSTobias Hieta                        "affine",
69b71edfaaSTobias Hieta                        "  constraints",
70b71edfaaSTobias Hieta                        "",
71b71edfaaSTobias Hieta                        "Differential Revision: https://reviews.llvm.org/D75792",
72b71edfaaSTobias Hieta                    )
73b71edfaaSTobias Hieta                ),
74b71edfaaSTobias Hieta            ),
7581ee4952SGeorge Burgess IV            revert_checker._LogEntry(
76b71edfaaSTobias Hieta                "97572fa6e9daecd648873496fd11f7d1e25a55f0",
77b71edfaaSTobias Hieta                "[NFC] use hasAnyOperatorName and hasAnyOverloadedOperatorName "
78b71edfaaSTobias Hieta                "functions in clang-tidy matchers",
7981ee4952SGeorge Burgess IV            ),
8081ee4952SGeorge Burgess IV        ]
8181ee4952SGeorge Burgess IV
8281ee4952SGeorge Burgess IV        logs = list(
8381ee4952SGeorge Burgess IV            revert_checker._log_stream(
8481ee4952SGeorge Burgess IV                get_llvm_project_path(),
8581ee4952SGeorge Burgess IV                root_sha=start_sha,
8681ee4952SGeorge Burgess IV                end_at_sha=end_sha,
87b71edfaaSTobias Hieta            )
88b71edfaaSTobias Hieta        )
8981ee4952SGeorge Burgess IV        self.assertEqual(commits, logs)
9081ee4952SGeorge Burgess IV
9181ee4952SGeorge Burgess IV    def test_reverted_noncommit_object_is_a_nop(self) -> None:
9281ee4952SGeorge Burgess IV        log_filter = self.silence_logging()
9381ee4952SGeorge Burgess IV        # c9944df916e41b1014dff5f6f75d52297b48ecdc mentions reverting a non-commit
9481ee4952SGeorge Burgess IV        # object. It sits between the given base_ref and root.
9581ee4952SGeorge Burgess IV        reverts = revert_checker.find_reverts(
9681ee4952SGeorge Burgess IV            git_dir=get_llvm_project_path(),
97b71edfaaSTobias Hieta            across_ref="c9944df916e41b1014dff5f6f75d52297b48ecdc~",
98b71edfaaSTobias Hieta            root="c9944df916e41b1014dff5f6f75d52297b48ecdc",
99*0a53f43cSGeorge Burgess IV            max_pr_lookback=50,
100b71edfaaSTobias Hieta        )
10181ee4952SGeorge Burgess IV        self.assertEqual(reverts, [])
10281ee4952SGeorge Burgess IV
103b71edfaaSTobias Hieta        complaint = (
104b71edfaaSTobias Hieta            "Failed to resolve reverted object "
105b71edfaaSTobias Hieta            "edd18355be574122aaa9abf58c15d8c50fb085a1"
106b71edfaaSTobias Hieta        )
10781ee4952SGeorge Burgess IV        self.assertTrue(
10881ee4952SGeorge Burgess IV            any(x.startswith(complaint) for x in log_filter.messages),
109b71edfaaSTobias Hieta            log_filter.messages,
110b71edfaaSTobias Hieta        )
11181ee4952SGeorge Burgess IV
11281ee4952SGeorge Burgess IV    def test_known_reverts_across_arbitrary_llvm_rev(self) -> None:
11381ee4952SGeorge Burgess IV        reverts = revert_checker.find_reverts(
11481ee4952SGeorge Burgess IV            git_dir=get_llvm_project_path(),
115b71edfaaSTobias Hieta            across_ref="c47f971694be0159ffddfee8a75ae515eba91439",
116b71edfaaSTobias Hieta            root="9f981e9adf9c8d29bb80306daf08d2770263ade6",
117*0a53f43cSGeorge Burgess IV            max_pr_lookback=50,
118b71edfaaSTobias Hieta        )
119b71edfaaSTobias Hieta        self.assertEqual(
120b71edfaaSTobias Hieta            reverts,
121b71edfaaSTobias Hieta            [
12281ee4952SGeorge Burgess IV                revert_checker.Revert(
123b71edfaaSTobias Hieta                    sha="4e0fe038f438ae1679eae9e156e1f248595b2373",
124b71edfaaSTobias Hieta                    reverted_sha="65b21282c710afe9c275778820c6e3c1cf46734b",
125b71edfaaSTobias Hieta                ),
126ce2a5fa7SGeorge Burgess IV                revert_checker.Revert(
127b71edfaaSTobias Hieta                    sha="9f981e9adf9c8d29bb80306daf08d2770263ade6",
128b71edfaaSTobias Hieta                    reverted_sha="4060016fce3e6a0b926ee9fc59e440a612d3a2ec",
129b71edfaaSTobias Hieta                ),
130b71edfaaSTobias Hieta            ],
131b71edfaaSTobias Hieta        )
13281ee4952SGeorge Burgess IV
133*0a53f43cSGeorge Burgess IV    def test_pr_based_revert_works(self) -> None:
134*0a53f43cSGeorge Burgess IV        reverts = revert_checker.find_reverts(
135*0a53f43cSGeorge Burgess IV            git_dir=get_llvm_project_path(),
136*0a53f43cSGeorge Burgess IV            # This SHA is a direct child of the reverted SHA expected below.
137*0a53f43cSGeorge Burgess IV            across_ref="2d5f3b0a61fb171617012a2c3ba05fd31fb3bb1d",
138*0a53f43cSGeorge Burgess IV            # This SHA is a direct child of the revert SHA listed below.
139*0a53f43cSGeorge Burgess IV            root="2c01b278580212914ec037bb5dd9b73702dfe7f1",
140*0a53f43cSGeorge Burgess IV            max_pr_lookback=50,
141*0a53f43cSGeorge Burgess IV        )
142*0a53f43cSGeorge Burgess IV        self.assertEqual(
143*0a53f43cSGeorge Burgess IV            reverts,
144*0a53f43cSGeorge Burgess IV            [
145*0a53f43cSGeorge Burgess IV                revert_checker.Revert(
146*0a53f43cSGeorge Burgess IV                    # This SHA is a `Reverts ${PR}` for #111004.
147*0a53f43cSGeorge Burgess IV                    sha="50866e84d1da8462aeb96607bf6d9e5bbd5869c5",
148*0a53f43cSGeorge Burgess IV                    # ...And this was the commit for #111004.
149*0a53f43cSGeorge Burgess IV                    reverted_sha="67160c5ab5f5b7fd5fa7851abcfde367c8a9f91b",
150*0a53f43cSGeorge Burgess IV                ),
151*0a53f43cSGeorge Burgess IV            ],
152*0a53f43cSGeorge Burgess IV        )
153*0a53f43cSGeorge Burgess IV
15481ee4952SGeorge Burgess IV
155b71edfaaSTobias Hietaif __name__ == "__main__":
15681ee4952SGeorge Burgess IV    unittest.main()
157