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 Rupprechtclass CommandRunInterpreterLegacyAPICase(TestBase):
999451b44SJordan Rupprecht
1099451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1199451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1299451b44SJordan Rupprecht
137606a543SJonas Devlieghere    @skipIfReproducer # lldb::FileSP used in typemap cannot be instrumented.
1499451b44SJordan Rupprecht    def setUp(self):
1599451b44SJordan Rupprecht        TestBase.setUp(self)
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht        self.stdin_path = self.getBuildArtifact("stdin.txt")
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht        with open(self.stdin_path, 'w') as input_handle:
2099451b44SJordan Rupprecht            input_handle.write("nonexistingcommand\nquit")
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        # Python will close the file descriptor if all references
2399451b44SJordan Rupprecht        # to the filehandle object lapse, so we need to keep one
2499451b44SJordan Rupprecht        # around.
2599451b44SJordan Rupprecht        self.filehandle = open(self.stdin_path, 'r')
2699451b44SJordan Rupprecht        self.dbg.SetInputFileHandle(self.filehandle, False)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # No need to track the output
2999451b44SJordan Rupprecht        self.devnull = open(os.devnull, 'w')
3099451b44SJordan Rupprecht        self.dbg.SetOutputFileHandle(self.devnull, False)
3199451b44SJordan Rupprecht        self.dbg.SetErrorFileHandle (self.devnull, False)
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht    def test_run_session_with_error_and_quit_legacy(self):
3499451b44SJordan Rupprecht        """Run non-existing and quit command returns appropriate values"""
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter(
3799451b44SJordan Rupprecht                True, False, lldb.SBCommandInterpreterRunOptions(), 0, False,
3899451b44SJordan Rupprecht                False)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        self.assertGreater(n_errors, 0)
4199451b44SJordan Rupprecht        self.assertTrue(quit_requested)
4299451b44SJordan Rupprecht        self.assertFalse(has_crashed)
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprechtclass CommandRunInterpreterAPICase(TestBase):
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
4899451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
4999451b44SJordan Rupprecht
507606a543SJonas Devlieghere    @skipIfReproducer # lldb::FileSP used in typemap cannot be instrumented.
5199451b44SJordan Rupprecht    def setUp(self):
5299451b44SJordan Rupprecht        TestBase.setUp(self)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        self.stdin_path = self.getBuildArtifact("stdin.txt")
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        with open(self.stdin_path, 'w') as input_handle:
5799451b44SJordan Rupprecht            input_handle.write("nonexistingcommand\nquit")
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht        self.dbg.SetInputFile(open(self.stdin_path, 'r'))
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # No need to track the output
6299451b44SJordan Rupprecht        devnull = open(os.devnull, 'w')
6399451b44SJordan Rupprecht        self.dbg.SetOutputFile(devnull)
6499451b44SJordan Rupprecht        self.dbg.SetErrorFile(devnull)
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht    def test_run_session_with_error_and_quit(self):
6799451b44SJordan Rupprecht        """Run non-existing and quit command returns appropriate values"""
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        n_errors, quit_requested, has_crashed = self.dbg.RunCommandInterpreter(
7099451b44SJordan Rupprecht                True, False, lldb.SBCommandInterpreterRunOptions(), 0, False,
7199451b44SJordan Rupprecht                False)
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        self.assertGreater(n_errors, 0)
7499451b44SJordan Rupprecht        self.assertTrue(quit_requested)
7599451b44SJordan Rupprecht        self.assertFalse(has_crashed)
76*c9647419SMed Ismail Bennani
77*c9647419SMed Ismail Bennaniclass SBCommandInterpreterRunOptionsCase(TestBase):
78*c9647419SMed Ismail Bennani
79*c9647419SMed Ismail Bennani    NO_DEBUG_INFO_TESTCASE = True
80*c9647419SMed Ismail Bennani    mydir = TestBase.compute_mydir(__file__)
81*c9647419SMed Ismail Bennani
82*c9647419SMed Ismail Bennani    def test_command_interpreter_run_options(self):
83*c9647419SMed Ismail Bennani        """Test SBCommandInterpreterRunOptions default values, getters & setters """
84*c9647419SMed Ismail Bennani
85*c9647419SMed Ismail Bennani        opts = lldb.SBCommandInterpreterRunOptions()
86*c9647419SMed Ismail Bennani
87*c9647419SMed Ismail Bennani        # Check getters with default values
88*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetStopOnContinue(), False)
89*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetStopOnError(), False)
90*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetStopOnCrash(), False)
91*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetEchoCommands(), True)
92*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetPrintResults(), True)
93*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetPrintErrors(), True)
94*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetAddToHistory(), True)
95*c9647419SMed Ismail Bennani
96*c9647419SMed Ismail Bennani        # Invert values
97*c9647419SMed Ismail Bennani        opts.SetStopOnContinue(not opts.GetStopOnContinue())
98*c9647419SMed Ismail Bennani        opts.SetStopOnError(not opts.GetStopOnError())
99*c9647419SMed Ismail Bennani        opts.SetStopOnCrash(not opts.GetStopOnCrash())
100*c9647419SMed Ismail Bennani        opts.SetEchoCommands(not opts.GetEchoCommands())
101*c9647419SMed Ismail Bennani        opts.SetPrintResults(not opts.GetPrintResults())
102*c9647419SMed Ismail Bennani        opts.SetPrintErrors(not opts.GetPrintErrors())
103*c9647419SMed Ismail Bennani        opts.SetAddToHistory(not opts.GetAddToHistory())
104*c9647419SMed Ismail Bennani
105*c9647419SMed Ismail Bennani        # Check the value changed
106*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetStopOnContinue(), True)
107*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetStopOnError(), True)
108*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetStopOnCrash(), True)
109*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetEchoCommands(), False)
110*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetPrintResults(), False)
111*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetPrintErrors(), False)
112*c9647419SMed Ismail Bennani        self.assertEqual(opts.GetAddToHistory(), False)
113