zerodds-ffi-loader v1.0 — Spec Coverage
Source: docs/specs/zerodds-ffi-loader-1.0.md
Implementation:
crates/zerodds-c-api/· docs.rs — FFI library loader (C-API bootstrap).
§1 Conformance levels
§1 L1-L3 conformance matrix
Spec: §1 — three levels (ABI/loader/pub-sub-live-wire); L1 mandatory per language binding, L2+L3 mandatory per publishable crate.
Repo: —
Tests: —
Status: n/a (informative) — assignment of the levels; the requirements are the items §2 to §5.
§2 ABI surface
§2.1 Versioning MAJOR/MINOR/PATCH/ABI_REVISION
Spec: §2.1 — ZERODDS_VERSION_MAJOR/MINOR/PATCH + ZERODDS_ABI_REVISION;
zerodds_abi_revision() checkable at runtime.
Repo: crates/zerodds-c-api/include/zerodds.h,
crates/zerodds-c-api/src/lib.rs.
Tests: crates/zerodds-c-api/tests/abi_compat.rs::the_header_macro_and_the_exported_revision_agree,
crates/zerodds-c-api/tests/abi_compat.rs::abi_snapshot_matches,
crates/zerodds-c-api/tests/abi_compat.rs::extract_symbols_finds_known_functions.
Status: done
§2.2 Symbol naming scheme extern “C” + zerodds_*
Spec: §2.2 — all symbols extern "C", snake_case, no C++/Rust mangling,
-fvisibility=hidden.
Repo: crates/zerodds-c-api/src/{factory_ffi.rs,participant_ffi.rs,publisher_ffi.rs,subscriber_ffi.rs,topic_ffi.rs,qos_ffi.rs,condition_ffi.rs,listener_ffi.rs,builtin_ffi.rs,extra_ffi.rs,xcdr2.rs}.
Tests: crates/zerodds-c-api/tests/abi_compat.rs::extract_symbols_finds_known_functions,
crates/zerodds-c-api/tests/abi_compat.rs::abi_snapshot_matches — the snapshot file lists every
exported symbol by name; a new or renamed export breaks the comparison.
Status: done
§2.3 Header excerpt zerodds.h
Spec: §2.3 — a header with runtime, topic, writer, reader, qos opaque types; result_t/bytes_t/time_t/instance_handle_t/sample_t structs; functions runtime_create/destroy/qos_/topic_/writer_/reader_/strerror.
Repo: crates/zerodds-c-api/include/zerodds.h,
crates/zerodds-c-api/include/zerodds_xcdr2.h.
Tests: crates/zerodds-c-api/tests/xcdr2_c_codegen.rs,
::xcdr2_c_compile (compile-time check).
Status: done
§2.4 Lifetime rules runtime > topic > writer/reader
Spec: §2.4 — lifetime hierarchy; *_destroy idempotent + null-safe;
bytes_t.data from _take valid only until the next call.
Repo: crates/zerodds-c-api/src/{factory_ffi.rs,participant_ffi.rs,topic_ffi.rs,publisher_ffi.rs,subscriber_ffi.rs},
crates/zerodds-c-api/src/entities.rs.
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip,
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_handles_null_safely,
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_take_into_null_safe,
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_runtime_create_domain_too_large_returns_null,
crates/zerodds-c-api/tests/waitset_event_driven.rs::waitset_wait_null_and_timeout_safe.
Status: done
§2.5 Thread safety
Spec: §2.5 — all ABI functions thread-safe; listener callbacks on dedicated threads.
Repo: —
Tests: —
Status: open — no test calls the ABI from more than one thread. Send/Sync are
in the type system; the concurrency itself is not measured.
### §2.6 Callback API listener
Spec: §2.6 — zerodds_data_available_cb + zerodds_reader_set_listener
with user_data.
Repo: crates/zerodds-c-api/src/listener_ffi.rs.
Tests: crates/zerodds-c-api/src/listener_ffi.rs::tests::dp_set_get_listener_roundtrip,
::poll_listeners_returns_count_and_clears_state,
::poll_fires_data_available_and_data_on_readers,
::poll_fires_inconsistent_topic_for_topic_and_participant,
::dw_set_listener_clear_via_null.
Status: done
§3 Per-language loader patterns
§3.1 Python (ctypes)
Spec: §3.1 — a loader with ENV override ZERODDS_LIB, a wheel-internal
_lib/, a system-linker fallback; Runtime/Writer/Reader classes.
Repo: crates/py/python/zerodds/loader.py (load_library with the
three-step resolution ZERODDS_LIB → package-internal _lib/ → system linker;
Runtime, Writer, Reader, DomainParticipantFactory),
examples/tutorials/dds-chat/ports/python-cli/src/dds_chat_tutorial/{__init__.py,main.py,live_pubsub.py,message.py}.
Tests: crates/py/python/tests/test_loader_smoke.py
(test_loader_resolves_library and the three that follow it; 4 passed against
ZERODDS_LIB=target/release/libzerodds.dylib),
examples/tutorials/dds-chat/ports/python-cli/tests/{test_codec.py,test_fixtures.py,test_live_pubsub.py}.
Status: done
§3.2 Java (pure-Java)
Spec: §3.2 — a pure-Java DDS-Java-PSM without a native library on the
Java side (no System.loadLibrary, no JNI adapter). An earlier JNI bridge
was removed.
Repo: crates/java-omgdds/java/src/main/java/org/omg/dds/** (the pure-Java
PSM: domain/, pub/, sub/, topic/, core/) and
crates/java-omgdds/java/src/main/java/org/zerodds/**
(InProcessBus, cdr/, rtps/, bridge/GrpcBridgeClient);
crates/java-omgdds/java/pom.xml builds a portable JAR with no
.so/.dylib/.dll,
examples/tutorials/dds-chat/ports/java-cli/src/main/java/io/zerodds/chat/Main.java,
examples/tutorials/dds-chat/ports/java-cli/pom.xml.
Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/QuickstartApiTest.java::serviceEnvironmentBootstrapBySystemProperty,
crates/java-omgdds/java/src/test/java/org/omg/dds/QuickstartApiTest.java::byteArrayQuickstartRoundTrip,
crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java::singleWriterSingleReaderRoundTrip,
crates/java-omgdds/java/src/test/java/org/omg/dds/Xcdr2CodecTest.java::primitivesRoundTrip;
run: mvn -o test in crates/java-omgdds/java — 103 tests, 1 skipped.
Status: done
§3.3 C# (DllImport)
Spec: §3.3 — [DllImport("zerodds")], a NuGet runtimes/<rid>/native/
layout, an IDisposable wrapper.
Repo: crates/cs/csharp/ZeroDDS/src/Native.cs (77 [DllImport("zerodds", EntryPoint = …)] declarations with an explicit EntryPoint, NativeAOT-compatible)
under crates/cs/csharp/ZeroDDS/src/{Domain,Topic,Pub,Sub,Qos,Conditions,Listener}.cs
as IDisposable wrappers; crates/cs/csharp/ZeroDDS/ZeroDDS.csproj carries the
NuGet metadata,
examples/tutorials/dds-chat/ports/csharp-cli/src/Program.cs,
examples/tutorials/dds-chat/ports/csharp-cli/test/FixturesTests.cs.
Tests: crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V1_EmptyFinal_EncodesToZeroBytes,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V2_PlainPrimitivesFinal_MatchesWire,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V4_StringFinal_MatchesWire,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V10_Mutable_MatchesWire,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V12_MutableSentinel_NoExplicitSentinelEmitted,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::FixedBcd_OracleVectors_Roundtrip;
plus crates/cs/csharp/build_cs_smoke.sh, which runs
crates/cs/csharp/ZeroDDS.Tests/Program.cs against the built libzerodds,
and examples/tutorials/dds-chat/ports/csharp-cli/test/FixturesTests.cs.
Status: done
§3.4 C++
Spec: §3.4 — header <zerodds/Runtime.hpp>, RAII wrapper, linker
-lzerodds.
Repo: crates/cpp/include/,
examples/tutorials/dds-chat/ports/cpp-tui/src/{main.cpp,live_pubsub.cpp},
examples/tutorials/dds-chat/ports/cpp-tui/test/live_pubsub_test.cpp,
examples/tutorials/dds-chat/ports/cpp-tui/CMakeLists.txt.
Tests: crates/cpp/tests/smoke_dds_psm.cpp::test_participant_lifecycle, crates/cpp/tests/smoke_dds_psm.cpp::test_topic_creation,
crates/cpp/tests/smoke_dds_psm.cpp::test_publisher_subscriber_lifecycle,
crates/cpp/tests/smoke_dds_psm.cpp::test_writer_reader_lifecycle,
crates/cpp/tests/smoke_dds_psm.cpp::test_take_on_empty_returns_empty, crates/cpp/tests/smoke_dds_psm.cpp::test_status_getters;
driven by crates/cpp/tests/cpp_smoke_via_cargo.rs::dds_psm_cxx_smoke.
Status: done
§3.5 TypeScript/JavaScript Node N-API + WASM
Spec: §3.5 — Node via the koffi FFI in crates/ts-node/; WASM via
wasm-bindgen in crates/ts-wasm/; the WASM build uses the WS bridge as a
daemon.
Repo: crates/ts-node/src/{native.ts,index.ts,dds.ts,qos.ts} (koffi
declarations over zerodds.h, library resolution with a ZERODDS_LIB
override), crates/ts-wasm/src/lib.rs (CdrEncoder/CdrDecoder via
wasm-bindgen over zerodds-wire; the earlier form bound against
zerodds-cdr, which the rebuild removed) and
crates/ts-wasm/src/{index.ts,cdr/,dcps/} (the DCPS-over-WebSocket facade
onto the crates/websocket-bridge/ daemon),
examples/tutorials/dds-chat/ports/ts-node/src/live_pubsub.ts,
examples/tutorials/dds-chat/ports/ts-browser/src/live_pubsub.ts.
Tests: cargo test -p zerodds-ts-wasm — 6/6
(tests::primitive_roundtrip_little_endian and five more); npm test in
crates/ts-wasm/ — 4/4 in test/smoke.test.mjs against the pkg-node/
built from this source with npm run build:wasm, and 4/4 in
test/dcps.test.ts;
examples/tutorials/dds-chat/ports/ts-node/test/live_pubsub.test.ts,
examples/tutorials/dds-chat/ports/ts-browser/test/live_pubsub.test.ts.
Status: done
§3.6 Flutter (dart:ffi)
Spec: §3.6 — DynamicLibrary.open() per platform; lookup + function
cast.
Repo: examples/tutorials/dds-chat/apps/flutter-mobile/lib/native/loader.dart,
examples/tutorials/dds-chat/apps/flutter-mobile/lib/native/live_pubsub.dart
(cluster-C dart:ffi loader fully wired).
Tests: examples/tutorials/dds-chat/apps/flutter-mobile/test/live_pubsub_test.dart — "cross-process Pub/Sub round-trip";
examples/tutorials/dds-chat/apps/flutter-mobile/test/message_codec_test.dart — "encapsulation header is PL_CDR2_LE",
"message roundtrip", "room field roundtrip";
examples/tutorials/dds-chat/apps/flutter-mobile/test/fixtures_test.dart — "01-simple fixture decodes correctly",
"03-unicode fixture decodes correctly". The Dart tests carry sentences
rather than identifiers; the citation is the sentence flutter test prints.
Status: done
§4 Per-language convention for the pub/sub sample
§4.1 Sample lifecycle Open Runtime → write/take → Close
Spec: §4.1 — a 6-step lifecycle (Runtime/QoS/Topic/Writer/loop encode+write/Close).
Repo: per-language loaders (see §3.x), crates/zerodds-c-api/src/.
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip walks exactly the six steps:
zerodds_runtime_create, zerodds_writer_create/zerodds_reader_create
with topic and type name, five zerodds_writer_write,
zerodds_reader_take with zerodds_buffer_free, then the *_destroy
chain. crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip_via_take_into (take into a
caller-provided buffer), crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip_via_loan (the loan
path). tools/traceability/tests/ffi_loader_packaging.rs::the_shipped_header_declares_the_lifecycle_entry_points checks
that zerodds.h declares those entry points. Gate: the three roundtrip
tests are #[ignore] on macOS (multicast loopback) and run in the default
run on Linux; the header test has no gate.
Status: done
§4.2 CDR encoding per language
Spec: §4.2 — the CDR codec per language: the wire runtime in
runtime/<language> with the code zerodds-idlc generate emits.
Repo: Rust crates/wire/src/{writer.rs,reader.rs};
C runtime/c/include/zerodds_wire.h + code from zerodds-idlc generate --lang c, with <stem>_typesupport.h holding one
zerodds_typesupport_t per topic type (tools/idlc/src/c_support.rs)
for the typed dispatch of crates/zerodds-c-api/include/zerodds_xcdr2.h,
with no codec of its own; C++ runtime/cpp/include/zerodds/wire.hpp + code
from zerodds-idlc generate --lang c++
(crates/cpp/include/dds/topic/{xcdr2.hpp,xcdr2_md5.hpp} removed);
C# runtime/csharp/src/{Writer.cs,Reader.cs};
Java runtime/java/src/main/java/org/zerodds/wire/;
TS/Node runtime/typescript/src/; WASM the wasm-bindgen codec
crates/ts-wasm/src/lib.rs, itself over zerodds-wire (no codec of its
own — the former directory crates/ts-wasm/src/cdr duplicated it and is
removed);
Python runtime/python/zerodds_wire/.
Tests: crates/zerodds-c-api/tests/xcdr2_wire_vectors.rs (13 cases:
v1_empty_final_struct, v2_plain_primitives_final,
v3_mixed_primitives_final, v4_string_final, v5_sequence_int32_final,
v6_sequence_string_final, v7_nested_modules_final, v8_keyed_struct_final,
v9_appendable_struct, v10_mutable_struct, v11_optional_member_some,
v11_optional_member_none, v12_mutable_no_explicit_sentinel) is the
reference set. The same vectors per language:
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V1_EmptyFinal_EncodesToZeroBytes,
::V4_StringFinal_MatchesWire, ::V10_Mutable_MatchesWire;
crates/java-omgdds/java/src/test/java/org/zerodds/cdr/Xcdr2WireVectorsTest.java::v1EmptyFinal,
::v3MixedPrimitives, ::v4Greeting;
crates/ts-node/test/xcdr2-wire-vectors.test.ts —
"V-1 Empty Final Struct: encode → 0 bytes; roundtrip";
crates/ts-wasm/test/smoke.test.mjs —
"wasm encode-decode primitive roundtrip (LE)";
crates/py/python/tests/test_loader_smoke.py::test_loader_resolves_library.
Status: done
§5 Cross-language live test
§5 tests/cross_lang_live/ per-language script + Rust pub subprocess
Spec: §5 — conftest.py spawns the Rust pub; per-language sub scripts
test_<lang>_sub.{py,sh}; a common shared_topic.idl.
Repo: crates/zerodds-c-api/tests/smoke_ffi.rs (Rust-side round-trip),
per-language live pub/sub implementations under
examples/tutorials/dds-chat/ports/, tests/cross_lang_live/ (cluster-C
central cross-language harness).
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip is the Rust
side of the roundtrip; the per-language sub-scripts
tests/cross_lang_live/{live_pubsub_c.sh,live_pubsub_cpp.sh,live_pubsub_csharp.sh,live_pubsub_java.sh,live_pubsub_python.sh,live_pubsub_typescript.sh}
drive it against each port, and tests/cross_lang_live/run_all.sh runs all
six. The port side carries names:
examples/tutorials/dds-chat/ports/python-cli/tests/test_live_pubsub.py::test_pub_sub_round_trip,
examples/tutorials/dds-chat/ports/java-cli/src/test/java/io/zerodds/chat/LivePubSubTest.java::pubSubRoundTrip,
examples/tutorials/dds-chat/ports/csharp-cli/test/LivePubSubTests.cs::PubSubRoundTrip,
examples/tutorials/dds-chat/ports/ts-node/test/live_pubsub.test.ts — "cross-process pub/sub round-trip".
Status: done
§6 Packaging
§6 Library + header + per-language packages
Spec: §6 — libzerodds.{so,dylib,dll} + zerodds.h in system paths;
PyPI/Maven Central/NuGet/npm-ESM/pub.dev.
Repo: crates/zerodds-c-api/Cargo.toml (cdylib),
crates/zerodds-c-api/include/zerodds.h, packaging/linux/{deb,rpm}/,
packaging/macos/{homebrew,pkg}/,
packaging/windows/{msi,scoop,chocolatey}/,
packaging/linux/rpm/zerodds.pc.
Tests: tools/traceability/tests/ffi_loader_packaging.rs::the_shipped_header_declares_the_lifecycle_entry_points,
tools/traceability/tests/ffi_loader_packaging.rs::the_linux_packages_install_the_library_and_resolve_the_prefixes
(the SONAME chain libzerodds.so.1.0.0 → .so.1 → .so plus
zerodds.pc with includedir/libdir/-lzerodds),
tools/traceability/tests/ffi_loader_packaging.rs::the_macos_packages_install_the_header_and_the_dylib
(the Homebrew formula and the .pkg build under /usr/local),
tools/traceability/tests/ffi_loader_packaging.rs::the_python_wheel_carries_the_distribution_name_of_the_clause.
No gate; all four run in the default run.
Status: partial — library, header and pkg-config are in the Linux and macOS packages and are checked against the clause; the PyPI distribution carries the name the clause gives it. The Windows half and three of the six per-language packages are not met; both are tracked as §6b.
§6b Windows header/library and the missing per-language packages
Spec: §6 — %PROGRAMFILES%\ZeroDDS\include\zerodds.h,
bin\zerodds.dll, lib\zerodds.lib; NuGet ZeroDDS with
runtimes/<rid>/native/, npm @zerodds/sdk and @zerodds/wasm,
pub.dev zerodds, Maven Central eu.ifyna:zerodds-java-omgdds.
Repo: —
Tests: —
Status: open — packaging/windows/msi/zerodds.wxs removed the Devel
feature explicitly, so no Windows package ships the header, the DLL or the
import library. Of the per-language packages only the PyPI wheel exists in
the tree under the name the clause gives; the npm package is called
@zerodds/wire rather than @zerodds/sdk/@zerodds/wasm, there is no
NuGet and no pub.dev package, and the Maven module carries the coordinates
org.zerodds:omgdds instead of eu.ifyna:zerodds-java-omgdds.
§7 Versioning + ABI compat promise
§7 Patch/minor/major rules + abi_revision
Spec: §7 — patch=no ABI changes, minor=additive symbols, major=breaking + ABI_REVISION bump.
Repo: crates/zerodds-c-api/src/lib.rs::zerodds_abi_revision (the
exported function) + ZERODDS_ABI_REVISION (the Rust constant);
crates/zerodds-c-api/include/zerodds.h (#define ZERODDS_ABI_REVISION,
from the cbindgen preamble in crates/zerodds-c-api/cbindgen.toml).
Tests: crates/zerodds-c-api/tests/abi_compat.rs::the_header_macro_and_the_exported_revision_agree
(the header macro, the Rust constant and the function’s return value carry
the same number, and zerodds_abi_revision is in the symbol surface),
crates/zerodds-c-api/tests/abi_compat.rs::abi_snapshot_matches
(additive yes, removal or rename no).
Status: done
§8 Testing
§8.1 Unit tests per symbol family
Spec: §8.1 — runtime, qos, topic, writer, reader, error, thread-safety, ≥ 5
tests each in crates/zerodds-c-api/tests/.
Repo: crates/zerodds-c-api/src/{factory_ffi.rs,participant_ffi.rs,publisher_ffi.rs,subscriber_ffi.rs,topic_ffi.rs,qos_ffi.rs,condition_ffi.rs,listener_ffi.rs,builtin_ffi.rs,extra_ffi.rs}.
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs,
crates/zerodds-c-api/tests/xcdr2_c_codegen.rs, ::xcdr2_c_compile,
::xcdr2_wire_vectors.
Status: done
§8.2 ABI compat test abi.snapshot.json
Spec: §8.2 — tests/abi_compat.rs compares the current symbol list
against abi.snapshot.json, fails on unintended changes.
Repo: crates/zerodds-c-api/tests/abi_compat.rs,
crates/zerodds-c-api/tests/abi.snapshot.json (185 symbols baseline).
Tests: cargo test -p zerodds-c-api --test abi_compat —
abi_snapshot_matches + extract_symbols_finds_known_functions, 2/2 green.
Regenerate via ZERODDS_ABI_REGENERATE=1.
Status: done
§8.3 Per-language loader tests + cross-language live test
Spec: §8.3 — per language crate ≥ 5 loader tests + a cross-language live
test in tests/cross_lang_live/.
Repo: per-language test trees crates/py/python/tests/,
crates/cpp/tests/, crates/cs/csharp/{ZeroDDS.Tests,ZeroDDS.Cdr.Tests}/,
crates/java-omgdds/java/src/test/java/, crates/ts-node/test/,
crates/ts-wasm/test/, examples/tutorials/dds-chat/ports/*/test*/,
tests/cross_lang_live/run_all.sh (cluster-C central cross-language matrix
runner).
Tests: Per language:
crates/py/python/tests/test_loader_smoke.py::test_loader_resolves_library,
::test_loader_runtime_create_participant_offline,
::test_loader_factory_singleton,
::test_loader_zerodds_error_is_runtime_error_subclass;
crates/cpp/tests/smoke_dds_psm.cpp::test_participant_lifecycle;
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V1_EmptyFinal_EncodesToZeroBytes;
crates/java-omgdds/java/src/test/java/org/omg/dds/QuickstartApiTest.java::serviceEnvironmentBootstrapBySystemProperty;
crates/ts-wasm/test/smoke.test.mjs — "wasm version string".
The cross-language live test itself:
examples/tutorials/dds-chat/ports/python-cli/tests/test_live_pubsub.py::test_pub_sub_round_trip and
examples/tutorials/dds-chat/ports/java-cli/src/test/java/io/zerodds/chat/LivePubSubTest.java::pubSubRoundTrip,
driven by tests/cross_lang_live/run_all.sh.
Status: done
§9 Cross-references
§9 Related crates + wire format + packaging spec
Spec: §9 — library crates/zerodds-c-api/, per-language bindings, the
pure-Java implementation, wire format, packaging, the listener-callbacks
spec.
Repo: —
Tests: —
Status: n/a (informative) — list of references.
§10 Versioning
§10 SemVer bump rules
Spec: §10 — patch=no ABI change, minor=additive symbols + a new language loader, major=breaking ABI.
Repo: —
Tests: —
Status: n/a (informative) — rule for assigning the version number, not a property of the library.
Audit status
18 done / 1 partial / 2 open / 0 blocked / 3 n/a (informative).
Test run: cargo test -p zerodds-ts-wasm 6/6; npm test in
crates/ts-wasm/ 8/8; mvn test in crates/java-omgdds/java/ 95 tests,
0 failures; dotnet test in crates/cs/csharp/ 31 + 6 green and
build_cs_smoke.sh with no failure;
pytest crates/py/python/tests/test_loader_smoke.py 4 passed.
Open items: zerodds-ffi-loader-1.0.open.en.md.
zerodds-ffi-loader v1.0 — Spec-Coverage
Quelle: docs/specs/zerodds-ffi-loader-1.0.md
Implementation:
crates/zerodds-c-api/· docs.rs — FFI-Library-Loader (Bootstrap der C-API).
§1 Conformance-Levels
§1 L1-L3 Conformance-Matrix
Spec: §1 — drei Levels (ABI/Loader/Pub-Sub-Live-Wire); L1 Pflicht pro Sprach-Anbindung, L2+L3 Pflicht pro publishable Crate.
Repo: —
Tests: —
Status: n/a (informative) — Zuordnung der Levels; die Anforderungen stehen als Items §2 bis §5.
§2 ABI-Surface
§2.1 Versionierung MAJOR/MINOR/PATCH/ABI_REVISION
Spec: §2.1 — ZERODDS_VERSION_MAJOR/MINOR/PATCH + ZERODDS_ABI_ REVISION; zerodds_abi_revision() runtime-checkbar.
Repo: crates/zerodds-c-api/include/zerodds.h,
crates/zerodds-c-api/src/lib.rs.
Tests: crates/zerodds-c-api/tests/abi_compat.rs::the_header_macro_and_the_exported_revision_agree,
crates/zerodds-c-api/tests/abi_compat.rs::abi_snapshot_matches,
crates/zerodds-c-api/tests/abi_compat.rs::extract_symbols_finds_known_functions.
Status: done
§2.2 Symbol-Namensschema extern “C” + zerodds_*
Spec: §2.2 — alle Symbole extern "C", snake_case, kein C++/Rust-
Mangling, -fvisibility=hidden.
Repo: crates/zerodds-c-api/src/{factory_ffi.rs,participant_ffi.rs,publisher_ffi.rs,subscriber_ffi.rs,topic_ffi.rs,qos_ffi.rs,condition_ffi.rs,listener_ffi.rs,builtin_ffi.rs,extra_ffi.rs,xcdr2.rs}.
Tests: crates/zerodds-c-api/tests/abi_compat.rs::extract_symbols_finds_known_functions,
crates/zerodds-c-api/tests/abi_compat.rs::abi_snapshot_matches — die Snapshot-Datei listet jedes
exportierte Symbol namentlich, ein neuer oder umbenannter Export bricht den
Vergleich.
Status: done
§2.3 Header-Auszug zerodds.h
Spec: §2.3 — Header mit runtime, topic, writer, reader, qos opaque- Types; result_t/bytes_t/time_t/instance_handle_t/sample_t Structs; Funktionen runtime_create/destroy/qos_/topic_/writer_/reader_/ strerror.
Repo: crates/zerodds-c-api/include/zerodds.h,
crates/zerodds-c-api/include/zerodds_xcdr2.h.
Tests: crates/zerodds-c-api/tests/xcdr2_c_codegen.rs,
::xcdr2_c_compile (compile-time-Check).
Status: done
§2.4 Lifetime-Regeln runtime > topic > writer/reader
Spec: §2.4 — Lifetime-Hierarchie; *_destroy idempotent + null-
safe; bytes_t.data aus _take nur bis zum nächsten Call gültig.
Repo: crates/zerodds-c-api/src/{factory_ffi.rs,participant_ffi.rs,topic_ffi.rs,publisher_ffi.rs,subscriber_ffi.rs},
crates/zerodds-c-api/src/entities.rs.
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip,
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_handles_null_safely,
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_take_into_null_safe,
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_runtime_create_domain_too_large_returns_null,
crates/zerodds-c-api/tests/waitset_event_driven.rs::waitset_wait_null_and_timeout_safe.
Status: done
§2.5 Thread-Safety
Spec: §2.5 — alle ABI-Funktionen thread-safe; Listener-Callbacks auf dedizierten Threads.
Repo: —
Tests: —
Status: open — kein Test ruft die ABI aus mehreren Threads. Send/Sync stehen
im Typsystem, gemessen ist die Nebenläufigkeit nicht.
### §2.6 Callback-API Listener
Spec: §2.6 — zerodds_data_available_cb + zerodds_reader_set_ listener mit user_data.
Repo: crates/zerodds-c-api/src/listener_ffi.rs.
Tests: crates/zerodds-c-api/src/listener_ffi.rs::tests::dp_set_get_listener_roundtrip,
::poll_listeners_returns_count_and_clears_state,
::poll_fires_data_available_and_data_on_readers,
::poll_fires_inconsistent_topic_for_topic_and_participant,
::dw_set_listener_clear_via_null.
Status: done
§3 Per-Sprach-Loader-Patterns
§3.1 Python (ctypes)
Spec: §3.1 — Loader mit ENV-Override ZERODDS_LIB, Wheel-internes
_lib/, System-Linker Fallback; Runtime/Writer/Reader-Klassen.
Repo: crates/py/python/zerodds/loader.py (load_library mit der
Drei-Stufen-Auflösung ZERODDS_LIB → paketinternes _lib/ → System-Linker;
Runtime, Writer, Reader, DomainParticipantFactory),
examples/tutorials/dds-chat/ports/python-cli/src/dds_chat_tutorial/{__init__.py,main.py,live_pubsub.py,message.py}.
Tests: crates/py/python/tests/test_loader_smoke.py
(test_loader_resolves_library und die drei folgenden; 4 passed gegen
ZERODDS_LIB=target/release/libzerodds.dylib),
examples/tutorials/dds-chat/ports/python-cli/tests/{test_codec.py,test_fixtures.py,test_live_pubsub.py}.
Status: done
§3.2 Java (Pure-Java)
Spec: §3.2 — Pure-Java DDS-Java-PSM ohne Native-Library auf der
Java-Seite (kein System.loadLibrary, kein JNI-Adapter). Eine
frühere JNI-Bridge wurde entfernt.
Repo: crates/java-omgdds/java/src/main/java/org/omg/dds/** (Pure-Java-PSM:
domain/, pub/, sub/, topic/, core/) und
crates/java-omgdds/java/src/main/java/org/zerodds/** (InProcessBus,
cdr/, rtps/, bridge/GrpcBridgeClient); crates/java-omgdds/java/pom.xml
baut ein portables JAR ohne .so/.dylib/.dll,
examples/tutorials/dds-chat/ports/java-cli/src/main/java/io/zerodds/chat/Main.java,
examples/tutorials/dds-chat/ports/java-cli/pom.xml.
Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/QuickstartApiTest.java::serviceEnvironmentBootstrapBySystemProperty,
crates/java-omgdds/java/src/test/java/org/omg/dds/QuickstartApiTest.java::byteArrayQuickstartRoundTrip,
crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java::singleWriterSingleReaderRoundTrip,
crates/java-omgdds/java/src/test/java/org/omg/dds/Xcdr2CodecTest.java::primitivesRoundTrip;
Lauf: mvn -o test in crates/java-omgdds/java — 103 Tests, 1
übersprungen.
Status: done
§3.3 C# (DllImport)
Spec: §3.3 — [DllImport("zerodds")], NuGet runtimes/<rid>/ native/-Layout, IDisposable-Wrapper.
Repo: crates/cs/csharp/ZeroDDS/src/Native.cs (77 [DllImport("zerodds", EntryPoint = …)]-Deklarationen mit explizitem EntryPoint, NativeAOT-tauglich)
über crates/cs/csharp/ZeroDDS/src/{Domain,Topic,Pub,Sub,Qos,Conditions,Listener}.cs
als IDisposable-Wrapper; crates/cs/csharp/ZeroDDS/ZeroDDS.csproj trägt die
NuGet-Metadaten,
examples/tutorials/dds-chat/ports/csharp-cli/src/Program.cs,
examples/tutorials/dds-chat/ports/csharp-cli/test/FixturesTests.cs.
Tests: crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V1_EmptyFinal_EncodesToZeroBytes,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V2_PlainPrimitivesFinal_MatchesWire,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V4_StringFinal_MatchesWire,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V10_Mutable_MatchesWire,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V12_MutableSentinel_NoExplicitSentinelEmitted,
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::FixedBcd_OracleVectors_Roundtrip;
dazu crates/cs/csharp/build_cs_smoke.sh, das
crates/cs/csharp/ZeroDDS.Tests/Program.cs gegen die gebaute libzerodds
fährt, und examples/tutorials/dds-chat/ports/csharp-cli/test/FixturesTests.cs.
Status: done
§3.4 C++
Spec: §3.4 — Header <zerodds/Runtime.hpp>, RAII-Wrapper, Linker
-lzerodds.
Repo: crates/cpp/include/,
examples/tutorials/dds-chat/ports/cpp-tui/src/{main.cpp,live_pubsub.cpp},
examples/tutorials/dds-chat/ports/cpp-tui/test/live_pubsub_test.cpp,
examples/tutorials/dds-chat/ports/cpp-tui/CMakeLists.txt.
Tests: crates/cpp/tests/smoke_dds_psm.cpp::test_participant_lifecycle, crates/cpp/tests/smoke_dds_psm.cpp::test_topic_creation,
crates/cpp/tests/smoke_dds_psm.cpp::test_publisher_subscriber_lifecycle,
crates/cpp/tests/smoke_dds_psm.cpp::test_writer_reader_lifecycle,
crates/cpp/tests/smoke_dds_psm.cpp::test_take_on_empty_returns_empty, crates/cpp/tests/smoke_dds_psm.cpp::test_status_getters;
gefahren über crates/cpp/tests/cpp_smoke_via_cargo.rs::dds_psm_cxx_smoke.
Status: done
§3.5 TypeScript/JavaScript Node N-API + WASM
Spec: §3.5 — Node via koffi-FFI in crates/ts-node/; WASM via
wasm-bindgen in crates/ts-wasm/; WASM-Build nutzt WS-Bridge als
Daemon.
Repo: crates/ts-node/src/{native.ts,index.ts,dds.ts,qos.ts}
(koffi-Deklarationen über zerodds.h, Library-Auflösung mit
ZERODDS_LIB-Übersteuerung),
crates/ts-wasm/src/lib.rs (CdrEncoder/CdrDecoder per wasm-bindgen über
zerodds-wire; die frühere Fassung band gegen das im Rebuild entfallene
zerodds-cdr) und crates/ts-wasm/src/{index.ts,cdr/,dcps/} (DCPS-über-
WebSocket-Fassade zum crates/websocket-bridge/-Daemon),
examples/tutorials/dds-chat/ports/ts-node/src/live_pubsub.ts,
examples/tutorials/dds-chat/ports/ts-browser/src/live_pubsub.ts.
Tests: cargo test -p zerodds-ts-wasm — 6/6 (tests::primitive_roundtrip_little_endian
und fünf weitere); npm test in crates/ts-wasm/ — 4/4 in
test/smoke.test.mjs gegen die aus dieser Quelle mit
npm run build:wasm erzeugte pkg-node/ und 4/4 in test/dcps.test.ts;
examples/tutorials/dds-chat/ports/ts-node/test/live_pubsub.test.ts,
examples/tutorials/dds-chat/ports/ts-browser/test/live_pubsub.test.ts.
Status: done
§3.6 Flutter (dart:ffi)
Spec: §3.6 — DynamicLibrary.open() per Platform; Lookup +
Function-Cast.
Repo: examples/tutorials/dds-chat/apps/flutter-mobile/lib/native/loader.dart,
examples/tutorials/dds-chat/apps/flutter-mobile/lib/native/live_pubsub.dart
(Cluster-C dart:ffi-Loader voll wired).
Tests: examples/tutorials/dds-chat/apps/flutter-mobile/test/live_pubsub_test.dart — "cross-process Pub/Sub round-trip";
examples/tutorials/dds-chat/apps/flutter-mobile/test/message_codec_test.dart — "encapsulation header is PL_CDR2_LE",
"message roundtrip", "room field roundtrip";
examples/tutorials/dds-chat/apps/flutter-mobile/test/fixtures_test.dart — "01-simple fixture decodes correctly",
"03-unicode fixture decodes correctly". Die Dart-Tests tragen Sätze statt
Bezeichner; zitiert wird der Satz, den flutter test ausgibt.
Status: done
§4 Per-Sprach-Convention für Pub/Sub-Sample
§4.1 Sample-Lifecycle Open Runtime → write/take → Close
Spec: §4.1 — 6-Schritt-Lifecycle (Runtime/QoS/Topic/Writer/Loop encode+write/Close).
Repo: Per-Sprach-Loader (siehe §3.x), crates/zerodds-c-api/src/.
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip läuft genau die sechs Schritte:
zerodds_runtime_create, zerodds_writer_create/zerodds_reader_create
mit Topic- und Typnamen, fünf zerodds_writer_write, zerodds_reader_take
mit zerodds_buffer_free, dann die *_destroy-Kette.
crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip_via_take_into (Take in einen vom Aufrufer
gestellten Puffer), crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip_via_loan (Loan-Pfad).
tools/traceability/tests/ffi_loader_packaging.rs::the_shipped_header_declares_the_lifecycle_entry_points prüft, dass
zerodds.h diese Einstiegspunkte deklariert. Gate: die drei Roundtrip-
Tests sind auf macOS #[ignore] (Multicast-Loopback), auf Linux laufen
sie im Default-Lauf; der Header-Test hat kein Gate.
Status: done
§4.2 CDR-Encoding pro Sprache
Spec: §4.2 — der CDR-Codec je Sprache: die Wire-Laufzeit in
runtime/<Sprache> mit dem Code, den zerodds-idlc generate erzeugt.
Repo: Rust crates/wire/src/{writer.rs,reader.rs};
C runtime/c/include/zerodds_wire.h + Code aus zerodds-idlc generate --lang c, dazu <stem>_typesupport.h mit einer zerodds_typesupport_t
je Topic-Typ (tools/idlc/src/c_support.rs) für den Typed-Dispatch aus
crates/zerodds-c-api/include/zerodds_xcdr2.h, ohne eigenen Codec;
C++ runtime/cpp/include/zerodds/wire.hpp + Code aus zerodds-idlc generate --lang c++ (crates/cpp/include/dds/topic/{xcdr2.hpp, xcdr2_md5.hpp} entfernt);
C# runtime/csharp/src/{Writer.cs,Reader.cs};
Java runtime/java/src/main/java/org/zerodds/wire/;
TS/Node runtime/typescript/src/; WASM der wasm-bindgen-Codec
crates/ts-wasm/src/lib.rs, selbst über zerodds-wire (kein eigener
Codec — das ehemalige Verzeichnis crates/ts-wasm/src/cdr duplizierte ihn und ist
entfernt);
Python runtime/python/zerodds_wire/.
Tests: crates/zerodds-c-api/tests/xcdr2_wire_vectors.rs (13 Fälle:
v1_empty_final_struct, v2_plain_primitives_final,
v3_mixed_primitives_final, v4_string_final, v5_sequence_int32_final,
v6_sequence_string_final, v7_nested_modules_final, v8_keyed_struct_final,
v9_appendable_struct, v10_mutable_struct, v11_optional_member_some,
v11_optional_member_none, v12_mutable_no_explicit_sentinel) ist der
Referenz-Satz. Pro Sprache dieselben Vektoren:
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V1_EmptyFinal_EncodesToZeroBytes,
::V4_StringFinal_MatchesWire, ::V10_Mutable_MatchesWire;
crates/java-omgdds/java/src/test/java/org/zerodds/cdr/Xcdr2WireVectorsTest.java::v1EmptyFinal,
::v3MixedPrimitives, ::v4Greeting;
crates/ts-node/test/xcdr2-wire-vectors.test.ts —
"V-1 Empty Final Struct: encode → 0 bytes; roundtrip";
crates/ts-wasm/test/smoke.test.mjs —
"wasm encode-decode primitive roundtrip (LE)";
crates/py/python/tests/test_loader_smoke.py::test_loader_resolves_library.
Status: done
§5 Cross-Lang-Live-Test
§5 tests/cross_lang_live/ Per-Sprach-Skript + Rust-Pub-Subprocess
Spec: §5 — conftest.py spawnt Rust-Pub; Per-Sprach-Sub-Skripte
test_<lang>_sub.{py,sh}; gemeinsame shared_topic.idl.
Repo: crates/zerodds-c-api/tests/smoke_ffi.rs (Rust-Side
Roundtrip), Per-Sprach-Live-Pub/Sub-Implementationen unter
examples/tutorials/dds-chat/ports/,
tests/cross_lang_live/ (Cluster-C zentraler Cross-Lang-Harness).
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs::ffi_pub_sub_roundtrip ist die
Rust-Seite des Roundtrips; die Per-Sprach-Sub-Skripte
tests/cross_lang_live/{live_pubsub_c.sh,live_pubsub_cpp.sh,live_pubsub_csharp.sh,live_pubsub_java.sh,live_pubsub_python.sh,live_pubsub_typescript.sh}
starten sie gegen den jeweiligen Port, tests/cross_lang_live/run_all.sh
fährt alle sechs. Die Port-Seite trägt Namen:
examples/tutorials/dds-chat/ports/python-cli/tests/test_live_pubsub.py::test_pub_sub_round_trip,
examples/tutorials/dds-chat/ports/java-cli/src/test/java/io/zerodds/chat/LivePubSubTest.java::pubSubRoundTrip,
examples/tutorials/dds-chat/ports/csharp-cli/test/LivePubSubTests.cs::PubSubRoundTrip,
examples/tutorials/dds-chat/ports/ts-node/test/live_pubsub.test.ts — "cross-process pub/sub round-trip".
Status: done
§6 Packaging
§6 Library + Header + Per-Sprach-Packages
Spec: §6 — libzerodds.{so,dylib,dll} + zerodds.h in System-
Pfaden; PyPI/Maven Central/NuGet/npm-ESM/pub.dev.
Repo: crates/zerodds-c-api/Cargo.toml (cdylib),
crates/zerodds-c-api/include/zerodds.h,
packaging/linux/{deb,rpm}/,
packaging/macos/{homebrew,pkg}/,
packaging/windows/{msi,scoop,chocolatey}/,
packaging/linux/rpm/zerodds.pc.
Tests: tools/traceability/tests/ffi_loader_packaging.rs::the_shipped_header_declares_the_lifecycle_entry_points,
tools/traceability/tests/ffi_loader_packaging.rs::the_linux_packages_install_the_library_and_resolve_the_prefixes
(SONAME-Kette libzerodds.so.1.0.0 → .so.1 → .so plus zerodds.pc
mit includedir/libdir/-lzerodds),
tools/traceability/tests/ffi_loader_packaging.rs::the_macos_packages_install_the_header_and_the_dylib
(Homebrew-Formula und .pkg-Build unter /usr/local),
tools/traceability/tests/ffi_loader_packaging.rs::the_python_wheel_carries_the_distribution_name_of_the_clause.
Kein Gate; alle vier laufen im Default-Lauf.
Status: partial — Library, Header und pkg-config sind für Linux und macOS in den Paketen und werden gegen die Klausel geprüft; die PyPI-Distribution heißt wie die Klausel sie nennt. Nicht erfüllt sind der Windows-Anteil und drei der sechs Per-Sprach-Packages; beides als §6b geführt.
§6b Windows-Header/-Library und die fehlenden Per-Sprach-Packages
Spec: §6 — %PROGRAMFILES%\ZeroDDS\include\zerodds.h,
bin\zerodds.dll, lib\zerodds.lib; NuGet ZeroDDS mit
runtimes/<rid>/native/, npm @zerodds/sdk und @zerodds/wasm,
pub.dev zerodds, Maven Central eu.ifyna:zerodds-java-omgdds.
Repo: —
Tests: —
Status: open — packaging/windows/msi/zerodds.wxs hat das
Devel-Feature ausdrücklich entfernt, also liefert kein Windows-Paket
Header, DLL oder Import-Library aus. Von den Per-Sprach-Packages
existiert im Baum nur das PyPI-Wheel unter dem genannten Namen; das
npm-Paket heißt @zerodds/wire statt @zerodds/sdk/@zerodds/wasm,
ein NuGet- und ein pub.dev-Package gibt es nicht, und das Maven-Modul
trägt die Koordinaten org.zerodds:omgdds statt
eu.ifyna:zerodds-java-omgdds.
§7 Versioning + ABI-Compat-Promise
§7 Patch/Minor/Major-Regeln + abi_revision
Spec: §7 — Patch=keine ABI-Änderungen, Minor=additive Symbole, Major=Breaking + ABI_REVISION-Bump.
Repo: crates/zerodds-c-api/src/lib.rs::zerodds_abi_revision
(exportierte Funktion) + ZERODDS_ABI_REVISION (Rust-Konstante);
crates/zerodds-c-api/include/zerodds.h (#define ZERODDS_ABI_REVISION,
aus dem cbindgen-Preamble in crates/zerodds-c-api/cbindgen.toml).
Tests: crates/zerodds-c-api/tests/abi_compat.rs::the_header_macro_and_the_exported_revision_agree
(Header-Macro, Rust-Konstante und Rückgabewert der Funktion tragen
dieselbe Zahl, und zerodds_abi_revision steht in der Symbol-Surface),
crates/zerodds-c-api/tests/abi_compat.rs::abi_snapshot_matches
(additiv ja, Entfernen/Umbenennen nein).
Status: done
§8 Testing
§8.1 Unit-Tests pro Symbol-Familie
Spec: §8.1 — runtime, qos, topic, writer, reader, error, thread-safety
je ≥ 5 Tests in crates/zerodds-c-api/tests/.
Repo: crates/zerodds-c-api/src/{factory_ffi.rs,participant_ffi.rs,publisher_ffi.rs,subscriber_ffi.rs,topic_ffi.rs,qos_ffi.rs,condition_ffi.rs,listener_ffi.rs,builtin_ffi.rs,extra_ffi.rs}.
Tests: crates/zerodds-c-api/tests/smoke_ffi.rs,
crates/zerodds-c-api/tests/xcdr2_c_codegen.rs,
::xcdr2_c_compile,
::xcdr2_wire_vectors.
Status: done
§8.2 ABI-Compat-Test abi.snapshot.json
Spec: §8.2 — tests/abi_compat.rs vergleicht aktuelle Symbol-
Liste gegen abi.snapshot.json, fail bei unbeabsichtigten Änderungen.
Repo: crates/zerodds-c-api/tests/abi_compat.rs,
crates/zerodds-c-api/tests/abi.snapshot.json (185 Symbole baseline).
Tests: cargo test -p zerodds-c-api --test abi_compat —
abi_snapshot_matches + extract_symbols_finds_known_functions,
2/2 grün. Regenerate via ZERODDS_ABI_REGENERATE=1.
Status: done
§8.3 Per-Sprach-Loader-Tests + Cross-Lang-Live-Test
Spec: §8.3 — pro Sprach-Crate ≥ 5 Loader-Tests + Cross-Lang-Live-
Test in tests/cross_lang_live/.
Repo: Per-Sprach-Testbäume crates/py/python/tests/,
crates/cpp/tests/, crates/cs/csharp/{ZeroDDS.Tests,ZeroDDS.Cdr.Tests}/,
crates/java-omgdds/java/src/test/java/, crates/ts-node/test/,
crates/ts-wasm/test/, examples/tutorials/dds-chat/ports/*/test*/,
tests/cross_lang_live/run_all.sh (Cluster-C zentraler
Cross-Lang-Matrix-Runner).
Tests: Per Sprache:
crates/py/python/tests/test_loader_smoke.py::test_loader_resolves_library,
::test_loader_runtime_create_participant_offline,
::test_loader_factory_singleton,
::test_loader_zerodds_error_is_runtime_error_subclass;
crates/cpp/tests/smoke_dds_psm.cpp::test_participant_lifecycle;
crates/cs/csharp/ZeroDDS.Cdr.Tests/Xcdr2WireVectorsTests.cs::V1_EmptyFinal_EncodesToZeroBytes;
crates/java-omgdds/java/src/test/java/org/omg/dds/QuickstartApiTest.java::serviceEnvironmentBootstrapBySystemProperty;
crates/ts-wasm/test/smoke.test.mjs — "wasm version string".
Der Cross-Lang-Live-Test selbst:
examples/tutorials/dds-chat/ports/python-cli/tests/test_live_pubsub.py::test_pub_sub_round_trip und
examples/tutorials/dds-chat/ports/java-cli/src/test/java/io/zerodds/chat/LivePubSubTest.java::pubSubRoundTrip,
gefahren über tests/cross_lang_live/run_all.sh.
Status: done
§9 Cross-References
§9 Verwandte Crates + Wire-Format + Packaging-Spec
Spec: §9 — Library crates/zerodds-c-api/, Per-Sprach-Bindings,
Pure-Java-Implementation, Wire-Format, Packaging, Listener-Callbacks-Spec.
Repo: —
Tests: —
Status: n/a (informative) — Verweisliste.
§10 Versioning
§10 SemVer-Bump-Regeln
Spec: §10 — Patch=ohne ABI-Change, Minor=additive Symbole + neuer Sprach-Loader, Major=Breaking-ABI.
Repo: —
Tests: —
Status: n/a (informative) — Regel für die Vergabe der Versionsnummer, keine Eigenschaft der Bibliothek.
Audit-Status
18 done / 1 partial / 2 open / 0 blocked / 3 n/a (informative).
Test-Lauf: cargo test -p zerodds-ts-wasm 6/6;
npm test in crates/ts-wasm/ 8/8; mvn test in crates/java-omgdds/java/
95 Tests, 0 Failures; dotnet test in crates/cs/csharp/ 31 + 6 grün und
build_cs_smoke.sh ohne Fehlschlag; pytest crates/py/python/tests/test_loader_smoke.py
4 passed.
Offene Punkte: zerodds-ffi-loader-1.0.open.md.