| 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()) |