1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00
llvm-mirror/utils/revert_checker_test.py
George Burgess IV 6032fd6068 utils: add a revert checker
Chrome OS and Android have found it useful to have an automated revert
checker. It was requested to upstream it, since other folks in the LLVM
community may also find value in it.

The tests depend on having a full (non-shallow) checkout of LLVM. This
seems reasonable to me, since:

- the tests should only be run if the user is developing on this script
- it's kind of hard to develop on this script without local git history
  :)

If people really want, the tests' dependency on LLVM's history can be
removed. It's mostly just effort/complexity that doesn't seem necessary.

Differential Revision: https://reviews.llvm.org/D105578
2021-07-07 14:20:01 -07:00

119 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#===----------------------------------------------------------------------===##
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===----------------------------------------------------------------------===##
"""Tests for revert_checker.
Note that these tests require having LLVM's git history available, since our
repository has a few interesting instances of edge-cases.
"""
import os
import logging
import unittest
from typing import List
import revert_checker
# pylint: disable=protected-access
def get_llvm_project_path() -> str:
"""Returns the path to llvm-project's root."""
my_dir = os.path.dirname(__file__)
return os.path.realpath(os.path.join(my_dir, '..', '..'))
class _SilencingFilter(logging.Filter):
"""Silences all log messages.
Also collects info about log messages that would've been emitted.
"""
def __init__(self) -> None:
self.messages: List[str] = []
def filter(self, record: logging.LogRecord) -> bool:
self.messages.append(record.getMessage())
return False
class Test(unittest.TestCase):
"""Tests for revert_checker."""
def silence_logging(self) -> _SilencingFilter:
root = logging.getLogger()
filt = _SilencingFilter()
root.addFilter(filt)
self.addCleanup(root.removeFilter, filt)
return filt
def test_log_stream_with_known_sha_range(self) -> None:
start_sha = 'e241573d5972d34a323fa5c64774c4207340beb3'
end_sha = 'a7a37517751ffb0f5529011b4ba96e67fcb27510'
commits = [
revert_checker._LogEntry(
'e241573d5972d34a323fa5c64774c4207340beb3', '\n'.join((
'[mlir] NFC: remove IntegerValueSet / MutableIntegerSet',
'',
'Summary:',
'- these are unused and really not needed now given flat '
'affine',
' constraints',
'',
'Differential Revision: https://reviews.llvm.org/D75792',
))),
revert_checker._LogEntry(
'97572fa6e9daecd648873496fd11f7d1e25a55f0',
'[NFC] use hasAnyOperatorName and hasAnyOverloadedOperatorName '
'functions in clang-tidy matchers',
),
]
logs = list(
revert_checker._log_stream(
get_llvm_project_path(),
root_sha=start_sha,
end_at_sha=end_sha,
))
self.assertEqual(commits, logs)
def test_reverted_noncommit_object_is_a_nop(self) -> None:
log_filter = self.silence_logging()
# c9944df916e41b1014dff5f6f75d52297b48ecdc mentions reverting a non-commit
# object. It sits between the given base_ref and root.
reverts = revert_checker.find_reverts(
git_dir=get_llvm_project_path(),
across_ref='c9944df916e41b1014dff5f6f75d52297b48ecdc~',
root='c9944df916e41b1014dff5f6f75d52297b48ecdc')
self.assertEqual(reverts, [])
complaint = ('Failed to resolve reverted object '
'edd18355be574122aaa9abf58c15d8c50fb085a1')
self.assertTrue(
any(x.startswith(complaint) for x in log_filter.messages),
log_filter.messages)
def test_known_reverts_across_arbitrary_llvm_rev(self) -> None:
reverts = revert_checker.find_reverts(
git_dir=get_llvm_project_path(),
across_ref='c47f971694be0159ffddfee8a75ae515eba91439',
root='9f981e9adf9c8d29bb80306daf08d2770263ade6')
self.assertEqual(reverts, [
revert_checker.Revert(
sha='9f981e9adf9c8d29bb80306daf08d2770263ade6',
reverted_sha='4060016fce3e6a0b926ee9fc59e440a612d3a2ec'),
revert_checker.Revert(
sha='4e0fe038f438ae1679eae9e156e1f248595b2373',
reverted_sha='65b21282c710afe9c275778820c6e3c1cf46734b'),
])
if __name__ == '__main__':
unittest.main()