xref: /llvm-project/lldb/test/API/lang/objc/objc-checker/TestObjCCheckers.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtUse lldb Python API to make sure the dynamic checkers are doing their jobs.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass ObjCCheckerTestCase(TestBase):
1399451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def setUp(self):
1699451b44SJordan Rupprecht        # Call super's setUp().
1799451b44SJordan Rupprecht        TestBase.setUp(self)
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht        # Find the line number to break for main.c.
20*2238dcc3SJonas Devlieghere        self.source_name = "main.m"
2199451b44SJordan Rupprecht
22*2238dcc3SJonas Devlieghere    @add_test_categories(["pyapi"])
2399451b44SJordan Rupprecht    def test_objc_checker(self):
2499451b44SJordan Rupprecht        """Test that checkers catch unrecognized selectors"""
25*2238dcc3SJonas Devlieghere        if self.getArchitecture() == "i386":
2699451b44SJordan Rupprecht            self.skipTest("requires Objective-C 2.0 runtime")
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        self.build()
2999451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        # Create a target from the debugger.
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
3499451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        # Set up our breakpoints:
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        main_bkpt = target.BreakpointCreateBySourceRegex(
39*2238dcc3SJonas Devlieghere            "Set a breakpoint here.", lldb.SBFileSpec(self.source_name)
40*2238dcc3SJonas Devlieghere        )
41*2238dcc3SJonas Devlieghere        self.assertTrue(
42*2238dcc3SJonas Devlieghere            main_bkpt and main_bkpt.GetNumLocations() == 1, VALID_BREAKPOINT
43*2238dcc3SJonas Devlieghere        )
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        # Now launch the process, and do not stop at the entry point.
46*2238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
4799451b44SJordan Rupprecht
48*2238dcc3SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
4999451b44SJordan Rupprecht
50*2238dcc3SJonas Devlieghere        threads = lldbutil.get_threads_stopped_at_breakpoint(process, main_bkpt)
51619e2e09SDave Lee        self.assertEqual(len(threads), 1)
5299451b44SJordan Rupprecht        thread = threads[0]
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        #
5599451b44SJordan Rupprecht        #  The class Simple doesn't have a count method.  Make sure that we don't
5699451b44SJordan Rupprecht        #  actually try to send count but catch it as an unrecognized selector.
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
5999451b44SJordan Rupprecht        expr_value = frame.EvaluateExpression("(int) [my_simple count]", False)
6099451b44SJordan Rupprecht        expr_error = expr_value.GetError()
6199451b44SJordan Rupprecht
6299451b44SJordan Rupprecht        self.assertTrue(expr_error.Fail())
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        # Make sure the call produced no NSLog stdout.
6599451b44SJordan Rupprecht        stdout = process.GetSTDOUT(100)
6699451b44SJordan Rupprecht        self.assertTrue(stdout is None or (len(stdout) == 0))
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        # Make sure the error is helpful:
6999451b44SJordan Rupprecht        err_string = expr_error.GetCString()
703cc37622SDave Lee        self.assertIn("selector", err_string)
7199451b44SJordan Rupprecht
7299451b44SJordan Rupprecht        #
7399451b44SJordan Rupprecht        # Check that we correctly insert the checker for an
7499451b44SJordan Rupprecht        # ObjC method with the struct return convention.
7599451b44SJordan Rupprecht        # Getting this wrong would cause us to call the checker
7699451b44SJordan Rupprecht        # with the wrong arguments, and the checker would crash
7799451b44SJordan Rupprecht        # So I'm just checking "expression runs successfully" here:
7899451b44SJordan Rupprecht        #
7999451b44SJordan Rupprecht        expr_value = frame.EvaluateExpression("[my_simple getBigStruct]", False)
8099451b44SJordan Rupprecht        expr_error = expr_value.GetError()
8199451b44SJordan Rupprecht
82779bbbf2SDave Lee        self.assertSuccess(expr_error)
83