xref: /llvm-project/lldb/test/API/python_api/interpreter/TestRunCommandInterpreterAPI.py (revision 435dd9746107e13c2ad019be3bd34815f7d2360d)
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