TestValueAPI.py revision 5503d468e43aae7d047c9b98baf626fc5b6c352d
15503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen"""
25503d468e43aae7d047c9b98baf626fc5b6c352dJohnny ChenTest some SBValue APIs.
35503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen"""
45503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
55503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport os, time
65503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport re
75503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport unittest2
85503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport lldb, lldbutil
95503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenfrom lldbtest import *
105503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
115503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenclass ValueAPITestCase(TestBase):
125503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
135503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    mydir = os.path.join("python_api", "value")
145503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
155503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
165503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    @python_api_test
175503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    def test_with_dsym(self):
185503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        """Exercise some SBValue APIs."""
195503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        d = {'EXE': self.exe_name}
205503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.buildDsym(dictionary=d)
215503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.setTearDownCleanup(dictionary=d)
225503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.value_api(self.exe_name)
235503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
245503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    @python_api_test
255503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    def test_with_dwarf(self):
265503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        """Exercise some SBValue APIs."""
275503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        d = {'EXE': self.exe_name}
285503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.buildDwarf(dictionary=d)
295503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.setTearDownCleanup(dictionary=d)
305503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.value_api(self.exe_name)
315503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
325503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    def setUp(self):
335503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Call super's setUp().
345503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        TestBase.setUp(self)
355503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # We'll use the test method name as the exe_name.
365503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.exe_name = self.testMethodName
375503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Find the line number to of function 'c'.
385503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.line = line_number('main.c', '// Break at this line')
395503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
405503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    def value_api(self, exe_name):
415503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        """Exercise some SBValue APIs."""
425503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        exe = os.path.join(os.getcwd(), exe_name)
435503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
445503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Create a target by the debugger.
455503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        target = self.dbg.CreateTarget(exe)
465503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(target, VALID_TARGET)
475503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
485503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Create the breakpoint inside function 'main'.
495503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        breakpoint = target.BreakpointCreateByLocation('main.c', self.line)
505503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(breakpoint, VALID_BREAKPOINT)
515503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
525503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Now launch the process, and do not stop at entry point.
535503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        process = target.LaunchSimple(None, None, os.getcwd())
545503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(process, PROCESS_IS_VALID)
555503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
565503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Get Frame #0.
575503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(process.GetState() == lldb.eStateStopped)
585503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
595503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(thread != None, "There should be a thread stopped due to breakpoint condition")
605503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        frame0 = thread.GetFrameAtIndex(0)
615503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
625503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Get variable 'str_ptr'.
635503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        value = frame0.FindVariable('str_ptr')
645503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(value, VALID_VARIABLE)
655503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.DebugSBValue(value)
665503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
675503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Get child at index 5 => 'Friday'.
685503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        child = value.GetChildAtIndex(5, lldb.eNoDynamicValues, True)
695503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(child, VALID_VARIABLE)
705503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.DebugSBValue(child)
715503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
725503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.expect(child.GetSummary(), exe=False,
735503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen            substrs = ['Friday'])
745503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
755503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # Now try to get at the same variable using GetValueForExpressionPath().
765503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        # These two SBValue objects should have the same value.
775503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        val2 = value.GetValueForExpressionPath('[5]')
785503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(val2, VALID_VARIABLE)
795503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.DebugSBValue(val2)
805503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen        self.assertTrue(child.GetValue() == val2.GetValue() and
815503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen                        child.GetSummary() == val2.GetSummary())
825503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen
835503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenif __name__ == '__main__':
845503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    import atexit
855503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    lldb.SBDebugger.Initialize()
865503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
875503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen    unittest2.main()
88