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