Files
meshtastic_firmware/mcp-server/tests/recovery/test_power_cycle_preserves_userprefs.py
T
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

61 lines
2.0 KiB
Python

"""Hard reset via uhubctl must NOT wipe NVS. Verify the test profile's
region + channel survive a power-cycle.
Guards against a regression where a firmware change treats unexpected
power loss as a factory-reset trigger (e.g. bad EEPROM wear-leveling,
erase-on-boot-for-safety). Such a regression would be catastrophic for
field deployments.
"""
from __future__ import annotations
import time
import pytest
from meshtastic_mcp import admin, info
from tests import _power
from tests._port_discovery import resolve_port_by_role
@pytest.mark.timeout(180)
def test_lora_config_survives_power_cycle(
baked_single: dict[str, object],
test_profile: dict[str, object],
) -> None:
role = baked_single["role"]
pre_port = baked_single["port"]
pre_config = admin.get_config(section="lora", port=pre_port)["config"]["lora"]
pre_region = pre_config.get("region")
pre_preset = pre_config.get("modem_preset")
assert pre_region, f"lora.region not set pre-cycle on {role}"
# Hard power-cycle.
_power.power_cycle(role, delay_s=2)
time.sleep(0.5)
new_port = resolve_port_by_role(role, timeout_s=30.0)
# Let the firmware complete boot before admin reads.
time.sleep(2.0)
# Quick readiness probe.
probe = info.device_info(port=new_port, timeout_s=10.0)
assert (
probe.get("my_node_num") is not None
), f"device {role!r} didn't respond after power-cycle"
post_config = admin.get_config(section="lora", port=new_port)["config"]["lora"]
post_region = post_config.get("region")
post_preset = post_config.get("modem_preset")
assert post_region == pre_region, (
f"lora.region wiped by power-cycle on {role}: "
f"pre={pre_region!r} post={post_region!r}"
)
assert post_preset == pre_preset, (
f"lora.modem_preset wiped by power-cycle on {role}: "
f"pre={pre_preset!r} post={post_preset!r}"
)
# Channel-0 name should also match the test profile.
pri_ch = admin.get_channel_url(port=new_port)
assert pri_ch.get("url"), f"channel URL empty after power-cycle on {role}"