| """ |
| 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): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| 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 |
| @skipIfReproducer |
| @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' |
| ] |
| |
| 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.assertTrue(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 |
| @skipIfReproducer |
| @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, |
| ] |
| |
| 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) |
| |
| |
| |