| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class CommandInterepterPrintCallbackTest(TestBase): |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| def run_command_interpreter_with_output_file(self, out_filename, input_str): |
| with open(out_filename, "w") as f: |
| self.dbg.SetOutputFileHandle(f, False) |
| self.dbg.SetInputString(input_str) |
| opts = lldb.SBCommandInterpreterRunOptions() |
| self.dbg.RunCommandInterpreter(True, False, opts, 0, False, False) |
| |
| def test_command_interpreter_print_callback(self): |
| """Test the command interpreter print callback.""" |
| self.build() |
| exe = self.getBuildArtifact("a.out") |
| |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, VALID_TARGET) |
| |
| lldbutil.run_to_source_breakpoint( |
| self, "// Break here", lldb.SBFileSpec("main.c") |
| ) |
| |
| out_filename = self.getBuildArtifact("output") |
| ci = self.dbg.GetCommandInterpreter() |
| called = False |
| |
| # The string we'll be looking for in the command output. |
| needle = "Show a list of all debugger commands" |
| |
| # Test registering a callback that handles the printing. Make sure the |
| # result is passed to the callback and that we don't print the result. |
| def handling_callback(return_object): |
| nonlocal called |
| called = True |
| self.assertEqual("help help", return_object.GetCommand()) |
| self.assertIn(needle, return_object.GetOutput()) |
| return lldb.eCommandReturnObjectPrintCallbackHandled |
| |
| ci.SetPrintCallback(handling_callback) |
| self.assertFalse(called) |
| self.run_command_interpreter_with_output_file(out_filename, "help help\n") |
| with open(out_filename, "r") as f: |
| self.assertNotIn(needle, f.read()) |
| |
| # Test registering a callback that defers the printing to lldb. Make |
| # sure the result is passed to the callback and that the result is |
| # printed by lldb. |
| def non_handling_callback(return_object): |
| nonlocal called |
| called = True |
| self.assertEqual("he help", return_object.GetCommand()) |
| self.assertIn(needle, return_object.GetOutput()) |
| return lldb.eCommandReturnObjectPrintCallbackSkipped |
| |
| called = False |
| ci.SetPrintCallback(non_handling_callback) |
| self.assertFalse(called) |
| self.run_command_interpreter_with_output_file(out_filename, "he help\n") |
| self.assertTrue(called) |
| |
| with open(out_filename, "r") as f: |
| self.assertIn(needle, f.read()) |