199451b44SJordan Rupprecht"""Test the RunCommandInterpreter API.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprechtimport os 499451b44SJordan Rupprechtimport lldb 599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 799451b44SJordan Rupprecht 899451b44SJordan Rupprecht 92238dcc3SJonas Devlieghereclass CommandRunInterpreterLegacyAPICase(TestBase): 1099451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht def setUp(self): 1399451b44SJordan Rupprecht TestBase.setUp(self) 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht self.stdin_path = self.getBuildArtifact("stdin.txt") 1699451b44SJordan Rupprecht 172238dcc3SJonas Devlieghere with open(self.stdin_path, "w") as input_handle: 1899451b44SJordan Rupprecht input_handle.write("nonexistingcommand\nquit") 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht # Python will close the file descriptor if all references 2199451b44SJordan Rupprecht # to the filehandle object lapse, so we need to keep one 2299451b44SJordan Rupprecht # around. 232238dcc3SJonas Devlieghere self.filehandle = open(self.stdin_path, "r") 2499451b44SJordan Rupprecht self.dbg.SetInputFileHandle(self.filehandle, False) 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht # No need to track the output 272238dcc3SJonas Devlieghere self.devnull = open(os.devnull, "w") 2899451b44SJordan Rupprecht self.dbg.SetOutputFileHandle(self.devnull, False) 2999451b44SJordan Rupprecht self.dbg.SetErrorFileHandle(self.devnull, False) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht def test_run_session_with_error_and_quit_legacy(self): 3299451b44SJordan Rupprecht """Run non-existing and quit command returns appropriate values""" 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter( 352238dcc3SJonas Devlieghere True, False, lldb.SBCommandInterpreterRunOptions(), 0, False, False 362238dcc3SJonas Devlieghere ) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht self.assertGreater(n_errors, 0) 3999451b44SJordan Rupprecht self.assertTrue(quit_requested) 4099451b44SJordan Rupprecht self.assertFalse(has_crashed) 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprechtclass CommandRunInterpreterAPICase(TestBase): 4499451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht def setUp(self): 4799451b44SJordan Rupprecht TestBase.setUp(self) 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht self.stdin_path = self.getBuildArtifact("stdin.txt") 50*435dd974Sjimingham self.stdout_path = self.getBuildArtifact("stdout.txt") 51*435dd974Sjimingham 52*435dd974Sjimingham def run_commands_string( 53*435dd974Sjimingham self, command_string, options=lldb.SBCommandInterpreterRunOptions() 54*435dd974Sjimingham ): 55*435dd974Sjimingham """Run the commands in command_string through RunCommandInterpreter. 56*435dd974Sjimingham Returns (n_errors, quit_requested, has_crashed, result_string).""" 5799451b44SJordan Rupprecht 582238dcc3SJonas Devlieghere with open(self.stdin_path, "w") as input_handle: 59*435dd974Sjimingham input_handle.write(command_string) 6099451b44SJordan Rupprecht 61*435dd974Sjimingham n_errors = 0 62*435dd974Sjimingham quit_requested = False 63*435dd974Sjimingham has_crashed = False 6499451b44SJordan Rupprecht 65*435dd974Sjimingham with open(self.stdin_path, "r") as in_fileH, open( 66*435dd974Sjimingham self.stdout_path, "w" 67*435dd974Sjimingham ) as out_fileH: 68*435dd974Sjimingham self.dbg.SetInputFile(in_fileH) 69*435dd974Sjimingham 70*435dd974Sjimingham self.dbg.SetOutputFile(out_fileH) 71*435dd974Sjimingham self.dbg.SetErrorFile(out_fileH) 72*435dd974Sjimingham 73*435dd974Sjimingham n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter( 74*435dd974Sjimingham True, False, options, 0, False, False 75*435dd974Sjimingham ) 76*435dd974Sjimingham 77*435dd974Sjimingham result_string = None 78*435dd974Sjimingham with open(self.stdout_path, "r") as out_fileH: 79*435dd974Sjimingham result_string = out_fileH.read() 80*435dd974Sjimingham 81*435dd974Sjimingham return (n_errors, quit_requested, has_crashed, result_string) 8299451b44SJordan Rupprecht 8399451b44SJordan Rupprecht def test_run_session_with_error_and_quit(self): 8499451b44SJordan Rupprecht """Run non-existing and quit command returns appropriate values""" 8599451b44SJordan Rupprecht 86*435dd974Sjimingham n_errors, quit_requested, has_crashed, _ = self.run_commands_string( 87*435dd974Sjimingham "nonexistingcommand\nquit\n" 882238dcc3SJonas Devlieghere ) 8999451b44SJordan Rupprecht self.assertGreater(n_errors, 0) 9099451b44SJordan Rupprecht self.assertTrue(quit_requested) 9199451b44SJordan Rupprecht self.assertFalse(has_crashed) 92c9647419SMed Ismail Bennani 93*435dd974Sjimingham def test_allow_repeat(self): 94*435dd974Sjimingham """Try auto-repeat of process launch - the command will fail and 95*435dd974Sjimingham the auto-repeat will fail because of no auto-repeat.""" 96*435dd974Sjimingham options = lldb.SBCommandInterpreterRunOptions() 97*435dd974Sjimingham options.SetEchoCommands(False) 98*435dd974Sjimingham options.SetAllowRepeats(True) 99*435dd974Sjimingham 100*435dd974Sjimingham n_errors, quit_requested, has_crashed, result_str = self.run_commands_string( 101*435dd974Sjimingham "process launch\n\n", options 102*435dd974Sjimingham ) 103*435dd974Sjimingham self.assertEqual(n_errors, 2) 104*435dd974Sjimingham self.assertFalse(quit_requested) 105*435dd974Sjimingham self.assertFalse(has_crashed) 106*435dd974Sjimingham 107*435dd974Sjimingham self.assertIn("invalid target", result_str) 108*435dd974Sjimingham self.assertIn("No auto repeat", result_str) 109*435dd974Sjimingham 110c9647419SMed Ismail Bennani 1112238dcc3SJonas Devlieghereclass SBCommandInterpreterRunOptionsCase(TestBase): 112c9647419SMed Ismail Bennani NO_DEBUG_INFO_TESTCASE = True 113c9647419SMed Ismail Bennani 114c9647419SMed Ismail Bennani def test_command_interpreter_run_options(self): 115c9647419SMed Ismail Bennani """Test SBCommandInterpreterRunOptions default values, getters & setters""" 116c9647419SMed Ismail Bennani 117c9647419SMed Ismail Bennani opts = lldb.SBCommandInterpreterRunOptions() 118c9647419SMed Ismail Bennani 119c9647419SMed Ismail Bennani # Check getters with default values 1201eeeab82SJordan Rupprecht self.assertFalse(opts.GetStopOnContinue()) 1211eeeab82SJordan Rupprecht self.assertFalse(opts.GetStopOnError()) 1221eeeab82SJordan Rupprecht self.assertFalse(opts.GetStopOnCrash()) 1231eeeab82SJordan Rupprecht self.assertTrue(opts.GetEchoCommands()) 1241eeeab82SJordan Rupprecht self.assertTrue(opts.GetPrintResults()) 1251eeeab82SJordan Rupprecht self.assertTrue(opts.GetPrintErrors()) 1261eeeab82SJordan Rupprecht self.assertTrue(opts.GetAddToHistory()) 127*435dd974Sjimingham self.assertFalse(opts.GetAllowRepeats()) 128c9647419SMed Ismail Bennani 129c9647419SMed Ismail Bennani # Invert values 130c9647419SMed Ismail Bennani opts.SetStopOnContinue(not opts.GetStopOnContinue()) 131c9647419SMed Ismail Bennani opts.SetStopOnError(not opts.GetStopOnError()) 132c9647419SMed Ismail Bennani opts.SetStopOnCrash(not opts.GetStopOnCrash()) 133c9647419SMed Ismail Bennani opts.SetEchoCommands(not opts.GetEchoCommands()) 134c9647419SMed Ismail Bennani opts.SetPrintResults(not opts.GetPrintResults()) 135c9647419SMed Ismail Bennani opts.SetPrintErrors(not opts.GetPrintErrors()) 136c9647419SMed Ismail Bennani opts.SetAddToHistory(not opts.GetAddToHistory()) 137*435dd974Sjimingham opts.SetAllowRepeats(not opts.GetAllowRepeats()) 138c9647419SMed Ismail Bennani 139c9647419SMed Ismail Bennani # Check the value changed 1401eeeab82SJordan Rupprecht self.assertTrue(opts.GetStopOnContinue()) 1411eeeab82SJordan Rupprecht self.assertTrue(opts.GetStopOnError()) 1421eeeab82SJordan Rupprecht self.assertTrue(opts.GetStopOnCrash()) 1431eeeab82SJordan Rupprecht self.assertFalse(opts.GetEchoCommands()) 1441eeeab82SJordan Rupprecht self.assertFalse(opts.GetPrintResults()) 1451eeeab82SJordan Rupprecht self.assertFalse(opts.GetPrintErrors()) 1461eeeab82SJordan Rupprecht self.assertFalse(opts.GetAddToHistory()) 147*435dd974Sjimingham self.assertTrue(opts.GetAllowRepeats()) 148