199451b44SJordan Rupprecht"""Test the lldb public C++ api breakpoint callbacks.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprechtfrom __future__ import print_function 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht# __package__ = "lldbsuite.test" 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport os 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass SBBreakpointCallbackCase(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht def setUp(self): 1999451b44SJordan Rupprecht TestBase.setUp(self) 2099451b44SJordan Rupprecht self.generateSource('driver.cpp') 2199451b44SJordan Rupprecht self.generateSource('listener_test.cpp') 2299451b44SJordan Rupprecht self.generateSource('test_breakpoint_callback.cpp') 2399451b44SJordan Rupprecht self.generateSource('test_listener_event_description.cpp') 2499451b44SJordan Rupprecht self.generateSource('test_listener_event_process_state.cpp') 2599451b44SJordan Rupprecht self.generateSource('test_listener_resume.cpp') 26a37672e2SJim Ingham self.generateSource('test_stop-hook.cpp') 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht @skipIfRemote 2999451b44SJordan Rupprecht @skipIfNoSBHeaders 3099451b44SJordan Rupprecht # clang-cl does not support throw or catch (llvm.org/pr24538) 3199451b44SJordan Rupprecht @skipIfWindows 32a37672e2SJim Ingham def test_python_stop_hook(self): 33a37672e2SJim Ingham """Test that you can run a python command in a stop-hook when stdin is File based. """ 34a37672e2SJim Ingham self.build_and_test('driver.cpp test_stop-hook.cpp', 35a37672e2SJim Ingham 'test_python_stop_hook') 36a37672e2SJim Ingham 37a37672e2SJim Ingham @skipIfRemote 38a37672e2SJim Ingham @skipIfNoSBHeaders 39a37672e2SJim Ingham # clang-cl does not support throw or catch (llvm.org/pr24538) 40a37672e2SJim Ingham @skipIfWindows 4199451b44SJordan Rupprecht def test_breakpoint_callback(self): 4299451b44SJordan Rupprecht """Test the that SBBreakpoint callback is invoked when a breakpoint is hit. """ 4399451b44SJordan Rupprecht self.build_and_test('driver.cpp test_breakpoint_callback.cpp', 4499451b44SJordan Rupprecht 'test_breakpoint_callback') 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht @skipIfRemote 4799451b44SJordan Rupprecht @skipIfNoSBHeaders 4899451b44SJordan Rupprecht # clang-cl does not support throw or catch (llvm.org/pr24538) 4999451b44SJordan Rupprecht @skipIfWindows 5099451b44SJordan Rupprecht @expectedFlakeyFreeBSD 5199451b44SJordan Rupprecht def test_sb_api_listener_event_description(self): 5299451b44SJordan Rupprecht """ Test the description of an SBListener breakpoint event is valid.""" 5399451b44SJordan Rupprecht self.build_and_test( 5499451b44SJordan Rupprecht 'driver.cpp listener_test.cpp test_listener_event_description.cpp', 5599451b44SJordan Rupprecht 'test_listener_event_description') 5699451b44SJordan Rupprecht 5799451b44SJordan Rupprecht @skipIfRemote 5899451b44SJordan Rupprecht @skipIfNoSBHeaders 5999451b44SJordan Rupprecht # clang-cl does not support throw or catch (llvm.org/pr24538) 6099451b44SJordan Rupprecht @skipIfWindows 6199451b44SJordan Rupprecht @expectedFlakeyFreeBSD 6299451b44SJordan Rupprecht def test_sb_api_listener_event_process_state(self): 6399451b44SJordan Rupprecht """ Test that a registered SBListener receives events when a process 6499451b44SJordan Rupprecht changes state. 6599451b44SJordan Rupprecht """ 6699451b44SJordan Rupprecht self.build_and_test( 6799451b44SJordan Rupprecht 'driver.cpp listener_test.cpp test_listener_event_process_state.cpp', 6899451b44SJordan Rupprecht 'test_listener_event_process_state') 6999451b44SJordan Rupprecht 7099451b44SJordan Rupprecht @skipIfRemote 7199451b44SJordan Rupprecht @skipIfNoSBHeaders 7299451b44SJordan Rupprecht # clang-cl does not support throw or catch (llvm.org/pr24538) 7399451b44SJordan Rupprecht @skipIfWindows 7499451b44SJordan Rupprecht @expectedFlakeyFreeBSD 7599451b44SJordan Rupprecht @skipIf(oslist=["linux"]) # flakey 7699451b44SJordan Rupprecht def test_sb_api_listener_resume(self): 7799451b44SJordan Rupprecht """ Test that a process can be resumed from a non-main thread. """ 7899451b44SJordan Rupprecht self.build_and_test( 7999451b44SJordan Rupprecht 'driver.cpp listener_test.cpp test_listener_resume.cpp', 8099451b44SJordan Rupprecht 'test_listener_resume') 8199451b44SJordan Rupprecht 8299451b44SJordan Rupprecht def build_and_test(self, sources, test_name, args=None): 8399451b44SJordan Rupprecht """ Build LLDB test from sources, and run expecting 0 exit code """ 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht # These tests link against host lldb API. 8699451b44SJordan Rupprecht # Compiler's target triple must match liblldb triple 8799451b44SJordan Rupprecht # because remote is disabled, we can assume that the os is the same 8899451b44SJordan Rupprecht # still need to check architecture 8999451b44SJordan Rupprecht if self.getLldbArchitecture() != self.getArchitecture(): 9099451b44SJordan Rupprecht self.skipTest( 9199451b44SJordan Rupprecht "This test is only run if the target arch is the same as the lldb binary arch") 9299451b44SJordan Rupprecht 9399451b44SJordan Rupprecht self.inferior = 'inferior_program' 9499451b44SJordan Rupprecht self.buildProgram('inferior.cpp', self.inferior) 9599451b44SJordan Rupprecht self.addTearDownHook(lambda: 9699451b44SJordan Rupprecht os.remove(self.getBuildArtifact(self.inferior))) 9799451b44SJordan Rupprecht 9899451b44SJordan Rupprecht self.buildDriver(sources, test_name) 9999451b44SJordan Rupprecht self.addTearDownHook(lambda: 10099451b44SJordan Rupprecht os.remove(self.getBuildArtifact(test_name))) 10199451b44SJordan Rupprecht 10299451b44SJordan Rupprecht test_exe = self.getBuildArtifact(test_name) 10399451b44SJordan Rupprecht self.signBinary(test_exe) 10499451b44SJordan Rupprecht exe = [test_exe, self.getBuildArtifact(self.inferior)] 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht env = {self.dylibPath: self.getLLDBLibraryEnvVal()} 10799451b44SJordan Rupprecht if 'LLDB_DEBUGSERVER_PATH' in os.environ: 10899451b44SJordan Rupprecht env['LLDB_DEBUGSERVER_PATH'] = os.environ['LLDB_DEBUGSERVER_PATH'] 109*37028d3eSJonas Devlieghere try: 11099451b44SJordan Rupprecht if self.TraceOn(): 11199451b44SJordan Rupprecht print("Running test %s" % " ".join(exe)) 11299451b44SJordan Rupprecht check_call(exe, env=env) 11399451b44SJordan Rupprecht else: 11499451b44SJordan Rupprecht with open(os.devnull, 'w') as fnull: 11599451b44SJordan Rupprecht check_call(exe, env=env, stdout=fnull, stderr=fnull) 116*37028d3eSJonas Devlieghere except subprocess.CalledProcessError as e: 117*37028d3eSJonas Devlieghere self.fail(e) 11899451b44SJordan Rupprecht 11999451b44SJordan Rupprecht def build_program(self, sources, program): 12099451b44SJordan Rupprecht return self.buildDriver(sources, program) 121