blob: 6573c25c1a0b99ef5daf49e21ed332e92ef9fa8c [file] [log] [blame]
#!/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='4e0fe038f438ae1679eae9e156e1f248595b2373',
reverted_sha='65b21282c710afe9c275778820c6e3c1cf46734b'),
revert_checker.Revert(
sha='9f981e9adf9c8d29bb80306daf08d2770263ade6',
reverted_sha='4060016fce3e6a0b926ee9fc59e440a612d3a2ec'),
])
if __name__ == '__main__':
unittest.main()