Skip to content

Commit eed6ca5

Browse files
committed
chore: diagnose RDP pointer delivery
1 parent 2585c26 commit eed6ca5

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

benchmark/rdp_ladder/run_rdp_ladder_qualification.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def __init__(
209209
self._display = display
210210
self._w, self._h = width, height
211211
self._last_pointer: Optional[tuple[int, int]] = None
212+
self._last_pointer_delivery: Optional[dict[str, object]] = None
212213

213214
def _exec(self, args: list[str], *, binary: bool = False):
214215
cmd = ["docker", "exec", "-e", f"DISPLAY={self._display}", self._c, *args]
@@ -323,6 +324,19 @@ def _remote_pointer(self) -> Optional[tuple[int, int]]:
323324
except (KeyError, ValueError):
324325
return None
325326

327+
def pointer_delivery_diagnostic(self) -> Optional[dict[str, object]]:
328+
"""Return only synthetic-fixture pointer delivery metadata.
329+
330+
This method exists for qualification diagnostics. It contains screen
331+
coordinates and no application text, record data, or screenshot.
332+
"""
333+
334+
return (
335+
dict(self._last_pointer_delivery)
336+
if self._last_pointer_delivery is not None
337+
else None
338+
)
339+
326340
def pointer(self, x: int, y: int, button: str, down: bool) -> None:
327341
btn = {"left": "1", "right": "3", "middle": "2"}.get(button, "1")
328342
self._last_pointer = (int(x), int(y))
@@ -335,7 +349,8 @@ def pointer(self, x: int, y: int, button: str, down: bool) -> None:
335349
return
336350
target = (int(x), int(y))
337351
delivered = False
338-
for _attempt in range(3):
352+
observed: Optional[tuple[int, int]] = None
353+
for attempt in range(1, 4):
339354
self._exec(
340355
[
341356
"xdotool",
@@ -346,12 +361,19 @@ def pointer(self, x: int, y: int, button: str, down: bool) -> None:
346361
)
347362
deadline = time.monotonic() + 5.0
348363
while time.monotonic() < deadline:
349-
if self._remote_pointer() == target:
364+
observed = self._remote_pointer()
365+
if observed == target:
350366
delivered = True
351367
break
352368
time.sleep(0.1)
353369
if delivered:
354370
break
371+
self._last_pointer_delivery = {
372+
"target": list(target),
373+
"observed": list(observed) if observed is not None else None,
374+
"attempts": attempt,
375+
"delivered": delivered,
376+
}
355377
if not delivered:
356378
raise RuntimeError(
357379
f"RDP fixture did not acknowledge pointer motion to {target}"

benchmark/rdp_multiapp/run_qualification.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,7 @@ def acquire_with_fault() -> bytes:
10721072
),
10731073
"fault_ack": fault_ack,
10741074
"reset_ack": reset_ack,
1075+
"pointer_delivery": transport.pointer_delivery_diagnostic(),
10751076
"environment_preflight": environment_preflight,
10761077
"exact_fault_evidence": exact_fault_evidence,
10771078
"typed_target_refusal": typed_target_refusal,

0 commit comments

Comments
 (0)