Files
MeshCore/.github/workflows/run-unit-tests.yml
T
Claude 0e756bf24a Companion: say which profile raw and channel data arrived on
MeshCore Open TAK labels a MediaMesh photo or voice clip "Received via
MediaMesh", "via main mesh" or both. Wadamesh standalones tell the
app the profile in a frame byte stock firmware leaves reserved; a
Cascade companion left it unset, so the app showed nothing.

While radio2 is on (rx or rxtx):
- PUSH_CODE_RAW_DATA (0x84) byte 3: 0xA0 primary, 0xA1 radio2
  (stock 0xFF).
- RESP_CODE_CHANNEL_DATA_RECV (0x1B) byte 2: the same (stock 0).
With radio2 off, or for a packet from the UDP bridge, the stock values
stay, so existing clients see no change.

Test: test/test_companion_rx_via.py (in run-unit-tests); the two
harnesses that compile these handlers get a stub.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011i5tJJtj95MB4oUgncCUe5
2026-10-24 17:31:53 -07:00

1228 lines
61 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 XIAO Full Companion with Meshtext and direct OTA
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 T1000-E Full Companion with LR1110 Meshtext
run: >-
bash build.sh build-firmware t1000e_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: Qualify both RAK4631 Repeater sensor and LoRa OTA profiles
run: >-
bash build.sh build-firmware RAK_4631_repeater
--build-profile auto --firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Qualify both RAK3401 Room Server sensor and LoRa OTA profiles
run: >-
bash build.sh build-firmware RAK_3401_room_server
--build-profile auto --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
esp32-classic-companion-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Qualify Heltec V2 BLE with retained contacts and RAM reserves
run: >-
bash build.sh build-firmware Heltec_v2_companion_radio_ble
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascadia --profile cascade --auto
- name: Qualify Heltec V2 Full Companion with SX1276 Meshtext
run: >-
bash build.sh build-firmware Heltec_v2_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
esp32-constrained-companion-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Qualify C3 Full Companion with all transports and Meshtext
run: >-
bash build.sh build-firmware Xiao_C3_companion_radio_full
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Qualify C6 Full Companion with Meshtext
run: >-
bash build.sh build-firmware Xiao_C6_companion_radio_full_
--firmware-version v1.18.0.1-halo-keymind-cascade-dev
--radio-preset usa-cascade-fixed --profile cascade --require-ota
- name: Qualify Tracker V2 Full Companion with shared cold storage
run: >-
bash build.sh build-firmware heltec_tracker_v2_companion_radio_full_femon
--firmware-version v1.18.0.1-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_radio_switch_tuning_cli.py -v
python3 -B test/test_radio_switch_tuning_transaction.py -v
python3 -B test/test_radio_switch_driver_controls.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 host identity test dependencies
run: |
python3 -m pip install cryptography detools
sudo apt-get update
sudo apt-get install -y libssl-dev
- name: Verify MOTA containers and build profile contracts
run: python3 -B tools/mota/test_mota.py
- name: Verify embedded bootloader variant and guarded activation
run: |
python3 -B test/test_nrf52_embedded_variant.py -v
python3 -B test/test_nrf52_embedded_bootloader.py -v
python3 -B test/test_sensecap_bootloader_identity.py -v
python3 -B test/test_sensecap_bootloader_runtime.py -v
python3 -B tools/mota/test_bootloader_migration.py -v
python3 -B tools/mota/test_bootloader_migration_runtime.py -v
python3 -B test/test_bootloader_update_cli.py -v
python3 -B test/test_bootloader_migration_role_persistence.py -v
python3 -B test/test_bootloader_migration_store.py -v
- 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 shared SHA-512 signing against the original backend and RFC8032
run: python3 -B test/test_ed25519_shared_sha512.py -v
- 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_flood_advert_rtc.py -v
python3 -B test/test_flood_advert_iram.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_rtc_posts.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_gzip.py -v
python3 -B test/test_esp32_full_size.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_radio_rx_activity_epoch.py -v
python3 -B test/test_esp32_radio_trace.py -v
python3 -B test/test_esp32_radio_trace_cli.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
python3 -B test/test_rs232_bridge_diagnostics.py -v
python3 -B test/test_rs232_diagnostic_cli.py -v
python3 -B test/test_bridge_debug_formatter.py -v
python3 -B test/test_udp_bridge_config.py -v
python3 -B test/test_udp_packet_origin.py -v
python3 -B test/test_udp_bridge.py -v
python3 -B test/test_udp_bridge_integration.py -v
python3 -B test/test_indicator_repeater_profile.py -v
python3 -B test/test_companion_psram_mesh.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 packed noise history, fresh measurements and sampling
working-directory: test
run: >-
python3 -B -m unittest
test_noise_floor_history test_noise_floor_readings test_noise_floor_sampler
test_noise_floor_rssi_errors test_noise_floor_cli -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_battery_forwarding.py -v
python3 -B test/test_battery_calibration.py -v
python3 -B test/test_battery_calibration_store.py -v
python3 -B test/test_power_saving_diagnostics.py -v
python3 -B test/test_power_saving_diagnostics_buckets.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_rtc_queue.py -v
python3 -B test/test_esp32_cpu_clock.py -v
python3 -B test/test_esp32_cpu_clock_board.py -v
python3 -B test/test_esp32_power_test_controls.py -v
python3 -B test/test_esp32_uart_quiet_session.py -v
python3 -B test/test_companion_rxps_getters.py -v
python3 -B test/test_rxps_runtime.py -v
python3 -B test/test_rxps_hardware_capability.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_rx_via.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
python3 -B test/test_one_key_dm_compact_held.py -v
python3 -B test/test_companion_shared_ota_capacity.py -v
python3 -B test/test_espnow_raw_initialization.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_pocket_gui_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_companion_serial_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
- 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_guest_cli.py -v
python3 -B test/test_login_history.py -v
python3 -B test/test_guest_login_settings.py -v
python3 -B test/test_repeater_guest_access.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-${{ hashFiles('test/test_official_app_compatibility.py', 'test/test_official_config_gui.py', 'test/test_official_web_console.py') }}
- 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_light_sleep_policy.py -v
python3 -B test/test_esp32_profile_idle_sleep.py -v
python3 -B test/test_esp32_role_profile_idle_handoff.py -v
python3 -B test/test_profile_idle_esp32.py -v
python3 -B test/test_profile_idle.py -v
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_rak3401_buffered_radio_hal.py -v
python3 -B test/test_sx126x_buffered_radio_hal.py -v
python3 -B test/test_esp32_tunable_target_constructors.py -v
python3 -B test/test_esp32_spi_ab_diagnostics.py -v
python3 -B test/test_profile_switch_timing.py -v
python3 -B test/test_nrf_radio_yield_budget.py -v
python3 -B test/test_nrf_radio_priority_lease.py -v
python3 -B test/test_nrf_radio_priority_integration.py -v
python3 -B test/test_nrf_radio_combined_experiment.py -v
python3 -B test/test_nrf_radio_usb_irq_guard.py -v
python3 -B test/test_nrf_radio_irq_observer.py -v
python3 -B test/test_nrf52_hil_irq_binding.py -v
python3 -B test/test_nrf_radio_spi_startup_diag.py -v
python3 -B test/test_nrf_radio_spi_read_probe.py -v
python3 -B test/test_sx126x_nrf_rp_constructors.py -v
python3 -B test/test_xiao_nrf52_buffered_spi.py -v
python3 -B test/test_nrf52_hil_spim1.py -v
python3 -B test/test_companion_hil_startup_frequency.py -v
python3 -B test/test_companion_board_power_commands.py -v
python3 -B test/test_companion_radio_diagnostics.py -v
python3 -B test/test_companion_help_writer.py -v
python3 -B test/test_companion_help_build_policy.py -v
python3 -B test/test_sdcard_cli_parity.py -v
python3 -B test/test_esp32_buffered_radio_targets.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_espnow_bridge_diagnostics.py -v
python3 -B test/test_espnow_diagnostic_cli.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_pocket_gui test_pocket_world_map test_pocket_eink_refresh test_pocket_panel_spi
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_esp32_sdk_logging.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_nrf52_bootloader_release_catalog.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_esp32_ble_power.py -v
python3 -B test/test_esp32_native_ble_stop.py -v
python3 -B test/test_esp32_ble_lifecycle_fix.py -v
python3 -B test/test_esp32_nimble_timer_fix.py -v
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_upstream_auto_display_merge.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
python3 -B test/test_webconfig_cpu_frequency.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