""" 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)