Files
clang-p2996/lldb/test/API/commands/session/save/TestSessionSave.py
Tom Yang 835b5e278e Add warning message to session save when transcript isn't saved. (#109020)
Somewhat recently, we made the change to hide the behavior to save LLDB
session history to the transcript buffer behind the flag
`interpreter.save-transcript`. By default, `interpreter.save-transcript`
is false. See #90703 for context.

I'm making a small update here to our `session save` messaging and some
help docs to clarify for users that aren't aware of this change. Maybe
`interpreter.save-transcript` could be true by default as well. Any
feedback welcome.

# Tests
```
bin/lldb-dotest -p TestSessionSave
```

---------

Co-authored-by: Tom Yang <toyang@fb.com>
2024-10-05 00:29:44 -07:00

163 lines
5.9 KiB
Python

"""
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 = [
"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)