| # RUN: %{python} %s |
| |
| """Unit tests for lit.LitConfig.""" |
| |
| import contextlib |
| import io |
| import os |
| import platform |
| import unittest |
| |
| from lit.LitConfig import LitConfig |
| |
| |
| def make_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={}, |
| ) |
| |
| |
| class TestWriteMessage(unittest.TestCase): |
| def test_note_survives_getsourcefile_returning_none(self): |
| """note() must not crash when the caller's frame has no source file. |
| |
| inspect.getsourcefile() returns None when the calling frame's source is |
| not on disk and not in linecache (e.g. lit packaged into a zip/archive). |
| _write_message() then used to do os.path.abspath(None), raising a |
| TypeError and turning an informational note into a fatal error. Simulate |
| that frame by exec'ing a note() call compiled with a filename that does |
| not exist on disk. |
| """ |
| lit_config = make_lit_config() |
| |
| # co_filename points at a path that is not on disk and not in |
| # linecache, so inspect.getsourcefile() on this frame returns None. |
| fake_filename = "/nonexistent/packaged/lit.cfg.py" |
| code = compile( |
| "lit_config.note('a note from a frame with no source file')", |
| fake_filename, |
| "exec", |
| ) |
| |
| captured = io.StringIO() |
| with contextlib.redirect_stderr(captured): |
| # Must not raise TypeError: expected str, ... not NoneType. |
| exec(code, {"lit_config": lit_config}) |
| |
| # The message is still emitted, tagged with the frame's co_filename. |
| # Compare on the basename only: _write_message runs the path through |
| # os.path.abspath(), which on Windows rewrites separators and prepends a |
| # drive, so the original string is not preserved verbatim. |
| output = captured.getvalue() |
| self.assertIn(os.path.basename(fake_filename), output) |
| self.assertIn("note:", output) |
| self.assertIn("a note from a frame with no source file", output) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |