xref: /llvm-project/lldb/test/API/lang/objc/global_ptrs/TestGlobalObjects.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
199451b44SJordan Rupprecht"""Test that a global ObjC object found before the process is started updates correctly."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprechtimport lldb
599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht
1099451b44SJordan Rupprechtclass TestObjCGlobalVar(TestBase):
1199451b44SJordan Rupprecht    def setUp(self):
1299451b44SJordan Rupprecht        # Call super's setUp().
1399451b44SJordan Rupprecht        TestBase.setUp(self)
1499451b44SJordan Rupprecht        self.main_source = lldb.SBFileSpec("main.m")
1599451b44SJordan Rupprecht
162238dcc3SJonas Devlieghere    @add_test_categories(["pyapi"])
1799451b44SJordan Rupprecht    def test_with_python_api(self):
1899451b44SJordan Rupprecht        """Test that a global ObjC object found before the process is started updates correctly."""
1999451b44SJordan Rupprecht        self.build()
2099451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2399451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2499451b44SJordan Rupprecht
252238dcc3SJonas Devlieghere        bkpt = target.BreakpointCreateBySourceRegex("NSLog", self.main_source)
2699451b44SJordan Rupprecht        self.assertTrue(bkpt, VALID_BREAKPOINT)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Before we launch, make an SBValue for our global object pointer:
2999451b44SJordan Rupprecht        g_obj_ptr = target.FindFirstGlobalVariable("g_obj_ptr")
30779bbbf2SDave Lee        self.assertSuccess(g_obj_ptr.GetError(), "Made the g_obj_ptr")
310ed758b2SDave Lee        self.assertEqual(
322238dcc3SJonas Devlieghere            g_obj_ptr.GetValueAsUnsigned(10), 0, "g_obj_ptr is initially null"
332238dcc3SJonas Devlieghere        )
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
362238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
4199451b44SJordan Rupprecht        threads = lldbutil.get_threads_stopped_at_breakpoint(process, bkpt)
4299451b44SJordan Rupprecht        if len(threads) != 1:
4399451b44SJordan Rupprecht            self.fail("Failed to stop at breakpoint 1.")
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        thread = threads[0]
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        dyn_value = g_obj_ptr.GetDynamicValue(lldb.eDynamicCanRunTarget)
482238dcc3SJonas Devlieghere        self.assertTrue(dyn_value.GetError().Success(), "Dynamic value is valid")
49*80fcecb1SJonas Devlieghere        self.assertEqual(dyn_value.GetObjectDescription(), "Some NSString")
50