| # RUN: %{python} %s | |
| # UNSUPPORTED: system-windows | |
| import unittest | |
| import platform | |
| import time | |
| from lit.util import runCommandCached | |
| from lit.LitConfig import LitConfig | |
| class TestCommandCache(unittest.TestCase): | |
| @staticmethod | |
| def _lit_config(): | |
| return LitConfig( | |
| progname="lit", | |
| path=[], | |
| diagnostic_level="note", | |
| useValgrind=False, | |
| valgrindLeakCheck=False, | |
| valgrindArgs=[], | |
| noExecute=False, | |
| debug=False, | |
| isWindows=(platform.system() == "Windows"), | |
| order="smart", | |
| params={}, | |
| ) | |
| def test_basic(self): | |
| lit_config = self._lit_config() | |
| self.assertEqual(lit_config.run_command_cached(["printf", "hi"]), b"hi") | |
| self.assertNotEqual(lit_config.run_command_cached("ls"), None) | |
| # Test that arguments (e.g. text=True) get forwarded to subprocess.run | |
| self.assertEqual( | |
| lit_config.run_command_cached(["printf", "hi"], text=True), "hi" | |
| ) | |
| # shell=True is not implied | |
| self.assertEqual( | |
| lit_config.run_command_cached("ls -al", allow_failure=True), None | |
| ) | |
| self.assertNotEqual( | |
| lit_config.run_command_cached("ls -al", allow_failure=True, shell=True), | |
| None, | |
| ) | |
| self.assertEqual( | |
| lit_config.run_command_cached("exit 0", shell=True, allow_failure=True), b"" | |
| ) | |
| def test_fatal(self): | |
| lit_config = self._lit_config() | |
| # Test fatal errors | |
| fatal_counter = 0 | |
| def wrap_fatal(msg): | |
| nonlocal fatal_counter | |
| fatal_counter += 1 | |
| lit_config.fatal = wrap_fatal | |
| lit_config.run_command_cached(["asdfghjkl"]) | |
| self.assertEqual(fatal_counter, 1) | |
| self.assertEqual( | |
| lit_config.run_command_cached(["asdfghjkl"], allow_failure=True), None | |
| ) | |
| self.assertEqual( | |
| lit_config.run_command_cached("exit 1", shell=True, allow_failure=True), | |
| None, | |
| ) | |
| self.assertEqual(fatal_counter, 1) | |
| def test_cache(self): | |
| lit_config = self._lit_config() | |
| date = lit_config.run_command_cached("date", shell=True) | |
| self.assertNotEqual(date, None) | |
| # Ideally, we'd just use `date -Ins` and not need to sleep, | |
| # but nanosecond support was only added in macOS 15.4-ish. | |
| # (Note that even if this sleep is too short/too long the | |
| # test should still pass.) | |
| time.sleep(2) | |
| # Second time should be cached, i.e. equal to the first | |
| self.assertEqual(lit_config.run_command_cached("date", shell=True), date) | |
| if __name__ == "__main__": | |
| unittest.main() |