mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
6032fd6068
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
119 lines
3.9 KiB
Python
Executable File
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()
|