# 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()