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
|
"""
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)
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_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)
|