[Lldb-commits] [lldb] [lldb-dap] Migrate threads and disassemble DAP test (PR #211277)

Sergei Druzhkov via lldb-commits lldb-commits at lists.llvm.org
Thu Jul 23 03:08:43 PDT 2026


================
@@ -2,80 +2,86 @@
 Test lldb-dap threads request
 """
 
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-import lldbdap_testcase
+from lldbsuite.test.decorators import skipIfTargetDoesNotSupportThreads
+from lldbsuite.test.lldbtest import line_number
+from lldbsuite.test.tools.lldb_dap import DAPTestCaseBase
+from lldbsuite.test.tools.lldb_dap.types import LaunchArgs, StoppedReason, ThreadsArgs
 
 
 @skipIfTargetDoesNotSupportThreads()
-class TestDAP_threads(lldbdap_testcase.DAPTestCaseBase):
+class TestDAP_threads(DAPTestCaseBase):
     def test_correct_thread(self):
         """
         Tests that the correct thread is selected if we continue from
         a thread that goes away and hit a breakpoint in another thread.
         In this case, the selected thread should be the thread that
         just hit the breakpoint, and not the first thread in the list.
         """
+        session = self.build_and_create_session()
         program = self.getBuildArtifact("a.out")
-        self.build_and_launch(program)
         source = "main.cpp"
         breakpoint_line = line_number(source, "// break here")
-        lines = [breakpoint_line]
-        # Set breakpoint in the thread function
-        breakpoint_ids = self.set_source_breakpoints(source, lines)
-        self.assertEqual(
-            len(breakpoint_ids), len(lines), "expect correct number of breakpoints"
-        )
-        self.continue_to_breakpoints(breakpoint_ids)
+
+        with session.configure(LaunchArgs(program)) as ctx:
+            breakpoint_ids = session.resolve_source_breakpoints(
+                source, [breakpoint_line]
+            )
+        first_stop = session.verify_stopped_on_breakpoint(after=ctx.process_event)
+
         # We're now stopped at the breakpoint in the first thread, thread #2.
         # Continue to join the first thread and hit the breakpoint in the
         # second thread, thread #3.
-        self.dap_server.request_continue()
-        stopped_event = self.dap_server.wait_for_stopped()
-        # Verify that the description is the relevant breakpoint,
-        # preserveFocusHint is False and threadCausedFocus is True
-        self.assertTrue(
-            stopped_event[0]["body"]["description"].startswith(
-                "breakpoint %s." % breakpoint_ids[0]
-            )
+        second_stop = session.continue_to_next_stop(exp_reason=StoppedReason.BREAKPOINT)
+        self.assertNotEqual(
+            first_stop.body.threadId,
+            second_stop.body.threadId,
+            "the stopped events should be on different threads.",
         )
-        self.assertNotIn("preserveFocusHint", stopped_event[0]["body"])
-        # All threads should be named Thread {index}
-        threads = self.dap_server.get_threads()
-        self.assertTrue(all(len(t["name"]) > 0 for t in threads))
+
+        # Verify that the description is the relevant breakpoint,
+        # preserveFocusHint is False and threadCausedFocus is True.
+        stop_description = self.expect_not_none(second_stop.body.description)
+        self.assertTrue(stop_description.startswith(f"breakpoint {breakpoint_ids[0]}"))
+        self.assertIsNone(second_stop.body.preserveFocusHint)
+
+        # All threads should have a name.
+        threads = session.send_request(ThreadsArgs()).result().body.threads
+        for t in threads:
+            self.assertTrue(t.name, "thread name should be non-empty")
+
+        session.continue_to_exit()
 
     def test_thread_format(self):
-        """
-        Tests the support for custom thread formats.
-        """
+        """Tests the support for custom thread formats."""
+        session = self.build_and_create_session()
         program = self.getBuildArtifact("a.out")
-        self.build_and_launch(
-            program,
-            customThreadFormat="This is thread index #${thread.index}",
-            stopCommands=["thread list"],
-        )
         source = "main.cpp"
         breakpoint_line = line_number(source, "// break here")
-        lines = [breakpoint_line]
-        # Set breakpoint in the thread function
-        breakpoint_ids = self.set_source_breakpoints(source, lines)
-        self.assertEqual(
-            len(breakpoint_ids), len(lines), "expect correct number of breakpoints"
-        )
-        self.continue_to_breakpoints(breakpoint_ids)
-        # We are stopped at the first thread
-        threads = self.dap_server.get_threads()
-        print("got thread", threads)
+
+        with session.configure(
+            LaunchArgs(
+                program,
+                customThreadFormat="This is thread index #${thread.index}",
+                stopCommands=["thread list"],
+            )
+        ) as ctx:
+            bp_ids = session.resolve_source_breakpoints(source, [breakpoint_line])
+        session.verify_stopped_on_breakpoint(bp_ids, after=ctx.process_event)
+
+        threads = session.send_request(ThreadsArgs()).result().body.threads
----------------
DrSergei wrote:

Maybe we can extend `ThreadContext` to store thread name and use `session.get_threads()`. I think we can assume that the thread name is set only once when the thread is created, at least in the tests


https://github.com/llvm/llvm-project/pull/211277


More information about the lldb-commits mailing list