Cross-cutting tests¶
Unit tests¶
Per-crate, no IPC, parallel-safe.
Property test ( |
Unit test asserting that every valid transition between
|
Unit-level coverage of the topic-match predicate independent of any
broker or iceoryx2 service: every (subscription pattern, incoming
topic) pair is asserted against the MQTT 3.1.1 wildcard semantics
(single-level |
Asserts that constructing a |
Workspace end-to-end tests¶
Full stack exercised via taktora-connector-host examples or
assert_cmd-driven binary smoke tests.
Single-binary integration: |
Two binaries: a plugin process running |
While the connector is mid-traffic, send SIGINT; the host returns
from |
With one channel configured, observe the iceoryx2 service for the duration of a normal session: the only envelopes that flow are user-payload envelopes (no “ping”, “version”, or “shutdown handshake”). Asserts the framework’s no-control-plane invariant. |
Loom concurrency tests¶
Run with cargo test --features loom under cfg(loom).
Loom model of |
Loom model with multiple threads attempting transitions
simultaneously (e.g. the tokio task reporting |
Cross-cutting traceability¶
ID |
Title |
Status |
Verifies |
|---|---|---|---|
ExponentialBackoff invariants |
open |
||
ConnectorHealth state-machine transitions |
open |
||
MqttRouting wildcard demux predicate |
open |
||
ChannelDescriptor validation |
open |
||
Interval trigger fires the configured number of times |
implemented |
||
Interval cardinality matches run_n on the threaded pool |
implemented |
||
ExecutionMonitor brackets every dispatch |
implemented |
||
Subscriber-triggered ingestion wakes the item |
implemented |
||
Publisher API send paths deliver to attached subscribers |
implemented |
||
Publisher::loan round-trips without serialisation |
implemented |
||
JsonCodec round-trip property test |
open |
||
Codec encode error on undersized buffer |
open |
||
Codec decode error propagation |
open |
||
NotifyOutcome surfaces listeners-notified count |
implemented |
||
Chain runs its items in declared order |
implemented |
||
Diamond DAG runs every vertex exactly once |
implemented |
||
StopChain and Err propagate to downstream items |
implemented |
||
wrap_with_condition gates execution on the predicate |
implemented |
||
TriggerDeclarer::deadline stores the (listener, deadline) pair |
implemented |
||
ExecutionMonitor::post_execute reports per-execute duration |
implemented |
||
ChannelWriter → ChannelReader round-trip |
open |
||
Sequence-number monotonicity |
open |
||
Timestamp populated at send |
open |
||
Correlation ID round-trip |
open |
||
Per-channel size — 4 KB, 64 KB, 1 MB |
open |
||
Payload-overflow rejection |
open |
||
Service naming derived from descriptor |
open |
||
ThreadAttributes affinity_mask compiles and runs |
implemented |
||
ThreadAttributes priority setter compiles into the worker thread body |
implemented |
||
Stoppable::stop wakes an idle WaitSet from another thread |
implemented |
||
QoS 0 round-trip |
open |
||
QoS 1 round-trip |
open |
||
Retained-message publish + subscribe |
open |
||
Wildcard subscription with `+` |
open |
||
Wildcard subscription with `#` |
open |
||
Username/password authentication |
open |
||
TLS connection (developer-machine only) |
open |
||
Reconnect after broker bounce |
open |
||
HealthEvent emitted on every transition |
open |
||
Outbound bridge saturation → BackPressure |
open |
||
Inbound bridge saturation → DroppedInbound |
open |
||
Per-iteration error slot is pre-allocated, not Arc-Mutex-allocated per cycle |
implemented |
||
In-process gateway smoke |
open |
||
Separate-process gateway smoke |
open |
||
SIGINT clean exit within 5-second budget |
open |
||
No control-plane envelopes flow |
open |
||
Bridge handoff under arbitrary interleaving |
open |
||
Health state-machine under concurrent updates |
open |
||
Zero allocations in steady-state dispatch |
open |
||
Cap exhaustion and oversize alloc both fail-closed |
open |
||
Steady-state cap behaviour under burst |
open |
||
lock() then alloc panics |
open |
||
Counter accuracy |
open |
||
Concurrent alloc/dealloc safety smoke |
open |
||
Histogram percentile accuracy |
implemented |
||
Per-task max jitter under synthetic period violation |
implemented |
||
Overrun counter increments exactly per overrun cycle |
implemented |
||
Push and pull stat paths agree |
implemented |
||
Allocation-free telemetry update |
implemented |
||
EthercatConnector trait surface |
open |
||
EthercatRouting field round-trip |
open |
||
Single MainDevice per gateway instance |
open |
||
Bus reaches OP before traffic accepted |
open |
||
Static PDO map accepted from options |
open |
||
PDO mapping applied during PRE-OP to SAFE-OP |
open |
||
Cycle time configurable |
open |
||
Missed ticks are skipped not queued |
open |
||
Distributed Clocks bring-up is opt-in |
open |
||
Up requires OP and matching working counter |
open |
||
Working-counter mismatch transitions to Degraded |
open |
||
Tokio sidecar contained inside connector crate |
open |
||
Bridge channels are bounded with configurable capacity |
open |
||
Outbound bridge saturation surfaces as BackPressure |
open |
||
Inbound bridge saturation surfaces as DroppedInbound |
open |
||
Gateway opens raw socket on Linux with CAP_NET_RAW |
open |
||
PDI bit-slice byte-aligned round-trip |
open |
||
PDI bit-slice unaligned round-trip |
open |
||
Adjacent PDI bit slices do not interfere |
open |
||
Per-channel routing registry has stable iteration order |
open |
||
Outbound end-to-end (plugin send → PDI slice via mock) |
open |
||
Inbound end-to-end (PDI slice via mock → plugin recv) |
open |
||
Loopback round-trip (plugin → mock → plugin) |
open |
||
Asymmetric expected_wkc summing |
open |
||
DC cycle path branches on options.distributed_clocks |
open |
||
Recovery state machine drives BusDriver::recover per policy |
open |
||
Health transitions during recovery |
open |
||
Hardware drill — endurance + unplug/replug |
open |
||
Harness builds and runs on Linux non-RT |
open |
||
NDJSON schema validation |
open |
||
Harness telemetry agrees with stats_snapshot |
open |
||
ZenohRouting field validation |
open |
||
ZenohConnector implements Connector with ZenohRouting |
open |
||
Pub/sub end-to-end against MockZenohSession |
open |
||
Query round-trip against MockZenohSession |
open |
REQ_0420; REQ_0421; REQ_0422; REQ_0423; REQ_0424; REQ_0426; REQ_0427 |
|
Codec failure paths for queries |
open |
||
Outbound bridge saturation surfaces as BackPressure |
open |
||
Inbound bridge saturation surfaces as DroppedInbound |
open |
||
Query timeout emits 0x03 terminator |
open |
||
Health state machine on MockZenohSession lifecycle |
implemented |
||
REQ_0441 anti-req — no ReconnectPolicy on session loss |
implemented |
||
zenoh-integration feature gates the real zenoh dep |
implemented |
||
Cross-platform support |
implemented |
||
Two-peer real session pub/sub |
draft |
||
Client-mode router smoke |
draft |
||
Tokio sidecar contained inside taktora-connector-zenoh |
implemented |
||
parse() accepts a representative Beckhoff EL3001 ESI |
open |
||
Parser compiles under no_std + alloc |
rejected |
||
Parser is independent of ethercrab |
open |
||
Vendor-specific elements survive as RawXml |
open |
||
Parse errors carry line and column |
open |
||
Name sanitisation handles ESI naming edge cases |
open |
||
Revision collision produces distinct idents |
open |
||
PDO entry dedup collapses structurally identical layouts |
open |
||
TokenStream emission, not string formatting |
open |
||
EL3001 backend output snapshot |
open |
||
Generated registry covers every emitted device |
open |
||
Generated module compiles under no_std + alloc |
open |
||
Backend is the sole ethercrab consumer in the toolchain |
open |
||
Object-dictionary emission gated by feature flag |
open |
||
EsiDevice trait shape compiles for a hand-written device |
open |
||
EsiConfigurable async trait shape compiles |
open |
||
ethercat-esi-rt is the trait home, not taktora-internal |
open |
||
Builder writes a parseable Rust file to OUT_DIR |
open |
||
cargo rerun-if-changed emitted per ESI input |
open |
||
Output passes prettyplease formatting |
open |
||
cargo esi expand emits a single device's code |
open |
||
cargo esi list enumerates devices |
open |
||
CLI output matches build helper output byte-for-byte |
open |
||
Verifier passes on matching ESI + SII pair |
open |
||
Verifier reports the differing field |
open |
||
Verifier reuses ethercat-esi parser |
open |
||
Verifier exit codes follow the documented matrix |
open |
||
Repeated codegen runs produce byte-identical output |
open |
||
Input-file ordering does not affect output |
open |
||
Layering integrity check (Cargo.toml audit) |
open |