Detect OLED or the original stock TFT touch assembly in ordinary V4.2/V4.3 images. Add saved live display.type auto/oled/tft/off selection and report the active selection in board output. Keep sensors on primary I2C, preserve shared power, and isolate TFT FSPI from radio HSPI through sleep and changes. Consolidate future picker/build choices only with application capability proof. Retain exact legacy OTA identities and separate R8 hardware images. Document controls and physical qualification limits. Validation: five serialized Full builds with capability/size/RAM checks; focused host tests, existing R8/T-Deck/OLED regressions, build-profile suite, and picker/provider tests. V4.3 OLED live changes and off/auto reboot persistence passed on Mercerwood. Physical TFT qualification remains pending.
1245 lines
62 KiB
YAML
1245 lines
62 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 band-aware RF switching 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.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-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 contacts, ESP32-C6 rooms and ESP-NOW Companion
|
|
# 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_ -e Generic_ESPNOW_comp_radio_usb
|
|
|
|
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_repeater_discovery_settings.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_infrastructure_radio_apply.py -v
|
|
python3 -B test/test_common_cli_save_results.py -v
|
|
python3 -B test/test_common_cli_tx_pending.py -v
|
|
python3 -B test/test_radio_rx_settings_transaction.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_tx_power_transaction.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_admin_cli_reply_scope.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_service_start_retry.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_display_night_mode.py -v
|
|
python3 -B test/test_display_night_location.py -v
|
|
python3 -B test/test_display_night_rendering.py -v
|
|
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_heltec_v4_display_detection.py -v
|
|
python3 -B test/test_heltec_v4_unified_catalog.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
|
|
python3 -B test/test_display_night_webconfig.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
|
|
- name: Release feature link behavior
|
|
run: node test/test_release_features.js
|