1"""
2Test the session save feature
3"""
4
5import lldb
6from lldbsuite.test.decorators import *
7from lldbsuite.test.lldbtest import *
8from lldbsuite.test import lldbutil
9
10
11class SessionSaveTestCase(TestBase):
12
13    mydir = TestBase.compute_mydir(__file__)
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    @skipIfReproducer
26    @no_debug_info_test
27    def test_session_save(self):
28        raw = ""
29        interpreter = self.dbg.GetCommandInterpreter()
30
31        settings = [
32          'settings set interpreter.echo-commands true',
33          'settings set interpreter.echo-comment-commands true',
34          'settings set interpreter.stop-command-source-on-error false'
35        ]
36
37        for setting in settings:
38          interpreter.HandleCommand(setting, lldb.SBCommandReturnObject())
39
40        inputs = [
41          '# This is a comment',  # Comment
42          'help session',         # Valid command
43          'Lorem ipsum'           # Invalid command
44        ]
45
46        for cmd in inputs:
47          res = lldb.SBCommandReturnObject()
48          interpreter.HandleCommand(cmd, res)
49          raw += self.raw_transcript_builder(cmd, res)
50
51        self.assertTrue(interpreter.HasCommands())
52        self.assertTrue(len(raw) != 0)
53
54        # Check for error
55        cmd = 'session save /root/file'
56        interpreter.HandleCommand(cmd, res)
57        self.assertFalse(res.Succeeded())
58        raw += self.raw_transcript_builder(cmd, res)
59
60        import tempfile
61        tf = tempfile.NamedTemporaryFile()
62        output_file = tf.name
63
64        res = lldb.SBCommandReturnObject()
65        interpreter.HandleCommand('session save ' + output_file, res)
66        self.assertTrue(res.Succeeded())
67        raw += self.raw_transcript_builder(cmd, res)
68
69        with open(output_file, "r") as file:
70          content = file.read()
71          # Exclude last line, since session won't record it's own output
72          lines = raw.splitlines()[:-1]
73          for line in lines:
74            self.assertIn(line, content)
75