15bb742b1SMed Ismail Bennani""" 25bb742b1SMed Ismail BennaniTest the session save feature 35bb742b1SMed Ismail Bennani""" 4fe1874ddSMed Ismail Bennaniimport os 5d6b64612SMed Ismail Bennaniimport tempfile 6d6b64612SMed Ismail Bennani 75bb742b1SMed Ismail Bennaniimport lldb 85bb742b1SMed Ismail Bennanifrom lldbsuite.test.decorators import * 95bb742b1SMed Ismail Bennanifrom lldbsuite.test.lldbtest import * 105bb742b1SMed Ismail Bennanifrom lldbsuite.test import lldbutil 115bb742b1SMed Ismail Bennani 125bb742b1SMed Ismail Bennani 135bb742b1SMed Ismail Bennaniclass SessionSaveTestCase(TestBase): 145bb742b1SMed Ismail Bennani def raw_transcript_builder(self, cmd, res): 155bb742b1SMed Ismail Bennani raw = "(lldb) " + cmd + "\n" 165bb742b1SMed Ismail Bennani if res.GetOutputSize(): 175bb742b1SMed Ismail Bennani raw += res.GetOutput() 185bb742b1SMed Ismail Bennani if res.GetErrorSize(): 195bb742b1SMed Ismail Bennani raw += res.GetError() 205bb742b1SMed Ismail Bennani return raw 215bb742b1SMed Ismail Bennani 225bb742b1SMed Ismail Bennani @no_debug_info_test 235bb742b1SMed Ismail Bennani def test_session_save(self): 245bb742b1SMed Ismail Bennani raw = "" 255bb742b1SMed Ismail Bennani interpreter = self.dbg.GetCommandInterpreter() 265bb742b1SMed Ismail Bennani 27e8dc8d61Sroyitaqi # Make sure "save-transcript" is on, so that all the following setings 28e8dc8d61Sroyitaqi # and commands are saved into the trasncript. Note that this cannot be 29e8dc8d61Sroyitaqi # a part of the `settings`, because this command itself won't be saved 30e8dc8d61Sroyitaqi # into the transcript. 31e8dc8d61Sroyitaqi self.runCmd("settings set interpreter.save-transcript true") 32e8dc8d61Sroyitaqi 335bb742b1SMed Ismail Bennani settings = [ 342238dcc3SJonas Devlieghere "settings set interpreter.echo-commands true", 352238dcc3SJonas Devlieghere "settings set interpreter.echo-comment-commands true", 362238dcc3SJonas Devlieghere "settings set interpreter.stop-command-source-on-error false", 372238dcc3SJonas Devlieghere "settings set interpreter.open-transcript-in-editor false", 385bb742b1SMed Ismail Bennani ] 395bb742b1SMed Ismail Bennani 405bb742b1SMed Ismail Bennani for setting in settings: 415bb742b1SMed Ismail Bennani interpreter.HandleCommand(setting, lldb.SBCommandReturnObject()) 425bb742b1SMed Ismail Bennani 435bb742b1SMed Ismail Bennani inputs = [ 442238dcc3SJonas Devlieghere "# This is a comment", # Comment 452238dcc3SJonas Devlieghere "help session", # Valid command 462238dcc3SJonas Devlieghere "Lorem ipsum", # Invalid command 475bb742b1SMed Ismail Bennani ] 485bb742b1SMed Ismail Bennani 495bb742b1SMed Ismail Bennani for cmd in inputs: 505bb742b1SMed Ismail Bennani res = lldb.SBCommandReturnObject() 515bb742b1SMed Ismail Bennani interpreter.HandleCommand(cmd, res) 525bb742b1SMed Ismail Bennani raw += self.raw_transcript_builder(cmd, res) 535bb742b1SMed Ismail Bennani 545bb742b1SMed Ismail Bennani self.assertTrue(interpreter.HasCommands()) 559c246882SJordan Rupprecht self.assertNotEqual(len(raw), 0) 565bb742b1SMed Ismail Bennani 575bb742b1SMed Ismail Bennani # Check for error 582238dcc3SJonas Devlieghere cmd = "session save /root/file" 595bb742b1SMed Ismail Bennani interpreter.HandleCommand(cmd, res) 605bb742b1SMed Ismail Bennani self.assertFalse(res.Succeeded()) 615bb742b1SMed Ismail Bennani raw += self.raw_transcript_builder(cmd, res) 625bb742b1SMed Ismail Bennani 63c5e417a8SVladislav Dzhidzhoev output_file = self.getBuildArtifact('my-session') 645bb742b1SMed Ismail Bennani 655bb742b1SMed Ismail Bennani res = lldb.SBCommandReturnObject() 662238dcc3SJonas Devlieghere interpreter.HandleCommand("session save " + output_file, res) 675bb742b1SMed Ismail Bennani self.assertTrue(res.Succeeded()) 685bb742b1SMed Ismail Bennani raw += self.raw_transcript_builder(cmd, res) 695bb742b1SMed Ismail Bennani 705bb742b1SMed Ismail Bennani with open(output_file, "r") as file: 715bb742b1SMed Ismail Bennani content = file.read() 725bb742b1SMed Ismail Bennani # Exclude last line, since session won't record it's own output 735bb742b1SMed Ismail Bennani lines = raw.splitlines()[:-1] 745bb742b1SMed Ismail Bennani for line in lines: 755bb742b1SMed Ismail Bennani self.assertIn(line, content) 76fe1874ddSMed Ismail Bennani 77fe1874ddSMed Ismail Bennani td = tempfile.TemporaryDirectory() 78fe1874ddSMed Ismail Bennani res = lldb.SBCommandReturnObject() 792238dcc3SJonas Devlieghere interpreter.HandleCommand( 802238dcc3SJonas Devlieghere "settings set interpreter.save-session-directory " + td.name, res 812238dcc3SJonas Devlieghere ) 82fe1874ddSMed Ismail Bennani self.assertTrue(res.Succeeded()) 83fe1874ddSMed Ismail Bennani 84fe1874ddSMed Ismail Bennani res = lldb.SBCommandReturnObject() 852238dcc3SJonas Devlieghere interpreter.HandleCommand("session save", res) 86fe1874ddSMed Ismail Bennani self.assertTrue(res.Succeeded()) 87fe1874ddSMed Ismail Bennani raw += self.raw_transcript_builder(cmd, res) 88835b5e27STom Yang # Also check that we don't print an error message about an empty transcript. 89835b5e27STom Yang self.assertNotIn("interpreter.save-transcript is set to false", res.GetError()) 90fe1874ddSMed Ismail Bennani 91fe1874ddSMed Ismail Bennani with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: 92fe1874ddSMed Ismail Bennani content = file.read() 93fe1874ddSMed Ismail Bennani # Exclude last line, since session won't record it's own output 94fe1874ddSMed Ismail Bennani lines = raw.splitlines()[:-1] 95fe1874ddSMed Ismail Bennani for line in lines: 96fe1874ddSMed Ismail Bennani self.assertIn(line, content) 97d6b64612SMed Ismail Bennani 98d6b64612SMed Ismail Bennani @no_debug_info_test 99835b5e27STom Yang def test_session_save_no_transcript_warning(self): 100835b5e27STom Yang interpreter = self.dbg.GetCommandInterpreter() 101835b5e27STom Yang 102835b5e27STom Yang self.runCmd("settings set interpreter.save-transcript false") 103835b5e27STom Yang 104835b5e27STom Yang # These commands won't be saved, so are arbitrary. 105835b5e27STom Yang commands = [ 106*c3782f67SAlex Langford "settings set interpreter.open-transcript-in-editor false", 107835b5e27STom Yang "p 1", 108835b5e27STom Yang "settings set interpreter.save-session-on-quit true", 109835b5e27STom Yang "fr v", 110835b5e27STom Yang "settings set interpreter.echo-comment-commands true", 111835b5e27STom Yang ] 112835b5e27STom Yang 113835b5e27STom Yang for command in commands: 114835b5e27STom Yang res = lldb.SBCommandReturnObject() 115835b5e27STom Yang interpreter.HandleCommand(command, res) 116835b5e27STom Yang 117835b5e27STom Yang output_file = self.getBuildArtifact("my-session") 118835b5e27STom Yang 119835b5e27STom Yang res = lldb.SBCommandReturnObject() 120835b5e27STom Yang interpreter.HandleCommand("session save " + output_file, res) 121835b5e27STom Yang self.assertTrue(res.Succeeded()) 122835b5e27STom Yang # We should warn about the setting being false. 123835b5e27STom Yang self.assertIn("interpreter.save-transcript is set to false", res.GetError()) 124835b5e27STom Yang self.assertTrue( 125835b5e27STom Yang os.path.getsize(output_file) == 0, 126835b5e27STom Yang "Output file should be empty since we didn't save the transcript.", 127835b5e27STom Yang ) 128835b5e27STom Yang 129835b5e27STom Yang @no_debug_info_test 130d6b64612SMed Ismail Bennani def test_session_save_on_quit(self): 131d6b64612SMed Ismail Bennani raw = "" 132d6b64612SMed Ismail Bennani interpreter = self.dbg.GetCommandInterpreter() 133d6b64612SMed Ismail Bennani 134e8dc8d61Sroyitaqi # Make sure "save-transcript" is on, so that all the following setings 135e8dc8d61Sroyitaqi # and commands are saved into the trasncript. Note that this cannot be 136e8dc8d61Sroyitaqi # a part of the `settings`, because this command itself won't be saved 137e8dc8d61Sroyitaqi # into the transcript. 138e8dc8d61Sroyitaqi self.runCmd("settings set interpreter.save-transcript true") 139e8dc8d61Sroyitaqi 140d6b64612SMed Ismail Bennani td = tempfile.TemporaryDirectory() 141d6b64612SMed Ismail Bennani 142d6b64612SMed Ismail Bennani settings = [ 1432238dcc3SJonas Devlieghere "settings set interpreter.echo-commands true", 1442238dcc3SJonas Devlieghere "settings set interpreter.echo-comment-commands true", 1452238dcc3SJonas Devlieghere "settings set interpreter.stop-command-source-on-error false", 1462238dcc3SJonas Devlieghere "settings set interpreter.save-session-on-quit true", 1472238dcc3SJonas Devlieghere "settings set interpreter.save-session-directory " + td.name, 1482238dcc3SJonas Devlieghere "settings set interpreter.open-transcript-in-editor false", 149d6b64612SMed Ismail Bennani ] 150d6b64612SMed Ismail Bennani 151d6b64612SMed Ismail Bennani for setting in settings: 152d6b64612SMed Ismail Bennani res = lldb.SBCommandReturnObject() 153d6b64612SMed Ismail Bennani interpreter.HandleCommand(setting, res) 154d6b64612SMed Ismail Bennani raw += self.raw_transcript_builder(setting, res) 155d6b64612SMed Ismail Bennani 156d6b64612SMed Ismail Bennani self.dbg.Destroy(self.dbg) 157d6b64612SMed Ismail Bennani 158d6b64612SMed Ismail Bennani with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: 159d6b64612SMed Ismail Bennani content = file.read() 160d6b64612SMed Ismail Bennani # Exclude last line, since session won't record it's own output 161d6b64612SMed Ismail Bennani lines = raw.splitlines()[:-1] 162d6b64612SMed Ismail Bennani for line in lines: 163d6b64612SMed Ismail Bennani self.assertIn(line, content) 164