| """Test that the 'add-dsym', aka 'target symbols add', command informs the user about success or failure.""" |
| |
| from __future__ import print_function |
| |
| |
| import os |
| import time |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| @skipUnlessDarwin |
| class AddDsymCommandCase(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| def setUp(self): |
| TestBase.setUp(self) |
| self.template = 'main.cpp.template' |
| self.source = 'main.cpp' |
| self.teardown_hook_added = False |
| |
| @no_debug_info_test |
| def test_add_dsym_command_with_error(self): |
| """Test that the 'add-dsym' command informs the user about failures.""" |
| |
| # Call the program generator to produce main.cpp, version 1. |
| self.generate_main_cpp(version=1) |
| self.buildDefault(dictionary={'MAKE_DSYM':'YES'}) |
| |
| # Insert some delay and then call the program generator to produce |
| # main.cpp, version 2. |
| time.sleep(5) |
| self.generate_main_cpp(version=101) |
| # Now call make again, but this time don't generate the dSYM. |
| self.buildDefault(dictionary={'MAKE_DSYM':'NO'}) |
| |
| self.exe_name = 'a.out' |
| self.do_add_dsym_with_error(self.exe_name) |
| |
| @no_debug_info_test |
| def test_add_dsym_command_with_success(self): |
| """Test that the 'add-dsym' command informs the user about success.""" |
| |
| # Call the program generator to produce main.cpp, version 1. |
| self.generate_main_cpp(version=1) |
| self.buildDefault(dictionary={'MAKE_DSYM':'YES'}) |
| |
| self.exe_name = 'a.out' |
| self.do_add_dsym_with_success(self.exe_name) |
| |
| @no_debug_info_test |
| def test_add_dsym_with_dSYM_bundle(self): |
| """Test that the 'add-dsym' command informs the user about success.""" |
| |
| # Call the program generator to produce main.cpp, version 1. |
| self.generate_main_cpp(version=1) |
| self.buildDefault(dictionary={'MAKE_DSYM':'YES'}) |
| |
| self.exe_name = 'a.out' |
| self.do_add_dsym_with_dSYM_bundle(self.exe_name) |
| |
| def generate_main_cpp(self, version=0): |
| """Generate main.cpp from main.cpp.template.""" |
| temp = os.path.join(self.getSourceDir(), self.template) |
| with open(temp, 'r') as f: |
| content = f.read() |
| |
| new_content = content.replace( |
| '%ADD_EXTRA_CODE%', |
| 'printf("This is version %d\\n");' % |
| version) |
| src = os.path.join(self.getBuildDir(), self.source) |
| with open(src, 'w') as f: |
| f.write(new_content) |
| |
| # The main.cpp has been generated, add a teardown hook to remove it. |
| if not self.teardown_hook_added: |
| self.addTearDownHook(lambda: os.remove(src)) |
| self.teardown_hook_added = True |
| |
| def do_add_dsym_with_error(self, exe_name): |
| """Test that the 'add-dsym' command informs the user about failures.""" |
| exe_path = self.getBuildArtifact(exe_name) |
| self.runCmd("file " + exe_path, CURRENT_EXECUTABLE_SET) |
| |
| wrong_path = os.path.join(self.getBuildDir(), |
| "%s.dSYM" % exe_name, "Contents") |
| self.expect("add-dsym " + wrong_path, error=True, |
| substrs=['invalid module path']) |
| |
| right_path = os.path.join( |
| self.getBuildDir(), |
| "%s.dSYM" % |
| exe_path, |
| "Contents", |
| "Resources", |
| "DWARF", |
| exe_name) |
| self.expect("add-dsym " + right_path, error=True, |
| substrs=['symbol file', 'does not match']) |
| |
| def do_add_dsym_with_success(self, exe_name): |
| """Test that the 'add-dsym' command informs the user about success.""" |
| exe_path = self.getBuildArtifact(exe_name) |
| self.runCmd("file " + exe_path, CURRENT_EXECUTABLE_SET) |
| |
| # This time, the UUID should match and we expect some feedback from |
| # lldb. |
| right_path = os.path.join( |
| self.getBuildDir(), |
| "%s.dSYM" % |
| exe_path, |
| "Contents", |
| "Resources", |
| "DWARF", |
| exe_name) |
| self.expect("add-dsym " + right_path, |
| substrs=['symbol file', 'has been added to']) |
| |
| def do_add_dsym_with_dSYM_bundle(self, exe_name): |
| """Test that the 'add-dsym' command informs the user about success when loading files in bundles.""" |
| exe_path = self.getBuildArtifact(exe_name) |
| self.runCmd("file " + exe_path, CURRENT_EXECUTABLE_SET) |
| |
| # This time, the UUID should be found inside the bundle |
| right_path = "%s.dSYM" % exe_path |
| self.expect("add-dsym " + right_path, |
| substrs=['symbol file', 'has been added to']) |