1"""Test the lldb public C++ api breakpoint callbacks.""" 2 3from __future__ import print_function 4 5# __package__ = "lldbsuite.test" 6 7 8import os 9from lldbsuite.test.decorators import * 10from lldbsuite.test.lldbtest import * 11from lldbsuite.test import lldbutil 12 13 14class SBBreakpointCallbackCase(TestBase): 15 16 NO_DEBUG_INFO_TESTCASE = True 17 18 def setUp(self): 19 TestBase.setUp(self) 20 self.generateSource('driver.cpp') 21 self.generateSource('listener_test.cpp') 22 self.generateSource('test_breakpoint_callback.cpp') 23 self.generateSource('test_listener_event_description.cpp') 24 self.generateSource('test_listener_event_process_state.cpp') 25 self.generateSource('test_listener_resume.cpp') 26 27 mydir = TestBase.compute_mydir(__file__) 28 29 @skipIfRemote 30 @skipIfNoSBHeaders 31 # clang-cl does not support throw or catch (llvm.org/pr24538) 32 @skipIfWindows 33 def test_breakpoint_callback(self): 34 """Test the that SBBreakpoint callback is invoked when a breakpoint is hit. """ 35 self.build_and_test('driver.cpp test_breakpoint_callback.cpp', 36 'test_breakpoint_callback') 37 38 @skipIfRemote 39 @skipIfNoSBHeaders 40 # clang-cl does not support throw or catch (llvm.org/pr24538) 41 @skipIfWindows 42 @expectedFlakeyFreeBSD 43 def test_sb_api_listener_event_description(self): 44 """ Test the description of an SBListener breakpoint event is valid.""" 45 self.build_and_test( 46 'driver.cpp listener_test.cpp test_listener_event_description.cpp', 47 'test_listener_event_description') 48 49 @skipIfRemote 50 @skipIfNoSBHeaders 51 # clang-cl does not support throw or catch (llvm.org/pr24538) 52 @skipIfWindows 53 @expectedFlakeyFreeBSD 54 def test_sb_api_listener_event_process_state(self): 55 """ Test that a registered SBListener receives events when a process 56 changes state. 57 """ 58 self.build_and_test( 59 'driver.cpp listener_test.cpp test_listener_event_process_state.cpp', 60 'test_listener_event_process_state') 61 62 @skipIfRemote 63 @skipIfNoSBHeaders 64 # clang-cl does not support throw or catch (llvm.org/pr24538) 65 @skipIfWindows 66 @expectedFlakeyFreeBSD 67 @skipIf(oslist=["linux"]) # flakey 68 def test_sb_api_listener_resume(self): 69 """ Test that a process can be resumed from a non-main thread. """ 70 self.build_and_test( 71 'driver.cpp listener_test.cpp test_listener_resume.cpp', 72 'test_listener_resume') 73 74 def build_and_test(self, sources, test_name, args=None): 75 """ Build LLDB test from sources, and run expecting 0 exit code """ 76 77 # These tests link against host lldb API. 78 # Compiler's target triple must match liblldb triple 79 # because remote is disabled, we can assume that the os is the same 80 # still need to check architecture 81 if self.getLldbArchitecture() != self.getArchitecture(): 82 self.skipTest( 83 "This test is only run if the target arch is the same as the lldb binary arch") 84 85 self.inferior = 'inferior_program' 86 self.buildProgram('inferior.cpp', self.inferior) 87 self.addTearDownHook(lambda: 88 os.remove(self.getBuildArtifact(self.inferior))) 89 90 self.buildDriver(sources, test_name) 91 self.addTearDownHook(lambda: 92 os.remove(self.getBuildArtifact(test_name))) 93 94 test_exe = self.getBuildArtifact(test_name) 95 self.signBinary(test_exe) 96 exe = [test_exe, self.getBuildArtifact(self.inferior)] 97 98 env = {self.dylibPath: self.getLLDBLibraryEnvVal()} 99 if 'LLDB_DEBUGSERVER_PATH' in os.environ: 100 env['LLDB_DEBUGSERVER_PATH'] = os.environ['LLDB_DEBUGSERVER_PATH'] 101 if self.TraceOn(): 102 print("Running test %s" % " ".join(exe)) 103 check_call(exe, env=env) 104 else: 105 with open(os.devnull, 'w') as fnull: 106 check_call(exe, env=env, stdout=fnull, stderr=fnull) 107 108 def build_program(self, sources, program): 109 return self.buildDriver(sources, program) 110