1"""
2Test SBSymbolContext APIs.
3"""
4
5import os, time
6import re
7import unittest2
8import lldb, lldbutil
9from lldbtest import *
10
11class SymbolContextAPITestCase(TestBase):
12
13    mydir = os.path.join("python_api", "symbol-context")
14
15    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16    @python_api_test
17    @dsym_test
18    def test_with_dsym(self):
19        """Exercise SBSymbolContext API extensively."""
20        self.buildDsym()
21        self.symbol_context()
22
23    @python_api_test
24    @dwarf_test
25    def test_with_dwarf(self):
26        """Exercise SBSymbolContext API extensively."""
27        self.buildDwarf()
28        self.symbol_context()
29
30    def setUp(self):
31        # Call super's setUp().
32        TestBase.setUp(self)
33        # Find the line number to of function 'c'.
34        self.line = line_number('main.c', '// Find the line number of function "c" here.')
35
36    def symbol_context(self):
37        """Get an SBSymbolContext object and call its many methods."""
38        exe = os.path.join(os.getcwd(), "a.out")
39
40        # Create a target by the debugger.
41        target = self.dbg.CreateTarget(exe)
42        self.assertTrue(target, VALID_TARGET)
43
44        # Now create a breakpoint on main.c by name 'c'.
45        breakpoint = target.BreakpointCreateByName('c', 'a.out')
46        #print "breakpoint:", breakpoint
47        self.assertTrue(breakpoint and
48                        breakpoint.GetNumLocations() == 1,
49                        VALID_BREAKPOINT)
50
51        # Now launch the process, and do not stop at entry point.
52        process = target.LaunchSimple(None, None, os.getcwd())
53        self.assertTrue(process, PROCESS_IS_VALID)
54
55        # Frame #0 should be on self.line.
56        from lldbutil import get_stopped_thread
57        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
58        self.assertTrue(thread.IsValid(), "There should be a thread stopped due to breakpoint")
59        frame0 = thread.GetFrameAtIndex(0)
60        self.assertTrue(frame0.GetLineEntry().GetLine() == self.line)
61
62        # Now get the SBSymbolContext from this frame.  We want everything. :-)
63        context = frame0.GetSymbolContext(lldb.eSymbolContextEverything)
64        self.assertTrue(context)
65
66        # Get the description of this module.
67        module = context.GetModule()
68        desc = lldbutil.get_description(module)
69        self.expect(desc, "The module should match", exe=False,
70            substrs = [os.path.join(self.mydir, 'a.out')])
71
72        compileUnit = context.GetCompileUnit()
73        self.expect(str(compileUnit), "The compile unit should match", exe=False,
74            substrs = [os.path.join(self.mydir, 'main.c')])
75
76        function = context.GetFunction()
77        self.assertTrue(function)
78        #print "function:", function
79
80        block = context.GetBlock()
81        self.assertTrue(block)
82        #print "block:", block
83
84        lineEntry = context.GetLineEntry()
85        #print "line entry:", lineEntry
86        self.expect(lineEntry.GetFileSpec().GetDirectory(), "The line entry should have the correct directory",
87                    exe=False,
88            substrs = [self.mydir])
89        self.expect(lineEntry.GetFileSpec().GetFilename(), "The line entry should have the correct filename",
90                    exe=False,
91            substrs = ['main.c'])
92        self.assertTrue(lineEntry.GetLine() == self.line,
93                        "The line entry's line number should match ")
94
95        symbol = context.GetSymbol()
96        self.assertTrue(function.GetName() == symbol.GetName() and symbol.GetName() == 'c',
97                        "The symbol name should be 'c'")
98
99
100if __name__ == '__main__':
101    import atexit
102    lldb.SBDebugger.Initialize()
103    atexit.register(lambda: lldb.SBDebugger.Terminate())
104    unittest2.main()
105