| """Test the RunCommandInterpreter API.""" | |
| import os | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| class CommandRunInterpreterLegacyAPICase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| def setUp(self): | |
| TestBase.setUp(self) | |
| self.stdin_path = self.getBuildArtifact("stdin.txt") | |
| with open(self.stdin_path, "w") as input_handle: | |
| input_handle.write("nonexistingcommand\nquit") | |
| # Python will close the file descriptor if all references | |
| # to the filehandle object lapse, so we need to keep one | |
| # around. | |
| self.filehandle = open(self.stdin_path, "r") | |
| self.dbg.SetInputFileHandle(self.filehandle, False) | |
| # No need to track the output | |
| self.devnull = open(os.devnull, "w") | |
| self.dbg.SetOutputFileHandle(self.devnull, False) | |
| self.dbg.SetErrorFileHandle(self.devnull, False) | |
| def test_run_session_with_error_and_quit_legacy(self): | |
| """Run non-existing and quit command returns appropriate values""" | |
| n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter( | |
| True, False, lldb.SBCommandInterpreterRunOptions(), 0, False, False | |
| ) | |
| self.assertGreater(n_errors, 0) | |
| self.assertTrue(quit_requested) | |
| self.assertFalse(has_crashed) | |
| class CommandRunInterpreterAPICase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| def setUp(self): | |
| TestBase.setUp(self) | |
| self.stdin_path = self.getBuildArtifact("stdin.txt") | |
| self.stdout_path = self.getBuildArtifact("stdout.txt") | |
| def run_commands_string( | |
| self, command_string, options=lldb.SBCommandInterpreterRunOptions() | |
| ): | |
| """Run the commands in command_string through RunCommandInterpreter. | |
| Returns (n_errors, quit_requested, has_crashed, result_string).""" | |
| with open(self.stdin_path, "w") as input_handle: | |
| input_handle.write(command_string) | |
| n_errors = 0 | |
| quit_requested = False | |
| has_crashed = False | |
| with open(self.stdin_path, "r") as in_fileH, open( | |
| self.stdout_path, "w" | |
| ) as out_fileH: | |
| self.dbg.SetInputFile(in_fileH) | |
| self.dbg.SetOutputFile(out_fileH) | |
| self.dbg.SetErrorFile(out_fileH) | |
| n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter( | |
| True, False, options, 0, False, False | |
| ) | |
| result_string = None | |
| with open(self.stdout_path, "r") as out_fileH: | |
| result_string = out_fileH.read() | |
| return (n_errors, quit_requested, has_crashed, result_string) | |
| def test_run_session_with_error_and_quit(self): | |
| """Run non-existing and quit command returns appropriate values""" | |
| n_errors, quit_requested, has_crashed, _ = self.run_commands_string( | |
| "nonexistingcommand\nquit\n" | |
| ) | |
| self.assertGreater(n_errors, 0) | |
| self.assertTrue(quit_requested) | |
| self.assertFalse(has_crashed) | |
| def test_allow_repeat(self): | |
| """Try auto-repeat of process launch - the command will fail and | |
| the auto-repeat will fail because of no auto-repeat.""" | |
| options = lldb.SBCommandInterpreterRunOptions() | |
| options.SetEchoCommands(False) | |
| options.SetAllowRepeats(True) | |
| n_errors, quit_requested, has_crashed, result_str = self.run_commands_string( | |
| "process launch\n\n", options | |
| ) | |
| self.assertEqual(n_errors, 2) | |
| self.assertFalse(quit_requested) | |
| self.assertFalse(has_crashed) | |
| self.assertIn("invalid target", result_str) | |
| self.assertIn("no auto repeat", result_str) | |
| class SBCommandInterpreterRunOptionsCase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| def test_command_interpreter_run_options(self): | |
| """Test SBCommandInterpreterRunOptions default values, getters & setters""" | |
| opts = lldb.SBCommandInterpreterRunOptions() | |
| # Check getters with default values | |
| self.assertFalse(opts.GetStopOnContinue()) | |
| self.assertFalse(opts.GetStopOnError()) | |
| self.assertFalse(opts.GetStopOnCrash()) | |
| self.assertTrue(opts.GetEchoCommands()) | |
| self.assertTrue(opts.GetPrintResults()) | |
| self.assertTrue(opts.GetPrintErrors()) | |
| self.assertTrue(opts.GetAddToHistory()) | |
| self.assertFalse(opts.GetAllowRepeats()) | |
| # Invert values | |
| opts.SetStopOnContinue(not opts.GetStopOnContinue()) | |
| opts.SetStopOnError(not opts.GetStopOnError()) | |
| opts.SetStopOnCrash(not opts.GetStopOnCrash()) | |
| opts.SetEchoCommands(not opts.GetEchoCommands()) | |
| opts.SetPrintResults(not opts.GetPrintResults()) | |
| opts.SetPrintErrors(not opts.GetPrintErrors()) | |
| opts.SetAddToHistory(not opts.GetAddToHistory()) | |
| opts.SetAllowRepeats(not opts.GetAllowRepeats()) | |
| # Check the value changed | |
| self.assertTrue(opts.GetStopOnContinue()) | |
| self.assertTrue(opts.GetStopOnError()) | |
| self.assertTrue(opts.GetStopOnCrash()) | |
| self.assertFalse(opts.GetEchoCommands()) | |
| self.assertFalse(opts.GetPrintResults()) | |
| self.assertFalse(opts.GetPrintErrors()) | |
| self.assertFalse(opts.GetAddToHistory()) | |
| self.assertTrue(opts.GetAllowRepeats()) |