[Lldb-commits] [lldb] [lldb-dap] Migrate lldb-dap tests in `lldb-dap/breakpoint` (PR #208166)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Jul 8 01:30:50 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Ebuka Ezike (da-viper)
<details>
<summary>Changes</summary>
migrate breakpointLocations, logpoints, setBreakpoints exceptionBreakpoints and functionBreakpoints test
---
Patch is 65.93 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/208166.diff
5 Files Affected:
- (modified) lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_breakpointLocations.py (+55-66)
- (modified) lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_logpoints.py (+123-187)
- (modified) lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_setBreakpoints.py (+240-237)
- (modified) lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_setExceptionBreakpoints.py (+22-13)
- (modified) lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_setFunctionBreakpoints.py (+91-98)
``````````diff
diff --git a/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_breakpointLocations.py b/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_breakpointLocations.py
index 1fe5f8b9e2adc..f97b4b403b063 100644
--- a/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_breakpointLocations.py
+++ b/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_breakpointLocations.py
@@ -2,88 +2,77 @@
Test lldb-dap breakpointLocations request
"""
-
-import dap_server
-import shutil
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-import lldbdap_testcase
import os
+from lldbsuite.test.decorators import (
+ skipIfTargetDoesNotSupportSharedLibraries,
+ skipIfWindows,
+)
+from lldbsuite.test.lldbtest import line_number
+from lldbsuite.test.tools.lldb_dap.dap_types import BreakpointLocation, LaunchArgs
+from lldbsuite.test.tools.lldb_dap.lldb_dap_testcase import DAPTestCaseBase
- at skipIfTargetDoesNotSupportSharedLibraries()
-class TestDAP_breakpointLocations(lldbdap_testcase.DAPTestCaseBase):
- def setUp(self):
- lldbdap_testcase.DAPTestCaseBase.setUp(self)
-
- self.main_basename = "main-copy.cpp"
- self.main_path = os.path.realpath(self.getBuildArtifact(self.main_basename))
+ at skipIfTargetDoesNotSupportSharedLibraries()
+class TestDAP_breakpointLocations(DAPTestCaseBase):
@skipIfWindows
def test_column_breakpoints(self):
"""Test retrieving the available breakpoint locations."""
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program, stopOnEntry=True)
- loop_line = line_number(self.main_path, "// break loop")
- self.dap_server.request_continue()
+ session = self.build_and_create_session()
+ main_path = os.path.realpath(self.getBuildArtifact("main-copy.cpp"))
- # Ask for the breakpoint locations based only on the line number
- response = self.dap_server.request_breakpointLocations(
- self.main_path, loop_line
- )
- self.assertTrue(response["success"])
- self.assertEqual(
- response["body"]["breakpoints"],
- [
- {"line": loop_line, "column": 9},
- {"line": loop_line, "column": 13},
- {"line": loop_line, "column": 20},
- {"line": loop_line, "column": 23},
- {"line": loop_line, "column": 25},
- {"line": loop_line, "column": 34},
- {"line": loop_line, "column": 37},
- {"line": loop_line, "column": 39},
- {"line": loop_line, "column": 51},
- ],
- )
+ process_event = session.launch(LaunchArgs(program, stopOnEntry=True))
+ session.verify_stopped_on_entry(after=process_event)
- # Ask for the breakpoint locations for a column range
- response = self.dap_server.request_breakpointLocations(
- self.main_path,
- loop_line,
- column=24,
- end_column=46,
- )
- self.assertTrue(response["success"])
- self.assertEqual(
- response["body"]["breakpoints"],
- [
- {"line": loop_line, "column": 25},
- {"line": loop_line, "column": 34},
- {"line": loop_line, "column": 37},
- {"line": loop_line, "column": 39},
- ],
+ # Ask for the breakpoint locations based only on the line number.
+ loop_line = line_number(main_path, "// break loop")
+ response = session.get_breakpoint_locations(main_path, loop_line)
+ breakpoint_locations = response.body.breakpoints
+
+ expected_locations = [
+ BreakpointLocation(line=loop_line, column=9),
+ BreakpointLocation(line=loop_line, column=13),
+ BreakpointLocation(line=loop_line, column=20),
+ BreakpointLocation(line=loop_line, column=23),
+ BreakpointLocation(line=loop_line, column=25),
+ BreakpointLocation(line=loop_line, column=34),
+ BreakpointLocation(line=loop_line, column=37),
+ BreakpointLocation(line=loop_line, column=39),
+ BreakpointLocation(line=loop_line, column=51),
+ ]
+ self.assertEqual(breakpoint_locations, expected_locations)
+
+ # Ask for the breakpoint locations for a column range.
+ response = session.get_breakpoint_locations(
+ main_path, loop_line, column=24, endColumn=46
)
+ breakpoint_locations = response.body.breakpoints
+ expected_locations = [
+ BreakpointLocation(line=loop_line, column=25),
+ BreakpointLocation(line=loop_line, column=34),
+ BreakpointLocation(line=loop_line, column=37),
+ BreakpointLocation(line=loop_line, column=39),
+ ]
+ self.assertEqual(breakpoint_locations, expected_locations)
- # Ask for the breakpoint locations for a range of line numbers
- response = self.dap_server.request_breakpointLocations(
- self.main_path,
- line=loop_line,
- end_line=loop_line + 2,
- column=39,
+ # Ask for the breakpoint locations for a range of line numbers.
+ response = session.get_breakpoint_locations(
+ main_path, line=loop_line, column=39, endLine=loop_line + 2
)
self.maxDiff = None
- self.assertTrue(response["success"])
# On some systems, there is an additional breakpoint available
# at loop_line + 1, column 3, i.e. at the end of the loop. To make
# this test more portable, only check that all expected breakpoints
# are presented, but also accept additional breakpoints.
- expected_breakpoints = [
- {"column": 39, "line": loop_line},
- {"column": 51, "line": loop_line},
- {"column": 3, "line": loop_line + 2},
- {"column": 18, "line": loop_line + 2},
+ expected_locations = [
+ BreakpointLocation(line=loop_line, column=39),
+ BreakpointLocation(line=loop_line, column=51),
+ BreakpointLocation(line=loop_line + 2, column=3),
+ BreakpointLocation(line=loop_line + 2, column=18),
]
- for bp in expected_breakpoints:
- self.assertIn(bp, response["body"]["breakpoints"])
+ breakpoint_locations = response.body.breakpoints
+ for bp in expected_locations:
+ self.assertIn(bp, breakpoint_locations)
+
+ session.continue_to_exit()
diff --git a/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_logpoints.py b/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_logpoints.py
index d633f0b9ffde4..71c7c0cf9097c 100644
--- a/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_logpoints.py
+++ b/lldb/test/API/tools/lldb-dap/breakpoint/TestDAP_logpoints.py
@@ -2,109 +2,95 @@
Test lldb-dap logpoints feature.
"""
-
-import dap_server
-import shutil
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-import lldbdap_testcase
import os
+from lldbsuite.test.decorators import (
+ skipIfTargetDoesNotSupportSharedLibraries,
+ skipIfWindows,
+)
+from lldbsuite.test.lldbtest import line_number
+from lldbsuite.test.tools.lldb_dap.dap_types import (
+ LaunchArgs,
+ SourceBreakpoint,
+ StoppedEvent,
+)
+from lldbsuite.test.tools.lldb_dap.lldb_dap_testcase import DAPTestCaseBase
+from lldbsuite.test.tools.lldb_dap.session_helpers import DAPTestSession
+
@skipIfTargetDoesNotSupportSharedLibraries()
-class TestDAP_logpoints(lldbdap_testcase.DAPTestCaseBase):
+class TestDAP_logpoints(DAPTestCaseBase):
def setUp(self):
- lldbdap_testcase.DAPTestCaseBase.setUp(self)
+ DAPTestCaseBase.setUp(self)
self.main_basename = "main-copy.cpp"
self.main_path = os.path.realpath(self.getBuildArtifact(self.main_basename))
- @skipIfWindows
- def test_logmessage_basic(self):
- """Tests breakpoint logmessage basic functionality."""
+ def stop_at_before_loop_line(self, session: DAPTestSession) -> StoppedEvent:
+ """Launch, set a breakpoint at 'before loop' line and stop there"""
before_loop_line = line_number("main.cpp", "// before loop")
- loop_line = line_number("main.cpp", "// break loop")
- after_loop_line = line_number("main.cpp", "// after loop")
-
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
-
- # Set a breakpoint at a line before loop
- before_loop_breakpoint_ids = self.set_source_breakpoints(
- self.main_path, [before_loop_line]
- )
- self.assertEqual(len(before_loop_breakpoint_ids), 1, "expect one breakpoint")
-
- self.dap_server.request_continue()
+ with session.configure(LaunchArgs(program)) as ctx:
+ [bp] = session.resolve_source_breakpoints(
+ self.main_path, [before_loop_line]
+ )
- # Verify we hit the breakpoint before loop line
- self.verify_breakpoint_hit(before_loop_breakpoint_ids)
+ return session.verify_stopped_on_breakpoint(bp, after=ctx.process_event)
- # Swallow old console output
- self.get_console()
+ @skipIfWindows
+ def test_logMessage_basic(self):
+ """Tests breakpoint logMessage basic functionality."""
+ session = self.build_and_create_session()
+ initial_stop = self.stop_at_before_loop_line(session)
+ source = self.getSourcePath("main.cpp")
+ loop_line = line_number(source, "// break loop")
+ after_loop_line = line_number(source, "// after loop")
# Set two breakpoints:
- # 1. First at the loop line with logMessage
- # 2. Second guard breakpoint at a line after loop
+ # 1. First at the loop line with logMessage.
+ # 2. Second guard breakpoint at a line after loop.
logMessage_prefix = "This is log message for { -- "
logMessage = logMessage_prefix + "{i + 3}, {message}"
- [loop_breakpoint_id, post_loop_breakpoint_id] = self.set_source_breakpoints(
+ [_, post_loop_breakpoint_id] = session.resolve_source_breakpoints(
self.main_path,
- [loop_line, after_loop_line],
- [{"logMessage": logMessage}, {}],
+ [
+ SourceBreakpoint(loop_line, logMessage=logMessage),
+ SourceBreakpoint(after_loop_line),
+ ],
)
- # Continue to trigger the breakpoint with log messages
- self.dap_server.request_continue()
+ # Continue and verify we hit the breakpoint after loop line.
+ post_loop_stop = session.continue_to_breakpoint(post_loop_breakpoint_id)
- # Verify we hit the breakpoint after loop line
- self.verify_breakpoint_hit([post_loop_breakpoint_id])
-
- output = self.get_console()
- lines = output.splitlines()
- logMessage_output = []
- for line in lines:
- if line.startswith(logMessage_prefix):
- logMessage_output.append(line)
-
- # Verify logMessage count
- loop_count = 10
- self.assertEqual(len(logMessage_output), loop_count)
+ captured = session.collect_console(after=initial_stop, until=post_loop_stop)
+ logMessage_output = [
+ line
+ for line in captured.seen_texts.splitlines()
+ if line.startswith(logMessage_prefix)
+ ]
+ # Verify logMessage count.
+ self.assertEqual(len(logMessage_output), 10)
message_addr_pattern = r"\b0x[0-9A-Fa-f]+\b"
message_content = '"Hello from main!"'
- # Verify log message match
+
+ # Verify logMessage match.
for idx, logMessage_line in enumerate(logMessage_output):
result = idx + 3
- reg_str = (
- f"{logMessage_prefix}{result}, {message_addr_pattern} {message_content}"
+ self.assertRegex(
+ logMessage_line,
+ f"{logMessage_prefix}{result}, {message_addr_pattern} {message_content}",
)
- self.assertRegex(logMessage_line, reg_str)
+ session.continue_to_exit()
@skipIfWindows
def test_logmessage_advanced(self):
"""Tests breakpoint logmessage functionality for complex expression."""
- before_loop_line = line_number("main.cpp", "// before loop")
- loop_line = line_number("main.cpp", "// break loop")
- after_loop_line = line_number("main.cpp", "// after loop")
-
- program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
-
- # Set a breakpoint at a line before loop
- before_loop_breakpoint_ids = self.set_source_breakpoints(
- self.main_path, [before_loop_line]
- )
- self.assertEqual(len(before_loop_breakpoint_ids), 1, "expect one breakpoint")
-
- self.dap_server.request_continue()
-
- # Verify we hit the breakpoint before loop line
- self.verify_breakpoint_hit(before_loop_breakpoint_ids)
-
- # Swallow old console output
- self.get_console()
+ session = self.build_and_create_session()
+ initial_stop = self.stop_at_before_loop_line(session)
+ source = self.getSourcePath("main.cpp")
+ before_loop_line = line_number(source, "// break loop")
+ after_loop_line = line_number(source, "// after loop")
# Set two breakpoints:
# 1. First at the loop line with logMessage
@@ -114,91 +100,64 @@ def test_logmessage_advanced(self):
logMessage_prefix
+ "{int y = 0; if (i % 3 == 0) { y = i + 3;} else {y = i * 3;} y}"
)
- [loop_breakpoint_id, post_loop_breakpoint_id] = self.set_source_breakpoints(
+ [_, post_loop_breakpoint_id] = session.resolve_source_breakpoints(
self.main_path,
- [loop_line, after_loop_line],
- [{"logMessage": logMessage}, {}],
+ [
+ SourceBreakpoint(before_loop_line, logMessage=logMessage),
+ SourceBreakpoint(after_loop_line),
+ ],
)
- # Continue to trigger the breakpoint with log messages
- self.dap_server.request_continue()
-
- # Verify we hit the breakpoint after loop line
- self.verify_breakpoint_hit([post_loop_breakpoint_id])
-
- output = self.get_console()
- lines = output.splitlines()
- logMessage_output = []
- for line in lines:
- if line.startswith(logMessage_prefix):
- logMessage_output.append(line)
-
- # Verify logMessage count
- loop_count = 10
- self.assertEqual(len(logMessage_output), loop_count)
-
- # Verify log message match
+ post_loop_stop = session.continue_to_breakpoint(post_loop_breakpoint_id)
+ captured = session.collect_console(after=initial_stop, until=post_loop_stop)
+ logMessage_output = [
+ line
+ for line in captured.seen_texts.splitlines()
+ if line.startswith(logMessage_prefix)
+ ]
+ # Verify logMessage count.
+ self.assertEqual(len(logMessage_output), 10)
+
+ # Verify logMessage match.
for idx, logMessage_line in enumerate(logMessage_output):
result = idx + 3 if idx % 3 == 0 else idx * 3
self.assertEqual(logMessage_line, logMessage_prefix + str(result))
@skipIfWindows
def test_logmessage_format(self):
- """
- Tests breakpoint logmessage functionality with format.
- """
- before_loop_line = line_number("main.cpp", "// before loop")
- loop_line = line_number("main.cpp", "// break loop")
- after_loop_line = line_number("main.cpp", "// after loop")
-
- program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
-
- # Set a breakpoint at a line before loop
- before_loop_breakpoint_ids = self.set_source_breakpoints(
- self.main_path, [before_loop_line]
- )
- self.assertEqual(len(before_loop_breakpoint_ids), 1, "expect one breakpoint")
-
- self.dap_server.request_continue()
-
- # Verify we hit the breakpoint before loop line
- self.verify_breakpoint_hit(before_loop_breakpoint_ids)
-
- # Swallow old console output
- self.get_console()
+ """Tests breakpoint logmessage functionality with format."""
+ session = self.build_and_create_session()
+ initial_stop = self.stop_at_before_loop_line(session)
+ source = self.getSourcePath("main.cpp")
+ loop_line = line_number(source, "// break loop")
+ after_loop_line = line_number(source, "// after loop")
# Set two breakpoints:
- # 1. First at the loop line with logMessage
- # 2. Second guard breakpoint at a line after loop
+ # 1. First at the loop line with logMessage.
+ # 2. Second guard breakpoint at a line after loop.
logMessage_prefix = "This is log message for -- "
logMessage_with_format = "part1\tpart2\bpart3\x64part4"
logMessage_with_format_raw = r"part1\tpart2\bpart3\x64part4"
logMessage = logMessage_prefix + logMessage_with_format_raw + "{i - 1}"
- [loop_breakpoint_id, post_loop_breakpoint_id] = self.set_source_breakpoints(
+ [_, post_loop_breakpoint_id] = session.resolve_source_breakpoints(
self.main_path,
- [loop_line, after_loop_line],
- [{"logMessage": logMessage}, {}],
+ [
+ SourceBreakpoint(loop_line, logMessage=logMessage),
+ SourceBreakpoint(after_loop_line),
+ ],
)
- # Continue to trigger the breakpoint with log messages
- self.dap_server.request_continue()
-
- # Verify we hit the breakpoint after loop line
- self.verify_breakpoint_hit([post_loop_breakpoint_id])
-
- output = self.get_console()
- lines = output.splitlines()
- logMessage_output = []
- for line in lines:
- if line.startswith(logMessage_prefix):
- logMessage_output.append(line)
-
- # Verify logMessage count
- loop_count = 10
- self.assertEqual(len(logMessage_output), loop_count)
-
- # Verify log message match
+ post_loop_stop = session.continue_to_breakpoint(post_loop_breakpoint_id)
+ captured = session.collect_console(after=initial_stop, until=post_loop_stop)
+ logMessage_output = [
+ line
+ for line in captured.seen_texts.splitlines()
+ if line.startswith(logMessage_prefix)
+ ]
+ # Verify logMessage count.
+ self.assertEqual(len(logMessage_output), 10)
+
+ # Verify logMessage match.
for idx, logMessage_line in enumerate(logMessage_output):
result = idx - 1
self.assertEqual(
@@ -208,64 +167,41 @@ def test_logmessage_format(self):
@skipIfWindows
def test_logmessage_format_failure(self):
- """
- Tests breakpoint logmessage format with parsing failure.
- """
- before_loop_line = line_number("main.cpp", "// before loop")
- loop_line = line_number("main.cpp", "// break loop")
- after_loop_line = line_number("main.cpp", "// after loop")
-
- program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
-
- # Set a breakpoint at a line before loop
- before_loop_breakpoint_ids = self.set_source_breakpoints(
- self.main_path, [before_loop_line]
- )
- self.assertEqual(len(before_loop_breakpoint_ids), 1, "expect one breakpoint")
-
- self.dap_server.request_continue()
-
- # Verify we hit the breakpoint before loop line
- self.verify_breakpoint_hit(before_loop_breakpoint_ids)
-
- # Swallow old console output
- self.get_console()
+ """Tests breakpoint logmessage format with parsing failure."""
+ session = self.build_and_create_session()
+ initial_stop = self.stop_at_before_loop_line(session)
+ source = self.getSourcePath("main.cpp")
+ loop_line = line_number(source, "// break loop")
+ after_loop_line = line_number(source, "// after loop")
# Set two breakpoints:
- # 1. First at the loop line with log...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/208166
More information about the lldb-commits
mailing list