Home | History | Annotate | Download | only in foundation
      1 """
      2 Test symbol table access for main.m.
      3 """
      4 
      5 import os, time
      6 import unittest2
      7 import lldb
      8 from lldbtest import *
      9 
     10 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     11 class FoundationSymtabTestCase(TestBase):
     12 
     13     mydir = os.path.join("lang", "objc", "foundation")
     14 
     15     symbols_list = ['-[MyString initWithNSString:]',
     16                     '-[MyString dealloc]',
     17                     '-[MyString description]',
     18                     '-[MyString descriptionPauses]',     # synthesized property
     19                     '-[MyString setDescriptionPauses:]', # synthesized property
     20                     'Test_Selector',
     21                     'Test_NSString',
     22                     'Test_MyString',
     23                     'Test_NSArray',
     24                     'main'
     25                     ]
     26 
     27     @python_api_test
     28     @dsym_test
     29     def test_with_dsym_and_python_api(self):
     30         """Test symbol table access with Python APIs."""
     31         self.buildDsym()
     32         self.symtab_access_python()
     33 
     34     @python_api_test
     35     @dwarf_test
     36     def test_with_dwarf_and_python_api(self):
     37         """Test symbol table access with Python APIs."""
     38         self.buildDwarf()
     39         self.symtab_access_python()
     40 
     41     def symtab_access_python(self):
     42         """Test symbol table access with Python APIs."""
     43         exe = os.path.join(os.getcwd(), "a.out")
     44         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
     45 
     46         target = self.dbg.CreateTarget(exe)
     47         self.assertTrue(target, VALID_TARGET)
     48 
     49         # Launch the process, and do not stop at the entry point.
     50         process = target.LaunchSimple(None, None, os.getcwd())
     51 
     52         #
     53         # Exercise Python APIs to access the symbol table entries.
     54         #
     55 
     56         # Create the filespec by which to locate our a.out module.
     57         filespec = lldb.SBFileSpec(exe, False)
     58 
     59         module = target.FindModule(filespec)
     60         self.assertTrue(module, VALID_MODULE)
     61 
     62         # Create the set of known symbols.  As we iterate through the symbol
     63         # table, remove the symbol from the set if it is a known symbol.
     64         expected_symbols = set(self.symbols_list)
     65         for symbol in module:
     66             self.assertTrue(symbol, VALID_SYMBOL)
     67             #print "symbol:", symbol
     68             name = symbol.GetName()
     69             if name in expected_symbols:
     70                 #print "Removing %s from known_symbols %s" % (name, expected_symbols)
     71                 expected_symbols.remove(name)
     72 
     73         # At this point, the known_symbols set should have become an empty set.
     74         # If not, raise an error.
     75         #print "symbols unaccounted for:", expected_symbols
     76         self.assertTrue(len(expected_symbols) == 0,
     77                         "All the known symbols are accounted for")
     78 
     79 
     80 if __name__ == '__main__':
     81     import atexit
     82     lldb.SBDebugger.Initialize()
     83     atexit.register(lambda: lldb.SBDebugger.Terminate())
     84     unittest2.main()
     85