Skip to content

Release v0.2.0: integrate IEC 61850 engineering workbench #1197

Release v0.2.0: integrate IEC 61850 engineering workbench

Release v0.2.0: integrate IEC 61850 engineering workbench #1197

name: IED Simulator Qt
on:
push:
paths:
- 'apps/ied_simulator/**'
- 'include/ariec61850/scl/**'
- 'src/scl/**'
- 'include/ariec61850/mms/**'
- 'src/mms/**'
- 'include/ariec61850/goose/**'
- 'src/goose/**'
- 'tools/static_ied_server.cpp'
- 'tools/mms_read_probe.cpp'
- 'tools/mms_urcb_gi_probe.cpp'
- 'tools/mms_brcb_event_probe.cpp'
- 'tools/mms_sgcb_probe.cpp'
- 'tools/static_ied_server_iedsim/**'
- 'tests/fixtures/scl/**'
- 'CMakeLists.txt'
- '.github/workflows/ied-simulator-qt.yml'
pull_request:
paths:
- 'apps/ied_simulator/**'
- 'include/ariec61850/scl/**'
- 'src/scl/**'
- 'include/ariec61850/mms/**'
- 'src/mms/**'
- 'include/ariec61850/goose/**'
- 'src/goose/**'
- 'tools/static_ied_server.cpp'
- 'tools/mms_read_probe.cpp'
- 'tools/mms_urcb_gi_probe.cpp'
- 'tools/mms_brcb_event_probe.cpp'
- 'tools/mms_sgcb_probe.cpp'
- 'tools/static_ied_server_iedsim/**'
- 'tests/fixtures/scl/**'
- 'CMakeLists.txt'
- '.github/workflows/ied-simulator-qt.yml'
permissions:
contents: read
jobs:
build-and-smoke:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.8.3'
cache: true
- name: Configure
run: >-
cmake -S apps/ied_simulator -B build-ied-simulator-qt -G Ninja
-DCMAKE_BUILD_TYPE=Release
- name: Build
run: >-
cmake --build build-ied-simulator-qt
--target arstack_ied_simulator ariec61850_mms_read_probe ariec61850_live_discover ariec61850_mms_sgcb_probe ied_setting_control_manifest_qa ied_simulator_guardrails_qa ied_simulator_responsiveness_qa ied_simulator_commissioning_qa ied_simulator_runtime_commissioning_qa ied_simulator_goose_publication_qa ied_goose_workspace_qa ied_mms_client_workbench_qa ied_report_workspace_qa ied_file_settings_workspace_qa ied_scl_workspace_qa ied_product_hardening_qa --parallel 2
- name: Bounded activity and child-output guardrails
run: ./build-ied-simulator-qt/ied_simulator_guardrails_qa
- name: QML smoke test
env:
QT_QPA_PLATFORM: offscreen
run: ./build-ied-simulator-qt/arstack_ied_simulator --smoke-test
- name: MMS client discovery workbench gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/ied_mms_client_workbench_qa
./tests/fixtures/scl/client-workbench.scd
- name: Report / RCB commissioning workspace gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/ied_report_workspace_qa
./tests/fixtures/scl/minimal-station-brcb.scd
- name: external IEC 61850 client indexed RCB production-path gate
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/ied_report_workspace_qa
./tests/fixtures/scl/interop-indexed-reports.scd
- name: File transfer + Setting Groups workspace gates
env:
QT_QPA_PLATFORM: offscreen
run: ./build-ied-simulator-qt/ied_file_settings_workspace_qa
- name: Canonical SettingControl manifest projection gate
run: ./build-ied-simulator-qt/ied_setting_control_manifest_qa
- name: Production SGCB discovery and ActSG cross-association gate
run: >-
python3 apps/ied_simulator/test_sgcb_production.py
--server ./build-ied-simulator-qt/ariec61850_ied_simulator_server
--build-dir ./build-ied-simulator-qt
- name: external IEC 61850 client synthetic golden runtime gate
env:
QT_QPA_PLATFORM: offscreen
run: >-
python3 apps/ied_simulator/test_interop_golden_synthetic.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
--build-dir ./build-ied-simulator-qt
--scl ./tests/fixtures/scl/interop-golden-synthetic.cid
- name: SCL workspace preservation + conversion-policy gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/ied_scl_workspace_qa
./tests/fixtures/scl/minimal-station-brcb.scd
- name: Product hardening state + runtime readiness gates
env:
QT_QPA_PLATFORM: offscreen
run: ./build-ied-simulator-qt/ied_product_hardening_qa
- name: Prove interactive SCL import uses bounded async path
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/arstack_ied_simulator
--qa-async-import ./tests/fixtures/scl/minimal-station-brcb.scd
- name: Prove malformed SCL fails closed
run: >-
python3 apps/ied_simulator/test_malformed_import.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
- name: Start stop restart lifecycle soak
run: >-
python3 apps/ied_simulator/test_runtime_lifecycle.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
--scl ./tests/fixtures/scl/minimal-station-brcb.scd
--cycles 12
- name: Large SCL import performance gates
run: >-
python3 apps/ied_simulator/benchmark_large_scl.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
--targets 5000,20000,50000
- name: Runtime scale and responsiveness gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
python3 apps/ied_simulator/test_runtime_responsiveness.py
--qa ./build-ied-simulator-qt/ied_simulator_responsiveness_qa
--multi-scl ./tests/fixtures/scl/compact-multi-stream.scd
--single-scl ./tests/fixtures/scl/minimal-station-brcb.scd
- name: Commissioning feature depth gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/ied_simulator_commissioning_qa
./tests/fixtures/scl/minimal-station-brcb.scd
./tests/fixtures/scl/commissioning-unresolved.scd
- name: Runtime commissioning actions and behavior gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/ied_simulator_runtime_commissioning_qa
./tests/fixtures/scl/minimal-station-brcb.scd
./build-ied-simulator-qt
- name: GOOSE wire publication and fail-closed gates
run: >-
./build-ied-simulator-qt/ied_simulator_goose_publication_qa
./tests/fixtures/scl/minimal-station-brcb.scd
./goose-publication-evidence.pcap
- name: GOOSE monitor + publisher workspace gates
run: >-
./build-ied-simulator-qt/ied_goose_workspace_qa
./goose-publication-evidence.pcap
- name: Upload GOOSE wire evidence
uses: actions/upload-artifact@v4
with:
name: ied-simulator-goose-wire-evidence
path: goose-publication-evidence.pcap
if-no-files-found: error
retention-days: 14
- name: Live runtime data-plane burst gates
env:
QT_QPA_PLATFORM: offscreen
run: >-
python3 apps/ied_simulator/test_live_hot_updates.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
--read-probe ./build-ied-simulator-qt
--scl ./tests/fixtures/scl/minimal-station-brcb.scd
--bursts 1000,10000
- name: Reject stale live runtime deltas
run: >-
python3 apps/ied_simulator/test_live_data_plane_negative.py
--server ./build-ied-simulator-qt
--read-probe ./build-ied-simulator-qt
- name: Capture workbench visual regression
env:
QT_QPA_PLATFORM: offscreen
run: >-
./build-ied-simulator-qt/arstack_ied_simulator
--scl ./tests/fixtures/scl/minimal-station-brcb.scd
--screenshot ./ied-simulator-workbench.png
- name: Upload workbench screenshot
uses: actions/upload-artifact@v4
with:
name: ied-simulator-workbench
path: ied-simulator-workbench.png
if-no-files-found: error
retention-days: 14
- name: Prove GUI value is visible through MMS
run: >-
python3 apps/ied_simulator/test_gui_live_value.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
--read-probe ./build-ied-simulator-qt
--scl ./tests/fixtures/scl/minimal-station-brcb.scd
- name: Prove two IEDs can share TCP port across distinct local IPs
run: >-
python3 apps/ied_simulator/test_gui_multi_ied.py
--app ./build-ied-simulator-qt/arstack_ied_simulator
--read-probe ./build-ied-simulator-qt
--scl ./tests/fixtures/scl/compact-multi-stream.scd