Skip to content

Add integration tests for LoLa/mw::com feature in ITF - #417

Open
Subramanian-K812 wants to merge 20 commits into
eclipse-score:mainfrom
qorix-group:Subramanian-K812_add_communication_feature_integration_tests
Open

Subramanian-K812 wants to merge 20 commits into
eclipse-score:mainfrom
qorix-group:Subramanian-K812_add_communication_feature_integration_tests

Conversation

@Subramanian-K812

Copy link
Copy Markdown
Contributor

Add communication (LoLa / mw::com) integration tests to ITF

Summary

Adds an ITF test suite for the communication module (LoLa / mw::com).

The suite drives its own two-process scenario —
showcases/standalone/comm_fit: fit_sender + fit_receiver, built on the
same public com_api Rust crate com-api-example uses — as two real OS
processes communicating over real shared memory.

The tests assert on data the consumer actually observes — delivery, ordering,
and value-integrity of a sequence number the sender encodes in the payload —
rather than on log strings the application prints about its own
configuration, so a regression in the middleware is what breaks them.

The suite runs under the existing //feature_integration_tests/itf:itf
target on both the Linux (Docker) and QNX (QEMU) configs.

What's added

File Purpose
showcases/standalone/comm_fit/fit_sender.rs Producer: offers the VehicleInterface service instance, publishes left_tire samples carrying a monotonically increasing sequence number.
showcases/standalone/comm_fit/fit_receiver.rs Consumer: discovers the service (with retry, so start order doesn't matter), subscribes, and prints one line per received sample for the ITF to assert on.
showcases/standalone/comm_fit/BUILD Builds fit_sender/fit_receiver and bundles them for deployment.
showcases/BUILD Deploys the comm_fit bundle into the reference image alongside com-api-example.
patches/communication/002-expose-com-api-gen.patch Exposes com-api-gen (the generated VehicleInterface) outside //score/mw/com, so fit_sender/fit_receiver can depend on it.
bazel_common/score_modules_target_sw.MODULE.bazel Adds the patch above to the score_communication git_override.
known_good.json Same patch entry, kept aligned with the generated MODULE.bazel (required by the known_good_correct CI check).
feature_integration_tests/itf/test_communication.py The test cases (see coverage table below).
feature_integration_tests/itf/comm_helpers.py Exchange helpers and output oracles (CommResult, ordering/integrity checks, deployment-config and ASIL-B ACL scenario helpers).
feature_integration_tests/itf/test_properties.py Fallback-safe wrapper around attribute_plugin.add_test_properties, mirroring feature_integration_tests/test_cases/test_properties.py (verified identical).
feature_integration_tests/itf/BUILD Adds the new sources to the itf target and activates the requirement-traceability plugin (-p attribute_plugin + @score_tooling//python_basics/score_pytest:attribute_plugin dep).

Test coverage

Test Verifies (requirement IDs) Oracle
test_fit_binaries_are_deployed — (deployment smoke check) fit_sender/fit_receiver binaries present on the target image.
test_event_exchange_delivers_data event_type, producer_consumer, interfaces, data_driven_arch, service_discovery Consumer discovers the service (as a separate OS process from the producer), receives samples, exits cleanly.
test_received_samples_are_ordered_and_intact data_corruption, data_reordering Received sequence numbers are non-decreasing and every value is one the sender actually sent (never a garbled value).
test_deployment_config_is_read_from_runtime_path depl_config_runtime SHM binding / service identity are read at runtime from an explicit -s <path> manifest, not compiled in.
test_late_joining_consumer_receives_data stateless_communication, producer_consumer A consumer subscribing 3s after the producer started still binds and receives valid samples from the SHM ring buffer.
test_missing_config_file_fails_deterministically depl_config_runtime Missing manifest → deterministic failure bounded by a shell timeout, never reaches service discovery.
test_truncated_config_fails_deterministically depl_config_runtime Syntactically invalid JSON → same deterministic-failure contract (observed: process aborts, RECV_EXIT=134).
test_schema_invalid_config_fails_deterministically depl_config_runtime Well-formed JSON missing the required schema structure → same contract.
test_mixed_criticality_acl_isolation asil, acl_for_consumer, acl_for_producer, acl_per_service_instance ASIL-B provider offers to one allowed UID; a concurrently-running excluded UID is denied and cannot affect the allowed consumer's stream. (Runs on Linux; skipped on QNX — see Limitations.)

Requirement IDs are the published feat_req__com__* identifiers, attached via
@add_test_properties(partially_verifies=[...]) so they are emitted into the
JUnit XML <properties> — the same traceability convention used by the
persistency FIT cases under feature_integration_tests/test_cases.

The negative-config tests (missing/truncated/schema_invalid) and the ACL
isolation test each run against a dedicated instance specifier that no other
test offers, so they cannot observe another test's leftover shared-memory
state (the QEMU target is session-scoped and persists across the whole test
file, unlike the Docker plugin's fresh-container-per-test model).

Limitations

  • ASIL-B ACL isolation on QNX. allowedConsumer enforcement is a
    shared-memory ACL keyed on the consumer's real UID, so exercising it needs a
    consumer running under a UID excluded from the allow-list (setpriv on
    Linux, on -u <uid> on QNX). On QNX, LoLa's MessagePassingService
    endpoint registration itself requires privilege, so a consumer launched
    under a lower-privilege UID aborts at message-passing setup before
    reaching the shared-memory ACL check. The denial therefore cannot be
    attributed to the ACL on QNX, so the test skips there; it runs on Linux,
    where an unprivileged UID can still bring up its endpoint and so reaches the
    ACL check the assertions rely on.

Verification

  • QNX 8.0 under QEMU (--config=qnx-x86_64): confirmed 8 passed, 1
    skipped
    across multiple runs (test_mixed_criticality_acl_isolation
    skips for the reason under Limitations).
  • Linux under Docker (--config=linux-x86_64, what CI's "Linux — Build &
    Integration Test" job runs): confirmed 9 passed
  • Requirement-traceability properties confirmed present in the generated
    JUnit XML (bazel-testlogs/.../itf/test.xml)

Comment thread feature_integration_tests/itf/test_properties.py Outdated
Comment thread feature_integration_tests/itf/test_communication.py Outdated
Comment thread feature_integration_tests/itf/test_communication.py Outdated
Comment thread feature_integration_tests/itf/comm_helpers.py
Comment thread showcases/standalone/comm_fit/BUILD

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this needs clarification with people from communication - can we change visibility here and patch also the test, or?

@Subramanian-K812
Subramanian-K812 force-pushed the Subramanian-K812_add_communication_feature_integration_tests branch 3 times, most recently from 53b4e5a to dfa02eb Compare October 29, 2026 11:18
- Remove test_properties.py from ITF; inline the attribute_plugin
  try/except import directly in test_communication.py
- Inline samples ordering/integrity checks in
  test_received_samples_are_ordered_and_intact instead of hiding
  them in comm.samples_are_sequential_and_intact
- Replace raise AssertionError with pytest.fail() for the manifest
  setup error in test_deployment_config_is_read_from_runtime_path
- Add logger and log commands before target.execute() calls in
  comm_helpers.py for reproducibility
@Subramanian-K812
Subramanian-K812 force-pushed the Subramanian-K812_add_communication_feature_integration_tests branch 2 times, most recently from 2497627 to 52369e9 Compare October 29, 2026 13:45
@Subramanian-K812
Subramanian-K812 force-pushed the Subramanian-K812_add_communication_feature_integration_tests branch from 52369e9 to 701c8e2 Compare October 29, 2026 13:50
@FScholPer
FScholPer requested a balanced review from Copilot October 29, 2026 14:20

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Missing manifests do not stop runtime startup, and the ACL isolation test can pass despite repeated, reordered, or out-of-range samples.

2 open issues
What changed in this PR

Adds LoLa / mw::com communication coverage to the existing integration test framework, using separate producer and consumer processes over shared memory.

Changes:

  • Adds Rust and C++ test binaries, including cross-language exchanges.
  • Tests delivery, ordering, integrity, runtime configuration failures, late joining, and Linux-only ACL isolation.
  • Packages the binaries, enables requirement-traceability metadata, and exposes the generated Rust interface through a dependency patch.
File Description
showcases/​standalone/​comm_fit/​vehicle_interface.h Defines the C++ service interface and payloads.
showcases/​standalone/​comm_fit/​fit_sender.rs Publishes sequence-numbered samples through Rust.
showcases/​standalone/​comm_fit/​fit_sender.cc Provides the equivalent C++ producer.
showcases/​standalone/​comm_fit/​fit_receiver.rs Discovers and receives samples through Rust.
showcases/​standalone/​comm_fit/​fit_receiver.cc Provides the equivalent C++ consumer.
showcases/​standalone/​comm_fit/​BUILD Builds and bundles all four test binaries.
showcases/​BUILD Includes the communication test bundle in deployment packages.
patches/​communication/​002-expose-com-api-gen.patch Makes the generated Rust interface publicly accessible.
known_good.json Registers the communication visibility patch.
feature_integration_tests/​itf/​test_communication.py Adds communication and configuration test scenarios.
feature_integration_tests/​itf/​comm_helpers.py Provides process orchestration, output parsing, and ACL setup.
feature_integration_tests/​itf/​BUILD Registers the suite and traceability plugin.
bazel_common/​score_modules_target_sw.MODULE.bazel Reflects the patch in the generated dependency override.

Review effort: Balanced

Comment on lines +424 to +431
allowed_result, denied_result, allowed_uid = comm.run_acl_isolation_scenario(target)
logger.info("ACL scenario allowed_uid=%s", allowed_uid)
logger.info("allowed consumer stdout:\n%s", allowed_result.recv_stdout)
logger.info("denied consumer stdout:\n%s", denied_result.recv_stdout)

# Allowed consumer: unaffected by the concurrently-running denied one.
assert allowed_result.recv_exit_code == 0, "allowed consumer did not exit cleanly"
assert allowed_result.received_samples, "allowed consumer received no samples"
Comment on lines +117 to +119
} else {
eprintln!("FIT_RECV_CONFIG_MISSING path={}", config_path.display());
}
@github-actions

Copy link
Copy Markdown

The created documentation from the pull request is available at: docu-html

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants