TestSessionSave.py 2.15 KB
"""
Test the session save feature
"""

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


class SessionSaveTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    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


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

        settings = [
          'settings set interpreter.echo-commands true',
          'settings set interpreter.echo-comment-commands true',
          'settings set interpreter.stop-command-source-on-error 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.assertTrue(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)

        import tempfile
        tf = tempfile.NamedTemporaryFile()
        output_file = tf.name

        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)