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