Skip to content

Commit a87cf3e

Browse files
committed
keep track of verified breakpoints in tests
1 parent f44ea3f commit a87cf3e

File tree

3 files changed

+40
-35
lines changed

3 files changed

+40
-35
lines changed

lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ def __init__(
166166
self.initialized = False
167167
self.frame_scopes = {}
168168
self.init_commands = init_commands
169+
self.resolved_breakpoints = set([])
169170

170171
@classmethod
171172
def encode_content(cls, s: str) -> bytes:
@@ -309,6 +310,14 @@ def _process_continued(self, all_threads_continued: bool):
309310
if all_threads_continued:
310311
self.thread_stop_reasons = {}
311312

313+
def _update_verified_breakpoints(self, breakpoints):
314+
for breakpoint in breakpoints:
315+
if "verified" in breakpoint:
316+
if breakpoint["verified"]:
317+
self.resolved_breakpoints.add(str(breakpoint["id"]))
318+
else:
319+
self.resolved_breakpoints.discard(str(breakpoint["id"]))
320+
312321
def send_packet(self, command_dict: Request, set_sequence=True):
313322
"""Take the "command_dict" python dictionary and encode it as a JSON
314323
string and send the contents as a packet to the VSCode debug
@@ -452,8 +461,27 @@ def wait_for_breakpoint_events(self, timeout: Optional[float] = None):
452461
if not event:
453462
break
454463
breakpoint_events.append(event)
464+
465+
self._update_verified_breakpoints(
466+
[event["body"]["breakpoint"] for event in breakpoint_events]
467+
)
455468
return breakpoint_events
456469

470+
def wait_for_breakpoints_to_be_verified(
471+
self, breakpoint_ids: list[str], timeout: Optional[float] = None
472+
):
473+
"""Wait for all breakpoints to be verified. Return all unverified breakpoints."""
474+
unresolved_breakpoints = set(breakpoint_ids)
475+
unresolved_breakpoints -= self.resolved_breakpoints
476+
while len(unresolved_breakpoints) > 0:
477+
breakpoint_event = self.wait_for_event("breakpoint", timeout=timeout)
478+
if breakpoint_event is None:
479+
break
480+
481+
self._update_verified_breakpoints([breakpoint_event["body"]["breakpoint"]])
482+
unresolved_breakpoints -= self.resolved_breakpoints
483+
return unresolved_breakpoints
484+
457485
def wait_for_exited(self, timeout: Optional[float] = None):
458486
event_dict = self.wait_for_event("exited", timeout=timeout)
459487
if event_dict is None:
@@ -1013,7 +1041,10 @@ def request_setBreakpoints(self, source: Source, line_array, data=None):
10131041
"type": "request",
10141042
"arguments": args_dict,
10151043
}
1016-
return self.send_recv(command_dict)
1044+
response = self.send_recv(command_dict)
1045+
breakpoints = response["body"]["breakpoints"]
1046+
self._update_verified_breakpoints(breakpoints)
1047+
return response
10171048

10181049
def request_setExceptionBreakpoints(self, filters):
10191050
args_dict = {"filters": filters}
@@ -1216,17 +1247,15 @@ def request_locations(self, locationReference):
12161247
}
12171248
return self.send_recv(command_dict)
12181249

1219-
def request_testGetTargetBreakpoints(self, only_resolved=False):
1250+
def request_testGetTargetBreakpoints(self):
12201251
"""A request packet used in the LLDB test suite to get all currently
12211252
set breakpoint infos for all breakpoints currently set in the
12221253
target.
12231254
"""
12241255
command_dict = {
12251256
"command": "_testGetTargetBreakpoints",
12261257
"type": "request",
1227-
"arguments": {
1228-
"onlyResolved": only_resolved,
1229-
},
1258+
"arguments": {},
12301259
}
12311260
return self.send_recv(command_dict)
12321261

lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -106,29 +106,11 @@ def set_function_breakpoints(
106106
return breakpoint_ids
107107

108108
def wait_for_breakpoints_to_resolve(
109-
self, breakpoint_ids: list[str], timeout: Optional[float] = None
109+
self, breakpoint_ids: list[str], timeout: Optional[float] = DEFAULT_TIMEOUT
110110
):
111-
unresolved_breakpoints = set(breakpoint_ids)
112-
113-
# Check already resolved breakpoints
114-
resolved_breakpoints = self.dap_server.request_testGetTargetBreakpoints(
115-
only_resolved=True
116-
)["body"]["breakpoints"]
117-
for resolved_breakpoint in resolved_breakpoints:
118-
unresolved_breakpoints.discard(str(resolved_breakpoint["id"]))
119-
120-
while len(unresolved_breakpoints) > 0:
121-
breakpoint_event = self.dap_server.wait_for_event(
122-
"breakpoint", timeout=timeout
123-
)
124-
if breakpoint_event is None:
125-
break
126-
127-
if breakpoint_event["body"]["reason"] in ["changed", "new"]:
128-
unresolved_breakpoints.discard(
129-
str(breakpoint_event["body"]["breakpoint"]["id"])
130-
)
131-
111+
unresolved_breakpoints = self.dap_server.wait_for_breakpoints_to_be_verified(
112+
breakpoint_ids, timeout
113+
)
132114
self.assertEqual(
133115
len(unresolved_breakpoints),
134116
0,

lldb/tools/lldb-dap/Handler/TestGetTargetBreakpointsRequestHandler.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,12 @@ namespace lldb_dap {
1515

1616
void TestGetTargetBreakpointsRequestHandler::operator()(
1717
const llvm::json::Object &request) const {
18-
const auto *arguments = request.getObject("arguments");
19-
bool only_resolved = GetBoolean(arguments, "onlyResolved").value_or(false);
20-
2118
llvm::json::Object response;
2219
FillResponse(request, response);
2320
llvm::json::Array response_breakpoints;
2421
for (uint32_t i = 0; dap.target.GetBreakpointAtIndex(i).IsValid(); ++i) {
25-
const auto target_bp = dap.target.GetBreakpointAtIndex(i);
26-
if (!only_resolved || target_bp.GetNumResolvedLocations() > 0) {
27-
auto bp = Breakpoint(dap, target_bp);
28-
response_breakpoints.push_back(bp.ToProtocolBreakpoint());
29-
}
22+
auto bp = Breakpoint(dap, dap.target.GetBreakpointAtIndex(i));
23+
response_breakpoints.push_back(bp.ToProtocolBreakpoint());
3024
}
3125
llvm::json::Object body;
3226
body.try_emplace("breakpoints", std::move(response_breakpoints));

0 commit comments

Comments
 (0)