131 lines · python
1"""Test that the 'add-dsym', aka 'target symbols add', command informs the user about success or failure."""2 3 4import os5import time6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12@skipUnlessDarwin13class AddDsymCommandCase(TestBase):14 def setUp(self):15 TestBase.setUp(self)16 self.template = "main.cpp.template"17 self.source = "main.cpp"18 self.teardown_hook_added = False19 20 @no_debug_info_test21 def test_add_dsym_command_with_error(self):22 """Test that the 'add-dsym' command informs the user about failures."""23 24 # Call the program generator to produce main.cpp, version 1.25 self.generate_main_cpp(version=1)26 self.build(debug_info="dsym")27 28 # Insert some delay and then call the program generator to produce29 # main.cpp, version 2.30 time.sleep(5)31 self.generate_main_cpp(version=101)32 # Now call make again, but this time don't generate the dSYM.33 self.build(debug_info="dwarf")34 35 self.exe_name = "a.out"36 self.do_add_dsym_with_error(self.exe_name)37 38 @no_debug_info_test39 def test_add_dsym_command_with_success(self):40 """Test that the 'add-dsym' command informs the user about success."""41 42 # Call the program generator to produce main.cpp, version 1.43 self.generate_main_cpp(version=1)44 self.build(debug_info="dsym")45 46 self.exe_name = "a.out"47 self.do_add_dsym_with_success(self.exe_name)48 49 @no_debug_info_test50 def test_add_dsym_with_dSYM_bundle(self):51 """Test that the 'add-dsym' command informs the user about success."""52 53 # Call the program generator to produce main.cpp, version 1.54 self.generate_main_cpp(version=1)55 self.build(debug_info="dsym")56 57 self.exe_name = "a.out"58 self.do_add_dsym_with_dSYM_bundle(self.exe_name)59 60 def generate_main_cpp(self, version=0):61 """Generate main.cpp from main.cpp.template."""62 temp = os.path.join(self.getSourceDir(), self.template)63 with open(temp, "r") as f:64 content = f.read()65 66 new_content = content.replace(67 "%ADD_EXTRA_CODE%", 'printf("This is version %d\\n");' % version68 )69 src = os.path.join(self.getBuildDir(), self.source)70 with open(src, "w") as f:71 f.write(new_content)72 73 # The main.cpp has been generated, add a teardown hook to remove it.74 if not self.teardown_hook_added:75 self.addTearDownHook(lambda: os.remove(src))76 self.teardown_hook_added = True77 78 def do_add_dsym_with_error(self, exe_name):79 """Test that the 'add-dsym' command informs the user about failures."""80 exe_path = self.getBuildArtifact(exe_name)81 self.runCmd("file " + exe_path, CURRENT_EXECUTABLE_SET)82 83 wrong_path = os.path.join(self.getBuildDir(), "%s.dSYM" % exe_name, "Contents")84 self.expect(85 "add-dsym " + wrong_path, error=True, substrs=["invalid module path"]86 )87 88 right_path = os.path.join(89 self.getBuildDir(),90 "%s.dSYM" % exe_path,91 "Contents",92 "Resources",93 "DWARF",94 exe_name,95 )96 self.expect(97 "add-dsym " + right_path,98 error=True,99 substrs=["symbol file", "does not match"],100 )101 102 def do_add_dsym_with_success(self, exe_name):103 """Test that the 'add-dsym' command informs the user about success."""104 exe_path = self.getBuildArtifact(exe_name)105 self.runCmd("file " + exe_path, CURRENT_EXECUTABLE_SET)106 107 # This time, the UUID should match and we expect some feedback from108 # lldb.109 right_path = os.path.join(110 self.getBuildDir(),111 "%s.dSYM" % exe_path,112 "Contents",113 "Resources",114 "DWARF",115 exe_name,116 )117 self.expect(118 "add-dsym " + right_path, substrs=["symbol file", "has been added to"]119 )120 121 def do_add_dsym_with_dSYM_bundle(self, exe_name):122 """Test that the 'add-dsym' command informs the user about success when loading files in bundles."""123 exe_path = self.getBuildArtifact(exe_name)124 self.runCmd("file " + exe_path, CURRENT_EXECUTABLE_SET)125 126 # This time, the UUID should be found inside the bundle127 right_path = "%s.dSYM" % exe_path128 self.expect(129 "add-dsym " + right_path, substrs=["symbol file", "has been added to"]130 )131