| """ |
| Test the session save feature |
| """ |
| import os |
| import tempfile |
| |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class SessionSaveTestCase(TestBase): |
| def raw_transcript_builder(self, cmd, res): |
| raw = "(lldb) " + cmd + "\n" |
| if res.GetOutputSize(): |
| raw += res.GetOutput() |
| if res.GetErrorSize(): |
| raw += res.GetError() |
| return raw |
| |
| @skipIfWindows |
| @no_debug_info_test |
| def test_session_save(self): |
| raw = "" |
| interpreter = self.dbg.GetCommandInterpreter() |
| |
| settings = [ |
| "settings set interpreter.echo-commands true", |
| "settings set interpreter.echo-comment-commands true", |
| "settings set interpreter.stop-command-source-on-error false", |
| "settings set interpreter.open-transcript-in-editor false", |
| ] |
| |
| for setting in settings: |
| interpreter.HandleCommand(setting, lldb.SBCommandReturnObject()) |
| |
| inputs = [ |
| "# This is a comment", # Comment |
| "help session", # Valid command |
| "Lorem ipsum", # Invalid command |
| ] |
| |
| for cmd in inputs: |
| res = lldb.SBCommandReturnObject() |
| interpreter.HandleCommand(cmd, res) |
| raw += self.raw_transcript_builder(cmd, res) |
| |
| self.assertTrue(interpreter.HasCommands()) |
| self.assertNotEqual(len(raw), 0) |
| |
| # Check for error |
| cmd = "session save /root/file" |
| interpreter.HandleCommand(cmd, res) |
| self.assertFalse(res.Succeeded()) |
| raw += self.raw_transcript_builder(cmd, res) |
| |
| tf = tempfile.NamedTemporaryFile() |
| output_file = tf.name |
| |
| res = lldb.SBCommandReturnObject() |
| interpreter.HandleCommand("session save " + output_file, res) |
| self.assertTrue(res.Succeeded()) |
| raw += self.raw_transcript_builder(cmd, res) |
| |
| with open(output_file, "r") as file: |
| content = file.read() |
| # Exclude last line, since session won't record it's own output |
| lines = raw.splitlines()[:-1] |
| for line in lines: |
| self.assertIn(line, content) |
| |
| td = tempfile.TemporaryDirectory() |
| res = lldb.SBCommandReturnObject() |
| interpreter.HandleCommand( |
| "settings set interpreter.save-session-directory " + td.name, res |
| ) |
| self.assertTrue(res.Succeeded()) |
| |
| res = lldb.SBCommandReturnObject() |
| interpreter.HandleCommand("session save", res) |
| self.assertTrue(res.Succeeded()) |
| raw += self.raw_transcript_builder(cmd, res) |
| |
| with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: |
| content = file.read() |
| # Exclude last line, since session won't record it's own output |
| lines = raw.splitlines()[:-1] |
| for line in lines: |
| self.assertIn(line, content) |
| |
| @skipIfWindows |
| @no_debug_info_test |
| def test_session_save_on_quit(self): |
| raw = "" |
| interpreter = self.dbg.GetCommandInterpreter() |
| |
| td = tempfile.TemporaryDirectory() |
| |
| settings = [ |
| "settings set interpreter.echo-commands true", |
| "settings set interpreter.echo-comment-commands true", |
| "settings set interpreter.stop-command-source-on-error false", |
| "settings set interpreter.save-session-on-quit true", |
| "settings set interpreter.save-session-directory " + td.name, |
| "settings set interpreter.open-transcript-in-editor false", |
| ] |
| |
| for setting in settings: |
| res = lldb.SBCommandReturnObject() |
| interpreter.HandleCommand(setting, res) |
| raw += self.raw_transcript_builder(setting, res) |
| |
| self.dbg.Destroy(self.dbg) |
| |
| with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: |
| content = file.read() |
| # Exclude last line, since session won't record it's own output |
| lines = raw.splitlines()[:-1] |
| for line in lines: |
| self.assertIn(line, content) |