xref: /llvm-project/lldb/test/API/commands/session/save/TestSessionSave.py (revision c3782f67daf462f6b289b5898cb65c61f64c197d)
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