aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/commands/session/save/TestSessionSave.py
blob: e5913f8edfe8fcf668526dfbd9b286e3d3de08e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
"""
Test the session save feature
"""
import os
import tempfile

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class SessionSaveTestCase(TestBase):
    def raw_transcript_builder(self, cmd, res):
        raw = "(lldb) " + cmd + "\n"
        if res.GetOutputSize():
            raw += res.GetOutput()
        if res.GetErrorSize():
            raw += res.GetError()
        return raw

    @no_debug_info_test
    def test_session_save(self):
        raw = ""
        interpreter = self.dbg.GetCommandInterpreter()

        # Make sure "save-transcript" is on, so that all the following setings
        # and commands are saved into the trasncript. Note that this cannot be
        # a part of the `settings`, because this command itself won't be saved
        # into the transcript.
        self.runCmd("settings set interpreter.save-transcript true")

        settings = [
            "settings set interpreter.echo-commands true",
            "settings set interpreter.echo-comment-commands true",
            "settings set interpreter.stop-command-source-on-error false",
            "settings set interpreter.open-transcript-in-editor false",
        ]

        for setting in settings:
            interpreter.HandleCommand(setting, lldb.SBCommandReturnObject())

        inputs = [
            "# This is a comment",  # Comment
            "help session",  # Valid command
            "Lorem ipsum",  # Invalid command
        ]

        for cmd in inputs:
            res = lldb.SBCommandReturnObject()
            interpreter.HandleCommand(cmd, res)
            raw += self.raw_transcript_builder(cmd, res)

        self.assertTrue(interpreter.HasCommands())
        self.assertNotEqual(len(raw), 0)

        # Check for error
        cmd = "session save /root/file"
        interpreter.HandleCommand(cmd, res)
        self.assertFalse(res.Succeeded())
        raw += self.raw_transcript_builder(cmd, res)

        output_file = self.getBuildArtifact('my-session')

        res = lldb.SBCommandReturnObject()
        interpreter.HandleCommand("session save " + output_file, res)
        self.assertTrue(res.Succeeded())
        raw += self.raw_transcript_builder(cmd, res)

        with open(output_file, "r") as file:
            content = file.read()
            # Exclude last line, since session won't record it's own output
            lines = raw.splitlines()[:-1]
            for line in lines:
                self.assertIn(line, content)

        td = tempfile.TemporaryDirectory()
        res = lldb.SBCommandReturnObject()
        interpreter.HandleCommand(
            "settings set interpreter.save-session-directory " + td.name, res
        )
        self.assertTrue(res.Succeeded())

        res = lldb.SBCommandReturnObject()
        interpreter.HandleCommand("session save", res)
        self.assertTrue(res.Succeeded())
        raw += self.raw_transcript_builder(cmd, res)
        # Also check that we don't print an error message about an empty transcript.
        self.assertNotIn("interpreter.save-transcript is set to false", res.GetError())

        with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file:
            content = file.read()
            # Exclude last line, since session won't record it's own output
            lines = raw.splitlines()[:-1]
            for line in lines:
                self.assertIn(line, content)

    @no_debug_info_test
    def test_session_save_no_transcript_warning(self):
        interpreter = self.dbg.GetCommandInterpreter()

        self.runCmd("settings set interpreter.save-transcript false")

        # These commands won't be saved, so are arbitrary.
        commands = [
            "settings set interpreter.open-transcript-in-editor false",
            "p 1",
            "settings set interpreter.save-session-on-quit true",
            "fr v",
            "settings set interpreter.echo-comment-commands true",
        ]

        for command in commands:
            res = lldb.SBCommandReturnObject()
            interpreter.HandleCommand(command, res)

        output_file = self.getBuildArtifact("my-session")

        res = lldb.SBCommandReturnObject()
        interpreter.HandleCommand("session save " + output_file, res)
        self.assertTrue(res.Succeeded())
        # We should warn about the setting being false.
        self.assertIn("interpreter.save-transcript is set to false", res.GetError())
        self.assertTrue(
            os.path.getsize(output_file) == 0,
            "Output file should be empty since we didn't save the transcript.",
        )

    @no_debug_info_test
    def test_session_save_on_quit(self):
        raw = ""
        interpreter = self.dbg.GetCommandInterpreter()

        # Make sure "save-transcript" is on, so that all the following setings
        # and commands are saved into the trasncript. Note that this cannot be
        # a part of the `settings`, because this command itself won't be saved
        # into the transcript.
        self.runCmd("settings set interpreter.save-transcript true")

        td = tempfile.TemporaryDirectory()

        settings = [
            "settings set interpreter.echo-commands true",
            "settings set interpreter.echo-comment-commands true",
            "settings set interpreter.stop-command-source-on-error false",
            "settings set interpreter.save-session-on-quit true",
            "settings set interpreter.save-session-directory " + td.name,
            "settings set interpreter.open-transcript-in-editor false",
        ]

        for setting in settings:
            res = lldb.SBCommandReturnObject()
            interpreter.HandleCommand(setting, res)
            raw += self.raw_transcript_builder(setting, res)

        self.dbg.Destroy(self.dbg)

        with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file:
            content = file.read()
            # Exclude last line, since session won't record it's own output
            lines = raw.splitlines()[:-1]
            for line in lines:
                self.assertIn(line, content)