https://github.com/HamzaHassanain updated https://github.com/llvm/llvm-project/pull/173473
>From 264da9b931ac90c078a81557bbd0e2f50638a9d7 Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Wed, 24 Dec 2025 12:37:09 +0200 Subject: [PATCH 1/2] [lldb] Swig python extensions tests for SBTargetExtention --- .../python_api/sbtarget_extensions/Makefile | 3 + .../TestSBTargetExtensions.py | 137 ++++++++++++++++++ .../API/python_api/sbtarget_extensions/main.c | 7 + 3 files changed, 147 insertions(+) create mode 100644 lldb/test/API/python_api/sbtarget_extensions/Makefile create mode 100644 lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py create mode 100644 lldb/test/API/python_api/sbtarget_extensions/main.c diff --git a/lldb/test/API/python_api/sbtarget_extensions/Makefile b/lldb/test/API/python_api/sbtarget_extensions/Makefile new file mode 100644 index 0000000000000..10495940055b6 --- /dev/null +++ b/lldb/test/API/python_api/sbtarget_extensions/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py new file mode 100644 index 0000000000000..d1b7ba1eabd0e --- /dev/null +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -0,0 +1,137 @@ +import re +import uuid + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + + +class SBTargetExtensionsTestCase(TestBase): + + def test_equality(self): + """Test the equality operator for SBTarget.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertEqual(target, target) + self.assertNotEqual(target, lldb.SBTarget()) + + def test_module_access(self): + """Test the module access extension properties and methods.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertTrue(len(target.modules) > 0) + module = target.module[0] + self.assertTrue(module.IsValid()) + + self.assertEqual(target.module["a.out"], module) + self.assertEqual(target.module[module.file.fullpath], module) + + # UUID strings on Linux might not be standard UUIDs (they are Build IDs). + # We try to convert, but if it fails, we skip the UUID object check. + uuid_str = module.GetUUIDString() + if uuid_str: + try: + uuid_obj = uuid.UUID(uuid_str) + self.assertEqual(target.module[uuid_obj], module) + except ValueError: + # The UUID string wasn't a standard UUID format, which is fine on Linux. + pass + + self.assertEqual(len(target.module[re.compile("a.out")]), 1) + self.assertEqual(target.module[re.compile("a.out")][0], module) + + def test_process_creation(self): + """Test process creation via extensions.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertFalse(target.process.IsValid()) + + process = target.LaunchSimple(None, None, self.get_process_working_directory()) + self.assertTrue(process.IsValid()) + + # SBProcess objects don't support direct equality (==), compare IDs. + self.assertEqual(target.process.GetProcessID(), process.GetProcessID()) + + def test_breakpoints(self): + """Test breakpoint access via extensions.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + self.assertTrue(breakpoint.IsValid()) + + self.assertEqual(target.num_breakpoints, 1) + self.assertEqual(len(target.breakpoints), 1) + + # target.breakpoint[i] uses INDEX, not ID. + self.assertEqual(target.breakpoint[0].GetID(), target.breakpoints[0].GetID()) + + # To verify ID lookup works via the standard API: + self.assertEqual(target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID()) + + def test_watchpoints(self): + """Test watchpoint access via extensions.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + # 1. Set a breakpoint so the process stops and stays alive. + breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + self.assertTrue(breakpoint.IsValid()) + + # 2. Launch the process. + process = target.LaunchSimple(None, None, self.get_process_working_directory()) + self.assertTrue(process.IsValid()) + + # 3. Ensure we are stopped. + self.assertEqual(process.GetState(), lldb.eStateStopped) + + variables = target.FindGlobalVariables("g_var", 1) + self.assertTrue(variables.GetSize() > 0) + + global_variable = variables.GetValueAtIndex(0) + error = lldb.SBError() + + # 4. Now we can set the watchpoint. + watchpoint = target.WatchAddress(global_variable.GetLoadAddress(), 4, False, True, error) + self.assertTrue(error.Success(), f"Watchpoint failed: {error.GetCString()}") + + self.assertTrue(target.num_watchpoints > 0) + self.assertEqual(len(target.watchpoints), target.num_watchpoints) + + self.assertEqual(target.watchpoint[0].GetID(), target.watchpoints[0].GetID()) + self.assertEqual(target.watchpoint[0].GetID(), watchpoint.GetID()) + + def test_other_properties(self): + """Test miscellaneous properties of SBTarget.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertTrue(target.executable.IsValid()) + + self.assertEqual(target.debugger.GetID(), self.dbg.GetID()) + + self.assertTrue(target.broadcaster.IsValid()) + self.assertIn(target.byte_order, [lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid]) + self.assertTrue(target.addr_size > 0) + self.assertIsNotNone(target.triple) + self.assertIsNotNone(target.arch_name) + + self.assertTrue(target.data_byte_size > 0) + self.assertTrue(target.code_byte_size > 0) + + self.assertTrue(target.platform.IsValid()) \ No newline at end of file diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c new file mode 100644 index 0000000000000..6ef2ce65d0ae9 --- /dev/null +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int g_var = 10; + +int main() { + return g_var; // Set breakpoint here +} >From 0d7ceba7be2bfa63c15bf23df9a27a8aea9441af Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Wed, 24 Dec 2025 12:57:30 +0200 Subject: [PATCH 2/2] [lldb][formatting] fixed the formatter complians --- .../TestSBTargetExtensions.py | 22 ++++++++++++++----- .../API/python_api/sbtarget_extensions/main.c | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py index d1b7ba1eabd0e..4f3ff30390ddf 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -7,7 +7,6 @@ class SBTargetExtensionsTestCase(TestBase): - def test_equality(self): """Test the equality operator for SBTarget.""" self.build() @@ -68,7 +67,9 @@ def test_breakpoints(self): target = self.dbg.CreateTarget(exe) self.assertTrue(target.IsValid()) - breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + breakpoint = target.BreakpointCreateBySourceRegex( + "Set breakpoint here", lldb.SBFileSpec("main.c") + ) self.assertTrue(breakpoint.IsValid()) self.assertEqual(target.num_breakpoints, 1) @@ -78,7 +79,9 @@ def test_breakpoints(self): self.assertEqual(target.breakpoint[0].GetID(), target.breakpoints[0].GetID()) # To verify ID lookup works via the standard API: - self.assertEqual(target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID()) + self.assertEqual( + target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID() + ) def test_watchpoints(self): """Test watchpoint access via extensions.""" @@ -88,7 +91,9 @@ def test_watchpoints(self): self.assertTrue(target.IsValid()) # 1. Set a breakpoint so the process stops and stays alive. - breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + breakpoint = target.BreakpointCreateBySourceRegex( + "Set breakpoint here", lldb.SBFileSpec("main.c") + ) self.assertTrue(breakpoint.IsValid()) # 2. Launch the process. @@ -105,7 +110,9 @@ def test_watchpoints(self): error = lldb.SBError() # 4. Now we can set the watchpoint. - watchpoint = target.WatchAddress(global_variable.GetLoadAddress(), 4, False, True, error) + watchpoint = target.WatchAddress( + global_variable.GetLoadAddress(), 4, False, True, error + ) self.assertTrue(error.Success(), f"Watchpoint failed: {error.GetCString()}") self.assertTrue(target.num_watchpoints > 0) @@ -126,7 +133,10 @@ def test_other_properties(self): self.assertEqual(target.debugger.GetID(), self.dbg.GetID()) self.assertTrue(target.broadcaster.IsValid()) - self.assertIn(target.byte_order, [lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid]) + self.assertIn( + target.byte_order, + [lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid], + ) self.assertTrue(target.addr_size > 0) self.assertIsNotNone(target.triple) self.assertIsNotNone(target.arch_name) diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c index 6ef2ce65d0ae9..e3dcbd11e66d3 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/main.c +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -3,5 +3,5 @@ int g_var = 10; int main() { - return g_var; // Set breakpoint here + return g_var; // Set breakpoint here } _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
