UI connector (MVVM)

Test cases verifying the UI connector requirements (UiConnector implements Conn... (REQ_0855)OS-mediated trust for v1 (REQ_0884)). The deterministic, host-OS-agnostic behaviour (derive layout, schema, dedupe, back-pressure, gating, health) is covered by unit tests and trybuild compile-fail fixtures that run in default CI on Linux, macOS, and Windows. The live publish/command/discovery round-trips stand up real iceoryx2 shared-memory services, so they live in the publish = false taktora-connector-ui-tests crate (run under the workspace’s single-test-thread discipline, Single-threaded test discip... (CON_0004)). The language-neutral wire contract is pinned by a checked-in golden manifest and a reproducibility check that recomputes the contract hash from the JSON alone.

Test Case: ViewModel derive: layout, schema and envelope sizing TEST_0873
status: implemented
verifies: REQ_0859, REQ_0878
links incoming: REQ_0878, REQ_0859

#[derive(ViewModel)] / #[derive(ImageEnum)] over a struct of bool / f64 / fixed array / BoundedString / C-like enum fields, asserting the derived compile-time envelope size N matches the declared layout (Derive macro computes the e... (REQ_0859)) and that the emitted ViewModelSchema / FieldType manifest contribution names every field with the correct descriptor (Derive macro emits the mani... (REQ_0878)). Realised as crates/taktora-connector-ui-tests/tests/derive_viewmodel.rs.

Test Case: Command derive: CommandParams, idempotent flag and schema TEST_0874
status: implemented
links incoming: REQ_0866, REQ_0868, REQ_0878

#[derive(CommandParams)] with and without #[command(idempotent)], asserting the emitted CommandSchema carries the parameter field descriptors, the command Kind, the CanExecute kind (CanExecute is a published b... (REQ_0866)), and the idempotent flag (Idempotent commands are fla... (REQ_0868)) into the manifest contribution (Derive macro emits the mani... (REQ_0878)). Realised as crates/taktora-connector-ui-tests/tests/derive_command.rs.

Test Case: Non-POD ViewModel fields rejected at compile time TEST_0875
status: implemented
verifies: REQ_0858

trybuild compile-fail corpus asserting that heap-backed (Vec), generic, and serde-renamed fields produce a clear compile_error! rather than mis-encoding, and that a nested-struct field lands on the purposeful “not yet supported” diagnostic — the deferred slice of ViewModel fields restricted... (REQ_0858). Realised as crates/taktora-connector-ui-tests/tests/trybuild.rs driving tests/ui/reject_vec.rs, reject_nested_struct.rs, reject_generic.rs, reject_serde_rename_container.rs, and reject_serde_rename_field.rs against their .stderr snapshots.

Test Case: Server-side Property seqlock RT-update handle TEST_0876
status: implemented
verifies: REQ_0860
links incoming: REQ_0860

Drives the server-side Property<V> RT-update handle and its clone-able pump-side PropertyReader<V>, asserting that an update writes the POD struct into the per-ViewModel seqlock cell with no heap allocation / iceoryx2 call / codec invocation on that path, and that a concurrent pump-side read is torn-read-safe (seqlock retry). Realised as crates/taktora-connector-ui-tests/tests/property.rs.

Test Case: Publish-plane iceoryx2 round-trip: cadence, coalescing, zero-subscriber skip TEST_0877
status: implemented
links incoming: REQ_0856, REQ_0861, REQ_0862

Stands up the production IoxVmPublisher and the Pump against a real iceoryx2 service: asserts a ViewModel is published as one latest-value struct-per-service (ViewModel published as one ... (REQ_0856)), that the non-RT pump snapshots / JSON-encodes / publishes at its cadence coalescing intermediate values (Non-RT publisher pump encod... (REQ_0861)), and that a zero-subscriber ViewModel is skipped and resumes once a subscriber attaches (Publisher pump skips zero-s... (REQ_0862)). Realised as crates/taktora-connector-ui-tests/tests/pump_iox.rs.

Test Case: Command-plane iceoryx2 round-trip: acceptance ack, dedupe, off-RT handler TEST_0878
status: implemented
links incoming: REQ_0865, REQ_0867, REQ_0870

Drives the production IoxCommandTransport / CommandHandler against a UI-shaped client that publishes invocations on the request service and reads acks on the reply service: asserts the acceptance-ack request-response keyed by correlation_id (Commands use acceptance-ack... (REQ_0865)), that a retry reusing a seen correlation_id replays the cached ack without re-executing the effect (Command delivery is at-most... (REQ_0867)), and that the handler runs off the RT/WaitSet thread (Command handler runs off th... (REQ_0870)). Realised as crates/taktora-connector-ui-tests/tests/command_iox.rs.

Test Case: Command deterministic behaviour: reason codes, back-pressure, gating TEST_0879
status: implemented

Unit tests over MockCommandTransport exercising the deterministic command behaviour without shared memory: CanExecute=false gating replies Rejected { CanExecuteFalse } and does not enqueue the effect (CanExecute is a published b... (REQ_0866)); the bounded effect channel replies Rejected { BackPressure } when full rather than blocking (Command channel is bounded ... (REQ_0871)); an unregistered command replies Rejected { UnknownCommand } and the closed RejectedCode set is exercised (Rejected carries a closed r... (REQ_0869)); and the correlation_id LRU dedupe replays cached acks (Command delivery is at-most... (REQ_0867)). Realised as the #[cfg(test)] unit tests in crates/taktora-connector-ui/src/command.rs.

Test Case: Assembled UiConnector end-to-end over iceoryx2 TEST_0880
status: implemented

Builds a UiConnector (declaring a ViewModel, a hot scalar, and a command), registers it with an Executor so the pump and command-handler threads spawn, then plays a UI client on a separate iceoryx2 node in the same process: reads the single instance-namespaced manifest (Single instance-namespaced ... (REQ_0872)), the ViewModel, the hot scalar published on its own service (Hot-scalar opt-out promotes... (REQ_0863)), and the SystemViewModel heartbeat with epoch (Mandatory SystemViewModel h... (REQ_0879)), and round-trips a command confirming UiConnector satisfies the Connector contract (UiConnector implements Conn... (REQ_0855)). Realised as crates/taktora-connector-ui-tests/tests/connector_iox.rs.

Test Case: Reference client end-to-end: discovery, hash validation, diffing, restart, trust TEST_0881

Drives the reference Client (taktora-connector-ui-client) against a live UiConnector server on a separate iceoryx2 node: discovery via the service registry (Multi-application discovery... (REQ_0877)), contract-hash validation with read-only fallback on mismatch (Contract-hash mismatch fail... (REQ_0876)), per-field PropertyChanged diffing with per-ViewModel staleness from the envelope (Client reconstructs per-fie... (REQ_0864), Per-ViewModel staleness fro... (REQ_0880)), stateless restart recovery via history-depth-1 redelivery (UI restart is stateless (REQ_0881)), and epoch change triggering a manifest re-read / re-validate (Application restart bumps e... (REQ_0882)). The same test exercises the v1 trust posture (OS-mediated trust for v1 (REQ_0884)): a distinct local process opens the connector’s services and issues commands with no application-level authentication handshake — command authority is granted by OS / iceoryx2 access control alone, as recorded in UI connector is a passive, ... (ADR_0107). Realised as crates/taktora-connector-ui-tests/tests/client_iox.rs.

Test Case: Connector health reflects local publish health TEST_0882
status: implemented
verifies: REQ_0883
links incoming: REQ_0883

Unit tests asserting the UiConnector health state machine reports local publishing health — pump running, publish back-pressure or drops degrade it and recovery restores Up — rather than remote-peer liveness, and that subscriber presence/absence is not by itself a health fault. Realised as the #[cfg(test)] unit tests in crates/taktora-connector-ui/src/health.rs and the pump-health seam tests in crates/taktora-connector-ui/src/pump.rs.

Test Case: Golden manifest and contract hash TEST_0883
status: implemented

Golden-fixture test asserting the contract crate’s serialization still produces the checked-in tests/golden_manifest.json — the canonical wire example other languages target — and that the manifest enumerates every ViewModel / command with its service names, field schemas, signatures, kinds, and idempotent flags (Manifest enumerates all ser... (REQ_0873)), carries the contract_hash computed over the structural contract (Manifest carries a contract... (REQ_0874)), expresses the closed self-describing FieldType schema set including nested Struct descriptors (Closed self-describing sche... (REQ_0875)), and that the Kind enumeration reserves the Event variant (UiRouting carries ViewModel... (REQ_0857), Closed self-describing sche... (REQ_0875)). Realised as crates/taktora-connector-ui-contract/tests/golden.rs (with the Kind::Event reservation pinned by the unit tests in crates/taktora-connector-ui-contract/src/kind.rs). The language-neutral reproducibility of the contract_hash (Manifest carries a contract... (REQ_0874)) is additionally proved from a non-Rust consumer by crates/taktora-connector-ui-contract/py/smoke.py, a pure-stdlib Python script that recomputes the hash from the same checked-in golden manifest via the canonical algorithm and asserts a bit-for-bit match.