Home | History | Annotate | Download | only in uuid
      1 """Test that the 'add-dsym', aka 'target symbols add', command informs the user about success or failure."""
      2 
      3 import os, time
      4 import unittest2
      5 import lldb
      6 import pexpect
      7 from lldbtest import *
      8 
      9 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     10 class AddDsymCommandCase(TestBase):
     11 
     12     mydir = os.path.join("warnings", "uuid")
     13 
     14     def setUp(self):
     15         TestBase.setUp(self)
     16         self.template = 'main.cpp.template'
     17         self.source = 'main.cpp'
     18         self.teardown_hook_added = False
     19 
     20     def test_add_dsym_command_with_error(self):
     21         """Test that the 'add-dsym' command informs the user about failures."""
     22 
     23         # Call the program generator to produce main.cpp, version 1.
     24         self.generate_main_cpp(version=1)
     25         self.buildDsym(clean=True)
     26 
     27         # Insert some delay and then call the program generator to produce main.cpp, version 2.
     28         time.sleep(5)
     29         self.generate_main_cpp(version=101)
     30         # Now call make again, but this time don't generate the dSYM.
     31         self.buildDwarf(clean=False)
     32 
     33         self.exe_name = 'a.out'
     34         self.do_add_dsym_with_error(self.exe_name)
     35 
     36     def test_add_dsym_command_with_success(self):
     37         """Test that the 'add-dsym' command informs the user about success."""
     38 
     39         # Call the program generator to produce main.cpp, version 1.
     40         self.generate_main_cpp(version=1)
     41         self.buildDsym(clean=True)
     42 
     43         self.exe_name = 'a.out'
     44         self.do_add_dsym_with_success(self.exe_name)
     45 
     46     def test_add_dsym_with_dSYM_bundle(self):
     47         """Test that the 'add-dsym' command informs the user about success."""
     48 
     49         # Call the program generator to produce main.cpp, version 1.
     50         self.generate_main_cpp(version=1)
     51         self.buildDsym(clean=True)
     52 
     53         self.exe_name = 'a.out'
     54         self.do_add_dsym_with_dSYM_bundle(self.exe_name)
     55 
     56 
     57     def generate_main_cpp(self, version=0):
     58         """Generate main.cpp from main.cpp.template."""
     59         temp = os.path.join(os.getcwd(), self.template)
     60         with open(temp, 'r') as f:
     61             content = f.read()
     62 
     63         new_content = content.replace('%ADD_EXTRA_CODE%',
     64                                       'printf("This is version %d\\n");' % version)
     65         src = os.path.join(os.getcwd(), self.source)
     66         with open(src, 'w') as f:
     67             f.write(new_content)
     68 
     69         # The main.cpp has been generated, add a teardown hook to remove it.
     70         if not self.teardown_hook_added:
     71             self.addTearDownHook(lambda: os.remove(src))
     72             self.teardown_hook_added = True
     73 
     74     def do_add_dsym_with_error(self, exe_name):
     75         """Test that the 'add-dsym' command informs the user about failures."""
     76         self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)
     77 
     78         wrong_path = os.path.join("%s.dSYM" % exe_name, "Contents")
     79         self.expect("add-dsym " + wrong_path, error=True,
     80             substrs = ['invalid module path'])
     81 
     82         right_path = os.path.join("%s.dSYM" % exe_name, "Contents", "Resources", "DWARF", exe_name)
     83         self.expect("add-dsym " + right_path, error=True,
     84             substrs = ['symbol file', 'does not match'])
     85 
     86     def do_add_dsym_with_success(self, exe_name):
     87         """Test that the 'add-dsym' command informs the user about success."""
     88         self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)
     89 
     90         # This time, the UUID should match and we expect some feedback from lldb.
     91         right_path = os.path.join("%s.dSYM" % exe_name, "Contents", "Resources", "DWARF", exe_name)
     92         self.expect("add-dsym " + right_path,
     93             substrs = ['symbol file', 'has been added to'])
     94 
     95     def do_add_dsym_with_dSYM_bundle(self, exe_name):
     96         """Test that the 'add-dsym' command informs the user about success when loading files in bundles."""
     97         self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)
     98 
     99         # This time, the UUID should be found inside the bundle
    100         right_path = "%s.dSYM" % exe_name
    101         self.expect("add-dsym " + right_path,
    102             substrs = ['symbol file', 'has been added to'])
    103 
    104 
    105 if __name__ == '__main__':
    106     import atexit
    107     lldb.SBDebugger.Initialize()
    108     atexit.register(lambda: lldb.SBDebugger.Terminate())
    109     unittest2.main()
    110