Files
MeshCore/.github/workflows/run-unit-tests.yml
T
mikecarper db1c4704e0 Fix firmware budget regressions and flood alias delimiters
Share nRF52 checked-record reads and command-family lookups without changing
storage formats, error protection, fleet authorization, or delegated scopes.
Use the existing bounded Merkle proof workspace for qualified ESP32 repeaters
while retaining source capacity, wire format, and every enabled feature.
Restore advert tab/CRLF delimiters and expose nested qualification build logs.

Validation: all 1932 native CI test cases; exact canonical RAK4631 Full,
Wio-E5 Mini, Station G3 Full MQTT, and Wireless Tracker Full wrappers;
linked RAK crypto/workspace checks and retained Reader code equivalence;
focused persistence, authorization, source-proof, and RAM policy regressions.
2026-10-21 03:02:46 -07:00

1068 lines
52 KiB
YAML

name: Run Unit Tests
on:
push:
branches:
- main
- master
- keymindCascade
pull_request:
workflow_dispatch:
jobs:
nrf52-companion-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Qualify RAK4631 Full Companion with linked Meshtext support
run: >-
bash build.sh build-firmware RAK_4631_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Verify linked Companion crypto, retained Reader and ARM stack use
run: |
python3 -m pip install unicorn==2.1.4
python3 -B scripts/check_nrf52_companion_crypto.py .pio/build/RAK_4631_companion_radio_full/firmware.elf
python3 -B scripts/check_nrf52_companion_reader.py .pio/build/RAK_4631_companion_radio_full/firmware.elf
python3 -B scripts/check_nrf52_companion_ota_workspace.py .pio/build/RAK_4631_companion_radio_full/firmware.elf
- name: Qualify direct-OTA-only XIAO Full Companion
# This configuration has no Meshtext/Ethernet application callbacks.
run: >-
bash build.sh build-firmware Xiao_nrf52_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Qualify unified T114 Full Companion with automatic screen detection
run: >-
bash build.sh build-firmware Heltec_t114_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Compile both legacy T096 BLE FEM settings with their RAM gates
# Sequential environments in one process; do not replace these with
# Full overlays, which have different OTA and runtime allocations.
run: pio run -e Heltec_t096_companion_radio_ble_femoff -e Heltec_t096_companion_radio_ble_femon
nrf52-sensor-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Verify nRF52 HEX packaging with installed build dependencies
run: |
python3 -B test/test_nrf52_endf_hex.py -v
python3 -B test/test_endf_restamp.py -v
- name: Compile GPS Sensor tracker on nRF52 boards
run: pio run -e t1000e_sensor -e RAK_WisMesh_Tag_sensor
- name: Qualify unified T114 Repeater with screen detection and LoRa OTA
run: >-
bash build.sh build-firmware Heltec_t114_repeater_lora_ota_no_external_sensors
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Compile optional RAK15002 SD archive (no hardware qualification)
run: pio run -e RAK_4631_repeater_rak15002_sd_seeder_only
optional-display-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Qualify RC32 Full Companion with optional T108 detection
run: >-
bash build.sh build-firmware heltec_rc32_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Qualify Wireless Tracker V1 with optional screen detection
run: >-
bash build.sh build-firmware Heltec_Wireless_Tracker_repeater
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Qualify V4 R8 TFT Full Companion with optional screen detection
run: >-
bash build.sh build-firmware heltec_v4_r8_tft_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Show qualification build logs on failure
if: failure()
run: |
for log in out/build-logs/*.log; do
[ -f "$log" ] || continue
echo "::group::$log (last 120 lines)"
tail -n 120 "$log"
echo "::endgroup::"
done
esp32-sensor-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Compile GPS-capable Sensor tracker on ESP32-S3
run: pio run -e heltec_v4_sensor
- name: Compile shared-slot Station G3 and legacy alias with buffered KISS
# One PlatformIO process: these environments share the checkout build tree.
run: pio run -e Station_G3_ESP32_repeater -e Station_G3_ESP32_r2_repeater -e Station_G3_ESP32_kiss_modem
- name: Qualify Station G3 Full MQTT internal RAM and exact OTA identity
run: >-
bash build.sh build-firmware Station_G3_ESP32_r2_repeater_observer_mqtt
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota --full-exact
- name: Compile W12 low-power FEM TX preparation in repeater and Full Companion
run: |
pio run -e meshnology_w12_repeater
bash build.sh build-firmware meshnology_w12_companion_radio_full --firmware-version v1.17.1.10-halo-keymind-cascade-dev --radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Show qualification build logs on failure
if: failure()
run: |
for log in out/build-logs/*.log; do
[ -f "$log" ] || continue
echo "::group::$log (last 120 lines)"
tail -n 120 "$log"
echo "::endgroup::"
done
esp32-ethernet-companion-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Qualify ESP32 Full Companion with radio2 Ethernet and existing Meshtext
run: >-
bash build.sh build-firmware heltec_v4_r8_companion_radio_full
--firmware-version v1.17.1.10-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
cross-platform-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Compile RP2040 contact storage and Arduino 3 ESP32-C6 room services
# One process: PlatformIO environments share this checkout's build tree.
run: pio run -e Xiao_rp2040_companion_radio_usb -e LilyGo_Tlora_C6_room_server_
management-reports:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Install real crypto implementations for cross-language tests
run: |
python3 -m pip install platformio pycryptodome==3.23.0
mkdir -p .pio/libdeps/management-test
pio pkg install --global --library 'rweather/Crypto@0.4.0' --storage-dir .pio/libdeps/management-test
- name: Verify protocol, encryption, scheduling and MQTT decoding
run: |
python3 -B test/test_management_report.py -v
python3 -B test/test_management_cli_wrapper.py -v
node test/test_management_decoder.js
node scripts/test_telemetry_decoder.js
stm32-companion-smoke:
runs-on: ubuntu-latest
steps:
- name: Clone Repo
uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Verify compact STM32 signature arithmetic
run: |
python3 -B test/test_stm32_companion_profile.py -v
python3 -B test/test_ed25519_compact_scalar.py -v
python3 -B test/test_ed25519_compact_field.py -v
python3 -B test/test_ed25519_compact.py -v
- name: Qualify all small STM32 USB Companions at release version length
run: |
set -euo pipefail
for target in \
RAK_3x72_companion_radio_usb \
wio-e5-mini_companion_radio_usb \
wio-e5_companion_radio_usb \
Tiny_Relay_companion_radio_usb; do
bash build.sh build-firmware "$target" \
--firmware-version v1.18.0.1-halo-keymind-cascade-dev \
--radio-preset usa-cascade-fixed --profile cascade --require-ota
done
stm32-mini-repeater-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Verify constrained Mini Repeater feature boundaries
run: |
python3 -B test/test_stm32_mini_repeater_profile.py -v
python3 -B test/test_mini_repeater_logging.py -v
python3 -B test/test_management_feature_gate.py -v
python3 -B test/test_carrier_wave.py -v
python3 -B test/test_radio_profile_cli.py -v
python3 -B test/test_ed25519_compact_scalar.py -v
python3 -B test/test_ed25519_compact_field.py -v
python3 -B test/test_ed25519_compact.py -v
- name: Qualify cable-only Mini Repeater with unchanged flash and RAM gates
env:
DISABLE_DEBUG: '0'
run: |
set -euo pipefail
bash build.sh build-firmware wio-e5-mini_repeater \
--firmware-version v1.18.0.1-halo-keymind-cascade-dev \
--radio-preset usa-cascade-fixed --profile cascade --allow-no-ota
bootloader-version:
runs-on: ubuntu-latest
steps:
- name: Clone Repo
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Verify bootloader version regressions without hardware or downloads
run: python3 -B test/test_nrf52_bootloader_version.py -v
- name: Install signed-package verification dependency
run: python3 -m pip install cryptography
- name: Verify old-firmware compatibility in both OTA launchers
run: python3 -B -m unittest discover -s tools/lora_ota -p test_lora_ota_bootloader_version.py -v
- name: Verify OTA orchestration and automatic relay policy cleanup
run: python3 -B -m unittest discover -s tools/lora_ota -p 'test_lora_ota*.py' -v
- name: Verify all signed OTAFIX 2.4.6 release images
env:
MESHCORE_BOOTLOADER_MOTA_ZIP: ${{ runner.temp }}/OTAFIX-2.4.6-bootloader-mota.zip
# The test pins the archive SHA-256, verifies every .mota signature,
# and checks the exact MeshTower V2 SD CRC from the bug report.
run: |
curl --fail --location --retry 3 --max-time 120 --output "$MESHCORE_BOOTLOADER_MOTA_ZIP" \
https://github.com/mikecarper/Adafruit_nRF52_Bootloader_OTAFIX/releases/download/0.11.0-OTAFIX2.4.6/OTAFIX-2.4.6-bootloader-mota.zip
python3 -B test/test_nrf52_bootloader_version.py -v
test:
runs-on: ubuntu-latest
steps:
- name: Clone Repo
uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Install signed-package verification dependency
run: |
python3 -m pip install cryptography
sudo apt-get update
sudo apt-get install -y libssl-dev
mkdir -p .pio/libdeps/room-mail-test
pio pkg install --global --library 'rweather/Crypto@0.4.0' --storage-dir .pio/libdeps/room-mail-test
- name: Verify ArduinoJson pin
run: |
python3 -B scripts/check_arduinojson_pin.py --self-test
python3 -B scripts/check_arduinojson_pin.py
- name: Verify build-size diagnostics and nRF52 optimizer recipes
run: |
bash test/test_build_size_detection.sh
python3 -B test/test_nrf52_size_profile.py -v
python3 -B test/test_rak_combined_build_config.py -v
- name: Run Unit Tests
run: pio test -e native -e native_kiss_modem -e native_ota_channel -vv
- name: Verify real GPS NMEA parser and provider with address and undefined sanitizers
run: pio test -e native_gps -vv
- name: Verify parser, delivery, storage, permissions, clock and radio stability
run: |
python3 -B test/test_protocol_parser_bounds.py -v
python3 -B test/test_region_map_transactions.py -v
python3 -B test/test_region_name_export.py -v
python3 -B test/test_cli_error_bounds.py -v
python3 -B test/test_common_cli_argument_bounds.py -v
python3 -B test/test_flood_retry_bucket_cli.py -v
python3 -B test/test_ota_security.py -v
python3 -B test/test_companion_offline_delivery.py -v
python3 -B test/test_room_receive_admission.py -v
python3 -B test/test_companion_lfs_traversal.py -v
python3 -B test/test_room_post_permissions.py -v
python3 -B test/test_room_login_authorization.py -v
python3 -B test/test_room_login_integration.py -v
python3 -B test/test_room_login_replay_capacity.py -v
python3 -B test/test_room_client_paths.py -v
python3 -B test/test_client_acl_infrastructure.py -v
python3 -B test/test_stored_client_reply_routes.py -v
python3 -B test/test_room_catchup.py -v
python3 -B test/test_room_catchup_transport.py -v
python3 -B test/test_room_topic_store.py -v
python3 -B test/test_room_topic_delivery.py -v
python3 -B test/test_room_acl_persistence.py -v
python3 -B test/test_room_access_policy.py -v
python3 -B test/test_room_history_store.py -v
python3 -B test/test_room_history_integration.py -v
python3 -B test/test_room_board_store.py -v
python3 -B test/test_room_board_protocol.py -v
python3 -B test/test_room_mail_store.py -v
python3 -B test/test_room_mail_protocol.py -v
python3 -B test/test_room_web_mailbox.py -v
python3 -B test/test_room_web_http.py -v
python3 -B test/test_room_web_service.py -v
python3 -B test/test_contact_clock_bootstrap.py -v
python3 -B test/test_rtc_discovery.py -v
python3 -B test/test_upstream_routing_merge.py -v
python3 -B test/test_iotthinks_merge.py -v
python3 -B test/test_upstream_power_policy_merge.py -v
python3 -B test/test_upstream_20261015_wifi_boot.py -v
python3 -B test/test_wio_tracker_l2_gps_power.py -v
python3 -B test/test_lr1121_power_merge.py -v
python3 -B test/test_lr2021_power.py -v
python3 -B test/test_lr2021_tx_prearm.py -v
python3 -B test/test_meshtracker_x1_battery.py -v
python3 -B test/test_drv2605_power.py -v
python3 -B test/test_radio_interrupt_recovery.py -v
python3 -B test/test_forwarding_profile_timing.py -v
python3 -B test/test_clock_transit_profile_timing.py -v
python3 -B test/test_bridge_recovery.py -v
python3 -B test/test_bridge_ingress.py -v
- name: Verify signed private fleet management
run: |
python3 -B test/test_fleet_command_crypto.py -v
python3 -B test/test_companion_fleet_control.py -v
python3 -B test/test_fleet_channel_runtime.py -v
python3 -B test/test_fleet_role_wiring.py -v
python3 -B test/test_fleet_location.py -v
python3 -B test/test_fleet_radio_schedules.py -v
python3 -B test/test_fleet_clock_control.py -v
- name: Verify OTA channel persistence and published image tags
run: |
python3 -B test/test_ota_channel_persistence.py -v
python3 -B test/test_observer_ota_channel.py -v
python3 -B test/test_observer_build_channels.py -v
python3 -B scripts/verify_ota_channel.py --self-test
- name: Verify build output cleanup safety
run: python3 -B test/test_build_output_safety.py -v
- name: Verify serial mOTA response deadlines and RX fairness
run: |
python3 -B test/test_mota_serial_deadline.py -v
python3 -B test/test_mota_folder_deadline.py -v
python3 -B test/test_ota_folder_resume.py -v
python3 -B test/test_ota_direct_manager.py -v
python3 -B test/test_mota_kiss_direct.py -v
python3 -B test/test_ota_kiss_direct.py -v
python3 -B test/test_companion_foreign_hooks.py -v
- name: Verify filter playground modes and built-in defaults
run: node scripts/test_filter_tool.js
- name: Verify bridge filter wiring and shorthand permissions
run: |
python3 -B test/test_flood_text_pattern.py -v
python3 -B test/test_flood_rule_extensions.py -v
python3 -B test/test_flood_rule_cli.py -v
python3 -B test/test_flood_moderation.py -v
python3 -B test/test_transport_filter_wiring.py -v
python3 -B test/test_room_filter_extensions.py -v
python3 -B test/test_rs232_runtime.py -v
python3 -B test/test_rs232_mqtt_runtime.py -v
python3 -B test/test_rs232_driver_lifecycle.py -v
python3 -B test/test_rs232_nrf_uart_lifecycle.py -v
python3 -B test/test_rs232_heartbeat.py -v
python3 -B test/test_rs232_heartbeat_owner.py -v
python3 -B test/test_rs232_power_settings.py -v
- name: Verify saved repeat-off trace exception and relay guards
run: |
python3 -B test/test_repeater_trace_repeat.py -v
python3 -B test/test_repeater_trace_forwarding.py -v
- name: Verify telemetry schedule input and persistence rollback
run: python3 -B test/test_telemetry_tx_command.py -v
- name: Verify transactional telemetry preferences and legacy route recovery
run: python3 -B test/test_telemetry_tx_persistence.py -v
- name: Verify MQTT and WiFi ownership, recovery and power policy
run: |
python3 -B test/test_mqtt_transport_results.py -v
python3 -B test/test_mqtt_tls_security.py -v
python3 -B test/test_mqtt_network_timeout.py -v
python3 -B test/test_mqtt_disconnect.py -v
python3 -B test/test_mqtt_connection_admission.py -v
python3 -B test/test_mqtt_handshake_scheduler.py -v
python3 -B test/test_mqtt_transport_health.py -v
python3 -B test/test_mqtt_diagnostics.py -v
python3 -B test/test_mqtt_advert_verify.py -v
python3 -B test/test_mqtt_publish_ack.py -v
python3 -B test/test_companion_mqtt_diagnostics.py -v
python3 -B test/test_wifi_network_power_policy.py -v
python3 -B test/test_mqtt_wifi_network_power.py -v
python3 -B test/test_companion_wifi_network_power.py -v
python3 -B test/test_webconfig_network_power.py -v
python3 -B test/test_companion_ap_ownership.py -v
python3 -B test/test_heltec_v4_wifi_setup_page.py -v
- name: Verify DNS lease restoration and bounded diagnostics
run: python3 -B test/test_network_dns.py -v
- name: Verify Sensor dog tracker ownership, routes, storage, GPS and sleep
run: |
python3 -B test/test_tracker_route_policy.py -v
python3 -B test/test_sensor_tracker_store.py -v
python3 -B test/test_tracker_owner_response.py -v
python3 -B test/test_sensor_tracker_client.py -v
python3 -B test/test_sensor_tracker_gps.py -v
python3 -B test/test_sensor_tracker_sleep.py -v
python3 -B test/test_power_saving_deadlines.py -v
python3 -B test/test_t096_regulator.py -v
python3 -B test/test_nrf52_board_regulators.py -v
python3 -B test/test_nrf52_regulator.py -v
python3 -B test/test_radio_regulator_modes.py -v
python3 -B test/test_regulator_recovery.py -v
python3 -B test/test_regulator_settings.py -v
python3 -B test/test_power_saving_diagnostics.py -v
python3 -B test/test_power_saving_role_diagnostics.py -v
python3 -B test/test_companion_power_diagnostics.py -v
python3 -B test/test_companion_rxps_getters.py -v
python3 -B test/test_nrf52_sleep_cycle.py -v
python3 -B test/test_nrf52_sleep_events.py -v
python3 -B test/test_nrf52_profile_idle.py -v
python3 -B test/test_esp32_scanner_power_yield.py -v
python3 -B test/test_esp32_gpio_hold.py -v
- name: Verify Companion contact and channel TX routing
run: |
python3 -B test/test_companion_channel_alias.py -v
python3 -B test/test_companion_tx_routing.py -v
python3 -B test/test_companion_channel_publication.py -v
python3 -B test/test_companion_tx_raw_alias.py -v
python3 -B test/test_companion_traffic_routing.py -v
python3 -B test/test_ethernet_kiss.py -v
python3 -B test/test_ethernet_radio.py -v
python3 -B test/test_companion_ethernet.py -v
python3 -B test/test_companion_discovery.py -v
python3 -B test/test_repeater_discovery.py -v
python3 -B test/test_companion_discovery_correlation.py -v
python3 -B test/test_pico_ble_queues.py -v
python3 -B test/test_companion_preferences_transaction.py -v
python3 -B test/test_companion_prefs_values.py -v
python3 -B test/test_companion_prefs_image.py -v
python3 -B test/test_companion_timezone_prefs.py -v
python3 -B test/test_companion_prefs_tail.py -v
python3 -B test/test_companion_radio_settings_transaction.py -v
python3 -B test/test_companion_prefs_transactions.py -v
python3 -B test/test_companion_primary_radio_persistence.py -v
python3 -B test/test_companion_response_bounds.py -v
python3 -B test/test_companion_ack_delivery.py -v
python3 -B test/test_companion_lost_reply.py -v
python3 -B test/test_companion_delayed_reply_delivery.py -v
python3 -B test/test_companion_scheduled_reboot.py -v
python3 -B test/test_trace_profile_timing.py -v
python3 -B test/test_companion_hardware_serial.py -v
python3 -B test/test_companion_hardware_serial_gps.py -v
python3 -B test/test_companion_contact_lifetime.py -v
python3 -B test/test_contact_indices.py -v
python3 -B test/test_small_table_sort.py -v
python3 -B test/test_companion_identity_cli.py -v
python3 -B test/test_companion_packet_stream.py -v
python3 -B test/test_companion_uncached_storage.py -v
python3 -B test/test_companion_contact_partial_tail.py -v
python3 -B test/test_companion_channel_storage.py -v
python3 -B test/test_nrf52_extrafs_contract.py -v
python3 -B test/test_xiao_qspi_recovery.py -v
python3 -B test/test_nrf52_qspi_dma_fix.py -v
python3 -B test/test_xiao_identity_recovery.py -v
python3 -B test/test_companion_ota_config.py -v
python3 -B test/test_ota_identity_policy.py -v
python3 -B test/test_companion_radio_gain_restore.py -v
python3 -B test/test_room_sensor_radio_restore.py -v
python3 -B test/test_common_radio_persistence.py -v
python3 -B test/test_common_cli_save_results.py -v
python3 -B test/test_common_prefs_uncertain_reply.py -v
python3 -B test/test_common_prefs_apply_reply.py -v
python3 -B test/test_common_prefs_commit.py -v
python3 -B test/test_common_cli_retry_tail.py -v
python3 -B test/test_common_prefs_legacy_rxgain.py -v
python3 -B test/test_flood_policy_capacity.py -v
python3 -B test/test_flood_rule_layout.py -v
python3 -B test/test_mqtt_prefs_commit.py -v
python3 -B test/test_identity_and_settings_recovery.py -v
python3 -B test/test_contact_cache.py -v
python3 -B test/test_one_key_dm_shared_queue.py -v
- name: Verify Ethernet RF harness framing, TX lock, isolation and safe serial ownership
run: |
python3 -B test/test_hil_tx_frequency_guard.py -v
python3 -B test/test_kiss_boot_trace.py -v
python3 -B test/test_kiss_ethernet_wire.py -v
python3 -B test/test_heltec_v3_flash_mode.py -v
python3 -B test/test_companion_ble_bench.py -v
python3 -B test/test_ble_visibility_probe.py -v
python3 -B test/test_ethernet_kiss_probe.py -v
python3 -B test/test_ethernet_tap_relay.py -v
python3 -B test/test_windows_usb_stdio_bridge.py -v
python3 -B test/test_ethernet_ssh_phone_bench.py -v
python3 -B test/test_meshcore_usb_sftp_bench.py -v
python3 -B test/test_ethernet_hil_serial_open.py -v
python3 -B test/test_ethernet_serial_guard.py -v
python3 -B test/test_ethernet_serial_rpc.py -v
python3 -B test/test_ethernet_primary_probe.py -v
python3 -B test/test_ethernet_radio2_sweep.py -v
python3 -B test/test_ethernet_preamble_bench.py -v
python3 -B test/test_ethernet_preamble_ssh_runner.py -v
python3 -B test/test_ethernet_kiss_modem_probe.py -v
python3 -B test/test_ethernet_tcp_stats.py -v
python3 -B test/test_meshcore_ip_relay.py -v
python3 -B test/test_meshcore_ip_ssh_phone_bench.py -v
python3 -B test/test_mcfirmware_bench_flash.py -v
- name: Verify Meshtext chat codec, transport and Companion integration
run: |
python3 -B test/test_meshtext_chat.py -v
python3 -B test/test_meshtext_config.py -v
python3 -B test/test_meshtext_transport.py -v
python3 -B test/test_meshtext_primary_preamble.py -v
python3 -B test/test_meshtext_license.py -v
python3 -B test/test_beacon_frames.py -v
python3 -B test/test_beacon_manager.py -v
python3 -B test/test_beacon_radio.py -v
python3 -B test/test_beacon_dispatcher.py -v
python3 -B test/test_beacon_legacy_lora_protocol.py -v
python3 -B test/test_lr_meshtext_wire.py -v
python3 -B test/test_stm32wl_meshtext_protocol.py -v
python3 -B test/test_meshtext_modem_profiles.py -v
python3 -B test/test_environment_no_gps_link.py -v
python3 -B test/test_beacon_file_api.py -v
python3 -B test/test_beacon_sx1276_cad.py -v
python3 -B test/test_radio_profile_auto.py -v
python3 -B test/test_companion_meshtext.py -v
python3 -B test/test_companion_meshtext_storage.py -v
python3 -B test/test_meshtext_delivery_hil.py -v
python3 -B test/test_meshtext_speed_hil.py -v
python3 -B test/test_companion_raw_radio2_sweep.py -v
python3 -B test/test_meshtext_listen_hil.py -v
python3 -B test/test_mercer_mt_flash.py -v
python3 -B test/test_mercer_nrf_app_flash.py -v
python3 -B test/test_indicator_repeater_hil_recipe.py -v
python3 -B test/test_indicator_radio_hal.py -v
python3 -B test/test_mota_usb_seeder_hil.py -v
python3 -B test/test_mota_espnow_chain_hil.py -v
python3 -B test/test_meshtext_auto_radio2_hil.py -v
python3 -B test/test_meshtext_auto_radio2_hil_sdk.py -v
- name: Verify receive recovery and pinned radio status transport
run: |
python3 -B test/test_dispatcher_startup_watchdog.py -v
python3 -B test/test_radio_receive_contract.py
python3 -B test/test_noise_floor_sleep.py -v
python3 -B test/test_radio_receive_retry.py -v
python3 -B test/test_adaptive_agc_roles.py -v
python3 - <<'PY'
from pathlib import Path
import re
import subprocess
dependency = re.search(r'https://github.com/jgromes/RadioLib.git#[0-9a-f]{40}',
Path('platformio.ini').read_text()).group(0)
Path('.pio/libdeps/radio-status-test').mkdir(parents=True, exist_ok=True)
subprocess.run(['pio', 'pkg', 'install', '--global', '--library', dependency,
'--storage-dir', '.pio/libdeps/radio-status-test'], check=True)
PY
python3 -B test/test_sx126x_receive_mode.py
python3 -B test/test_beacon_power.py -v
- name: Verify temporary-radio timing and exact reply delivery
run: |
python3 -B test/test_carrier_wave.py
python3 -B test/test_morse_tx.py -v
python3 -B test/test_morse_rx.py -v
python3 -B test/test_morse_rx_min_speed.py -v
python3 -B test/test_morse_raw_rssi.py -v
python3 -B test/test_morse_rx_timing.py -v
python3 -B test/test_morse_rx_gap_bias.py -v
python3 -B test/test_morse_rx_human.py -v
python3 -B test/test_morse_hil_timing.py -v
python3 -B test/test_morse_hil_production.py -v
python3 -B test/test_morse_rx_squelch.py -v
python3 -B test/test_morse_rx_adaptive_quiet.py -v
python3 -B test/test_morse_hil_squelch.py -v
python3 -B test/test_morse_cli.py -v
python3 -B test/test_morse_auth.py -v
python3 -B test/test_morse_reply_handoff.py -v
python3 -B test/test_morse_remote.py -v
python3 -B test/test_morse_hil_safety.py -v
python3 -B test/test_morse_loop_policy.py -v
python3 -B test/test_morse_terminal_input.py -v
python3 -B test/test_radio_profile_cli.py
python3 -B test/test_radio_profile_spiffs_missing.py -v
python3 -B test/test_radio_reply_mutation.py
python3 -B test/test_radio_profile_scan.py
python3 -B test/test_radio_profile_clock.py -v
python3 -B test/test_radio_profile_repair.py -v
python3 -B test/test_radio_profile_runtime_recommendation.py -v
python3 -B test/test_radio_profile_idle_dispatcher.py -v
python3 -B test/test_radio_rxps_rejection.py -v
python3 -B test/test_repeater_radio_timing_integration.py
python3 -B test/test_temp_radio_reply_delivery_contract.py
python3 -B test/test_reply_tx_integration.py
python3 -B test/test_ota_speed.py -v
python3 -B test/test_ota_announce_cadence.py -v
python3 -B test/test_ota_apply_delivery.py -v
python3 -B test/test_ota_install_preflight.py -v
python3 -B test/test_ota_apply_reentry.py -v
python3 -B test/test_ota_store_resume.py -v
python3 -B test/test_ota_catalog_lifetime.py -v
python3 -B test/test_ota_store_flash_nrf52_hybrid.py -v
python3 -B test/test_tower_bootloader_caps.py -v
python3 -B test/test_tower_auto_storage.py -v
python3 -B test/test_tower_auto_integration.py -v
python3 -B test/test_ota_dev_staging.py -v
python3 -B test/test_ota_dev_reboot_guard.py -v
python3 -B test/test_ota_dev_resume.py -v
- name: Verify dual-profile switching and chirp timing
working-directory: test
run: >-
python3 -B -m unittest -v
test_sx1262_profile_switch test_sx1262_batched_modulation test_sx1262_protocol_batching
test_sx1262_modem_cache test_esp32_retune_priority test_tdeck_spi_clock_timing
test_radio_chirp_math
test_lr1110_profile_switch test_lr1110_packet_setter_cache
test_radio_profile_validation_backport
- name: Verify radio lab collectors and compiled experiment contracts
run: |
python3 -B -m unittest discover -s test -p 'test_profile_*.py' -v
python3 -B -m unittest discover -s tools/hil -p 'test_*.py' -v
python3 -B test/test_hil_esp32_self_serve_ota.py -v
python3 -B test/test_hil_esp32_usb_host_reboot.py -v
- name: Verify ESP32 static DRAM budget
run: |
python3 -B test/test_esp32_dram.py
python3 -B test/test_battery_charge_cli.py -v
python3 -B test/test_tbeam_charge_target.py -v
python3 -B test/test_elrs_power.py
python3 -B test/test_ota_heap_context.py
python3 -B test/test_ota_self_serve_policy.py -v
python3 -B test/test_ota_self_metadata_cache.py -v
python3 -B test/test_ota_nrf52_display_cache.py -v
python3 -B test/test_ota_device_deflate_encoder.py -v
python3 -B test/test_ota_device_deflate_role.py -v
python3 -B test/test_client_acl_spiffs.py
python3 -B test/test_client_acl_role.py -v
python3 -B test/test_client_acl_metadata.py -v
python3 -B test/test_client_acl_cli.py -v
python3 -B test/test_client_acl_response.py -v
- name: Setup Node for official app compatibility tests
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Cache pinned official app and browser protocol sources
uses: actions/cache@v4
with:
path: ~/.cache/meshcore-tests
key: official-clients-84bc39a950735aaffa93d912556852a4c22e235d0cc4e4d04790113207f13a68-aff42ad8ef2b332f24d644ff6a783f8272a88ff2
- name: Verify stock app radio, Access Control and room compatibility
run: |
node --version
python3 -B test/test_official_app_compatibility.py -v
python3 -B test/test_official_room_app_compatibility.py -v
- name: Verify ESP32 USB reboot sleep grace and G3 button wake
run: |
python3 -B test/test_usb_host_sleep_policy.py
python3 -B test/test_esp32_usb_sleep.py
python3 -B test/test_esp32_full_sleep.py
python3 -B test/test_esp32_full_power_lifecycle.py
- name: Verify official web console framing and power-saving idle sessions
run: |
python3 -B test/test_cpp_source.py -v
python3 -B test/test_official_web_console.py -v
python3 -B test/test_official_console_acceptance.py -v
python3 -B test/test_hil_linux_web_serial.py -v
python3 -B tools/hil/test_serial_session.py -v
python3 -B test/test_companion_release_acceptance.py -v
python3 -B test/test_mcfirmware_bench_backup.py -v
python3 -B test/test_mcfirmware_bench_app_flash.py -v
python3 -B test/test_mcfirmware_bench_data_restore.py -v
python3 -B tools/hil/test_room_webconfig_acceptance.py -v
python3 -B test/test_hil_slowfi_guard.py -v
- name: Verify official setup GUI initial time command deadline
run: python3 -B test/test_official_config_gui.py -v
- name: Verify ESP32 boot filesystem inventory and recovery safety
run: |
python3 -B test/test_esp32_boot_file_inventory.py -v
python3 -B test/test_esp32_boot_file_lifecycle.py -v
- name: Verify WiFi OTA startup and WebConfig handoff
run: |
python3 -B test/test_esp32_management_password.py -v
python3 -B test/test_companion_admin_password.py -v
python3 -B test/test_management_password_commands.py -v
python3 -B test/test_repeater_password_normalization.py -v
python3 -B test/test_wifi_setup_auth.py -v
python3 -B test/test_lightweight_ota_auth.py -v
python3 -B test/test_esp32_async_web_build_paths.py -v
python3 -B test/test_wifi_ota_start.py -v
python3 -B test/test_webconfig_ap_start.py -v
python3 -B test/test_webconfig_recovery_auth.py -v
python3 -B test/test_webconfig_password_sessions.py -v
python3 -B test/test_webconfig_login_throttle.py -v
python3 -B test/test_esp32_wifi_scan_fix.py -v
python3 -B test/test_esp32_wifi_scan_recipes.py -v
- name: Verify browser OTA completion and immediate HTTP listener restart
run: python3 -B test/test_async_web_lifecycle.py -v
- name: Verify GPS status distinguishes user settings from receiver sleep
run: |
python3 -B test/test_gps_status.py
python3 -B test/test_gps_upstream_adaptations.py -v
python3 -B test/test_esp32_gps_discovery.py -v
python3 -B test/test_gps_sync_interval.py -v
python3 -B test/test_rak_gps_clock_freshness.py -v
python3 -B test/test_micronmea_time_fix.py -v
python3 -B test/test_micronmea_time_fix_recipes.py -v
python3 -B test/test_gps_sync_preferences.py -v
python3 -B test/test_rak_gps_power.py -v
python3 -B test/test_rak_shutdown_power.py -v
python3 -B test/test_rak3401_onboard_radio.py -v
python3 -B test/test_xiao_battery_safety.py -v
python3 -B test/test_peripheral_mode_prefs.py -v
python3 -B test/test_t1000e_sensor_power.py -v
python3 -B test/test_sensor_battery_alerts.py -v
python3 -B test/test_sensor_subscriptions.py -v
python3 -B test/test_sensor_reply_bounds.py -v
- name: Verify Companion ASCII defaults and USB session cleanup
run: |
python3 -B test/test_companion_terminal_profile.py
python3 -B test/test_companion_usb_default.py
python3 -B test/test_companion_usb_input.py
python3 -B test/test_arduino_serial_backpressure.py -v
python3 -B test/test_companion_ota_includes.py
python3 -B test/test_companion_usb_logging_handoff.py
python3 -B test/test_companion_usb_mota_exit.py
python3 -B test/test_common_cli_logging_transaction.py
python3 -B test/test_usb_diagnostic_logging.py
python3 -B test/test_nrf52_usb_client.py
python3 -B test/test_nrf52_usb_lifecycle.py
python3 -B test/test_nrf52_usb_logging_contract.py
python3 -B test/test_esp32_usb_serial_hygiene.py
python3 -B test/test_esp32_tinyusb_nonblocking.py
python3 -B test/test_esp32_usb_session_fix.py
python3 -B test/test_hwcdc_tx_backport.py -v
python3 -B test/test_hwcdc_startup_session.py -v
python3 -B test/test_hwcdc_313_startup_session.py -v
python3 -B test/test_hwcdc_3311_startup_session.py -v
python3 -B test/test_esp32_hwcdc_recipes.py -v
python3 -B test/test_hwcdc_role_transport.py -v
python3 -B test/test_hwcdc_write_capacity.py -v
python3 -B test/test_esp32_file_buffer_fix.py -v
python3 -B test/test_companion_usb_logging_reply.py
python3 -B test/test_esp32_tinyusb_cooperative_output.py
python3 -B test/test_esp32_tinyusb_role_hygiene.py
python3 -B test/test_stm32_float_conversion.py
- name: Verify Companion contact persistence and OTA sleep guards
run: |
python3 -B test/test_companion_contact_sleep_contract.py -v
python3 -B test/test_esp32_cooperative_contacts.py -v
python3 -B test/test_esp32_contact_writer_batch.py -v
python3 -B test/test_esp32_contact_crc_batch.py -v
python3 -B test/test_contact_file_transaction.py -v
python3 -B test/test_esp32_contact_publication.py -v
python3 -B test/test_esp32_advert_cache.py -v
- name: Verify Companion Bluetooth CLI connection protection
run: python3 -B test/test_companion_bluetooth_control.py -v
- name: Verify Companion Bluetooth reboot persistence
run: python3 -B test/test_companion_bluetooth_persistence.py -v
- name: Verify nRF52 SoftDevice LTO and persistent BLE subscriptions
env:
MESHCORE_REQUIRE_ARM_COMPILER: '1'
MESHCORE_REQUIRE_DFU_EMULATOR: '1'
run: |
pio pkg install --global --tool 'platformio/toolchain-gccarmnoneeabi@1.140201.0'
python3 -B test/test_nrf52_svc_compat.py -v
python3 -B test/test_nrf52_ble_cccd_fix.py -v
python3 -B test/test_nrf52_ble_disconnect.py -v
pip install unicorn==2.1.4
python3 -B test/test_nrf52_ble_dfu_fix.py -v
- name: Verify WiFi, ESP-NOW and combined wireless controls
run: |
python3 -B test/test_wireless_control.py -v
python3 -B test/test_serial_wifi_sessions.py -v
python3 -B test/test_companion_wifi_listener.py -v
python3 -B test/test_wifi_compatibility.py -v
python3 -B test/test_companion_wifi_compatibility.py -v
python3 -B test/test_companion_wifi_status_format.py -v
python3 -B test/test_serial_ethernet_sessions.py -v
python3 -B test/test_companion_wifi_session.py -v
python3 -B test/test_espnow_radio_lifecycle.py -v
python3 -B test/test_wifi_ap_lr_safety.py -v
python3 -B test/test_espnow_runtime.py -v
python3 -B test/test_wifi_ota_lifecycle.py -v
- name: Verify message reader buttons, touch targets, and footer layouts
working-directory: test
run: >-
python3 -B -m unittest
test_message_navigation test_companion_reader test_reader_touch_coordinates
test_touch_debug_overlay test_touch_debug_cli test_color_theme
test_indicator_messages_profile test_t096_message_footer_profile
test_indicator_display_profile test_indicator_render_profile
test_indicator_exclusive_transport test_companion_transport_selector
test_companion_home_ble_profiles
- name: Verify independent USB packet/debug logging, recovery, and instructions
run: |
python3 -B test/test_common_usb_debug.py
python3 -B test/test_companion_usb_logging.py
python3 -B test/test_nrf52_framework_logging.py
python3 -B test/test_usb_logging_watchdog.py
python3 -B test/test_usb_watchdog_event.py
python3 -B test/test_usb_logging_client_activity.py
python3 -B test/test_usb_logging_watchdog_runtime.py
python3 -B test/test_usb_logging_hwcdc_watchdog.py -v
python3 -B test/test_usb_logging_hwcdc_presence.py -v
python3 -B test/test_usb_logging_watchdog_roles.py
python3 -B test/test_nrf52_usb_console.py
python3 -B test/test_esp32_tinyusb_nonblocking.py
python3 -B test/test_esp32_tinyusb_role_hygiene.py
python3 -B test/test_logging_sleep_contract.py
python3 -B test/test_picker_controls_generator.py
python3 -B test/test_firmware_picker_package.py
node test/test_firmware_picker.js
node test/test_t114_picker.js
node test/test_optional_display_picker.js
node test/test_consolidated_picker.js
python3 -B test/test_t114_release_profiles.py -v
python3 -B test/test_optional_display_profiles.py -v
python3 -B test/test_consolidated_profiles.py -v
python3 -B test/test_rp2040_application_capabilities.py -v
- name: Verify Full logging compiler flags and packaged capabilities
run: |
python3 -B test/test_t114_autodisplay_recipes.py -v
python3 -B test/test_station_g3_radio_pins.py -v
python3 -B test/test_station_g3_cli_dispatch.py -v
python3 -B test/test_station_g3_fem_control.py -v
python3 -B test/test_station_g3_slot_settings.py -v
python3 -B test/test_station_g3_slot_detection.py -v
python3 -B test/test_station_g3_boot_recovery.py -v
python3 -B test/test_kiss_radio_slot.py -v
python3 -B test/test_station_g3_release_profiles.py -v
node test/test_station_g3_picker.js
python3 -B test/test_upstream_observer_recipes.py -v
python3 -B test/test_station_g3_sensor_recipes.py -v
python3 -B test/test_full_build_flag_dedup.py
python3 -B test/test_full_logging_compile.py
python3 -B test/test_full_logging_resume.py
python3 -B test/test_xiao_canonical_logging.py -v
python3 -B test/test_firmware_build_recipe.py -v
python3 -B test/test_firmware_capabilities.py
MESHCORE_TEST_REAL_PIO_PATHS=1 python3 -B test/test_esp32_partition_migration_build_dir.py -v
python3 -B test/test_esp32_partition_migration_usb.py -v
python3 -B test/test_esp32_partition_migrator_ap_password.py -v
python3 -B test/test_waveshare_partition_migration.py -v
python3 -B test/test_usb_partition_bridge_set.py -v
bash test/test_build_profiles.sh
python3 -B test/test_onboard_qspi_profiles.py -v
bash test/test_full_infrastructure_selection.sh
bash test/test_nrf52_ota_profiles.sh
bash test/test_xiao_qspi_combined.sh
- name: Verify nRF52 UF2-reset CLI coverage
run: python3 -B test/test_nrf52_uf2reset_cli.py
- name: Verify CLI setting dispatch and get-set coverage
run: |
python3 -B test/test_path_hash_cli.py
python3 -B test/test_cli_settings_contract.py
python3 -B test/test_local_cli_access.py
python3 -B test/test_remote_cli_command_identity.py -v
python3 -B test/test_replay_reset_integration.py -v
- name: Verify firmware memory budgets and nRF52 Bluetooth startup
env:
MESHCORE_REQUIRE_ARM_COMPILER: '1'
run: |
python3 -B test/test_firmware_ram.py
python3 -B test/test_sh1106_memory.py -v
python3 -B test/test_recent_repeater_storage.py -v
python3 -B test/test_ota_cold_buffers.py -v
python3 -B test/test_ota_source_proofs.py -v
python3 -B test/test_neighbor_scope_storage.py
python3 -B test/test_ed25519_compact.py
python3 -B test/test_cascade_release_package.py
python3 -B test/test_release_publication.py
python3 -B test/test_local_release_full_selection.py
python3 -B test/test_local_release_capacity_archive.py
python3 -B test/test_t096_full_memory.py
python3 -B test/test_st7735_framebuffer.py -v
python3 -B test/test_nrf52_ble_startup.py
python3 -B test/test_nrf52_ble_backpressure.py
python3 -B test/test_nrf52_ble_rx_queue.py -v
python3 -B test/test_nrf52_ble_tx_session.py -v
python3 -B test/test_nrf52_ble_trace.py
python3 -B test/test_nrf52_ble_debug_tools.py
python3 -B test/test_nrf52_usb_power.py
python3 -B test/test_nrf52_shutdown_leds.py -v
python3 -B test/test_shared_mota_queue.py
- name: Verify opt-in RAK4631 combined Ethernet and OTA modes
run: |
python3 -B test/test_rak_combined_ota.py -v
python3 -B test/test_rak_ethernet_transmit.py -v
python3 -B test/test_rak4631_ethernet_runtime.py -v
python3 -B test/test_ethernet_terminal_shutdown.py -v
python3 -B test/test_rak_sd_receiver.py -v
python3 -B test/test_rak15002_shared_spi.py -v
python3 -B test/test_ota_sd_auth_ownership.py -v
python3 -B test/test_nrf52_internal_bootloader_link.py -v
python3 -B test/test_rak_nor_gpio_reservations.py -v
python3 -B test/test_rak_companion_ethernet_worker.py -v
python3 -B test/test_rak_sd_context_handoff.py -v
python3 -B test/test_rak_sd_room_ethernet.py -v
- name: Verify nRF52 infrastructure trims and unchanged Companion scope
run: |
python3 -B test/test_nrf52_flash_trim.py -v
python3 -B test/test_nrf52_tft_font_trim.py -v
python3 -B test/test_ota_sd_cache.py -v
python3 -B test/test_rak15002_sd_seeder.py -v
python3 -B test/test_rak4631_rak15002_sd_recipes.py -v
python3 -B test/test_ota_target_names.py -v
python3 -B test/test_ota_cli_listing.py -v
- name: Verify compact same-size fonts and lossless rendering
run: |
python3 -B test/test_compact_arial.py -v
python3 -B test/test_compact_noto.py -v
python3 -B test/test_nrf52_font_license.py -v
python3 -B test/test_oled_font_experiments.py -v
python3 -B test/test_font_family_trials.py -v
- name: Verify Companion Bluetooth settings and WebConfig
run: |
python3 -B test/test_rtttl_rollover.py -v
python3 -B test/test_rtttl_rollover_recipes.py -v
python3 -B test/test_companion_ui_deadlines.py -v
python3 -B test/test_sensor_ui_polling.py -v
python3 -B test/test_home_sensor_refresh.py -v
python3 -B test/test_scrolling_status_bar_rollover.py -v
python3 -B test/test_gps_voice_buttons.py -v
python3 -B test/test_gps_voice_generator.py -v
python3 -B test/test_button_voice_actions.py -v
python3 -B test/test_button_voice_generator.py -v
python3 -B test/test_button_voice_preview.py -v
python3 -B test/test_g726_voice.py -v
MESH_G726_TEST_SANITIZERS=1 python3 -B test/test_g726_voice.py -v
python3 -B test/test_g726_voice_generator.py -v
python3 -B test/test_voice_prefixes.py -v
MESH_VOICE_TEST_SANITIZERS=1 python3 -B test/test_voice_prefixes.py -v
python3 -B test/test_nimble_companion.py
python3 -B test/test_bluetooth_pairing_ui.py
python3 -B test/test_companion_pairing_display.py
python3 -B test/test_companion_identity_startup.py
python3 -B test/test_startup_screen.py
python3 -B test/test_ui_startup_windows.py -v
node test/test_notification_builder.js
python3 -B test/test_notification_settings.py
python3 -B test/test_companion_alert_control.py -v
python3 -B test/test_companion_compact_led_control.py -v
python3 -B test/test_companion_alert_drivers.py -v
python3 -B test/test_notification_led_ownership.py -v
python3 -B test/test_led_settings.py -v
python3 -B test/test_board_led_policy.py -v
python3 -B test/test_status_led_policy.py -v
python3 -B test/test_nrf52_led_policy.py -v
python3 -B test/test_mono_led_rollover.py -v
python3 -B test/test_backlight_poll_rollover.py -v
python3 -B test/test_rgb_led_rollover.py -v
python3 -B test/test_display_power.py
python3 -B test/test_t114_display_detection.py -v
python3 -B test/test_rc32_display_detection.py -v
python3 -B test/test_wireless_tracker_display_detection.py -v
python3 -B test/test_heltec_r8_display_detection.py -v
python3 -B test/test_heltec_r8_display_rotation.py -v
python3 -B test/test_tdeck_display_cooperation.py -v
python3 -B test/test_muzi_accessory_detection.py -v
python3 -B test/test_techo_lite_display_detection.py -v
python3 -B test/test_companion_headless_buttons.py -v
python3 -B test/test_st7735_display_wake_profile.py -v
python3 -B test/test_legacy_ui_version_bounds.py -v
python3 -B test/test_infrastructure_ui_version.py -v
python3 -B test/test_ssd1306_power.py -v
python3 -B test/test_oled_display_probe.py -v
python3 -B test/test_oled_controller_settings.py -v
python3 -B test/test_companion_inbox.py
python3 -B test/test_heltec_r8_external_power.py
python3 -B test/test_bluetooth_mac_contract.py
python3 -B test/test_companion_settings_persistence_contract.py
python3 -B test/test_webconfig_ui.py
python3 -B test/test_webconfig_regulators.py -v
python3 -B test/test_webconfig_gzip.py
python3 -B test/test_webconfig_secret_masking.py
python3 -B test/test_webconfig_station_ownership.py -v
python3 -B test/test_mqtt_canonical_wifi.py -v
python3 -B test/test_mqtt_ap_ownership.py -v
python3 -B test/test_sensor_webconfig_capabilities.py -v
python3 -B test/test_webconfig_ui_runtime.py
python3 -B test/test_webconfig_lost_reply.py -v
MESHCORE_REQUIRE_ROOM_BROWSER=1 python3 -B test/test_room_web_ui.py -v
MESHCORE_REQUIRE_ROOM_BROWSER=1 python3 -B test/test_room_mail_web_ui.py -v
- name: Upload Test Results
# Upload test results even if the test step failed.
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: .pio/build/native/
hosted-doc-links:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Install the documentation renderer
run: python3 -m pip install mkdocs==1.6.1 mkdocs-material==9.7.7
- name: Verify source links and published page routes
run: python3 -B test/test_hosted_doc_links.py -v
- name: Verify hosted-link visibility and navigation
run: node test/test_hosted_doc_links.js