Files
firmware/mcp-server/tests/ui/test_input_fn_oob.py
Ben Meadors de23e5199d Add USB camera and uhubctl support for new test suite. Also included some bug fixes (#10204)
* Add USB camera and uhubctl support for new test suite. Also added some bug fixes

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Refactor test messages for clarity and consistency in regex tests

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-04-19 06:51:41 -05:00

62 lines
2.0 KiB
Python

"""Out-of-bounds FN_F5 when the device has <5 frames: no crash, idx unchanged.
`Screen::handleInputEvent` dispatches FN_F5 unconditionally to
`ui->switchToFrame(4)`. The OLEDDisplayUi library typically clamps or
silently ignores out-of-range indices, but firmware bugs have existed
here — this test protects against a regression that would wedge the UI.
If this test fails, first check: did the device actually crash (Guru
Meditation in the log)? Or did switchToFrame accept an OOB index and
leave the UI blank?
"""
from __future__ import annotations
import time
import pytest
from meshtastic_mcp.input_events import InputEventCode
from ._screen_log import get_current_frame, wait_for_reason
from .conftest import FrameCapture, send_event
@pytest.mark.timeout(90)
def test_fn_f5_out_of_bounds(
ui_port: str,
frame_capture: FrameCapture,
request: pytest.FixtureRequest,
) -> None:
lines: list[str] = request.node._debug_log_buffer
start = get_current_frame(lines)
assert start is not None
if start.count > 5:
pytest.skip(
f"device has {start.count} frames; FN_F5 is in-bounds — not testing OOB here"
)
frame_capture("initial-home")
send_event(ui_port, InputEventCode.FN_F5)
time.sleep(0.5)
try:
wait_for_reason(lines, "fn_f5", timeout_s=3.0)
except TimeoutError:
# Firmware may have ignored the event entirely — acceptable.
pass
# Capture whatever is on screen (OCR will tell us if something weird
# happened). Device must remain responsive — subsequent events should
# still land.
frame_capture("after-fn_f5-oob")
# Send a RIGHT to confirm the UI is still alive. If this times out,
# the OOB switchToFrame wedged the UI.
send_event(ui_port, InputEventCode.RIGHT)
post = wait_for_reason(lines, "next", timeout_s=5.0)
assert (
post is not None
), "UI wedged after OOB FN_F5 — RIGHT no longer produces frame log"
frame_capture("after-recovery-right")