1""" 2Test the session save feature 3""" 4import os 5import tempfile 6 7import lldb 8from lldbsuite.test.decorators import * 9from lldbsuite.test.lldbtest import * 10from lldbsuite.test import lldbutil 11 12 13class SessionSaveTestCase(TestBase): 14 15 def raw_transcript_builder(self, cmd, res): 16 raw = "(lldb) " + cmd + "\n" 17 if res.GetOutputSize(): 18 raw += res.GetOutput() 19 if res.GetErrorSize(): 20 raw += res.GetError() 21 return raw 22 23 24 @skipIfWindows 25 @no_debug_info_test 26 def test_session_save(self): 27 raw = "" 28 interpreter = self.dbg.GetCommandInterpreter() 29 30 settings = [ 31 'settings set interpreter.echo-commands true', 32 'settings set interpreter.echo-comment-commands true', 33 'settings set interpreter.stop-command-source-on-error false' 34 ] 35 36 for setting in settings: 37 interpreter.HandleCommand(setting, lldb.SBCommandReturnObject()) 38 39 inputs = [ 40 '# This is a comment', # Comment 41 'help session', # Valid command 42 'Lorem ipsum' # Invalid command 43 ] 44 45 for cmd in inputs: 46 res = lldb.SBCommandReturnObject() 47 interpreter.HandleCommand(cmd, res) 48 raw += self.raw_transcript_builder(cmd, res) 49 50 self.assertTrue(interpreter.HasCommands()) 51 self.assertTrue(len(raw) != 0) 52 53 # Check for error 54 cmd = 'session save /root/file' 55 interpreter.HandleCommand(cmd, res) 56 self.assertFalse(res.Succeeded()) 57 raw += self.raw_transcript_builder(cmd, res) 58 59 tf = tempfile.NamedTemporaryFile() 60 output_file = tf.name 61 62 res = lldb.SBCommandReturnObject() 63 interpreter.HandleCommand('session save ' + output_file, res) 64 self.assertTrue(res.Succeeded()) 65 raw += self.raw_transcript_builder(cmd, res) 66 67 with open(output_file, "r") as file: 68 content = file.read() 69 # Exclude last line, since session won't record it's own output 70 lines = raw.splitlines()[:-1] 71 for line in lines: 72 self.assertIn(line, content) 73 74 td = tempfile.TemporaryDirectory() 75 res = lldb.SBCommandReturnObject() 76 interpreter.HandleCommand('settings set interpreter.save-session-directory ' + td.name, res) 77 self.assertTrue(res.Succeeded()) 78 79 res = lldb.SBCommandReturnObject() 80 interpreter.HandleCommand('session save', res) 81 self.assertTrue(res.Succeeded()) 82 raw += self.raw_transcript_builder(cmd, res) 83 84 with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: 85 content = file.read() 86 # Exclude last line, since session won't record it's own output 87 lines = raw.splitlines()[:-1] 88 for line in lines: 89 self.assertIn(line, content) 90 91 @skipIfWindows 92 @no_debug_info_test 93 def test_session_save_on_quit(self): 94 raw = "" 95 interpreter = self.dbg.GetCommandInterpreter() 96 97 td = tempfile.TemporaryDirectory() 98 99 settings = [ 100 'settings set interpreter.echo-commands true', 101 'settings set interpreter.echo-comment-commands true', 102 'settings set interpreter.stop-command-source-on-error false', 103 'settings set interpreter.save-session-on-quit true', 104 'settings set interpreter.save-session-directory ' + td.name, 105 ] 106 107 for setting in settings: 108 res = lldb.SBCommandReturnObject() 109 interpreter.HandleCommand(setting, res) 110 raw += self.raw_transcript_builder(setting, res) 111 112 self.dbg.Destroy(self.dbg) 113 114 with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: 115 content = file.read() 116 # Exclude last line, since session won't record it's own output 117 lines = raw.splitlines()[:-1] 118 for line in lines: 119 self.assertIn(line, content) 120 121 122 123