diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml index e7d3cb022..e5b6779c4 100644 --- a/.github/workflows/run-unit-tests.yml +++ b/.github/workflows/run-unit-tests.yml @@ -118,14 +118,18 @@ jobs: python3 -B test/test_ed25519_compact_field.py -v python3 -B test/test_ed25519_compact.py -v - - name: Compile ordinary STM32 USB Companion with pinned core and RadioLib - run: pio run -e RAK_3x72_companion_radio_usb - - - name: Qualify Wio-E5 Mini Companion at release version length - run: >- - bash build.sh build-firmware wio-e5-mini_companion_radio_usb - --firmware-version v1.17.1.9-halo-keymind-cascade-dev - --radio-preset usa-cascade-fixed --profile cascade --require-ota + - 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 bootloader-version: runs-on: ubuntu-latest diff --git a/test/test_stm32_companion_profile.py b/test/test_stm32_companion_profile.py index d2b2b11b1..b8f32ba96 100644 --- a/test/test_stm32_companion_profile.py +++ b/test/test_stm32_companion_profile.py @@ -8,6 +8,9 @@ fixing its size limit by silently shrinking storage or Companion capacities. import configparser from pathlib import Path import re +import shlex +import subprocess +import textwrap import unittest @@ -98,5 +101,25 @@ class WioSTM32CompanionProfileTest(STM32CompanionProfileTest): r"-D\s+PIN_USER_BTN=USER_BTN\b") +class STM32CompanionCICoverageTest(unittest.TestCase): + def test_every_small_companion_is_linked_serially_at_release_version_length(self): + workflow = (ROOT / ".github/workflows/run-unit-tests.yml").read_text() + job = re.search(r"^ stm32-companion-smoke:\n(.*?)(?=^ [\w-]+:|\Z)", + workflow, re.MULTILINE | re.DOTALL) + self.assertIsNotNone(job) + script = job[1].replace("\\\n", "") + loop = re.search(r"for target in (.*?); do", script, re.DOTALL) + self.assertIsNotNone(loop) + self.assertEqual(set(shlex.split(loop[1])), { + "RAK_3x72_companion_radio_usb", "wio-e5-mini_companion_radio_usb", + "wio-e5_companion_radio_usb", "Tiny_Relay_companion_radio_usb"}) + self.assertIn("set -euo pipefail", script) + self.assertIn('bash build.sh build-firmware "$target"', script) + self.assertIn("--firmware-version v1.18.0.1-halo-keymind-cascade-dev", script) + self.assertNotIn(" &", script) + command = textwrap.dedent(job[1].rsplit(" run: |\n", 1)[1]) + subprocess.run(["bash", "-n"], input=command, text=True, check=True) + + if __name__ == "__main__": unittest.main()