mirror of
https://github.com/meshtastic/firmware.git
synced 2026-05-19 14:25:28 -04:00
* Start of MCP server and test suite * Add MCP server for interacting with meshtastic devices and testing framework / TUI * Update mcp-server/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix mcp-server review feedback from thread Agent-Logs-Url: https://github.com/meshtastic/firmware/sessions/91dc128a-ed50-4d07-8bb2-3dc6623a05f7 Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Enhance StreamAPI and PhoneAPI for improved log record handling and concurrency control * Semgrep fixes * Trunk and semgrep fixes * optimize pio streaming tee file writes Agent-Logs-Url: https://github.com/meshtastic/firmware/sessions/04e26c6b-6a2b-45be-bbeb-79ae4d0be633 Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * chore: remove redundant log handle assignment Agent-Logs-Url: https://github.com/meshtastic/firmware/sessions/04e26c6b-6a2b-45be-bbeb-79ae4d0be633 Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Consolidate type imports and remove placeholder test files * Add tests for config persistence and more exchange messages * Refactor position test to validate on-demand request/reply behavior * Remove position request/reply test and update README for telemetry behavior * Fix transmit history file to get removed on factory reset --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
"""Admin: owner name persists across a reboot.
|
|
|
|
The single most common "did my admin change stick?" test. Proves
|
|
`localNode.setOwner()` + `writeConfig("device")` commits to non-volatile
|
|
storage before the reboot.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
from typing import Any
|
|
|
|
import pytest
|
|
from meshtastic_mcp import admin, info
|
|
|
|
|
|
@pytest.mark.timeout(120)
|
|
def test_owner_survives_reboot(
|
|
baked_single: dict[str, Any],
|
|
wait_until,
|
|
) -> None:
|
|
"""Runs once per connected role — proves the reboot-persistence
|
|
round-trip works on each device independently, not just one."""
|
|
port = baked_single["port"]
|
|
|
|
pre = info.device_info(port=port, timeout_s=8.0)
|
|
original = pre.get("long_name") or ""
|
|
marker = "RebootSurvive"
|
|
try:
|
|
admin.set_owner(long_name=marker, short_name="RS", port=port)
|
|
time.sleep(1.5)
|
|
|
|
# Confirm pre-reboot
|
|
confirmed = info.device_info(port=port, timeout_s=8.0)
|
|
assert confirmed["long_name"] == marker
|
|
|
|
# Reboot (short delay)
|
|
admin.reboot(port=port, confirm=True, seconds=3)
|
|
|
|
# Wait for device to come back
|
|
time.sleep(8.0)
|
|
wait_until(
|
|
lambda: info.device_info(port=port, timeout_s=5.0).get("my_node_num")
|
|
is not None,
|
|
timeout=60,
|
|
backoff_start=1.0,
|
|
)
|
|
|
|
post = info.device_info(port=port, timeout_s=8.0)
|
|
assert post["long_name"] == marker, (
|
|
f"owner name did not persist across reboot: "
|
|
f"expected {marker!r}, got {post['long_name']!r}"
|
|
)
|
|
finally:
|
|
# Restore original (best-effort)
|
|
try:
|
|
admin.set_owner(long_name=original or "TestNode", port=port)
|
|
except Exception:
|
|
pass
|