From 1429ce237e3d237cce6caf77702e233efe2884fb Mon Sep 17 00:00:00 2001 From: bharatgoswami Date: Tue, 17 Mar 2026 10:30:47 +0530 Subject: [PATCH 1/4] Rust::com Integration test cases for primitive and user defined type * Added integration test cases to verify data type and size of type for primitive and user defined struct --- .../com-api-integration-lola-test/BUILD | 77 ++ .../com-api-integration-lola-test/config.json | 814 ++++++++++++++++++ .../integration_test_gen.cpp | 62 ++ .../integration_test_gen.h | 172 ++++ .../com-api-integration-lola-test/lib.rs | 30 + .../primitive_types_test.rs | 553 ++++++++++++ .../test_types.rs | 472 ++++++++++ .../user_defined_types_test.rs | 683 +++++++++++++++ 8 files changed, 2863 insertions(+) create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs create mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD new file mode 100644 index 000000000..ec78b515e --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD @@ -0,0 +1,77 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test") +load("//score/mw:common_features.bzl", "COMPILER_WARNING_FEATURES") + +filegroup( + name = "integration_test_config", + srcs = ["config.json"], + visibility = ["//:__subpackages__"], +) + +cc_library( + name = "integration_test_gen_cpp", + srcs = ["integration_test_gen.cpp"], + hdrs = ["integration_test_gen.h"], + features = COMPILER_WARNING_FEATURES, + implementation_deps = [ + "//score/mw/com/impl/rust/com-api/com-api-ffi-lola:registry_bridge_macro_cpp", + ], + alwayslink = True, +) + +rust_library( + name = "integration-test-lola", + srcs = [ + "lib.rs", + "primitive_types_test.rs", + "test_types.rs", + "user_defined_types_test.rs", + ], + visibility = [ + "//visibility:public", # platform_only + ], + deps = [ + ":integration_test_gen_cpp", + "//score/mw/com/impl/rust/com-api/com-api", + "//score/mw/com/impl/rust/com-api/com-api-runtime-lola", + ], +) + +rust_test( + name = "integration-test-primitives", + crate = ":integration-test-lola", + data = [":integration_test_config"], + features = ["link_std_cpp_lib"], + deps = [ + ":integration-test-lola", + ":integration_test_gen_cpp", + "//score/mw/com/impl/rust/com-api/com-api", + "//score/mw/com/impl/rust/com-api/com-api-runtime-lola", + ], +) + +rust_test( + name = "integration-test-user-defined", + crate = ":integration-test-lola", + data = [":integration_test_config"], + features = ["link_std_cpp_lib"], + deps = [ + ":integration-test-lola", + ":integration_test_gen_cpp", + "//score/mw/com/impl/rust/com-api/com-api", + "//score/mw/com/impl/rust/com-api/com-api-runtime-lola", + ], +) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json new file mode 100644 index 000000000..6b1fef551 --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json @@ -0,0 +1,814 @@ +{ + "serviceTypes": [ + { + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ + { + "binding": "SHM", + "serviceId": 7001, + "events": [ + { "eventName": "u8_event", "eventId": 1 }, + { "eventName": "u16_event", "eventId": 2 }, + { "eventName": "u32_event", "eventId": 3 }, + { "eventName": "u64_event", "eventId": 4 }, + { "eventName": "i8_event", "eventId": 5 }, + { "eventName": "i16_event", "eventId": 6 }, + { "eventName": "i32_event", "eventId": 7 }, + { "eventName": "i64_event", "eventId": 8 }, + { "eventName": "f32_event", "eventId": 9 }, + { "eventName": "f64_event", "eventId": 10 }, + { "eventName": "bool_event", "eventId": 11 } + ] + } + ] + }, + { + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ + { + "binding": "SHM", + "serviceId": 7002, + "events": [ + { "eventName": "simple_event", "eventId": 1 }, + { "eventName": "complex_event", "eventId": 2 }, + { "eventName": "nested_event", "eventId": 3 }, + { "eventName": "point_event", "eventId": 4 }, + { "eventName": "point3d_event", "eventId": 5 }, + { "eventName": "sensor_event", "eventId": 6 }, + { "eventName": "vehicle_event", "eventId": 7 } + ] + } + ] + }, + { + "serviceTypeName": "/score/test/LolaRuntimeTestInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ + { + "binding": "SHM", + "serviceId": 7003, + "events": [ + { "eventName": "test_event", "eventId": 1 } + ] + } + ] + } + ], + "serviceInstances": [ + { + "instanceSpecifier": "/PrimitiveTest/U8/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 1, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/U8/Multiple", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 2, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/U16/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 3, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/U16/Multiple", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 4, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/U32/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 5, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/U64/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 6, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/I8/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 7, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/I8/Multiple", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 8, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/I16/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 9, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/I32/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 10, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/I64/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 11, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/F32/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 12, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/F32/Multiple", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 13, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/F64/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 14, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/PrimitiveTest/Bool/Single", + "serviceTypeName": "/score/test/PrimitiveInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 15, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/SimpleStruct/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 1, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/SimpleStruct/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 2, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/ComplexStruct/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 3, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/ComplexStruct/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 4, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/NestedStruct/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 5, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/NestedStruct/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 6, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/Point/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 7, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/Point/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 8, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/Point3D/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 9, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/Point3D/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 10, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/SensorData/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 11, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/SensorData/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 12, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/VehicleState/Instance1", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 13, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/VehicleState/Instance2", + "serviceTypeName": "/score/test/UserDefinedInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 14, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, + { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + }, + { + "instanceSpecifier": "/LolaRuntimeTest/TestService/Instance1", + "serviceTypeName": "/score/test/LolaRuntimeTestInterface", + "version": { "major": 1, "minor": 0 }, + "instances": [ + { + "instanceId": 15, + "allowedConsumer": { "QM": [ 4002, 0 ] }, + "allowedProvider": { "QM": [ 4001, 0 ] }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { "eventName": "test_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + ] + } + ] + } + ] +} diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp new file mode 100644 index 000000000..a1fbf28d8 --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp @@ -0,0 +1,62 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +#include "integration_test_gen.h" +#include "score/mw/com/impl/rust/com-api/com-api-ffi-lola/registry_bridge_macro.h" + +BEGIN_EXPORT_MW_COM_INTERFACE(PrimitiveInterface, + ::score::mw::com::integration_test::PrimitiveProxy, + ::score::mw::com::integration_test::PrimitiveSkeleton) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U8Data, u8_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U16Data, u16_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U32Data, u32_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U64Data, u64_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I8Data, i8_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I16Data, i16_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I32Data, i32_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I64Data, i64_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::F32Data, f32_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::F64Data, f64_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::BoolData, bool_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(UserDefinedInterface, + ::score::mw::com::integration_test::UserDefinedProxy, + ::score::mw::com::integration_test::UserDefinedSkeleton) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::SimpleStruct, simple_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::ComplexStruct, complex_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::NestedStruct, nested_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::Point, point_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::Point3D, point3d_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::SensorData, sensor_event) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::VehicleState, vehicle_event) +END_EXPORT_MW_COM_INTERFACE() + +EXPORT_MW_COM_TYPE(U8Data, ::score::mw::com::integration_test::U8Data) +EXPORT_MW_COM_TYPE(U16Data, ::score::mw::com::integration_test::U16Data) +EXPORT_MW_COM_TYPE(U32Data, ::score::mw::com::integration_test::U32Data) +EXPORT_MW_COM_TYPE(U64Data, ::score::mw::com::integration_test::U64Data) +EXPORT_MW_COM_TYPE(I8Data, ::score::mw::com::integration_test::I8Data) +EXPORT_MW_COM_TYPE(I16Data, ::score::mw::com::integration_test::I16Data) +EXPORT_MW_COM_TYPE(I32Data, ::score::mw::com::integration_test::I32Data) +EXPORT_MW_COM_TYPE(I64Data, ::score::mw::com::integration_test::I64Data) +EXPORT_MW_COM_TYPE(F32Data, ::score::mw::com::integration_test::F32Data) +EXPORT_MW_COM_TYPE(F64Data, ::score::mw::com::integration_test::F64Data) +EXPORT_MW_COM_TYPE(BoolData, ::score::mw::com::integration_test::BoolData) +EXPORT_MW_COM_TYPE(SimpleStruct, ::score::mw::com::integration_test::SimpleStruct) +EXPORT_MW_COM_TYPE(ComplexStruct, ::score::mw::com::integration_test::ComplexStruct) +EXPORT_MW_COM_TYPE(NestedStruct, ::score::mw::com::integration_test::NestedStruct) +EXPORT_MW_COM_TYPE(Point, ::score::mw::com::integration_test::Point) +EXPORT_MW_COM_TYPE(Point3D, ::score::mw::com::integration_test::Point3D) +EXPORT_MW_COM_TYPE(SensorData, ::score::mw::com::integration_test::SensorData) +EXPORT_MW_COM_TYPE(VehicleState, ::score::mw::com::integration_test::VehicleState) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h new file mode 100644 index 000000000..37689deac --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h @@ -0,0 +1,172 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +#ifndef SCORE_MW_COM_IMPL_RUST_COM_API_INTEGRATION_TEST_LOLA_INTEGRATION_TEST_GEN_H +#define SCORE_MW_COM_IMPL_RUST_COM_API_INTEGRATION_TEST_LOLA_INTEGRATION_TEST_GEN_H + +#include "score/mw/com/types.h" + +#include +#include + +namespace score::mw::com::integration_test +{ + +struct U8Data +{ + uint8_t value; +}; + +struct U16Data +{ + uint16_t value; +}; + +struct U32Data +{ + uint32_t value; +}; + +struct U64Data +{ + uint64_t value; +}; + +struct I8Data +{ + int8_t value; +}; + +struct I16Data +{ + int16_t value; +}; + +struct I32Data +{ + int32_t value; +}; + +struct I64Data +{ + int64_t value; +}; + +struct F32Data +{ + float value; +}; + +struct F64Data +{ + double value; +}; + +struct BoolData +{ + bool value; +}; + +struct SimpleStruct +{ + uint32_t id; +}; + +struct ComplexStruct +{ + uint32_t count; + float temperature; + uint8_t is_active; + uint64_t timestamp; +}; + +struct NestedStruct +{ + uint32_t id; + SimpleStruct simple; + float value; +}; + +struct Point +{ + float x; + float y; +}; + +struct Point3D +{ + float x; + float y; + float z; +}; + +struct SensorData +{ + uint16_t sensor_id; + float temperature; + float humidity; + float pressure; +}; + +struct VehicleState +{ + float speed; + uint16_t rpm; + float fuel_level; + uint8_t is_running; + uint32_t mileage; +}; + +template +class PrimitiveInterface : public Trait::Base +{ + public: + using Trait::Base::Base; + + typename Trait::template Event u8_event{*this, "u8_event"}; + typename Trait::template Event u16_event{*this, "u16_event"}; + typename Trait::template Event u32_event{*this, "u32_event"}; + typename Trait::template Event u64_event{*this, "u64_event"}; + typename Trait::template Event i8_event{*this, "i8_event"}; + typename Trait::template Event i16_event{*this, "i16_event"}; + typename Trait::template Event i32_event{*this, "i32_event"}; + typename Trait::template Event i64_event{*this, "i64_event"}; + typename Trait::template Event f32_event{*this, "f32_event"}; + typename Trait::template Event f64_event{*this, "f64_event"}; + typename Trait::template Event bool_event{*this, "bool_event"}; +}; + +using PrimitiveProxy = ::score::mw::com::AsProxy; +using PrimitiveSkeleton = ::score::mw::com::AsSkeleton; + +template +class UserDefinedInterface : public Trait::Base +{ + public: + using Trait::Base::Base; + + typename Trait::template Event simple_event{*this, "simple_event"}; + typename Trait::template Event complex_event{*this, "complex_event"}; + typename Trait::template Event nested_event{*this, "nested_event"}; + typename Trait::template Event point_event{*this, "point_event"}; + typename Trait::template Event point3d_event{*this, "point3d_event"}; + typename Trait::template Event sensor_event{*this, "sensor_event"}; + typename Trait::template Event vehicle_event{*this, "vehicle_event"}; +}; + +using UserDefinedProxy = ::score::mw::com::AsProxy; +using UserDefinedSkeleton = ::score::mw::com::AsSkeleton; + +} // namespace score::mw::com::integration_test + +#endif // SCORE_MW_COM_IMPL_RUST_COM_API_INTEGRATION_TEST_LOLA_INTEGRATION_TEST_GEN_H diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs new file mode 100644 index 000000000..0033f791f --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs @@ -0,0 +1,30 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +//! Integration tests for COM API with Lola runtime +//! +//! This crate contains comprehensive integration tests for the COM API when used with the Lola runtime implementation. +//! The tests cover various aspects of the COM API, including producer and consumer interactions, data transmission, and service discovery. +//! The tests are designed to validate the correct functioning of the COM API abstractions when interfacing with the Lola middleware, +//! ensuring that data is correctly produced, transmitted, and consumed across different scenarios. +//! The test suite includes cases for primitive data types as well as user-defined types, +//! providing a thorough validation of the COM API's capabilities in a real-world integration context. +//! covering all primitive types and user-defined types. + +pub mod test_types; + +#[cfg(test)] +mod primitive_types_test; + +#[cfg(test)] +mod user_defined_types_test; diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs new file mode 100644 index 000000000..d8aacbfa7 --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs @@ -0,0 +1,553 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +//! Integration tests for primitive types +//! Tests all primitive types: u8, u16, u32, u64, i8, i16, i32, i64, f32, f64, bool + +#[cfg(test)] +mod primitive_type_tests { + use crate::test_types::{ + BoolData, F32Data, F64Data, I16Data, I32Data, I64Data, I8Data, PrimitiveConsumer, + PrimitiveInterface, PrimitiveOfferedProducer, U16Data, U32Data, U64Data, U8Data, + }; + use com_api::{ + Builder, FindServiceSpecifier, InstanceSpecifier, LolaRuntimeBuilderImpl, OfferedProducer, + Producer, Publisher, Runtime, RuntimeBuilder, SampleContainer, SampleMaybeUninit, + SampleMut, ServiceDiscovery, Subscriber, Subscription, + }; + + fn get_lola_runtime() -> impl Runtime { + let mut builder = LolaRuntimeBuilderImpl::new(); + builder.load_config(std::path::Path::new( + "score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json", + )); + builder.build().expect("Failed to build runtime") + } + + fn create_consumer( + runtime: &R, + service_id: InstanceSpecifier, + ) -> PrimitiveConsumer { + let consumer_discovery = + runtime.find_service::(FindServiceSpecifier::Specific(service_id)); + let available_service_instances = consumer_discovery.get_available_instances().unwrap(); + let consumer_builder = available_service_instances.into_iter().next().unwrap(); + consumer_builder.build().unwrap() + } + + fn create_producer( + runtime: &R, + service_id: InstanceSpecifier, + ) -> PrimitiveOfferedProducer { + let producer_builder = runtime.producer_builder::(service_id); + let producer = producer_builder.build().unwrap(); + producer.offer().unwrap() + } + + #[test] + fn test_u8_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/U8/Single") + .expect("Failed to create InstanceSpecifier"); + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + let test_value: u8 = 255; + let u8_data_package = U8Data { value: test_value }; + + let uninit_sample = producer.u8_event.allocate().unwrap(); + let sample = uninit_sample.write(u8_data_package); + sample.send().unwrap(); + + let subscription = consumer.u8_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1, "Should receive exactly 1 sample"); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value, "U8 values should match"); + } + Err(e) => panic!("Failed to receive u8 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_u8_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/U8/Multiple") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_values: Vec = vec![0, 128, 255, 42, 1]; + + for &value in &test_values { + let u8_data = U8Data { value }; + let uninit_sample = producer.u8_event.allocate().unwrap(); + let sample = uninit_sample.write(u8_data); + sample.send().unwrap(); + } + + let subscription = consumer.u8_event.subscribe(5).unwrap(); + let mut sample_buf = SampleContainer::new(5); + + match subscription.try_receive(&mut sample_buf, 5) { + Ok(count) => { + assert_eq!( + count, + test_values.len(), + "Should receive {} samples", + test_values.len() + ); + for (i, &expected_value) in test_values.iter().enumerate() { + if let Some(sample) = sample_buf.pop_front() { + assert_eq!(sample.value, expected_value, "Sample {} value mismatch", i); + } else { + panic!("Expected sample {} not found", i); + } + } + } + Err(e) => panic!("Failed to receive u8 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_u16_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/U16/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: u16 = u16::MAX; + let u16_data = U16Data { value: test_value }; + + let uninit_sample = producer.u16_event.allocate().unwrap(); + let sample = uninit_sample.write(u16_data); + sample.send().unwrap(); + + let subscription = consumer.u16_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1, "Should receive exactly 1 sample"); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value, "U16 values should match"); + } + Err(e) => panic!("Failed to receive u16 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_u16_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/U16/Multiple") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_values: Vec = vec![0, 256, 32768, 65535, 1000]; + + for &value in &test_values { + let u16_data = U16Data { value }; + let uninit_sample = producer.u16_event.allocate().unwrap(); + let sample = uninit_sample.write(u16_data); + sample.send().unwrap(); + } + + let subscription = consumer.u16_event.subscribe(5).unwrap(); + let mut sample_buf = SampleContainer::new(5); + + match subscription.try_receive(&mut sample_buf, 5) { + Ok(count) => { + assert_eq!(count, test_values.len()); + for (i, &expected_value) in test_values.iter().enumerate() { + if let Some(sample) = sample_buf.pop_front() { + assert_eq!(sample.value, expected_value, "Sample {} value mismatch", i); + } + } + } + Err(e) => panic!("Failed to receive u16 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_u32_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/U32/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: u32 = u32::MAX; + let u32_data = U32Data { value: test_value }; + + let uninit_sample = producer.u32_event.allocate().unwrap(); + let sample = uninit_sample.write(u32_data); + sample.send().unwrap(); + + let subscription = consumer.u32_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value); + } + Err(e) => panic!("Failed to receive u32 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_u64_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/U64/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: u64 = u64::MAX; + let u64_data = U64Data { value: test_value }; + + let uninit_sample = producer.u64_event.allocate().unwrap(); + let sample = uninit_sample.write(u64_data); + sample.send().unwrap(); + + let subscription = consumer.u64_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value); + } + Err(e) => panic!("Failed to receive u64 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_i8_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/I8/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: i8 = -128; + let i8_data = I8Data { value: test_value }; + + let uninit_sample = producer.i8_event.allocate().unwrap(); + let sample = uninit_sample.write(i8_data); + sample.send().unwrap(); + + let subscription = consumer.i8_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value); + } + Err(e) => panic!("Failed to receive i8 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_i8_negative_and_positive_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/I8/Multiple") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_values: Vec = vec![i8::MIN, -1, 0, 1, i8::MAX]; + + for &value in &test_values { + let i8_data = I8Data { value }; + let uninit_sample = producer.i8_event.allocate().unwrap(); + let sample = uninit_sample.write(i8_data); + sample.send().unwrap(); + } + + let subscription = consumer.i8_event.subscribe(5).unwrap(); + let mut sample_buf = SampleContainer::new(5); + + match subscription.try_receive(&mut sample_buf, 5) { + Ok(count) => { + assert_eq!(count, test_values.len()); + for &expected_value in test_values.iter() { + if let Some(sample) = sample_buf.pop_front() { + assert_eq!(sample.value, expected_value); + } + } + } + Err(e) => panic!("Failed to receive i8 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_i16_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/I16/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: i16 = i16::MIN; + let i16_data = I16Data { value: test_value }; + + let uninit_sample = producer.i16_event.allocate().unwrap(); + let sample = uninit_sample.write(i16_data); + sample.send().unwrap(); + + let subscription = consumer.i16_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value); + } + Err(e) => panic!("Failed to receive i16 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_i32_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/I32/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: i32 = i32::MIN; + let i32_data = I32Data { value: test_value }; + + let uninit_sample = producer.i32_event.allocate().unwrap(); + let sample = uninit_sample.write(i32_data); + sample.send().unwrap(); + + let subscription = consumer.i32_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value); + } + Err(e) => panic!("Failed to receive i32 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_i64_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/I64/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: i64 = i64::MIN; + let i64_data = I64Data { value: test_value }; + + let uninit_sample = producer.i64_event.allocate().unwrap(); + let sample = uninit_sample.write(i64_data); + sample.send().unwrap(); + + let subscription = consumer.i64_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.value, test_value); + } + Err(e) => panic!("Failed to receive i64 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_f32_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/F32/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: f32 = 3.14159; + let f32_data = F32Data { value: test_value }; + + let uninit_sample = producer.f32_event.allocate().unwrap(); + let sample = uninit_sample.write(f32_data); + sample.send().unwrap(); + + let subscription = consumer.f32_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert!((received_sample.value - test_value).abs() < 0.00001); + } + Err(e) => panic!("Failed to receive f32 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_f32_various_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/F32/Multiple") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_values: Vec = vec![0.0, -1.5, 100.123, -999.999]; + + for &value in &test_values { + let f32_data = F32Data { value }; + let uninit_sample = producer.f32_event.allocate().unwrap(); + let sample = uninit_sample.write(f32_data); + sample.send().unwrap(); + } + + let subscription = consumer.f32_event.subscribe(4).unwrap(); + let mut sample_buf = SampleContainer::new(4); + + match subscription.try_receive(&mut sample_buf, 4) { + Ok(count) => { + assert_eq!(count, test_values.len()); + for &expected_value in test_values.iter() { + if let Some(sample) = sample_buf.pop_front() { + assert!((sample.value - expected_value).abs() < 0.00001); + } + } + } + Err(e) => panic!("Failed to receive f32 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_f64_single_value_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/F64/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_value: f64 = 3.141592653589793; + let f64_data = F64Data { value: test_value }; + + let uninit_sample = producer.f64_event.allocate().unwrap(); + let sample = uninit_sample.write(f64_data); + sample.send().unwrap(); + + let subscription = consumer.f64_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received_sample = sample_buf.pop_front().unwrap(); + assert!((received_sample.value - test_value).abs() < 0.0000001); + } + Err(e) => panic!("Failed to receive f64 data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_bool_send_receive() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/PrimitiveTest/Bool/Single") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_values: Vec = vec![true, false]; + + for &value in &test_values { + let bool_value = if value { true } else { false }; + let bool_data = BoolData { value: bool_value }; + let uninit_sample = producer.bool_event.allocate().unwrap(); + let sample = uninit_sample.write(bool_data); + sample.send().unwrap(); + } + + let subscription = consumer.bool_event.subscribe(2).unwrap(); + let mut sample_buf = SampleContainer::new(2); + + match subscription.try_receive(&mut sample_buf, 2) { + Ok(count) => { + assert_eq!(count, test_values.len()); + for &expected_bool in test_values.iter() { + if let Some(sample) = sample_buf.pop_front() { + let received_bool = sample.value; + assert_eq!(received_bool, expected_bool); + } + } + } + Err(e) => panic!("Failed to receive bool data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } +} diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs new file mode 100644 index 000000000..8b2b52ef2 --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs @@ -0,0 +1,472 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +//! Test types and interfaces for integration testing +//! This module defines various data types and interfaces used for testing +//! both primitive types and user-defined types in the COM API. + +use com_api::{ + CommData, Consumer, Interface, OfferedProducer, Producer, ProviderInfo, Publisher, Reloc, + Runtime, Subscriber, +}; + +/// Test type for u8 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct U8Data { + pub value: u8, +} + +impl CommData for U8Data { + const ID: &'static str = "U8Data"; +} + +/// Test type for u16 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct U16Data { + pub value: u16, +} + +impl CommData for U16Data { + const ID: &'static str = "U16Data"; +} + +/// Test type for u32 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct U32Data { + pub value: u32, +} + +impl CommData for U32Data { + const ID: &'static str = "U32Data"; +} + +/// Test type for u64 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct U64Data { + pub value: u64, +} + +impl CommData for U64Data { + const ID: &'static str = "U64Data"; +} + +/// Test type for i8 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct I8Data { + pub value: i8, +} + +impl CommData for I8Data { + const ID: &'static str = "I8Data"; +} + +/// Test type for i16 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct I16Data { + pub value: i16, +} + +impl CommData for I16Data { + const ID: &'static str = "I16Data"; +} + +/// Test type for i32 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct I32Data { + pub value: i32, +} + +impl CommData for I32Data { + const ID: &'static str = "I32Data"; +} + +/// Test type for i64 primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct I64Data { + pub value: i64, +} + +impl CommData for I64Data { + const ID: &'static str = "I64Data"; +} + +/// Test type for f32 primitive +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct F32Data { + pub value: f32, +} + +impl CommData for F32Data { + const ID: &'static str = "F32Data"; +} + +/// Test type for f64 primitive +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct F64Data { + pub value: f64, +} + +impl CommData for F64Data { + const ID: &'static str = "F64Data"; +} + +/// Test type for bool primitive +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct BoolData { + pub value: bool, +} + +impl CommData for BoolData { + const ID: &'static str = "BoolData"; +} + +/// Simple user-defined type with single field +#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] +#[repr(C)] +pub struct SimpleStruct { + pub id: u32, +} + +impl CommData for SimpleStruct { + const ID: &'static str = "SimpleStruct"; +} + +/// User-defined type with multiple fields of different types +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct ComplexStruct { + pub count: u32, + pub temperature: f32, + pub is_active: u8, + pub timestamp: u64, +} + +impl CommData for ComplexStruct { + const ID: &'static str = "ComplexStruct"; +} + +/// User-defined type with nested structure +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct NestedStruct { + pub id: u32, + pub simple: SimpleStruct, + pub value: f32, +} + +impl CommData for NestedStruct { + const ID: &'static str = "NestedStruct"; +} + +/// User-defined type representing a 2D point +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct Point { + pub x: f32, + pub y: f32, +} + +impl CommData for Point { + const ID: &'static str = "Point"; +} + +/// User-defined type representing a 3D point +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct Point3D { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl CommData for Point3D { + const ID: &'static str = "Point3D"; +} + +/// User-defined type representing sensor data +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct SensorData { + pub sensor_id: u16, + pub temperature: f32, + pub humidity: f32, + pub pressure: f32, +} + +impl CommData for SensorData { + const ID: &'static str = "SensorData"; +} + +/// User-defined type representing vehicle state +#[derive(Debug, Clone, Copy, PartialEq, Reloc)] +#[repr(C)] +pub struct VehicleState { + pub speed: f32, + pub rpm: u16, + pub fuel_level: f32, + pub is_running: u8, + pub mileage: u32, +} + +impl CommData for VehicleState { + const ID: &'static str = "VehicleState"; +} + +/// Interface for testing primitive types +pub struct PrimitiveInterface {} + +impl Interface for PrimitiveInterface { + const INTERFACE_ID: &'static str = "PrimitiveInterface"; + type Consumer = PrimitiveConsumer; + type Producer = PrimitiveProducer; +} + +/// Consumer for primitive types interface +pub struct PrimitiveConsumer { + pub u8_event: R::Subscriber, + pub u16_event: R::Subscriber, + pub u32_event: R::Subscriber, + pub u64_event: R::Subscriber, + pub i8_event: R::Subscriber, + pub i16_event: R::Subscriber, + pub i32_event: R::Subscriber, + pub i64_event: R::Subscriber, + pub f32_event: R::Subscriber, + pub f64_event: R::Subscriber, + pub bool_event: R::Subscriber, +} + +impl Consumer for PrimitiveConsumer { + fn new(instance_info: R::ConsumerInfo) -> Self { + PrimitiveConsumer { + u8_event: R::Subscriber::new("u8_event", instance_info.clone()) + .expect("Failed to create u8 subscriber"), + u16_event: R::Subscriber::new("u16_event", instance_info.clone()) + .expect("Failed to create u16 subscriber"), + u32_event: R::Subscriber::new("u32_event", instance_info.clone()) + .expect("Failed to create u32 subscriber"), + u64_event: R::Subscriber::new("u64_event", instance_info.clone()) + .expect("Failed to create u64 subscriber"), + i8_event: R::Subscriber::new("i8_event", instance_info.clone()) + .expect("Failed to create i8 subscriber"), + i16_event: R::Subscriber::new("i16_event", instance_info.clone()) + .expect("Failed to create i16 subscriber"), + i32_event: R::Subscriber::new("i32_event", instance_info.clone()) + .expect("Failed to create i32 subscriber"), + i64_event: R::Subscriber::new("i64_event", instance_info.clone()) + .expect("Failed to create i64 subscriber"), + f32_event: R::Subscriber::new("f32_event", instance_info.clone()) + .expect("Failed to create f32 subscriber"), + f64_event: R::Subscriber::new("f64_event", instance_info.clone()) + .expect("Failed to create f64 subscriber"), + bool_event: R::Subscriber::new("bool_event", instance_info.clone()) + .expect("Failed to create bool subscriber"), + } + } +} + +/// Producer for primitive types interface +pub struct PrimitiveProducer { + _runtime: core::marker::PhantomData, + instance_info: R::ProviderInfo, +} + +impl Producer for PrimitiveProducer { + type Interface = PrimitiveInterface; + type OfferedProducer = PrimitiveOfferedProducer; + + fn offer(self) -> com_api::Result { + let offered = PrimitiveOfferedProducer { + u8_event: R::Publisher::new("u8_event", self.instance_info.clone()) + .expect("Failed to create u8 publisher"), + u16_event: R::Publisher::new("u16_event", self.instance_info.clone()) + .expect("Failed to create u16 publisher"), + u32_event: R::Publisher::new("u32_event", self.instance_info.clone()) + .expect("Failed to create u32 publisher"), + u64_event: R::Publisher::new("u64_event", self.instance_info.clone()) + .expect("Failed to create u64 publisher"), + i8_event: R::Publisher::new("i8_event", self.instance_info.clone()) + .expect("Failed to create i8 publisher"), + i16_event: R::Publisher::new("i16_event", self.instance_info.clone()) + .expect("Failed to create i16 publisher"), + i32_event: R::Publisher::new("i32_event", self.instance_info.clone()) + .expect("Failed to create i32 publisher"), + i64_event: R::Publisher::new("i64_event", self.instance_info.clone()) + .expect("Failed to create i64 publisher"), + f32_event: R::Publisher::new("f32_event", self.instance_info.clone()) + .expect("Failed to create f32 publisher"), + f64_event: R::Publisher::new("f64_event", self.instance_info.clone()) + .expect("Failed to create f64 publisher"), + bool_event: R::Publisher::new("bool_event", self.instance_info.clone()) + .expect("Failed to create bool publisher"), + instance_info: self.instance_info.clone(), + }; + self.instance_info.offer_service()?; + Ok(offered) + } + + fn new(instance_info: R::ProviderInfo) -> com_api::Result { + Ok(PrimitiveProducer { + _runtime: core::marker::PhantomData, + instance_info, + }) + } +} + +/// Offered producer for primitive types interface +pub struct PrimitiveOfferedProducer { + pub u8_event: R::Publisher, + pub u16_event: R::Publisher, + pub u32_event: R::Publisher, + pub u64_event: R::Publisher, + pub i8_event: R::Publisher, + pub i16_event: R::Publisher, + pub i32_event: R::Publisher, + pub i64_event: R::Publisher, + pub f32_event: R::Publisher, + pub f64_event: R::Publisher, + pub bool_event: R::Publisher, + instance_info: R::ProviderInfo, +} + +impl OfferedProducer for PrimitiveOfferedProducer { + type Interface = PrimitiveInterface; + type Producer = PrimitiveProducer; + + fn unoffer(self) -> com_api::Result { + let producer = PrimitiveProducer { + _runtime: core::marker::PhantomData, + instance_info: self.instance_info.clone(), + }; + self.instance_info.stop_offer_service()?; + Ok(producer) + } +} + +/// Interface for testing user-defined types +pub struct UserDefinedInterface {} + +impl Interface for UserDefinedInterface { + const INTERFACE_ID: &'static str = "UserDefinedInterface"; + type Consumer = UserDefinedConsumer; + type Producer = UserDefinedProducer; +} + +/// Consumer for user-defined types interface +pub struct UserDefinedConsumer { + pub simple_event: R::Subscriber, + pub complex_event: R::Subscriber, + pub nested_event: R::Subscriber, + pub point_event: R::Subscriber, + pub point3d_event: R::Subscriber, + pub sensor_event: R::Subscriber, + pub vehicle_event: R::Subscriber, +} + +impl Consumer for UserDefinedConsumer { + fn new(instance_info: R::ConsumerInfo) -> Self { + UserDefinedConsumer { + simple_event: R::Subscriber::new("simple_event", instance_info.clone()) + .expect("Failed to create simple subscriber"), + complex_event: R::Subscriber::new("complex_event", instance_info.clone()) + .expect("Failed to create complex subscriber"), + nested_event: R::Subscriber::new("nested_event", instance_info.clone()) + .expect("Failed to create nested subscriber"), + point_event: R::Subscriber::new("point_event", instance_info.clone()) + .expect("Failed to create point subscriber"), + point3d_event: R::Subscriber::new("point3d_event", instance_info.clone()) + .expect("Failed to create point3d subscriber"), + sensor_event: R::Subscriber::new("sensor_event", instance_info.clone()) + .expect("Failed to create sensor subscriber"), + vehicle_event: R::Subscriber::new("vehicle_event", instance_info.clone()) + .expect("Failed to create vehicle subscriber"), + } + } +} + +/// Producer for user-defined types interface +pub struct UserDefinedProducer { + _runtime: core::marker::PhantomData, + instance_info: R::ProviderInfo, +} + +impl Producer for UserDefinedProducer { + type Interface = UserDefinedInterface; + type OfferedProducer = UserDefinedOfferedProducer; + + fn offer(self) -> com_api::Result { + let offered = UserDefinedOfferedProducer { + simple_event: R::Publisher::new("simple_event", self.instance_info.clone()) + .expect("Failed to create simple publisher"), + complex_event: R::Publisher::new("complex_event", self.instance_info.clone()) + .expect("Failed to create complex publisher"), + nested_event: R::Publisher::new("nested_event", self.instance_info.clone()) + .expect("Failed to create nested publisher"), + point_event: R::Publisher::new("point_event", self.instance_info.clone()) + .expect("Failed to create point publisher"), + point3d_event: R::Publisher::new("point3d_event", self.instance_info.clone()) + .expect("Failed to create point3d publisher"), + sensor_event: R::Publisher::new("sensor_event", self.instance_info.clone()) + .expect("Failed to create sensor publisher"), + vehicle_event: R::Publisher::new("vehicle_event", self.instance_info.clone()) + .expect("Failed to create vehicle publisher"), + instance_info: self.instance_info.clone(), + }; + self.instance_info.offer_service()?; + Ok(offered) + } + + fn new(instance_info: R::ProviderInfo) -> com_api::Result { + Ok(UserDefinedProducer { + _runtime: core::marker::PhantomData, + instance_info, + }) + } +} + +/// Offered producer for user-defined types interface +pub struct UserDefinedOfferedProducer { + pub simple_event: R::Publisher, + pub complex_event: R::Publisher, + pub nested_event: R::Publisher, + pub point_event: R::Publisher, + pub point3d_event: R::Publisher, + pub sensor_event: R::Publisher, + pub vehicle_event: R::Publisher, + instance_info: R::ProviderInfo, +} + +impl OfferedProducer for UserDefinedOfferedProducer { + type Interface = UserDefinedInterface; + type Producer = UserDefinedProducer; + + fn unoffer(self) -> com_api::Result { + let producer = UserDefinedProducer { + _runtime: core::marker::PhantomData, + instance_info: self.instance_info.clone(), + }; + self.instance_info.stop_offer_service()?; + Ok(producer) + } +} diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs new file mode 100644 index 000000000..b65252289 --- /dev/null +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs @@ -0,0 +1,683 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +//! Integration tests for user-defined types +//! Tests complex data structures including simple structs, nested structs, and composite types + +#[cfg(test)] +mod user_defined_type_tests { + use crate::test_types::{ + ComplexStruct, NestedStruct, Point, Point3D, SensorData, SimpleStruct, UserDefinedConsumer, + UserDefinedInterface, UserDefinedOfferedProducer, VehicleState, + }; + use com_api::{ + Builder, FindServiceSpecifier, InstanceSpecifier, LolaRuntimeBuilderImpl, OfferedProducer, + Producer, Publisher, Runtime, RuntimeBuilder, SampleContainer, SampleMaybeUninit, + SampleMut, ServiceDiscovery, Subscriber, Subscription, + }; + + fn get_lola_runtime() -> impl Runtime { + let mut builder = LolaRuntimeBuilderImpl::new(); + builder.load_config(std::path::Path::new( + "score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json", + )); + builder.build().expect("Failed to build runtime") + } + + fn create_consumer( + runtime: &R, + service_id: InstanceSpecifier, + ) -> UserDefinedConsumer { + let consumer_discovery = runtime + .find_service::(FindServiceSpecifier::Specific(service_id)); + let available_service_instances = consumer_discovery.get_available_instances().unwrap(); + let consumer_builder = available_service_instances.into_iter().next().unwrap(); + consumer_builder.build().unwrap() + } + + fn create_producer( + runtime: &R, + service_id: InstanceSpecifier, + ) -> UserDefinedOfferedProducer { + let producer_builder = runtime.producer_builder::(service_id); + let producer = producer_builder.build().unwrap(); + producer.offer().unwrap() + } + + #[test] + fn test_simple_struct_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/SimpleStruct/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = SimpleStruct { id: 42 }; + + let uninit_sample = producer.simple_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.simple_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1, "Should receive exactly 1 sample"); + let received_sample = sample_buf.pop_front().unwrap(); + assert_eq!(received_sample.id, 42, "SimpleStruct ID should match"); + } + Err(e) => panic!("Failed to receive SimpleStruct data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_simple_struct_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/SimpleStruct/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + SimpleStruct { id: 1 }, + SimpleStruct { id: 100 }, + SimpleStruct { id: 9999 }, + SimpleStruct { id: 0 }, + SimpleStruct { id: u32::MAX }, + ]; + + for data in &test_data { + let uninit_sample = producer.simple_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.simple_event.subscribe(5).unwrap(); + let mut sample_buf = SampleContainer::new(5); + + match subscription.try_receive(&mut sample_buf, 5) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for (i, expected) in test_data.iter().enumerate() { + if let Some(sample) = sample_buf.pop_front() { + assert_eq!( + sample.id, expected.id, + "SimpleStruct mismatch at index {}", + i + ); + } + } + } + Err(e) => panic!("Failed to receive SimpleStruct data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_complex_struct_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/ComplexStruct/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = ComplexStruct { + count: 42, + temperature: 25.5, + is_active: 1, + timestamp: 1234567890, + }; + + let uninit_sample = producer.complex_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.complex_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received = sample_buf.pop_front().unwrap(); + assert_eq!(received.count, 42); + assert!((received.temperature - 25.5).abs() < 0.01); + assert_eq!(received.is_active, 1); + assert_eq!(received.timestamp, 1234567890); + } + Err(e) => panic!("Failed to receive ComplexStruct data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_complex_struct_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/ComplexStruct/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + ComplexStruct { + count: 0, + temperature: 0.0, + is_active: 0, + timestamp: 0, + }, + ComplexStruct { + count: 100, + temperature: 20.0, + is_active: 1, + timestamp: 1000000, + }, + ComplexStruct { + count: u32::MAX, + temperature: -40.5, + is_active: 0, + timestamp: u64::MAX, + }, + ]; + + for data in &test_data { + let uninit_sample = producer.complex_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.complex_event.subscribe(3).unwrap(); + let mut sample_buf = SampleContainer::new(3); + + match subscription.try_receive(&mut sample_buf, 3) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for expected in test_data.iter() { + if let Some(received) = sample_buf.pop_front() { + assert_eq!(received.count, expected.count); + assert!((received.temperature - expected.temperature).abs() < 0.01); + assert_eq!(received.is_active, expected.is_active); + assert_eq!(received.timestamp, expected.timestamp); + } + } + } + Err(e) => panic!("Failed to receive ComplexStruct data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_nested_struct_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/NestedStruct/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let inner_struct = SimpleStruct { id: 123 }; + let test_data = NestedStruct { + id: 1, + simple: inner_struct, + value: 99.9, + }; + + let uninit_sample = producer.nested_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.nested_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received = sample_buf.pop_front().unwrap(); + assert_eq!(received.id, 1); + assert_eq!(received.simple.id, 123); + assert!((received.value - 99.9).abs() < 0.01); + } + Err(e) => panic!("Failed to receive NestedStruct data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_nested_struct_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/NestedStruct/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + NestedStruct { + id: 1, + simple: SimpleStruct { id: 10 }, + value: 1.1, + }, + NestedStruct { + id: 2, + simple: SimpleStruct { id: 20 }, + value: 2.2, + }, + NestedStruct { + id: 3, + simple: SimpleStruct { id: 30 }, + value: 3.3, + }, + ]; + + for data in &test_data { + let uninit_sample = producer.nested_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.nested_event.subscribe(3).unwrap(); + let mut sample_buf = SampleContainer::new(3); + + match subscription.try_receive(&mut sample_buf, 3) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for expected in test_data.iter() { + if let Some(received) = sample_buf.pop_front() { + assert_eq!(received.id, expected.id); + assert_eq!(received.simple.id, expected.simple.id); + assert!((received.value - expected.value).abs() < 0.01); + } + } + } + Err(e) => panic!("Failed to receive NestedStruct data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_point_2d_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/Point/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = Point { x: 1.5, y: 2.5 }; + + let uninit_sample = producer.point_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.point_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received = sample_buf.pop_front().unwrap(); + assert!((received.x - 1.5).abs() < 0.001); + assert!((received.y - 2.5).abs() < 0.001); + } + Err(e) => panic!("Failed to receive Point data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_point_2d_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/Point/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + Point { x: 0.0, y: 0.0 }, + Point { x: 1.0, y: 1.0 }, + Point { x: -1.5, y: 2.5 }, + Point { + x: 100.0, + y: -100.0, + }, + ]; + + for data in &test_data { + let uninit_sample = producer.point_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.point_event.subscribe(4).unwrap(); + let mut sample_buf = SampleContainer::new(4); + + match subscription.try_receive(&mut sample_buf, 4) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for expected in test_data.iter() { + if let Some(received) = sample_buf.pop_front() { + assert!((received.x - expected.x).abs() < 0.001); + assert!((received.y - expected.y).abs() < 0.001); + } + } + } + Err(e) => panic!("Failed to receive Point data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_point_3d_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/Point3D/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = Point3D { + x: 1.0, + y: 2.0, + z: 3.0, + }; + + let uninit_sample = producer.point3d_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.point3d_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received = sample_buf.pop_front().unwrap(); + assert!((received.x - 1.0).abs() < 0.001); + assert!((received.y - 2.0).abs() < 0.001); + assert!((received.z - 3.0).abs() < 0.001); + } + Err(e) => panic!("Failed to receive Point3D data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_point_3d_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/Point3D/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + Point3D { + x: 0.0, + y: 0.0, + z: 0.0, + }, + Point3D { + x: 1.0, + y: 2.0, + z: 3.0, + }, + Point3D { + x: -5.5, + y: -6.6, + z: -7.7, + }, + ]; + + for data in &test_data { + let uninit_sample = producer.point3d_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.point3d_event.subscribe(3).unwrap(); + let mut sample_buf = SampleContainer::new(3); + + match subscription.try_receive(&mut sample_buf, 3) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for expected in test_data.iter() { + if let Some(received) = sample_buf.pop_front() { + assert!((received.x - expected.x).abs() < 0.001); + assert!((received.y - expected.y).abs() < 0.001); + assert!((received.z - expected.z).abs() < 0.001); + } + } + } + Err(e) => panic!("Failed to receive Point3D data: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_sensor_data_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/SensorData/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = SensorData { + sensor_id: 1, + temperature: 22.5, + humidity: 45.0, + pressure: 1013.25, + }; + + let uninit_sample = producer.sensor_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.sensor_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received = sample_buf.pop_front().unwrap(); + assert_eq!(received.sensor_id, 1); + assert!((received.temperature - 22.5).abs() < 0.01); + assert!((received.humidity - 45.0).abs() < 0.01); + assert!((received.pressure - 1013.25).abs() < 0.01); + } + Err(e) => panic!("Failed to receive SensorData: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_sensor_data_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/SensorData/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + SensorData { + sensor_id: 1, + temperature: 20.0, + humidity: 50.0, + pressure: 1013.0, + }, + SensorData { + sensor_id: 2, + temperature: 25.0, + humidity: 40.0, + pressure: 1014.0, + }, + SensorData { + sensor_id: 3, + temperature: 15.0, + humidity: 60.0, + pressure: 1012.0, + }, + ]; + + for data in &test_data { + let uninit_sample = producer.sensor_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.sensor_event.subscribe(3).unwrap(); + let mut sample_buf = SampleContainer::new(3); + + match subscription.try_receive(&mut sample_buf, 3) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for expected in test_data.iter() { + if let Some(received) = sample_buf.pop_front() { + assert_eq!(received.sensor_id, expected.sensor_id); + assert!((received.temperature - expected.temperature).abs() < 0.01); + assert!((received.humidity - expected.humidity).abs() < 0.01); + assert!((received.pressure - expected.pressure).abs() < 0.01); + } + } + } + Err(e) => panic!("Failed to receive SensorData: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_vehicle_state_single_value() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/VehicleState/Instance1") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = VehicleState { + speed: 60.0, + rpm: 3000, + fuel_level: 75.0, + is_running: 1, + mileage: 50000, + }; + + let uninit_sample = producer.vehicle_event.allocate().unwrap(); + let sample = uninit_sample.write(test_data); + sample.send().unwrap(); + + let subscription = consumer.vehicle_event.subscribe(1).unwrap(); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(count) => { + assert_eq!(count, 1); + let received = sample_buf.pop_front().unwrap(); + assert!((received.speed - 60.0).abs() < 0.1); + assert_eq!(received.rpm, 3000); + assert!((received.fuel_level - 75.0).abs() < 0.1); + assert_eq!(received.is_running, 1); + assert_eq!(received.mileage, 50000); + } + Err(e) => panic!("Failed to receive VehicleState: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } + + #[test] + fn test_vehicle_state_multiple_values() { + let runtime = get_lola_runtime(); + let service_id = InstanceSpecifier::new("/UserDefinedTest/VehicleState/Instance2") + .expect("Failed to create InstanceSpecifier"); + + let producer = create_producer(&runtime, service_id.clone()); + let consumer = create_consumer(&runtime, service_id); + + let test_data = vec![ + VehicleState { + speed: 0.0, + rpm: 0, + fuel_level: 100.0, + is_running: 0, + mileage: 0, + }, + VehicleState { + speed: 50.0, + rpm: 2000, + fuel_level: 90.0, + is_running: 1, + mileage: 10000, + }, + VehicleState { + speed: 120.0, + rpm: 5000, + fuel_level: 25.0, + is_running: 1, + mileage: 100000, + }, + VehicleState { + speed: 0.0, + rpm: 1000, + fuel_level: 50.0, + is_running: 1, + mileage: 150000, + }, + ]; + + for data in &test_data { + let uninit_sample = producer.vehicle_event.allocate().unwrap(); + let sample = uninit_sample.write(*data); + sample.send().unwrap(); + } + + let subscription = consumer.vehicle_event.subscribe(4).unwrap(); + let mut sample_buf = SampleContainer::new(4); + + match subscription.try_receive(&mut sample_buf, 4) { + Ok(count) => { + assert_eq!(count, test_data.len()); + for expected in test_data.iter() { + if let Some(received) = sample_buf.pop_front() { + assert!((received.speed - expected.speed).abs() < 0.1); + assert_eq!(received.rpm, expected.rpm); + assert!((received.fuel_level - expected.fuel_level).abs() < 0.1); + assert_eq!(received.is_running, expected.is_running); + assert_eq!(received.mileage, expected.mileage); + } + } + } + Err(e) => panic!("Failed to receive VehicleState: {:?}", e), + } + + let _ = producer.unoffer().unwrap(); + } +} From 2800bdbb711e821d849dd0fe898062a6a7ada4de Mon Sep 17 00:00:00 2001 From: bharatgoswami Date: Fri, 20 Mar 2026 10:56:40 +0530 Subject: [PATCH 2/4] Rust::com Created macro for test-case * Created macro for primitive and user-defined struct * created macro for genrated files --- .../com-api-integration-lola-test/config.json | 1116 ++++++++++------- .../integration_test_gen.cpp | 93 +- .../integration_test_gen.h | 109 +- .../primitive_types_test.rs | 640 ++-------- .../test_types.rs | 595 ++------- .../user_defined_types_test.rs | 759 ++--------- 6 files changed, 1141 insertions(+), 2171 deletions(-) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json index 6b1fef551..58280d064 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json @@ -1,7 +1,7 @@ { "serviceTypes": [ { - "serviceTypeName": "/score/test/PrimitiveInterface", + "serviceTypeName": "/score/test/U8Interface", "version": { "major": 1, "minor": 0 @@ -11,23 +11,16 @@ "binding": "SHM", "serviceId": 7001, "events": [ - { "eventName": "u8_event", "eventId": 1 }, - { "eventName": "u16_event", "eventId": 2 }, - { "eventName": "u32_event", "eventId": 3 }, - { "eventName": "u64_event", "eventId": 4 }, - { "eventName": "i8_event", "eventId": 5 }, - { "eventName": "i16_event", "eventId": 6 }, - { "eventName": "i32_event", "eventId": 7 }, - { "eventName": "i64_event", "eventId": 8 }, - { "eventName": "f32_event", "eventId": 9 }, - { "eventName": "f64_event", "eventId": 10 }, - { "eventName": "bool_event", "eventId": 11 } + { + "eventName": "u8_event", + "eventId": 1 + } ] } ] }, { - "serviceTypeName": "/score/test/UserDefinedInterface", + "serviceTypeName": "/score/test/U16Interface", "version": { "major": 1, "minor": 0 @@ -37,19 +30,16 @@ "binding": "SHM", "serviceId": 7002, "events": [ - { "eventName": "simple_event", "eventId": 1 }, - { "eventName": "complex_event", "eventId": 2 }, - { "eventName": "nested_event", "eventId": 3 }, - { "eventName": "point_event", "eventId": 4 }, - { "eventName": "point3d_event", "eventId": 5 }, - { "eventName": "sensor_event", "eventId": 6 }, - { "eventName": "vehicle_event", "eventId": 7 } + { + "eventName": "u16_event", + "eventId": 1 + } ] } ] }, { - "serviceTypeName": "/score/test/LolaRuntimeTestInterface", + "serviceTypeName": "/score/test/U32Interface", "version": { "major": 1, "minor": 0 @@ -59,753 +49,909 @@ "binding": "SHM", "serviceId": 7003, "events": [ - { "eventName": "test_event", "eventId": 1 } + { + "eventName": "u32_event", + "eventId": 1 + } ] } ] - } - ], - "serviceInstances": [ + }, { - "instanceSpecifier": "/PrimitiveTest/U8/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/U64Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 1, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7004, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "u64_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/U8/Multiple", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/I8Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 2, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7005, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i8_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/U16/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/I16Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 3, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7006, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i16_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/U16/Multiple", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/I32Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 4, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7007, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i32_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/U32/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/I64Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 5, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7008, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i64_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/U64/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/F32Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 6, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7009, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "f32_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/I8/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/F64Interface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 7, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7010, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "f64_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/I8/Multiple", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/BoolInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 8, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7011, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "bool_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/I16/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/SimpleStructInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 9, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7012, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "simple_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/I32/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/ComplexStructInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 10, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7013, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "complex_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/I64/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/NestedStructInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 11, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7014, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "nested_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/F32/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/PointInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 12, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7015, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "point_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/F32/Multiple", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/Point3DInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 13, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7016, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "point3d_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/F64/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/SensorDataInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 14, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7017, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "sensor_event", + "eventId": 1 + } ] } ] }, { - "instanceSpecifier": "/PrimitiveTest/Bool/Single", - "serviceTypeName": "/score/test/PrimitiveInterface", - "version": { "major": 1, "minor": 0 }, - "instances": [ + "serviceTypeName": "/score/test/VehicleStateInterface", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ { - "instanceId": 15, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, - "asil-level": "QM", "binding": "SHM", + "serviceId": 7018, "events": [ - { "eventName": "u8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "u64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i8_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i16_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "i64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f32_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "f64_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "bool_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "vehicle_event", + "eventId": 1 + } ] } ] - }, + } + ], + "serviceInstances": [ { - "instanceSpecifier": "/UserDefinedTest/SimpleStruct/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/U8", + "serviceTypeName": "/score/test/U8Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 1, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "u8_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/SimpleStruct/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/U16", + "serviceTypeName": "/score/test/U16Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 2, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "u16_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/ComplexStruct/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/U32", + "serviceTypeName": "/score/test/U32Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 3, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "u32_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/ComplexStruct/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/U64", + "serviceTypeName": "/score/test/U64Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 4, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "u64_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/NestedStruct/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/I8", + "serviceTypeName": "/score/test/I8Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 5, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i8_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/NestedStruct/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/I16", + "serviceTypeName": "/score/test/I16Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 6, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i16_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/Point/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/I32", + "serviceTypeName": "/score/test/I32Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 7, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i32_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/Point/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/I64", + "serviceTypeName": "/score/test/I64Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 8, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "i64_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/Point3D/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/F32", + "serviceTypeName": "/score/test/F32Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 9, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "f32_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/Point3D/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/F64", + "serviceTypeName": "/score/test/F64Interface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 10, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "f64_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/SensorData/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/PrimitiveTest/Bool", + "serviceTypeName": "/score/test/BoolInterface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 11, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "bool_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/SensorData/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/UserDefinedTest/SimpleStruct", + "serviceTypeName": "/score/test/SimpleStructInterface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 12, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "simple_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/VehicleState/Instance1", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/UserDefinedTest/ComplexStruct", + "serviceTypeName": "/score/test/ComplexStructInterface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 13, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "complex_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/UserDefinedTest/VehicleState/Instance2", - "serviceTypeName": "/score/test/UserDefinedInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/UserDefinedTest/NestedStruct", + "serviceTypeName": "/score/test/NestedStructInterface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 14, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "simple_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "complex_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "nested_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "point3d_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "sensor_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 }, - { "eventName": "vehicle_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "nested_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] }, { - "instanceSpecifier": "/LolaRuntimeTest/TestService/Instance1", - "serviceTypeName": "/score/test/LolaRuntimeTestInterface", - "version": { "major": 1, "minor": 0 }, + "instanceSpecifier": "/UserDefinedTest/Point", + "serviceTypeName": "/score/test/PointInterface", + "version": { + "major": 1, + "minor": 0 + }, "instances": [ { "instanceId": 15, - "allowedConsumer": { "QM": [ 4002, 0 ] }, - "allowedProvider": { "QM": [ 4001, 0 ] }, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { + "eventName": "point_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/Point3D", + "serviceTypeName": "/score/test/Point3DInterface", + "version": { + "major": 1, + "minor": 0 + }, + "instances": [ + { + "instanceId": 16, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { + "eventName": "point3d_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/SensorData", + "serviceTypeName": "/score/test/SensorDataInterface", + "version": { + "major": 1, + "minor": 0 + }, + "instances": [ + { + "instanceId": 17, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { + "eventName": "sensor_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } + ] + } + ] + }, + { + "instanceSpecifier": "/UserDefinedTest/VehicleState", + "serviceTypeName": "/score/test/VehicleStateInterface", + "version": { + "major": 1, + "minor": 0 + }, + "instances": [ + { + "instanceId": 18, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, "asil-level": "QM", "binding": "SHM", "events": [ - { "eventName": "test_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } + { + "eventName": "vehicle_event", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } ] } ] diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp index a1fbf28d8..831c1dc6b 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp @@ -14,34 +14,115 @@ #include "integration_test_gen.h" #include "score/mw/com/impl/rust/com-api/com-api-ffi-lola/registry_bridge_macro.h" -BEGIN_EXPORT_MW_COM_INTERFACE(PrimitiveInterface, - ::score::mw::com::integration_test::PrimitiveProxy, - ::score::mw::com::integration_test::PrimitiveSkeleton) +BEGIN_EXPORT_MW_COM_INTERFACE(U8Interface, + ::score::mw::com::integration_test::U8Proxy, + ::score::mw::com::integration_test::U8Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U8Data, u8_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(U16Interface, + ::score::mw::com::integration_test::U16Proxy, + ::score::mw::com::integration_test::U16Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U16Data, u16_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(U32Interface, + ::score::mw::com::integration_test::U32Proxy, + ::score::mw::com::integration_test::U32Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U32Data, u32_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(U64Interface, + ::score::mw::com::integration_test::U64Proxy, + ::score::mw::com::integration_test::U64Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U64Data, u64_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(I8Interface, + ::score::mw::com::integration_test::I8Proxy, + ::score::mw::com::integration_test::I8Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I8Data, i8_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(I16Interface, + ::score::mw::com::integration_test::I16Proxy, + ::score::mw::com::integration_test::I16Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I16Data, i16_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(I32Interface, + ::score::mw::com::integration_test::I32Proxy, + ::score::mw::com::integration_test::I32Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I32Data, i32_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(I64Interface, + ::score::mw::com::integration_test::I64Proxy, + ::score::mw::com::integration_test::I64Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I64Data, i64_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(F32Interface, + ::score::mw::com::integration_test::F32Proxy, + ::score::mw::com::integration_test::F32Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::F32Data, f32_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(F64Interface, + ::score::mw::com::integration_test::F64Proxy, + ::score::mw::com::integration_test::F64Skeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::F64Data, f64_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(BoolInterface, + ::score::mw::com::integration_test::BoolProxy, + ::score::mw::com::integration_test::BoolSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::BoolData, bool_event) END_EXPORT_MW_COM_INTERFACE() -BEGIN_EXPORT_MW_COM_INTERFACE(UserDefinedInterface, - ::score::mw::com::integration_test::UserDefinedProxy, - ::score::mw::com::integration_test::UserDefinedSkeleton) +BEGIN_EXPORT_MW_COM_INTERFACE(SimpleStructInterface, + ::score::mw::com::integration_test::SimpleStructProxy, + ::score::mw::com::integration_test::SimpleStructSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::SimpleStruct, simple_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(ComplexStructInterface, + ::score::mw::com::integration_test::ComplexStructProxy, + ::score::mw::com::integration_test::ComplexStructSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::ComplexStruct, complex_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(NestedStructInterface, + ::score::mw::com::integration_test::NestedStructProxy, + ::score::mw::com::integration_test::NestedStructSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::NestedStruct, nested_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(PointInterface, + ::score::mw::com::integration_test::PointProxy, + ::score::mw::com::integration_test::PointSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::Point, point_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(Point3DInterface, + ::score::mw::com::integration_test::Point3DProxy, + ::score::mw::com::integration_test::Point3DSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::Point3D, point3d_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(SensorDataInterface, + ::score::mw::com::integration_test::SensorDataProxy, + ::score::mw::com::integration_test::SensorDataSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::SensorData, sensor_event) +END_EXPORT_MW_COM_INTERFACE() + +BEGIN_EXPORT_MW_COM_INTERFACE(VehicleStateInterface, + ::score::mw::com::integration_test::VehicleStateProxy, + ::score::mw::com::integration_test::VehicleStateSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::VehicleState, vehicle_event) END_EXPORT_MW_COM_INTERFACE() +// Export all types EXPORT_MW_COM_TYPE(U8Data, ::score::mw::com::integration_test::U8Data) EXPORT_MW_COM_TYPE(U16Data, ::score::mw::com::integration_test::U16Data) EXPORT_MW_COM_TYPE(U32Data, ::score::mw::com::integration_test::U32Data) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h index 37689deac..00f8c4b8d 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h @@ -127,46 +127,75 @@ struct VehicleState uint32_t mileage; }; -template -class PrimitiveInterface : public Trait::Base -{ - public: - using Trait::Base::Base; - - typename Trait::template Event u8_event{*this, "u8_event"}; - typename Trait::template Event u16_event{*this, "u16_event"}; - typename Trait::template Event u32_event{*this, "u32_event"}; - typename Trait::template Event u64_event{*this, "u64_event"}; - typename Trait::template Event i8_event{*this, "i8_event"}; - typename Trait::template Event i16_event{*this, "i16_event"}; - typename Trait::template Event i32_event{*this, "i32_event"}; - typename Trait::template Event i64_event{*this, "i64_event"}; - typename Trait::template Event f32_event{*this, "f32_event"}; - typename Trait::template Event f64_event{*this, "f64_event"}; - typename Trait::template Event bool_event{*this, "bool_event"}; -}; - -using PrimitiveProxy = ::score::mw::com::AsProxy; -using PrimitiveSkeleton = ::score::mw::com::AsSkeleton; - -template -class UserDefinedInterface : public Trait::Base -{ - public: - using Trait::Base::Base; - - typename Trait::template Event simple_event{*this, "simple_event"}; - typename Trait::template Event complex_event{*this, "complex_event"}; - typename Trait::template Event nested_event{*this, "nested_event"}; - typename Trait::template Event point_event{*this, "point_event"}; - typename Trait::template Event point3d_event{*this, "point3d_event"}; - typename Trait::template Event sensor_event{*this, "sensor_event"}; - typename Trait::template Event vehicle_event{*this, "vehicle_event"}; -}; - -using UserDefinedProxy = ::score::mw::com::AsProxy; -using UserDefinedSkeleton = ::score::mw::com::AsSkeleton; - +// Macro to generate interface classes +#define CREATE_INTERFACE(ClassName, DataType, EventName) \ + template \ + class ClassName : public Trait::Base \ + { \ + public: \ + using Trait::Base::Base; \ + typename Trait::template Event EventName{*this, #EventName}; \ + }; + +// Primitive type interfaces (one per type) +CREATE_INTERFACE(U8Interface, U8Data, u8_event) +CREATE_INTERFACE(U16Interface, U16Data, u16_event) +CREATE_INTERFACE(U32Interface, U32Data, u32_event) +CREATE_INTERFACE(U64Interface, U64Data, u64_event) +CREATE_INTERFACE(I8Interface, I8Data, i8_event) +CREATE_INTERFACE(I16Interface, I16Data, i16_event) +CREATE_INTERFACE(I32Interface, I32Data, i32_event) +CREATE_INTERFACE(I64Interface, I64Data, i64_event) +CREATE_INTERFACE(F32Interface, F32Data, f32_event) +CREATE_INTERFACE(F64Interface, F64Data, f64_event) +CREATE_INTERFACE(BoolInterface, BoolData, bool_event) + +// User-defined type interfaces (one per type) +CREATE_INTERFACE(SimpleStructInterface, SimpleStruct, simple_event) +CREATE_INTERFACE(ComplexStructInterface, ComplexStruct, complex_event) +CREATE_INTERFACE(NestedStructInterface, NestedStruct, nested_event) +CREATE_INTERFACE(PointInterface, Point, point_event) +CREATE_INTERFACE(Point3DInterface, Point3D, point3d_event) +CREATE_INTERFACE(SensorDataInterface, SensorData, sensor_event) +CREATE_INTERFACE(VehicleStateInterface, VehicleState, vehicle_event) + +// Type aliases for proxy and skeleton +using U8Proxy = ::score::mw::com::AsProxy; +using U8Skeleton = ::score::mw::com::AsSkeleton; +using U16Proxy = ::score::mw::com::AsProxy; +using U16Skeleton = ::score::mw::com::AsSkeleton; +using U32Proxy = ::score::mw::com::AsProxy; +using U32Skeleton = ::score::mw::com::AsSkeleton; +using U64Proxy = ::score::mw::com::AsProxy; +using U64Skeleton = ::score::mw::com::AsSkeleton; +using I8Proxy = ::score::mw::com::AsProxy; +using I8Skeleton = ::score::mw::com::AsSkeleton; +using I16Proxy = ::score::mw::com::AsProxy; +using I16Skeleton = ::score::mw::com::AsSkeleton; +using I32Proxy = ::score::mw::com::AsProxy; +using I32Skeleton = ::score::mw::com::AsSkeleton; +using I64Proxy = ::score::mw::com::AsProxy; +using I64Skeleton = ::score::mw::com::AsSkeleton; +using F32Proxy = ::score::mw::com::AsProxy; +using F32Skeleton = ::score::mw::com::AsSkeleton; +using F64Proxy = ::score::mw::com::AsProxy; +using F64Skeleton = ::score::mw::com::AsSkeleton; +using BoolProxy = ::score::mw::com::AsProxy; +using BoolSkeleton = ::score::mw::com::AsSkeleton; +using SimpleStructProxy = ::score::mw::com::AsProxy; +using SimpleStructSkeleton = ::score::mw::com::AsSkeleton; +using ComplexStructProxy = ::score::mw::com::AsProxy; +using ComplexStructSkeleton = ::score::mw::com::AsSkeleton; +using NestedStructProxy = ::score::mw::com::AsProxy; +using NestedStructSkeleton = ::score::mw::com::AsSkeleton; +using PointProxy = ::score::mw::com::AsProxy; +using PointSkeleton = ::score::mw::com::AsSkeleton; +using Point3DProxy = ::score::mw::com::AsProxy; +using Point3DSkeleton = ::score::mw::com::AsSkeleton; +using SensorDataProxy = ::score::mw::com::AsProxy; +using SensorDataSkeleton = ::score::mw::com::AsSkeleton; +using VehicleStateProxy = ::score::mw::com::AsProxy; +using VehicleStateSkeleton = ::score::mw::com::AsSkeleton; } // namespace score::mw::com::integration_test #endif // SCORE_MW_COM_IMPL_RUST_COM_API_INTEGRATION_TEST_LOLA_INTEGRATION_TEST_GEN_H diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs index d8aacbfa7..37e3a5d04 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs @@ -11,543 +11,117 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -//! Integration tests for primitive types -//! Tests all primitive types: u8, u16, u32, u64, i8, i16, i32, i64, f32, f64, bool +//! Integration tests for primitive types. +//! Each type has its own interface (generated by `interface!`) so every test +//! creates a producer/consumer pair using only the event it needs. #[cfg(test)] mod primitive_type_tests { + use crate::generate_test; use crate::test_types::{ - BoolData, F32Data, F64Data, I16Data, I32Data, I64Data, I8Data, PrimitiveConsumer, - PrimitiveInterface, PrimitiveOfferedProducer, U16Data, U32Data, U64Data, U8Data, + BoolData, BoolInterface, F32Data, F32Interface, F64Data, F64Interface, I16Data, + I16Interface, I32Data, I32Interface, I64Data, I64Interface, I8Data, I8Interface, U16Data, + U16Interface, U32Data, U32Interface, U64Data, U64Interface, U8Data, U8Interface, }; - use com_api::{ - Builder, FindServiceSpecifier, InstanceSpecifier, LolaRuntimeBuilderImpl, OfferedProducer, - Producer, Publisher, Runtime, RuntimeBuilder, SampleContainer, SampleMaybeUninit, - SampleMut, ServiceDiscovery, Subscriber, Subscription, - }; - - fn get_lola_runtime() -> impl Runtime { - let mut builder = LolaRuntimeBuilderImpl::new(); - builder.load_config(std::path::Path::new( - "score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json", - )); - builder.build().expect("Failed to build runtime") - } - - fn create_consumer( - runtime: &R, - service_id: InstanceSpecifier, - ) -> PrimitiveConsumer { - let consumer_discovery = - runtime.find_service::(FindServiceSpecifier::Specific(service_id)); - let available_service_instances = consumer_discovery.get_available_instances().unwrap(); - let consumer_builder = available_service_instances.into_iter().next().unwrap(); - consumer_builder.build().unwrap() - } - - fn create_producer( - runtime: &R, - service_id: InstanceSpecifier, - ) -> PrimitiveOfferedProducer { - let producer_builder = runtime.producer_builder::(service_id); - let producer = producer_builder.build().unwrap(); - producer.offer().unwrap() - } - - #[test] - fn test_u8_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/U8/Single") - .expect("Failed to create InstanceSpecifier"); - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - let test_value: u8 = 255; - let u8_data_package = U8Data { value: test_value }; - - let uninit_sample = producer.u8_event.allocate().unwrap(); - let sample = uninit_sample.write(u8_data_package); - sample.send().unwrap(); - - let subscription = consumer.u8_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1, "Should receive exactly 1 sample"); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value, "U8 values should match"); - } - Err(e) => panic!("Failed to receive u8 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_u8_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/U8/Multiple") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_values: Vec = vec![0, 128, 255, 42, 1]; - - for &value in &test_values { - let u8_data = U8Data { value }; - let uninit_sample = producer.u8_event.allocate().unwrap(); - let sample = uninit_sample.write(u8_data); - sample.send().unwrap(); - } - - let subscription = consumer.u8_event.subscribe(5).unwrap(); - let mut sample_buf = SampleContainer::new(5); - - match subscription.try_receive(&mut sample_buf, 5) { - Ok(count) => { - assert_eq!( - count, - test_values.len(), - "Should receive {} samples", - test_values.len() - ); - for (i, &expected_value) in test_values.iter().enumerate() { - if let Some(sample) = sample_buf.pop_front() { - assert_eq!(sample.value, expected_value, "Sample {} value mismatch", i); - } else { - panic!("Expected sample {} not found", i); - } - } - } - Err(e) => panic!("Failed to receive u8 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_u16_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/U16/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: u16 = u16::MAX; - let u16_data = U16Data { value: test_value }; - - let uninit_sample = producer.u16_event.allocate().unwrap(); - let sample = uninit_sample.write(u16_data); - sample.send().unwrap(); - - let subscription = consumer.u16_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1, "Should receive exactly 1 sample"); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value, "U16 values should match"); - } - Err(e) => panic!("Failed to receive u16 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_u16_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/U16/Multiple") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_values: Vec = vec![0, 256, 32768, 65535, 1000]; - - for &value in &test_values { - let u16_data = U16Data { value }; - let uninit_sample = producer.u16_event.allocate().unwrap(); - let sample = uninit_sample.write(u16_data); - sample.send().unwrap(); - } - - let subscription = consumer.u16_event.subscribe(5).unwrap(); - let mut sample_buf = SampleContainer::new(5); - - match subscription.try_receive(&mut sample_buf, 5) { - Ok(count) => { - assert_eq!(count, test_values.len()); - for (i, &expected_value) in test_values.iter().enumerate() { - if let Some(sample) = sample_buf.pop_front() { - assert_eq!(sample.value, expected_value, "Sample {} value mismatch", i); - } - } - } - Err(e) => panic!("Failed to receive u16 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_u32_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/U32/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: u32 = u32::MAX; - let u32_data = U32Data { value: test_value }; - - let uninit_sample = producer.u32_event.allocate().unwrap(); - let sample = uninit_sample.write(u32_data); - sample.send().unwrap(); - - let subscription = consumer.u32_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value); - } - Err(e) => panic!("Failed to receive u32 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_u64_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/U64/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: u64 = u64::MAX; - let u64_data = U64Data { value: test_value }; - - let uninit_sample = producer.u64_event.allocate().unwrap(); - let sample = uninit_sample.write(u64_data); - sample.send().unwrap(); - - let subscription = consumer.u64_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value); - } - Err(e) => panic!("Failed to receive u64 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_i8_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/I8/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: i8 = -128; - let i8_data = I8Data { value: test_value }; - - let uninit_sample = producer.i8_event.allocate().unwrap(); - let sample = uninit_sample.write(i8_data); - sample.send().unwrap(); - - let subscription = consumer.i8_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value); - } - Err(e) => panic!("Failed to receive i8 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_i8_negative_and_positive_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/I8/Multiple") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_values: Vec = vec![i8::MIN, -1, 0, 1, i8::MAX]; - - for &value in &test_values { - let i8_data = I8Data { value }; - let uninit_sample = producer.i8_event.allocate().unwrap(); - let sample = uninit_sample.write(i8_data); - sample.send().unwrap(); - } - - let subscription = consumer.i8_event.subscribe(5).unwrap(); - let mut sample_buf = SampleContainer::new(5); - - match subscription.try_receive(&mut sample_buf, 5) { - Ok(count) => { - assert_eq!(count, test_values.len()); - for &expected_value in test_values.iter() { - if let Some(sample) = sample_buf.pop_front() { - assert_eq!(sample.value, expected_value); - } - } - } - Err(e) => panic!("Failed to receive i8 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_i16_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/I16/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: i16 = i16::MIN; - let i16_data = I16Data { value: test_value }; - - let uninit_sample = producer.i16_event.allocate().unwrap(); - let sample = uninit_sample.write(i16_data); - sample.send().unwrap(); - - let subscription = consumer.i16_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value); - } - Err(e) => panic!("Failed to receive i16 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_i32_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/I32/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: i32 = i32::MIN; - let i32_data = I32Data { value: test_value }; - - let uninit_sample = producer.i32_event.allocate().unwrap(); - let sample = uninit_sample.write(i32_data); - sample.send().unwrap(); - - let subscription = consumer.i32_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value); - } - Err(e) => panic!("Failed to receive i32 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_i64_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/I64/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: i64 = i64::MIN; - let i64_data = I64Data { value: test_value }; - - let uninit_sample = producer.i64_event.allocate().unwrap(); - let sample = uninit_sample.write(i64_data); - sample.send().unwrap(); - - let subscription = consumer.i64_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.value, test_value); - } - Err(e) => panic!("Failed to receive i64 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_f32_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/F32/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: f32 = 3.14159; - let f32_data = F32Data { value: test_value }; - - let uninit_sample = producer.f32_event.allocate().unwrap(); - let sample = uninit_sample.write(f32_data); - sample.send().unwrap(); - - let subscription = consumer.f32_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert!((received_sample.value - test_value).abs() < 0.00001); - } - Err(e) => panic!("Failed to receive f32 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_f32_various_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/F32/Multiple") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_values: Vec = vec![0.0, -1.5, 100.123, -999.999]; - - for &value in &test_values { - let f32_data = F32Data { value }; - let uninit_sample = producer.f32_event.allocate().unwrap(); - let sample = uninit_sample.write(f32_data); - sample.send().unwrap(); - } - - let subscription = consumer.f32_event.subscribe(4).unwrap(); - let mut sample_buf = SampleContainer::new(4); - - match subscription.try_receive(&mut sample_buf, 4) { - Ok(count) => { - assert_eq!(count, test_values.len()); - for &expected_value in test_values.iter() { - if let Some(sample) = sample_buf.pop_front() { - assert!((sample.value - expected_value).abs() < 0.00001); - } - } - } - Err(e) => panic!("Failed to receive f32 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_f64_single_value_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/F64/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_value: f64 = 3.141592653589793; - let f64_data = F64Data { value: test_value }; - - let uninit_sample = producer.f64_event.allocate().unwrap(); - let sample = uninit_sample.write(f64_data); - sample.send().unwrap(); - - let subscription = consumer.f64_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received_sample = sample_buf.pop_front().unwrap(); - assert!((received_sample.value - test_value).abs() < 0.0000001); - } - Err(e) => panic!("Failed to receive f64 data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_bool_send_receive() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/PrimitiveTest/Bool/Single") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_values: Vec = vec![true, false]; - - for &value in &test_values { - let bool_value = if value { true } else { false }; - let bool_data = BoolData { value: bool_value }; - let uninit_sample = producer.bool_event.allocate().unwrap(); - let sample = uninit_sample.write(bool_data); - sample.send().unwrap(); - } - - let subscription = consumer.bool_event.subscribe(2).unwrap(); - let mut sample_buf = SampleContainer::new(2); - - match subscription.try_receive(&mut sample_buf, 2) { - Ok(count) => { - assert_eq!(count, test_values.len()); - for &expected_bool in test_values.iter() { - if let Some(sample) = sample_buf.pop_front() { - let received_bool = sample.value; - assert_eq!(received_bool, expected_bool); - } - } - } - Err(e) => panic!("Failed to receive bool data: {:?}", e), - } - let _ = producer.unoffer().unwrap(); - } + generate_test!( + test = test_u8_send_receive, + interface = U8Interface, + event = u8_event, + path = "/PrimitiveTest/U8", + data = U8Data { value: 255_u8 }, + assert = |a: &U8Data, b: &U8Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_u16_send_receive, + interface = U16Interface, + event = u16_event, + path = "/PrimitiveTest/U16", + data = U16Data { value: u16::MAX }, + assert = |a: &U16Data, b: &U16Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_u32_send_receive, + interface = U32Interface, + event = u32_event, + path = "/PrimitiveTest/U32", + data = U32Data { value: u32::MAX }, + assert = |a: &U32Data, b: &U32Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_u64_send_receive, + interface = U64Interface, + event = u64_event, + path = "/PrimitiveTest/U64", + data = U64Data { value: u64::MAX }, + assert = |a: &U64Data, b: &U64Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_i8_send_receive, + interface = I8Interface, + event = i8_event, + path = "/PrimitiveTest/I8", + data = I8Data { value: i8::MIN }, + assert = |a: &I8Data, b: &I8Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_i16_send_receive, + interface = I16Interface, + event = i16_event, + path = "/PrimitiveTest/I16", + data = I16Data { value: i16::MIN }, + assert = |a: &I16Data, b: &I16Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_i32_send_receive, + interface = I32Interface, + event = i32_event, + path = "/PrimitiveTest/I32", + data = I32Data { value: i32::MIN }, + assert = |a: &I32Data, b: &I32Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_i64_send_receive, + interface = I64Interface, + event = i64_event, + path = "/PrimitiveTest/I64", + data = I64Data { value: i64::MIN }, + assert = |a: &I64Data, b: &I64Data| assert_eq!(a.value, b.value), + ); + + generate_test!( + test = test_f32_send_receive, + interface = F32Interface, + event = f32_event, + path = "/PrimitiveTest/F32", + data = F32Data { value: 3.14159_f32 }, + assert = |a: &F32Data, b: &F32Data| assert!((a.value - b.value).abs() < 1e-5_f32), + ); + + generate_test!( + test = test_f64_send_receive, + interface = F64Interface, + event = f64_event, + path = "/PrimitiveTest/F64", + data = F64Data { + value: 3.141_592_653_589_793_f64 + }, + assert = |a: &F64Data, b: &F64Data| assert!((a.value - b.value).abs() < 1e-7_f64), + ); + + generate_test!( + test = test_bool_send_receive, + interface = BoolInterface, + event = bool_event, + path = "/PrimitiveTest/Bool", + data = BoolData { value: true }, + assert = |a: &BoolData, b: &BoolData| assert_eq!(a.value, b.value), + ); } diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs index 8b2b52ef2..9455f717c 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs @@ -11,462 +11,145 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -//! Test types and interfaces for integration testing -//! This module defines various data types and interfaces used for testing -//! both primitive types and user-defined types in the COM API. - -use com_api::{ - CommData, Consumer, Interface, OfferedProducer, Producer, ProviderInfo, Publisher, Reloc, - Runtime, Subscriber, -}; - -/// Test type for u8 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct U8Data { - pub value: u8, -} - -impl CommData for U8Data { - const ID: &'static str = "U8Data"; -} - -/// Test type for u16 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct U16Data { - pub value: u16, -} - -impl CommData for U16Data { - const ID: &'static str = "U16Data"; -} - -/// Test type for u32 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct U32Data { - pub value: u32, -} - -impl CommData for U32Data { - const ID: &'static str = "U32Data"; -} - -/// Test type for u64 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct U64Data { - pub value: u64, -} - -impl CommData for U64Data { - const ID: &'static str = "U64Data"; -} - -/// Test type for i8 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct I8Data { - pub value: i8, -} - -impl CommData for I8Data { - const ID: &'static str = "I8Data"; -} - -/// Test type for i16 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct I16Data { - pub value: i16, -} - -impl CommData for I16Data { - const ID: &'static str = "I16Data"; -} - -/// Test type for i32 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct I32Data { - pub value: i32, -} - -impl CommData for I32Data { - const ID: &'static str = "I32Data"; -} - -/// Test type for i64 primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct I64Data { - pub value: i64, -} - -impl CommData for I64Data { - const ID: &'static str = "I64Data"; -} - -/// Test type for f32 primitive -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct F32Data { - pub value: f32, -} - -impl CommData for F32Data { - const ID: &'static str = "F32Data"; -} - -/// Test type for f64 primitive -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct F64Data { - pub value: f64, -} - -impl CommData for F64Data { - const ID: &'static str = "F64Data"; -} - -/// Test type for bool primitive -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct BoolData { - pub value: bool, -} - -impl CommData for BoolData { - const ID: &'static str = "BoolData"; -} - -/// Simple user-defined type with single field -#[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] -#[repr(C)] -pub struct SimpleStruct { - pub id: u32, -} - -impl CommData for SimpleStruct { - const ID: &'static str = "SimpleStruct"; -} - -/// User-defined type with multiple fields of different types -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct ComplexStruct { - pub count: u32, - pub temperature: f32, - pub is_active: u8, - pub timestamp: u64, -} - -impl CommData for ComplexStruct { - const ID: &'static str = "ComplexStruct"; -} - -/// User-defined type with nested structure -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct NestedStruct { - pub id: u32, - pub simple: SimpleStruct, - pub value: f32, -} - -impl CommData for NestedStruct { - const ID: &'static str = "NestedStruct"; -} - -/// User-defined type representing a 2D point -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct Point { - pub x: f32, - pub y: f32, -} - -impl CommData for Point { - const ID: &'static str = "Point"; -} - -/// User-defined type representing a 3D point -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct Point3D { - pub x: f32, - pub y: f32, - pub z: f32, -} - -impl CommData for Point3D { - const ID: &'static str = "Point3D"; -} - -/// User-defined type representing sensor data -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct SensorData { - pub sensor_id: u16, - pub temperature: f32, - pub humidity: f32, - pub pressure: f32, -} - -impl CommData for SensorData { - const ID: &'static str = "SensorData"; -} - -/// User-defined type representing vehicle state -#[derive(Debug, Clone, Copy, PartialEq, Reloc)] -#[repr(C)] -pub struct VehicleState { - pub speed: f32, - pub rpm: u16, - pub fuel_level: f32, - pub is_running: u8, - pub mileage: u32, -} - -impl CommData for VehicleState { - const ID: &'static str = "VehicleState"; -} - -/// Interface for testing primitive types -pub struct PrimitiveInterface {} - -impl Interface for PrimitiveInterface { - const INTERFACE_ID: &'static str = "PrimitiveInterface"; - type Consumer = PrimitiveConsumer; - type Producer = PrimitiveProducer; -} - -/// Consumer for primitive types interface -pub struct PrimitiveConsumer { - pub u8_event: R::Subscriber, - pub u16_event: R::Subscriber, - pub u32_event: R::Subscriber, - pub u64_event: R::Subscriber, - pub i8_event: R::Subscriber, - pub i16_event: R::Subscriber, - pub i32_event: R::Subscriber, - pub i64_event: R::Subscriber, - pub f32_event: R::Subscriber, - pub f64_event: R::Subscriber, - pub bool_event: R::Subscriber, -} - -impl Consumer for PrimitiveConsumer { - fn new(instance_info: R::ConsumerInfo) -> Self { - PrimitiveConsumer { - u8_event: R::Subscriber::new("u8_event", instance_info.clone()) - .expect("Failed to create u8 subscriber"), - u16_event: R::Subscriber::new("u16_event", instance_info.clone()) - .expect("Failed to create u16 subscriber"), - u32_event: R::Subscriber::new("u32_event", instance_info.clone()) - .expect("Failed to create u32 subscriber"), - u64_event: R::Subscriber::new("u64_event", instance_info.clone()) - .expect("Failed to create u64 subscriber"), - i8_event: R::Subscriber::new("i8_event", instance_info.clone()) - .expect("Failed to create i8 subscriber"), - i16_event: R::Subscriber::new("i16_event", instance_info.clone()) - .expect("Failed to create i16 subscriber"), - i32_event: R::Subscriber::new("i32_event", instance_info.clone()) - .expect("Failed to create i32 subscriber"), - i64_event: R::Subscriber::new("i64_event", instance_info.clone()) - .expect("Failed to create i64 subscriber"), - f32_event: R::Subscriber::new("f32_event", instance_info.clone()) - .expect("Failed to create f32 subscriber"), - f64_event: R::Subscriber::new("f64_event", instance_info.clone()) - .expect("Failed to create f64 subscriber"), - bool_event: R::Subscriber::new("bool_event", instance_info.clone()) - .expect("Failed to create bool subscriber"), +//! Test types and interfaces for integration testing. +use com_api::{interface, CommData, ProviderInfo, Publisher, Reloc, Subscriber}; + +// Macro to generate data types with CommData impl with Eq trait +macro_rules! define_type { + ($name:ident, eq, $($field:ident: $field_type:ty),+) => { + #[derive(Debug, Clone, Copy, PartialEq, Eq, Reloc)] + #[repr(C)] + pub struct $name { + $(pub $field: $field_type,)* } - } -} - -/// Producer for primitive types interface -pub struct PrimitiveProducer { - _runtime: core::marker::PhantomData, - instance_info: R::ProviderInfo, -} - -impl Producer for PrimitiveProducer { - type Interface = PrimitiveInterface; - type OfferedProducer = PrimitiveOfferedProducer; - - fn offer(self) -> com_api::Result { - let offered = PrimitiveOfferedProducer { - u8_event: R::Publisher::new("u8_event", self.instance_info.clone()) - .expect("Failed to create u8 publisher"), - u16_event: R::Publisher::new("u16_event", self.instance_info.clone()) - .expect("Failed to create u16 publisher"), - u32_event: R::Publisher::new("u32_event", self.instance_info.clone()) - .expect("Failed to create u32 publisher"), - u64_event: R::Publisher::new("u64_event", self.instance_info.clone()) - .expect("Failed to create u64 publisher"), - i8_event: R::Publisher::new("i8_event", self.instance_info.clone()) - .expect("Failed to create i8 publisher"), - i16_event: R::Publisher::new("i16_event", self.instance_info.clone()) - .expect("Failed to create i16 publisher"), - i32_event: R::Publisher::new("i32_event", self.instance_info.clone()) - .expect("Failed to create i32 publisher"), - i64_event: R::Publisher::new("i64_event", self.instance_info.clone()) - .expect("Failed to create i64 publisher"), - f32_event: R::Publisher::new("f32_event", self.instance_info.clone()) - .expect("Failed to create f32 publisher"), - f64_event: R::Publisher::new("f64_event", self.instance_info.clone()) - .expect("Failed to create f64 publisher"), - bool_event: R::Publisher::new("bool_event", self.instance_info.clone()) - .expect("Failed to create bool publisher"), - instance_info: self.instance_info.clone(), - }; - self.instance_info.offer_service()?; - Ok(offered) - } - - fn new(instance_info: R::ProviderInfo) -> com_api::Result { - Ok(PrimitiveProducer { - _runtime: core::marker::PhantomData, - instance_info, - }) - } -} - -/// Offered producer for primitive types interface -pub struct PrimitiveOfferedProducer { - pub u8_event: R::Publisher, - pub u16_event: R::Publisher, - pub u32_event: R::Publisher, - pub u64_event: R::Publisher, - pub i8_event: R::Publisher, - pub i16_event: R::Publisher, - pub i32_event: R::Publisher, - pub i64_event: R::Publisher, - pub f32_event: R::Publisher, - pub f64_event: R::Publisher, - pub bool_event: R::Publisher, - instance_info: R::ProviderInfo, -} - -impl OfferedProducer for PrimitiveOfferedProducer { - type Interface = PrimitiveInterface; - type Producer = PrimitiveProducer; - - fn unoffer(self) -> com_api::Result { - let producer = PrimitiveProducer { - _runtime: core::marker::PhantomData, - instance_info: self.instance_info.clone(), - }; - self.instance_info.stop_offer_service()?; - Ok(producer) - } -} - -/// Interface for testing user-defined types -pub struct UserDefinedInterface {} - -impl Interface for UserDefinedInterface { - const INTERFACE_ID: &'static str = "UserDefinedInterface"; - type Consumer = UserDefinedConsumer; - type Producer = UserDefinedProducer; -} - -/// Consumer for user-defined types interface -pub struct UserDefinedConsumer { - pub simple_event: R::Subscriber, - pub complex_event: R::Subscriber, - pub nested_event: R::Subscriber, - pub point_event: R::Subscriber, - pub point3d_event: R::Subscriber, - pub sensor_event: R::Subscriber, - pub vehicle_event: R::Subscriber, -} - -impl Consumer for UserDefinedConsumer { - fn new(instance_info: R::ConsumerInfo) -> Self { - UserDefinedConsumer { - simple_event: R::Subscriber::new("simple_event", instance_info.clone()) - .expect("Failed to create simple subscriber"), - complex_event: R::Subscriber::new("complex_event", instance_info.clone()) - .expect("Failed to create complex subscriber"), - nested_event: R::Subscriber::new("nested_event", instance_info.clone()) - .expect("Failed to create nested subscriber"), - point_event: R::Subscriber::new("point_event", instance_info.clone()) - .expect("Failed to create point subscriber"), - point3d_event: R::Subscriber::new("point3d_event", instance_info.clone()) - .expect("Failed to create point3d subscriber"), - sensor_event: R::Subscriber::new("sensor_event", instance_info.clone()) - .expect("Failed to create sensor subscriber"), - vehicle_event: R::Subscriber::new("vehicle_event", instance_info.clone()) - .expect("Failed to create vehicle subscriber"), + impl CommData for $name { + const ID: &'static str = stringify!($name); } - } -} - -/// Producer for user-defined types interface -pub struct UserDefinedProducer { - _runtime: core::marker::PhantomData, - instance_info: R::ProviderInfo, -} - -impl Producer for UserDefinedProducer { - type Interface = UserDefinedInterface; - type OfferedProducer = UserDefinedOfferedProducer; - - fn offer(self) -> com_api::Result { - let offered = UserDefinedOfferedProducer { - simple_event: R::Publisher::new("simple_event", self.instance_info.clone()) - .expect("Failed to create simple publisher"), - complex_event: R::Publisher::new("complex_event", self.instance_info.clone()) - .expect("Failed to create complex publisher"), - nested_event: R::Publisher::new("nested_event", self.instance_info.clone()) - .expect("Failed to create nested publisher"), - point_event: R::Publisher::new("point_event", self.instance_info.clone()) - .expect("Failed to create point publisher"), - point3d_event: R::Publisher::new("point3d_event", self.instance_info.clone()) - .expect("Failed to create point3d publisher"), - sensor_event: R::Publisher::new("sensor_event", self.instance_info.clone()) - .expect("Failed to create sensor publisher"), - vehicle_event: R::Publisher::new("vehicle_event", self.instance_info.clone()) - .expect("Failed to create vehicle publisher"), - instance_info: self.instance_info.clone(), - }; - self.instance_info.offer_service()?; - Ok(offered) - } - - fn new(instance_info: R::ProviderInfo) -> com_api::Result { - Ok(UserDefinedProducer { - _runtime: core::marker::PhantomData, - instance_info, - }) - } -} - -/// Offered producer for user-defined types interface -pub struct UserDefinedOfferedProducer { - pub simple_event: R::Publisher, - pub complex_event: R::Publisher, - pub nested_event: R::Publisher, - pub point_event: R::Publisher, - pub point3d_event: R::Publisher, - pub sensor_event: R::Publisher, - pub vehicle_event: R::Publisher, - instance_info: R::ProviderInfo, -} - -impl OfferedProducer for UserDefinedOfferedProducer { - type Interface = UserDefinedInterface; - type Producer = UserDefinedProducer; - - fn unoffer(self) -> com_api::Result { - let producer = UserDefinedProducer { - _runtime: core::marker::PhantomData, - instance_info: self.instance_info.clone(), - }; - self.instance_info.stop_offer_service()?; - Ok(producer) - } + }; + // Macro for types without Eq trait (e.g., with float fields) + ($name:ident, $($field:ident: $field_type:ty),+) => { + #[derive(Debug, Clone, Copy, PartialEq, Reloc)] + #[repr(C)] + pub struct $name { + $(pub $field: $field_type,)* + } + impl CommData for $name { + const ID: &'static str = stringify!($name); + } + }; +} + +define_type!(U8Data, eq, value: u8); +define_type!(U16Data, eq, value: u16); +define_type!(U32Data, eq, value: u32); +define_type!(U64Data, eq, value: u64); +define_type!(I8Data, eq, value: i8); +define_type!(I16Data, eq, value: i16); +define_type!(I32Data, eq, value: i32); +define_type!(I64Data, eq, value: i64); +define_type!(BoolData, eq, value: bool); + +// Floating point types (without Eq) +define_type!(F32Data, value: f32); +define_type!(F64Data, value: f64); + +// Complex struct types +define_type!(SimpleStruct, eq, id: u32); +define_type!(ComplexStruct, count: u32, temperature: f32, is_active: u8, timestamp: u64); +define_type!(NestedStruct, id: u32, simple: SimpleStruct, value: f32); +define_type!(Point, x: f32, y: f32); +define_type!(Point3D, x: f32, y: f32, z: f32); +define_type!(SensorData, sensor_id: u16, temperature: f32, humidity: f32, pressure: f32); +define_type!(VehicleState, speed: f32, rpm: u16, fuel_level: f32, is_running: u8, mileage: u32); + +interface!(interface U8, { Id = "U8Interface", u8_event: Event }); +interface!(interface U16, { Id = "U16Interface", u16_event: Event }); +interface!(interface U32, { Id = "U32Interface", u32_event: Event }); +interface!(interface U64, { Id = "U64Interface", u64_event: Event }); +interface!(interface I8, { Id = "I8Interface", i8_event: Event }); +interface!(interface I16, { Id = "I16Interface", i16_event: Event }); +interface!(interface I32, { Id = "I32Interface", i32_event: Event }); +interface!(interface I64, { Id = "I64Interface", i64_event: Event }); +interface!(interface F32, { Id = "F32Interface", f32_event: Event }); +interface!(interface F64, { Id = "F64Interface", f64_event: Event }); +interface!(interface Bool, { Id = "BoolInterface", bool_event: Event }); + +interface!(interface SimpleStruct, { Id = "SimpleStructInterface", simple_event: Event }); +interface!(interface ComplexStruct, { Id = "ComplexStructInterface", complex_event: Event }); +interface!(interface NestedStruct, { Id = "NestedStructInterface", nested_event: Event }); +interface!(interface Point, { Id = "PointInterface", point_event: Event }); +interface!(interface Point3D, { Id = "Point3DInterface", point3d_event: Event }); +interface!(interface SensorData, { Id = "SensorDataInterface", sensor_event: Event }); +interface!(interface VehicleState, { Id = "VehicleStateInterface", vehicle_event: Event }); + +// Generic test macro for send/receive tests +#[macro_export] +macro_rules! generate_test { + ( + test = $test_fn:ident, + interface = $Iface:ident, + event = $event_field:ident, + path = $path:literal, + data = $test_data:expr, + assert = $assert:expr $(,)? + ) => { + #[test] + fn $test_fn() { + use com_api::{ + Builder, FindServiceSpecifier, InstanceSpecifier, LolaRuntimeBuilderImpl, + OfferedProducer, Producer, Publisher, Runtime, RuntimeBuilder, SampleContainer, + SampleMaybeUninit, SampleMut, ServiceDiscovery, Subscriber, Subscription, + }; + + let mut builder = LolaRuntimeBuilderImpl::new(); + builder.load_config(std::path::Path::new( + "score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json", + )); + let runtime = builder.build().expect("Failed to build runtime"); + + let service_id = + InstanceSpecifier::new($path).expect("Failed to create InstanceSpecifier"); + + let producer = runtime + .producer_builder::<$Iface>(service_id.clone()) + .build() + .expect("Failed to build producer") + .offer() + .expect("Failed to offer producer"); + let consumer = runtime + .find_service::<$Iface>(FindServiceSpecifier::Specific(service_id)) + .get_available_instances() + .expect("Failed to get available instances") + .into_iter() + .next() + .expect("No service instances available") + .build() + .expect("Failed to build consumer"); + + let test_value = $test_data; + let uninit_sample = producer + .$event_field + .allocate() + .expect("Failed to allocate sample"); + let sample = uninit_sample.write(test_value); + sample.send().expect("Failed to send sample"); + + let subscription = consumer + .$event_field + .subscribe(1) + .expect("Failed to subscribe to event"); + let mut sample_buf = SampleContainer::new(1); + + match subscription.try_receive(&mut sample_buf, 1) { + Ok(received_count) => { + assert_eq!(received_count, 1, "Should receive exactly 1 sample"); + let received = sample_buf.pop_front().unwrap(); + ($assert)(&*received, &test_value); + } + Err(e) => panic!("Failed to receive data: {:?}", e), + } + + let _ = producer.unoffer().expect("Failed to unoffer producer"); + } + }; } diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs index b65252289..9fa20a88b 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs @@ -11,673 +11,130 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -//! Integration tests for user-defined types -//! Tests complex data structures including simple structs, nested structs, and composite types +//! Integration tests for user-defined types. +//! Each type has its own interface (generated by `interface!`) so every test +//! creates a producer/consumer pair using only the event it needs. #[cfg(test)] mod user_defined_type_tests { use crate::test_types::{ - ComplexStruct, NestedStruct, Point, Point3D, SensorData, SimpleStruct, UserDefinedConsumer, - UserDefinedInterface, UserDefinedOfferedProducer, VehicleState, + ComplexStruct, ComplexStructInterface, NestedStruct, NestedStructInterface, Point, Point3D, + Point3DInterface, PointInterface, SensorData, SensorDataInterface, SimpleStruct, + SimpleStructInterface, VehicleState, VehicleStateInterface, }; - use com_api::{ - Builder, FindServiceSpecifier, InstanceSpecifier, LolaRuntimeBuilderImpl, OfferedProducer, - Producer, Publisher, Runtime, RuntimeBuilder, SampleContainer, SampleMaybeUninit, - SampleMut, ServiceDiscovery, Subscriber, Subscription, - }; - - fn get_lola_runtime() -> impl Runtime { - let mut builder = LolaRuntimeBuilderImpl::new(); - builder.load_config(std::path::Path::new( - "score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json", - )); - builder.build().expect("Failed to build runtime") - } - - fn create_consumer( - runtime: &R, - service_id: InstanceSpecifier, - ) -> UserDefinedConsumer { - let consumer_discovery = runtime - .find_service::(FindServiceSpecifier::Specific(service_id)); - let available_service_instances = consumer_discovery.get_available_instances().unwrap(); - let consumer_builder = available_service_instances.into_iter().next().unwrap(); - consumer_builder.build().unwrap() - } - - fn create_producer( - runtime: &R, - service_id: InstanceSpecifier, - ) -> UserDefinedOfferedProducer { - let producer_builder = runtime.producer_builder::(service_id); - let producer = producer_builder.build().unwrap(); - producer.offer().unwrap() - } - - #[test] - fn test_simple_struct_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/SimpleStruct/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = SimpleStruct { id: 42 }; - - let uninit_sample = producer.simple_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.simple_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1, "Should receive exactly 1 sample"); - let received_sample = sample_buf.pop_front().unwrap(); - assert_eq!(received_sample.id, 42, "SimpleStruct ID should match"); - } - Err(e) => panic!("Failed to receive SimpleStruct data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_simple_struct_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/SimpleStruct/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - SimpleStruct { id: 1 }, - SimpleStruct { id: 100 }, - SimpleStruct { id: 9999 }, - SimpleStruct { id: 0 }, - SimpleStruct { id: u32::MAX }, - ]; - - for data in &test_data { - let uninit_sample = producer.simple_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.simple_event.subscribe(5).unwrap(); - let mut sample_buf = SampleContainer::new(5); - - match subscription.try_receive(&mut sample_buf, 5) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for (i, expected) in test_data.iter().enumerate() { - if let Some(sample) = sample_buf.pop_front() { - assert_eq!( - sample.id, expected.id, - "SimpleStruct mismatch at index {}", - i - ); - } - } - } - Err(e) => panic!("Failed to receive SimpleStruct data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_complex_struct_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/ComplexStruct/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = ComplexStruct { + use crate::generate_test; + + generate_test!( + test = test_simple_struct_send_receive, + interface = SimpleStructInterface, + event = simple_event, + path = "/UserDefinedTest/SimpleStruct", + data = SimpleStruct { id: 42 }, + assert = |r: &SimpleStruct, e: &SimpleStruct| assert_eq!(r.id, e.id), + ); + + generate_test!( + test = test_complex_struct_send_receive, + interface = ComplexStructInterface, + event = complex_event, + path = "/UserDefinedTest/ComplexStruct", + data = ComplexStruct { count: 42, temperature: 25.5, is_active: 1, - timestamp: 1234567890, - }; - - let uninit_sample = producer.complex_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.complex_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received = sample_buf.pop_front().unwrap(); - assert_eq!(received.count, 42); - assert!((received.temperature - 25.5).abs() < 0.01); - assert_eq!(received.is_active, 1); - assert_eq!(received.timestamp, 1234567890); - } - Err(e) => panic!("Failed to receive ComplexStruct data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_complex_struct_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/ComplexStruct/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - ComplexStruct { - count: 0, - temperature: 0.0, - is_active: 0, - timestamp: 0, - }, - ComplexStruct { - count: 100, - temperature: 20.0, - is_active: 1, - timestamp: 1000000, - }, - ComplexStruct { - count: u32::MAX, - temperature: -40.5, - is_active: 0, - timestamp: u64::MAX, - }, - ]; - - for data in &test_data { - let uninit_sample = producer.complex_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.complex_event.subscribe(3).unwrap(); - let mut sample_buf = SampleContainer::new(3); - - match subscription.try_receive(&mut sample_buf, 3) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for expected in test_data.iter() { - if let Some(received) = sample_buf.pop_front() { - assert_eq!(received.count, expected.count); - assert!((received.temperature - expected.temperature).abs() < 0.01); - assert_eq!(received.is_active, expected.is_active); - assert_eq!(received.timestamp, expected.timestamp); - } - } - } - Err(e) => panic!("Failed to receive ComplexStruct data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_nested_struct_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/NestedStruct/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let inner_struct = SimpleStruct { id: 123 }; - let test_data = NestedStruct { + timestamp: 1234567890 + }, + assert = |r: &ComplexStruct, e: &ComplexStruct| { + assert_eq!(r.count, e.count); + assert!((r.temperature - e.temperature).abs() < 0.01); + assert_eq!(r.is_active, e.is_active); + assert_eq!(r.timestamp, e.timestamp); + }, + ); + + generate_test!( + test = test_nested_struct_send_receive, + interface = NestedStructInterface, + event = nested_event, + path = "/UserDefinedTest/NestedStruct", + data = NestedStruct { id: 1, - simple: inner_struct, - value: 99.9, - }; - - let uninit_sample = producer.nested_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.nested_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received = sample_buf.pop_front().unwrap(); - assert_eq!(received.id, 1); - assert_eq!(received.simple.id, 123); - assert!((received.value - 99.9).abs() < 0.01); - } - Err(e) => panic!("Failed to receive NestedStruct data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_nested_struct_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/NestedStruct/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - NestedStruct { - id: 1, - simple: SimpleStruct { id: 10 }, - value: 1.1, - }, - NestedStruct { - id: 2, - simple: SimpleStruct { id: 20 }, - value: 2.2, - }, - NestedStruct { - id: 3, - simple: SimpleStruct { id: 30 }, - value: 3.3, - }, - ]; - - for data in &test_data { - let uninit_sample = producer.nested_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.nested_event.subscribe(3).unwrap(); - let mut sample_buf = SampleContainer::new(3); - - match subscription.try_receive(&mut sample_buf, 3) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for expected in test_data.iter() { - if let Some(received) = sample_buf.pop_front() { - assert_eq!(received.id, expected.id); - assert_eq!(received.simple.id, expected.simple.id); - assert!((received.value - expected.value).abs() < 0.01); - } - } - } - Err(e) => panic!("Failed to receive NestedStruct data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_point_2d_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/Point/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = Point { x: 1.5, y: 2.5 }; - - let uninit_sample = producer.point_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.point_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received = sample_buf.pop_front().unwrap(); - assert!((received.x - 1.5).abs() < 0.001); - assert!((received.y - 2.5).abs() < 0.001); - } - Err(e) => panic!("Failed to receive Point data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_point_2d_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/Point/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - Point { x: 0.0, y: 0.0 }, - Point { x: 1.0, y: 1.0 }, - Point { x: -1.5, y: 2.5 }, - Point { - x: 100.0, - y: -100.0, - }, - ]; - - for data in &test_data { - let uninit_sample = producer.point_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.point_event.subscribe(4).unwrap(); - let mut sample_buf = SampleContainer::new(4); - - match subscription.try_receive(&mut sample_buf, 4) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for expected in test_data.iter() { - if let Some(received) = sample_buf.pop_front() { - assert!((received.x - expected.x).abs() < 0.001); - assert!((received.y - expected.y).abs() < 0.001); - } - } - } - Err(e) => panic!("Failed to receive Point data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_point_3d_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/Point3D/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = Point3D { + simple: SimpleStruct { id: 123 }, + value: 99.9 + }, + assert = |r: &NestedStruct, e: &NestedStruct| { + assert_eq!(r.id, e.id); + assert_eq!(r.simple.id, e.simple.id); + assert!((r.value - e.value).abs() < 0.01); + }, + ); + + generate_test!( + test = test_point_2d_send_receive, + interface = PointInterface, + event = point_event, + path = "/UserDefinedTest/Point", + data = Point { x: 1.5, y: 2.5 }, + assert = |r: &Point, e: &Point| { + assert!((r.x - e.x).abs() < 0.001); + assert!((r.y - e.y).abs() < 0.001); + }, + ); + + generate_test!( + test = test_point_3d_send_receive, + interface = Point3DInterface, + event = point3d_event, + path = "/UserDefinedTest/Point3D", + data = Point3D { x: 1.0, y: 2.0, - z: 3.0, - }; - - let uninit_sample = producer.point3d_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.point3d_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received = sample_buf.pop_front().unwrap(); - assert!((received.x - 1.0).abs() < 0.001); - assert!((received.y - 2.0).abs() < 0.001); - assert!((received.z - 3.0).abs() < 0.001); - } - Err(e) => panic!("Failed to receive Point3D data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_point_3d_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/Point3D/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - Point3D { - x: 0.0, - y: 0.0, - z: 0.0, - }, - Point3D { - x: 1.0, - y: 2.0, - z: 3.0, - }, - Point3D { - x: -5.5, - y: -6.6, - z: -7.7, - }, - ]; - - for data in &test_data { - let uninit_sample = producer.point3d_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.point3d_event.subscribe(3).unwrap(); - let mut sample_buf = SampleContainer::new(3); - - match subscription.try_receive(&mut sample_buf, 3) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for expected in test_data.iter() { - if let Some(received) = sample_buf.pop_front() { - assert!((received.x - expected.x).abs() < 0.001); - assert!((received.y - expected.y).abs() < 0.001); - assert!((received.z - expected.z).abs() < 0.001); - } - } - } - Err(e) => panic!("Failed to receive Point3D data: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_sensor_data_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/SensorData/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = SensorData { + z: 3.0 + }, + assert = |r: &Point3D, e: &Point3D| { + assert!((r.x - e.x).abs() < 0.001); + assert!((r.y - e.y).abs() < 0.001); + assert!((r.z - e.z).abs() < 0.001); + }, + ); + + generate_test!( + test = test_sensor_data_send_receive, + interface = SensorDataInterface, + event = sensor_event, + path = "/UserDefinedTest/SensorData", + data = SensorData { sensor_id: 1, temperature: 22.5, humidity: 45.0, - pressure: 1013.25, - }; - - let uninit_sample = producer.sensor_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.sensor_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received = sample_buf.pop_front().unwrap(); - assert_eq!(received.sensor_id, 1); - assert!((received.temperature - 22.5).abs() < 0.01); - assert!((received.humidity - 45.0).abs() < 0.01); - assert!((received.pressure - 1013.25).abs() < 0.01); - } - Err(e) => panic!("Failed to receive SensorData: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_sensor_data_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/SensorData/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - SensorData { - sensor_id: 1, - temperature: 20.0, - humidity: 50.0, - pressure: 1013.0, - }, - SensorData { - sensor_id: 2, - temperature: 25.0, - humidity: 40.0, - pressure: 1014.0, - }, - SensorData { - sensor_id: 3, - temperature: 15.0, - humidity: 60.0, - pressure: 1012.0, - }, - ]; - - for data in &test_data { - let uninit_sample = producer.sensor_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.sensor_event.subscribe(3).unwrap(); - let mut sample_buf = SampleContainer::new(3); - - match subscription.try_receive(&mut sample_buf, 3) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for expected in test_data.iter() { - if let Some(received) = sample_buf.pop_front() { - assert_eq!(received.sensor_id, expected.sensor_id); - assert!((received.temperature - expected.temperature).abs() < 0.01); - assert!((received.humidity - expected.humidity).abs() < 0.01); - assert!((received.pressure - expected.pressure).abs() < 0.01); - } - } - } - Err(e) => panic!("Failed to receive SensorData: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_vehicle_state_single_value() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/VehicleState/Instance1") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = VehicleState { + pressure: 1013.25 + }, + assert = |r: &SensorData, e: &SensorData| { + assert_eq!(r.sensor_id, e.sensor_id); + assert!((r.temperature - e.temperature).abs() < 0.01); + assert!((r.humidity - e.humidity).abs() < 0.01); + assert!((r.pressure - e.pressure).abs() < 0.01); + }, + ); + + generate_test!( + test = test_vehicle_state_send_receive, + interface = VehicleStateInterface, + event = vehicle_event, + path = "/UserDefinedTest/VehicleState", + data = VehicleState { speed: 60.0, rpm: 3000, fuel_level: 75.0, is_running: 1, - mileage: 50000, - }; - - let uninit_sample = producer.vehicle_event.allocate().unwrap(); - let sample = uninit_sample.write(test_data); - sample.send().unwrap(); - - let subscription = consumer.vehicle_event.subscribe(1).unwrap(); - let mut sample_buf = SampleContainer::new(1); - - match subscription.try_receive(&mut sample_buf, 1) { - Ok(count) => { - assert_eq!(count, 1); - let received = sample_buf.pop_front().unwrap(); - assert!((received.speed - 60.0).abs() < 0.1); - assert_eq!(received.rpm, 3000); - assert!((received.fuel_level - 75.0).abs() < 0.1); - assert_eq!(received.is_running, 1); - assert_eq!(received.mileage, 50000); - } - Err(e) => panic!("Failed to receive VehicleState: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } - - #[test] - fn test_vehicle_state_multiple_values() { - let runtime = get_lola_runtime(); - let service_id = InstanceSpecifier::new("/UserDefinedTest/VehicleState/Instance2") - .expect("Failed to create InstanceSpecifier"); - - let producer = create_producer(&runtime, service_id.clone()); - let consumer = create_consumer(&runtime, service_id); - - let test_data = vec![ - VehicleState { - speed: 0.0, - rpm: 0, - fuel_level: 100.0, - is_running: 0, - mileage: 0, - }, - VehicleState { - speed: 50.0, - rpm: 2000, - fuel_level: 90.0, - is_running: 1, - mileage: 10000, - }, - VehicleState { - speed: 120.0, - rpm: 5000, - fuel_level: 25.0, - is_running: 1, - mileage: 100000, - }, - VehicleState { - speed: 0.0, - rpm: 1000, - fuel_level: 50.0, - is_running: 1, - mileage: 150000, - }, - ]; - - for data in &test_data { - let uninit_sample = producer.vehicle_event.allocate().unwrap(); - let sample = uninit_sample.write(*data); - sample.send().unwrap(); - } - - let subscription = consumer.vehicle_event.subscribe(4).unwrap(); - let mut sample_buf = SampleContainer::new(4); - - match subscription.try_receive(&mut sample_buf, 4) { - Ok(count) => { - assert_eq!(count, test_data.len()); - for expected in test_data.iter() { - if let Some(received) = sample_buf.pop_front() { - assert!((received.speed - expected.speed).abs() < 0.1); - assert_eq!(received.rpm, expected.rpm); - assert!((received.fuel_level - expected.fuel_level).abs() < 0.1); - assert_eq!(received.is_running, expected.is_running); - assert_eq!(received.mileage, expected.mileage); - } - } - } - Err(e) => panic!("Failed to receive VehicleState: {:?}", e), - } - - let _ = producer.unoffer().unwrap(); - } + mileage: 50000 + }, + assert = |r: &VehicleState, e: &VehicleState| { + assert!((r.speed - e.speed).abs() < 0.1); + assert_eq!(r.rpm, e.rpm); + assert!((r.fuel_level - e.fuel_level).abs() < 0.1); + assert_eq!(r.is_running, e.is_running); + assert_eq!(r.mileage, e.mileage); + }, + ); } From bd59a9e220e94622547f35bf8cb6a3961e5425de Mon Sep 17 00:00:00 2001 From: bharatgoswami Date: Tue, 24 Mar 2026 10:16:21 +0530 Subject: [PATCH 3/4] Rust::com Integration test case update * Updated one test case for all the primitive types --- .../com-api-integration-lola-test/BUILD | 18 +- .../com-api-integration-lola-test/config.json | 540 +----------------- ...ined_types_test.rs => integration_test.rs} | 87 ++- .../integration_test_gen.cpp | 80 +-- .../integration_test_gen.h | 105 +--- .../com-api-integration-lola-test/lib.rs | 5 +- .../primitive_types_test.rs | 127 ---- .../test_types.rs | 42 +- 8 files changed, 110 insertions(+), 894 deletions(-) rename score/mw/com/impl/rust/com-api/com-api-integration-lola-test/{user_defined_types_test.rs => integration_test.rs} (57%) delete mode 100644 score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD index ec78b515e..58181e447 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD @@ -35,10 +35,9 @@ cc_library( rust_library( name = "integration-test-lola", srcs = [ + "integration_test.rs", "lib.rs", - "primitive_types_test.rs", "test_types.rs", - "user_defined_types_test.rs", ], visibility = [ "//visibility:public", # platform_only @@ -51,20 +50,7 @@ rust_library( ) rust_test( - name = "integration-test-primitives", - crate = ":integration-test-lola", - data = [":integration_test_config"], - features = ["link_std_cpp_lib"], - deps = [ - ":integration-test-lola", - ":integration_test_gen_cpp", - "//score/mw/com/impl/rust/com-api/com-api", - "//score/mw/com/impl/rust/com-api/com-api-runtime-lola", - ], -) - -rust_test( - name = "integration-test-user-defined", + name = "integration-test", crate = ":integration-test-lola", data = [":integration_test_config"], features = ["link_std_cpp_lib"], diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json index 58280d064..a37b5ffa9 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json @@ -1,7 +1,7 @@ { "serviceTypes": [ { - "serviceTypeName": "/score/test/U8Interface", + "serviceTypeName": "/score/test/MixedPrimitivesInterface", "version": { "major": 1, "minor": 0 @@ -12,197 +12,7 @@ "serviceId": 7001, "events": [ { - "eventName": "u8_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/U16Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7002, - "events": [ - { - "eventName": "u16_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/U32Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7003, - "events": [ - { - "eventName": "u32_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/U64Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7004, - "events": [ - { - "eventName": "u64_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/I8Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7005, - "events": [ - { - "eventName": "i8_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/I16Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7006, - "events": [ - { - "eventName": "i16_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/I32Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7007, - "events": [ - { - "eventName": "i32_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/I64Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7008, - "events": [ - { - "eventName": "i64_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/F32Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7009, - "events": [ - { - "eventName": "f32_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/F64Interface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7010, - "events": [ - { - "eventName": "f64_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/BoolInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7011, - "events": [ - { - "eventName": "bool_event", + "eventName": "mixed_event", "eventId": 1 } ] @@ -345,8 +155,8 @@ ], "serviceInstances": [ { - "instanceSpecifier": "/PrimitiveTest/U8", - "serviceTypeName": "/score/test/U8Interface", + "instanceSpecifier": "/IntegrationTest/MixedPrimitives", + "serviceTypeName": "/score/test/MixedPrimitivesInterface", "version": { "major": 1, "minor": 0 @@ -370,347 +180,7 @@ "binding": "SHM", "events": [ { - "eventName": "u8_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/U16", - "serviceTypeName": "/score/test/U16Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 2, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "u16_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/U32", - "serviceTypeName": "/score/test/U32Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 3, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "u32_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/U64", - "serviceTypeName": "/score/test/U64Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 4, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "u64_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/I8", - "serviceTypeName": "/score/test/I8Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 5, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "i8_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/I16", - "serviceTypeName": "/score/test/I16Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 6, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "i16_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/I32", - "serviceTypeName": "/score/test/I32Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 7, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "i32_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/I64", - "serviceTypeName": "/score/test/I64Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 8, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "i64_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/F32", - "serviceTypeName": "/score/test/F32Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 9, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "f32_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/F64", - "serviceTypeName": "/score/test/F64Interface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 10, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "f64_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/PrimitiveTest/Bool", - "serviceTypeName": "/score/test/BoolInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 11, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "bool_event", + "eventName": "mixed_event", "numberOfSampleSlots": 10, "maxSubscribers": 3 } diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs similarity index 57% rename from score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs rename to score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs index 9fa20a88b..88136a76f 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/user_defined_types_test.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs @@ -11,18 +11,55 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -//! Integration tests for user-defined types. -//! Each type has its own interface (generated by `interface!`) so every test -//! creates a producer/consumer pair using only the event it needs. +//! integration test module covering both primitive and user-defined payloads. +//! +//! Primitive types are validated through one combined `MixedPrimitivesPayload` #[cfg(test)] -mod user_defined_type_tests { +mod integration_tests { + use crate::generate_test; use crate::test_types::{ - ComplexStruct, ComplexStructInterface, NestedStruct, NestedStructInterface, Point, Point3D, - Point3DInterface, PointInterface, SensorData, SensorDataInterface, SimpleStruct, - SimpleStructInterface, VehicleState, VehicleStateInterface, + ComplexStruct, ComplexStructInterface, MixedPrimitivesInterface, MixedPrimitivesPayload, + NestedStruct, NestedStructInterface, Point, Point3D, Point3DInterface, PointInterface, + SensorData, SensorDataInterface, SimpleStruct, SimpleStructInterface, VehicleState, + VehicleStateInterface, }; - use crate::generate_test; + + generate_test!( + test = test_mixed_primitives_send_receive, + interface = MixedPrimitivesInterface, + event = mixed_event, + path = "/IntegrationTest/MixedPrimitives", + data = MixedPrimitivesPayload { + u64_val: u64::MAX, + i64_val: i64::MIN, + u32_val: u32::MAX, + i32_val: i32::MIN, + f32_val: std::f32::consts::E, + u16_val: u16::MAX, + i16_val: i16::MIN, + u8_val: u8::MAX, + i8_val: i8::MIN, + flag: true, + }, + assert = |r: &MixedPrimitivesPayload, e: &MixedPrimitivesPayload| { + assert_eq!(r.u64_val, e.u64_val, "u64_val mismatch"); + assert_eq!(r.i64_val, e.i64_val, "i64_val mismatch"); + assert_eq!(r.u32_val, e.u32_val, "u32_val mismatch"); + assert_eq!(r.i32_val, e.i32_val, "i32_val mismatch"); + assert!( + (r.f32_val - e.f32_val).abs() < 1e-6_f32, + "f32_val mismatch: {} vs {}", + r.f32_val, + e.f32_val + ); + assert_eq!(r.u16_val, e.u16_val, "u16_val mismatch"); + assert_eq!(r.i16_val, e.i16_val, "i16_val mismatch"); + assert_eq!(r.u8_val, e.u8_val, "u8_val mismatch"); + assert_eq!(r.i8_val, e.i8_val, "i8_val mismatch"); + assert_eq!(r.flag, e.flag, "flag mismatch"); + }, + ); generate_test!( test = test_simple_struct_send_receive, @@ -42,11 +79,11 @@ mod user_defined_type_tests { count: 42, temperature: 25.5, is_active: 1, - timestamp: 1234567890 + timestamp: 1_234_567_890, }, assert = |r: &ComplexStruct, e: &ComplexStruct| { assert_eq!(r.count, e.count); - assert!((r.temperature - e.temperature).abs() < 0.01); + assert!((r.temperature - e.temperature).abs() < 0.01_f32); assert_eq!(r.is_active, e.is_active); assert_eq!(r.timestamp, e.timestamp); }, @@ -60,12 +97,12 @@ mod user_defined_type_tests { data = NestedStruct { id: 1, simple: SimpleStruct { id: 123 }, - value: 99.9 + value: 99.9, }, assert = |r: &NestedStruct, e: &NestedStruct| { assert_eq!(r.id, e.id); assert_eq!(r.simple.id, e.simple.id); - assert!((r.value - e.value).abs() < 0.01); + assert!((r.value - e.value).abs() < 0.01_f32); }, ); @@ -76,8 +113,8 @@ mod user_defined_type_tests { path = "/UserDefinedTest/Point", data = Point { x: 1.5, y: 2.5 }, assert = |r: &Point, e: &Point| { - assert!((r.x - e.x).abs() < 0.001); - assert!((r.y - e.y).abs() < 0.001); + assert!((r.x - e.x).abs() < 0.001_f32); + assert!((r.y - e.y).abs() < 0.001_f32); }, ); @@ -89,12 +126,12 @@ mod user_defined_type_tests { data = Point3D { x: 1.0, y: 2.0, - z: 3.0 + z: 3.0, }, assert = |r: &Point3D, e: &Point3D| { - assert!((r.x - e.x).abs() < 0.001); - assert!((r.y - e.y).abs() < 0.001); - assert!((r.z - e.z).abs() < 0.001); + assert!((r.x - e.x).abs() < 0.001_f32); + assert!((r.y - e.y).abs() < 0.001_f32); + assert!((r.z - e.z).abs() < 0.001_f32); }, ); @@ -107,13 +144,13 @@ mod user_defined_type_tests { sensor_id: 1, temperature: 22.5, humidity: 45.0, - pressure: 1013.25 + pressure: 1013.25, }, assert = |r: &SensorData, e: &SensorData| { assert_eq!(r.sensor_id, e.sensor_id); - assert!((r.temperature - e.temperature).abs() < 0.01); - assert!((r.humidity - e.humidity).abs() < 0.01); - assert!((r.pressure - e.pressure).abs() < 0.01); + assert!((r.temperature - e.temperature).abs() < 0.01_f32); + assert!((r.humidity - e.humidity).abs() < 0.01_f32); + assert!((r.pressure - e.pressure).abs() < 0.01_f32); }, ); @@ -127,12 +164,12 @@ mod user_defined_type_tests { rpm: 3000, fuel_level: 75.0, is_running: 1, - mileage: 50000 + mileage: 50_000, }, assert = |r: &VehicleState, e: &VehicleState| { - assert!((r.speed - e.speed).abs() < 0.1); + assert!((r.speed - e.speed).abs() < 0.1_f32); assert_eq!(r.rpm, e.rpm); - assert!((r.fuel_level - e.fuel_level).abs() < 0.1); + assert!((r.fuel_level - e.fuel_level).abs() < 0.1_f32); assert_eq!(r.is_running, e.is_running); assert_eq!(r.mileage, e.mileage); }, diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp index 831c1dc6b..abd45bd75 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp @@ -14,70 +14,10 @@ #include "integration_test_gen.h" #include "score/mw/com/impl/rust/com-api/com-api-ffi-lola/registry_bridge_macro.h" -BEGIN_EXPORT_MW_COM_INTERFACE(U8Interface, - ::score::mw::com::integration_test::U8Proxy, - ::score::mw::com::integration_test::U8Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U8Data, u8_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(U16Interface, - ::score::mw::com::integration_test::U16Proxy, - ::score::mw::com::integration_test::U16Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U16Data, u16_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(U32Interface, - ::score::mw::com::integration_test::U32Proxy, - ::score::mw::com::integration_test::U32Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U32Data, u32_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(U64Interface, - ::score::mw::com::integration_test::U64Proxy, - ::score::mw::com::integration_test::U64Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::U64Data, u64_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(I8Interface, - ::score::mw::com::integration_test::I8Proxy, - ::score::mw::com::integration_test::I8Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I8Data, i8_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(I16Interface, - ::score::mw::com::integration_test::I16Proxy, - ::score::mw::com::integration_test::I16Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I16Data, i16_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(I32Interface, - ::score::mw::com::integration_test::I32Proxy, - ::score::mw::com::integration_test::I32Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I32Data, i32_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(I64Interface, - ::score::mw::com::integration_test::I64Proxy, - ::score::mw::com::integration_test::I64Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::I64Data, i64_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(F32Interface, - ::score::mw::com::integration_test::F32Proxy, - ::score::mw::com::integration_test::F32Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::F32Data, f32_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(F64Interface, - ::score::mw::com::integration_test::F64Proxy, - ::score::mw::com::integration_test::F64Skeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::F64Data, f64_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(BoolInterface, - ::score::mw::com::integration_test::BoolProxy, - ::score::mw::com::integration_test::BoolSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::BoolData, bool_event) +BEGIN_EXPORT_MW_COM_INTERFACE(MixedPrimitivesInterface, + ::score::mw::com::integration_test::MixedPrimitivesProxy, + ::score::mw::com::integration_test::MixedPrimitivesSkeleton) +EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::MixedPrimitivesPayload, mixed_event) END_EXPORT_MW_COM_INTERFACE() BEGIN_EXPORT_MW_COM_INTERFACE(SimpleStructInterface, @@ -123,17 +63,7 @@ EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::VehicleState, vehicle_ev END_EXPORT_MW_COM_INTERFACE() // Export all types -EXPORT_MW_COM_TYPE(U8Data, ::score::mw::com::integration_test::U8Data) -EXPORT_MW_COM_TYPE(U16Data, ::score::mw::com::integration_test::U16Data) -EXPORT_MW_COM_TYPE(U32Data, ::score::mw::com::integration_test::U32Data) -EXPORT_MW_COM_TYPE(U64Data, ::score::mw::com::integration_test::U64Data) -EXPORT_MW_COM_TYPE(I8Data, ::score::mw::com::integration_test::I8Data) -EXPORT_MW_COM_TYPE(I16Data, ::score::mw::com::integration_test::I16Data) -EXPORT_MW_COM_TYPE(I32Data, ::score::mw::com::integration_test::I32Data) -EXPORT_MW_COM_TYPE(I64Data, ::score::mw::com::integration_test::I64Data) -EXPORT_MW_COM_TYPE(F32Data, ::score::mw::com::integration_test::F32Data) -EXPORT_MW_COM_TYPE(F64Data, ::score::mw::com::integration_test::F64Data) -EXPORT_MW_COM_TYPE(BoolData, ::score::mw::com::integration_test::BoolData) +EXPORT_MW_COM_TYPE(MixedPrimitivesPayload, ::score::mw::com::integration_test::MixedPrimitivesPayload) EXPORT_MW_COM_TYPE(SimpleStruct, ::score::mw::com::integration_test::SimpleStruct) EXPORT_MW_COM_TYPE(ComplexStruct, ::score::mw::com::integration_test::ComplexStruct) EXPORT_MW_COM_TYPE(NestedStruct, ::score::mw::com::integration_test::NestedStruct) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h index 00f8c4b8d..1f3ea6a7c 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h @@ -22,59 +22,20 @@ namespace score::mw::com::integration_test { -struct U8Data -{ - uint8_t value; -}; - -struct U16Data -{ - uint16_t value; -}; - -struct U32Data -{ - uint32_t value; -}; - -struct U64Data -{ - uint64_t value; -}; - -struct I8Data -{ - int8_t value; -}; - -struct I16Data -{ - int16_t value; -}; - -struct I32Data -{ - int32_t value; -}; - -struct I64Data -{ - int64_t value; -}; - -struct F32Data -{ - float value; -}; - -struct F64Data -{ - double value; -}; - -struct BoolData -{ - bool value; +/// Combined payload carrying every primitive type in a single struct. +/// Field order follows descending alignment to eliminate padding bytes. +struct MixedPrimitivesPayload +{ + uint64_t u64_val; + int64_t i64_val; + uint32_t u32_val; + int32_t i32_val; + float f32_val; + uint16_t u16_val; + int16_t i16_val; + uint8_t u8_val; + int8_t i8_val; + bool flag; }; struct SimpleStruct @@ -137,18 +98,8 @@ struct VehicleState typename Trait::template Event EventName{*this, #EventName}; \ }; -// Primitive type interfaces (one per type) -CREATE_INTERFACE(U8Interface, U8Data, u8_event) -CREATE_INTERFACE(U16Interface, U16Data, u16_event) -CREATE_INTERFACE(U32Interface, U32Data, u32_event) -CREATE_INTERFACE(U64Interface, U64Data, u64_event) -CREATE_INTERFACE(I8Interface, I8Data, i8_event) -CREATE_INTERFACE(I16Interface, I16Data, i16_event) -CREATE_INTERFACE(I32Interface, I32Data, i32_event) -CREATE_INTERFACE(I64Interface, I64Data, i64_event) -CREATE_INTERFACE(F32Interface, F32Data, f32_event) -CREATE_INTERFACE(F64Interface, F64Data, f64_event) -CREATE_INTERFACE(BoolInterface, BoolData, bool_event) +// Combined primitive payload interface +CREATE_INTERFACE(MixedPrimitivesInterface, MixedPrimitivesPayload, mixed_event) // User-defined type interfaces (one per type) CREATE_INTERFACE(SimpleStructInterface, SimpleStruct, simple_event) @@ -160,28 +111,8 @@ CREATE_INTERFACE(SensorDataInterface, SensorData, sensor_event) CREATE_INTERFACE(VehicleStateInterface, VehicleState, vehicle_event) // Type aliases for proxy and skeleton -using U8Proxy = ::score::mw::com::AsProxy; -using U8Skeleton = ::score::mw::com::AsSkeleton; -using U16Proxy = ::score::mw::com::AsProxy; -using U16Skeleton = ::score::mw::com::AsSkeleton; -using U32Proxy = ::score::mw::com::AsProxy; -using U32Skeleton = ::score::mw::com::AsSkeleton; -using U64Proxy = ::score::mw::com::AsProxy; -using U64Skeleton = ::score::mw::com::AsSkeleton; -using I8Proxy = ::score::mw::com::AsProxy; -using I8Skeleton = ::score::mw::com::AsSkeleton; -using I16Proxy = ::score::mw::com::AsProxy; -using I16Skeleton = ::score::mw::com::AsSkeleton; -using I32Proxy = ::score::mw::com::AsProxy; -using I32Skeleton = ::score::mw::com::AsSkeleton; -using I64Proxy = ::score::mw::com::AsProxy; -using I64Skeleton = ::score::mw::com::AsSkeleton; -using F32Proxy = ::score::mw::com::AsProxy; -using F32Skeleton = ::score::mw::com::AsSkeleton; -using F64Proxy = ::score::mw::com::AsProxy; -using F64Skeleton = ::score::mw::com::AsSkeleton; -using BoolProxy = ::score::mw::com::AsProxy; -using BoolSkeleton = ::score::mw::com::AsSkeleton; +using MixedPrimitivesProxy = ::score::mw::com::AsProxy; +using MixedPrimitivesSkeleton = ::score::mw::com::AsSkeleton; using SimpleStructProxy = ::score::mw::com::AsProxy; using SimpleStructSkeleton = ::score::mw::com::AsSkeleton; using ComplexStructProxy = ::score::mw::com::AsProxy; diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs index 0033f791f..15470ef08 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs @@ -24,7 +24,4 @@ pub mod test_types; #[cfg(test)] -mod primitive_types_test; - -#[cfg(test)] -mod user_defined_types_test; +mod integration_test; diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs deleted file mode 100644 index 37e3a5d04..000000000 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/primitive_types_test.rs +++ /dev/null @@ -1,127 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -//! Integration tests for primitive types. -//! Each type has its own interface (generated by `interface!`) so every test -//! creates a producer/consumer pair using only the event it needs. - -#[cfg(test)] -mod primitive_type_tests { - use crate::generate_test; - use crate::test_types::{ - BoolData, BoolInterface, F32Data, F32Interface, F64Data, F64Interface, I16Data, - I16Interface, I32Data, I32Interface, I64Data, I64Interface, I8Data, I8Interface, U16Data, - U16Interface, U32Data, U32Interface, U64Data, U64Interface, U8Data, U8Interface, - }; - - generate_test!( - test = test_u8_send_receive, - interface = U8Interface, - event = u8_event, - path = "/PrimitiveTest/U8", - data = U8Data { value: 255_u8 }, - assert = |a: &U8Data, b: &U8Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_u16_send_receive, - interface = U16Interface, - event = u16_event, - path = "/PrimitiveTest/U16", - data = U16Data { value: u16::MAX }, - assert = |a: &U16Data, b: &U16Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_u32_send_receive, - interface = U32Interface, - event = u32_event, - path = "/PrimitiveTest/U32", - data = U32Data { value: u32::MAX }, - assert = |a: &U32Data, b: &U32Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_u64_send_receive, - interface = U64Interface, - event = u64_event, - path = "/PrimitiveTest/U64", - data = U64Data { value: u64::MAX }, - assert = |a: &U64Data, b: &U64Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_i8_send_receive, - interface = I8Interface, - event = i8_event, - path = "/PrimitiveTest/I8", - data = I8Data { value: i8::MIN }, - assert = |a: &I8Data, b: &I8Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_i16_send_receive, - interface = I16Interface, - event = i16_event, - path = "/PrimitiveTest/I16", - data = I16Data { value: i16::MIN }, - assert = |a: &I16Data, b: &I16Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_i32_send_receive, - interface = I32Interface, - event = i32_event, - path = "/PrimitiveTest/I32", - data = I32Data { value: i32::MIN }, - assert = |a: &I32Data, b: &I32Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_i64_send_receive, - interface = I64Interface, - event = i64_event, - path = "/PrimitiveTest/I64", - data = I64Data { value: i64::MIN }, - assert = |a: &I64Data, b: &I64Data| assert_eq!(a.value, b.value), - ); - - generate_test!( - test = test_f32_send_receive, - interface = F32Interface, - event = f32_event, - path = "/PrimitiveTest/F32", - data = F32Data { value: 3.14159_f32 }, - assert = |a: &F32Data, b: &F32Data| assert!((a.value - b.value).abs() < 1e-5_f32), - ); - - generate_test!( - test = test_f64_send_receive, - interface = F64Interface, - event = f64_event, - path = "/PrimitiveTest/F64", - data = F64Data { - value: 3.141_592_653_589_793_f64 - }, - assert = |a: &F64Data, b: &F64Data| assert!((a.value - b.value).abs() < 1e-7_f64), - ); - - generate_test!( - test = test_bool_send_receive, - interface = BoolInterface, - event = bool_event, - path = "/PrimitiveTest/Bool", - data = BoolData { value: true }, - assert = |a: &BoolData, b: &BoolData| assert_eq!(a.value, b.value), - ); -} diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs index 9455f717c..198a1bf5c 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs @@ -39,19 +39,21 @@ macro_rules! define_type { }; } -define_type!(U8Data, eq, value: u8); -define_type!(U16Data, eq, value: u16); -define_type!(U32Data, eq, value: u32); -define_type!(U64Data, eq, value: u64); -define_type!(I8Data, eq, value: i8); -define_type!(I16Data, eq, value: i16); -define_type!(I32Data, eq, value: i32); -define_type!(I64Data, eq, value: i64); -define_type!(BoolData, eq, value: bool); - -// Floating point types (without Eq) -define_type!(F32Data, value: f32); -define_type!(F64Data, value: f64); +// Combined primitive payload – all primitive types packed into one struct. +// Field order follows descending alignment to match the C++ repr(C) layout. +define_type!( + MixedPrimitivesPayload, + u64_val: u64, + i64_val: i64, + u32_val: u32, + i32_val: i32, + f32_val: f32, + u16_val: u16, + i16_val: i16, + u8_val: u8, + i8_val: i8, + flag: bool +); // Complex struct types define_type!(SimpleStruct, eq, id: u32); @@ -62,17 +64,7 @@ define_type!(Point3D, x: f32, y: f32, z: f32); define_type!(SensorData, sensor_id: u16, temperature: f32, humidity: f32, pressure: f32); define_type!(VehicleState, speed: f32, rpm: u16, fuel_level: f32, is_running: u8, mileage: u32); -interface!(interface U8, { Id = "U8Interface", u8_event: Event }); -interface!(interface U16, { Id = "U16Interface", u16_event: Event }); -interface!(interface U32, { Id = "U32Interface", u32_event: Event }); -interface!(interface U64, { Id = "U64Interface", u64_event: Event }); -interface!(interface I8, { Id = "I8Interface", i8_event: Event }); -interface!(interface I16, { Id = "I16Interface", i16_event: Event }); -interface!(interface I32, { Id = "I32Interface", i32_event: Event }); -interface!(interface I64, { Id = "I64Interface", i64_event: Event }); -interface!(interface F32, { Id = "F32Interface", f32_event: Event }); -interface!(interface F64, { Id = "F64Interface", f64_event: Event }); -interface!(interface Bool, { Id = "BoolInterface", bool_event: Event }); +interface!(interface MixedPrimitives, { Id = "MixedPrimitivesInterface", mixed_event: Event }); interface!(interface SimpleStruct, { Id = "SimpleStructInterface", simple_event: Event }); interface!(interface ComplexStruct, { Id = "ComplexStructInterface", complex_event: Event }); @@ -80,7 +72,7 @@ interface!(interface NestedStruct, { Id = "NestedStructInterface", nested_even interface!(interface Point, { Id = "PointInterface", point_event: Event }); interface!(interface Point3D, { Id = "Point3DInterface", point3d_event: Event }); interface!(interface SensorData, { Id = "SensorDataInterface", sensor_event: Event }); -interface!(interface VehicleState, { Id = "VehicleStateInterface", vehicle_event: Event }); +interface!(interface VehicleState, { Id = "VehicleStateInterface", vehicle_event: Event }); // Generic test macro for send/receive tests #[macro_export] From 297ffad47fc1848ddbb309acd202240ef4687f9e Mon Sep 17 00:00:00 2001 From: bharatgoswami Date: Tue, 24 Mar 2026 16:02:07 +0530 Subject: [PATCH 4/4] Rust::com Update the test cases * Updated complex struct test case --- .../com-api-integration-lola-test/BUILD | 2 +- .../com-api-integration-lola-test/config.json | 318 ------------------ .../integration_test.rs | 165 ++++----- .../integration_test_gen.cpp | 44 +-- .../integration_test_gen.h | 68 ++-- .../com-api-integration-lola-test/lib.rs | 6 +- .../test_types.rs | 13 +- 7 files changed, 94 insertions(+), 522 deletions(-) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD index 58181e447..5e51f2fc5 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/BUILD @@ -1,5 +1,5 @@ # ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation +# Copyright (c) 2026 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json index a37b5ffa9..990db5d3c 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/config.json @@ -19,25 +19,6 @@ } ] }, - { - "serviceTypeName": "/score/test/SimpleStructInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7012, - "events": [ - { - "eventName": "simple_event", - "eventId": 1 - } - ] - } - ] - }, { "serviceTypeName": "/score/test/ComplexStructInterface", "version": { @@ -56,101 +37,6 @@ ] } ] - }, - { - "serviceTypeName": "/score/test/NestedStructInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7014, - "events": [ - { - "eventName": "nested_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/PointInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7015, - "events": [ - { - "eventName": "point_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/Point3DInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7016, - "events": [ - { - "eventName": "point3d_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/SensorDataInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7017, - "events": [ - { - "eventName": "sensor_event", - "eventId": 1 - } - ] - } - ] - }, - { - "serviceTypeName": "/score/test/VehicleStateInterface", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 7018, - "events": [ - { - "eventName": "vehicle_event", - "eventId": 1 - } - ] - } - ] } ], "serviceInstances": [ @@ -188,40 +74,6 @@ } ] }, - { - "instanceSpecifier": "/UserDefinedTest/SimpleStruct", - "serviceTypeName": "/score/test/SimpleStructInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 12, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "simple_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, { "instanceSpecifier": "/UserDefinedTest/ComplexStruct", "serviceTypeName": "/score/test/ComplexStructInterface", @@ -255,176 +107,6 @@ ] } ] - }, - { - "instanceSpecifier": "/UserDefinedTest/NestedStruct", - "serviceTypeName": "/score/test/NestedStructInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 14, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "nested_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/UserDefinedTest/Point", - "serviceTypeName": "/score/test/PointInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 15, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "point_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/UserDefinedTest/Point3D", - "serviceTypeName": "/score/test/Point3DInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 16, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "point3d_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/UserDefinedTest/SensorData", - "serviceTypeName": "/score/test/SensorDataInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 17, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "sensor_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - }, - { - "instanceSpecifier": "/UserDefinedTest/VehicleState", - "serviceTypeName": "/score/test/VehicleStateInterface", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 18, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "vehicle_event", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] } ] } diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs index 88136a76f..ca10da264 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test.rs @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2026 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -14,15 +14,16 @@ //! integration test module covering both primitive and user-defined payloads. //! //! Primitive types are validated through one combined `MixedPrimitivesPayload` - +//! Complex user-defined types are validated through `ComplexStruct` +//! The tests ensure that the COM API correctly handles data transmission and reception +//! for both primitive and complex types when integrated with the Lola runtime. #[cfg(test)] mod integration_tests { use crate::generate_test; use crate::test_types::{ - ComplexStruct, ComplexStructInterface, MixedPrimitivesInterface, MixedPrimitivesPayload, - NestedStruct, NestedStructInterface, Point, Point3D, Point3DInterface, PointInterface, - SensorData, SensorDataInterface, SimpleStruct, SimpleStructInterface, VehicleState, - VehicleStateInterface, + ArrayStruct, ComplexStruct, ComplexStructInterface, MixedPrimitivesInterface, + MixedPrimitivesPayload, NestedStruct, Point, Point3D, SensorData, SimpleStruct, + VehicleState, }; generate_test!( @@ -61,15 +62,6 @@ mod integration_tests { }, ); - generate_test!( - test = test_simple_struct_send_receive, - interface = SimpleStructInterface, - event = simple_event, - path = "/UserDefinedTest/SimpleStruct", - data = SimpleStruct { id: 42 }, - assert = |r: &SimpleStruct, e: &SimpleStruct| assert_eq!(r.id, e.id), - ); - generate_test!( test = test_complex_struct_send_receive, interface = ComplexStructInterface, @@ -77,101 +69,62 @@ mod integration_tests { path = "/UserDefinedTest/ComplexStruct", data = ComplexStruct { count: 42, - temperature: 25.5, - is_active: 1, - timestamp: 1_234_567_890, + simple: SimpleStruct { id: 10 }, + nested: NestedStruct { + id: 1, + simple: SimpleStruct { id: 123 }, + value: 99.9 + }, + point: Point { x: 1.5, y: 2.5 }, + point3d: Point3D { + x: 1.0, + y: 2.0, + z: 3.0 + }, + sensor: SensorData { + sensor_id: 7, + temperature: 22.5, + humidity: 45.0, + pressure: 1013.25 + }, + vehicle: VehicleState { + speed: 60.0, + rpm: 3000, + fuel_level: 75.0, + is_running: 1, + mileage: 50_000 + }, + array: ArrayStruct { + values: [1, 2, 3, 4, 5] + } }, assert = |r: &ComplexStruct, e: &ComplexStruct| { assert_eq!(r.count, e.count); - assert!((r.temperature - e.temperature).abs() < 0.01_f32); - assert_eq!(r.is_active, e.is_active); - assert_eq!(r.timestamp, e.timestamp); - }, - ); - - generate_test!( - test = test_nested_struct_send_receive, - interface = NestedStructInterface, - event = nested_event, - path = "/UserDefinedTest/NestedStruct", - data = NestedStruct { - id: 1, - simple: SimpleStruct { id: 123 }, - value: 99.9, - }, - assert = |r: &NestedStruct, e: &NestedStruct| { - assert_eq!(r.id, e.id); assert_eq!(r.simple.id, e.simple.id); - assert!((r.value - e.value).abs() < 0.01_f32); - }, - ); - - generate_test!( - test = test_point_2d_send_receive, - interface = PointInterface, - event = point_event, - path = "/UserDefinedTest/Point", - data = Point { x: 1.5, y: 2.5 }, - assert = |r: &Point, e: &Point| { - assert!((r.x - e.x).abs() < 0.001_f32); - assert!((r.y - e.y).abs() < 0.001_f32); - }, - ); - - generate_test!( - test = test_point_3d_send_receive, - interface = Point3DInterface, - event = point3d_event, - path = "/UserDefinedTest/Point3D", - data = Point3D { - x: 1.0, - y: 2.0, - z: 3.0, - }, - assert = |r: &Point3D, e: &Point3D| { - assert!((r.x - e.x).abs() < 0.001_f32); - assert!((r.y - e.y).abs() < 0.001_f32); - assert!((r.z - e.z).abs() < 0.001_f32); - }, - ); - - generate_test!( - test = test_sensor_data_send_receive, - interface = SensorDataInterface, - event = sensor_event, - path = "/UserDefinedTest/SensorData", - data = SensorData { - sensor_id: 1, - temperature: 22.5, - humidity: 45.0, - pressure: 1013.25, - }, - assert = |r: &SensorData, e: &SensorData| { - assert_eq!(r.sensor_id, e.sensor_id); - assert!((r.temperature - e.temperature).abs() < 0.01_f32); - assert!((r.humidity - e.humidity).abs() < 0.01_f32); - assert!((r.pressure - e.pressure).abs() < 0.01_f32); - }, - ); - - generate_test!( - test = test_vehicle_state_send_receive, - interface = VehicleStateInterface, - event = vehicle_event, - path = "/UserDefinedTest/VehicleState", - data = VehicleState { - speed: 60.0, - rpm: 3000, - fuel_level: 75.0, - is_running: 1, - mileage: 50_000, - }, - assert = |r: &VehicleState, e: &VehicleState| { - assert!((r.speed - e.speed).abs() < 0.1_f32); - assert_eq!(r.rpm, e.rpm); - assert!((r.fuel_level - e.fuel_level).abs() < 0.1_f32); - assert_eq!(r.is_running, e.is_running); - assert_eq!(r.mileage, e.mileage); + assert_eq!(r.nested.id, e.nested.id); + assert_eq!(r.nested.simple.id, e.nested.simple.id); + assert!((r.nested.value - e.nested.value).abs() < 0.01_f32); + assert!((r.point.x - e.point.x).abs() < 0.001_f32); + assert!((r.point.y - e.point.y).abs() < 0.001_f32); + assert!((r.point3d.x - e.point3d.x).abs() < 0.001_f32); + assert!((r.point3d.y - e.point3d.y).abs() < 0.001_f32); + assert!((r.point3d.z - e.point3d.z).abs() < 0.001_f32); + assert_eq!(r.sensor.sensor_id, e.sensor.sensor_id); + assert!((r.sensor.temperature - e.sensor.temperature).abs() < 0.01_f32); + assert!((r.sensor.humidity - e.sensor.humidity).abs() < 0.01_f32); + assert!((r.sensor.pressure - e.sensor.pressure).abs() < 0.01_f32); + assert!((r.vehicle.speed - e.vehicle.speed).abs() < 0.1_f32); + assert_eq!(r.vehicle.rpm, e.vehicle.rpm); + assert!((r.vehicle.fuel_level - e.vehicle.fuel_level).abs() < 0.1_f32); + assert_eq!(r.vehicle.is_running, e.vehicle.is_running); + assert_eq!(r.vehicle.mileage, e.vehicle.mileage); + for i in 0..r.array.values.len() { + assert_eq!( + r.array.values[i], e.array.values[i], + "array.values[{}] mismatch", + i + ); + } }, ); } diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp index abd45bd75..186a32dbc 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.cpp @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2026 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -20,54 +20,12 @@ BEGIN_EXPORT_MW_COM_INTERFACE(MixedPrimitivesInterface, EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::MixedPrimitivesPayload, mixed_event) END_EXPORT_MW_COM_INTERFACE() -BEGIN_EXPORT_MW_COM_INTERFACE(SimpleStructInterface, - ::score::mw::com::integration_test::SimpleStructProxy, - ::score::mw::com::integration_test::SimpleStructSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::SimpleStruct, simple_event) -END_EXPORT_MW_COM_INTERFACE() - BEGIN_EXPORT_MW_COM_INTERFACE(ComplexStructInterface, ::score::mw::com::integration_test::ComplexStructProxy, ::score::mw::com::integration_test::ComplexStructSkeleton) EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::ComplexStruct, complex_event) END_EXPORT_MW_COM_INTERFACE() -BEGIN_EXPORT_MW_COM_INTERFACE(NestedStructInterface, - ::score::mw::com::integration_test::NestedStructProxy, - ::score::mw::com::integration_test::NestedStructSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::NestedStruct, nested_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(PointInterface, - ::score::mw::com::integration_test::PointProxy, - ::score::mw::com::integration_test::PointSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::Point, point_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(Point3DInterface, - ::score::mw::com::integration_test::Point3DProxy, - ::score::mw::com::integration_test::Point3DSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::Point3D, point3d_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(SensorDataInterface, - ::score::mw::com::integration_test::SensorDataProxy, - ::score::mw::com::integration_test::SensorDataSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::SensorData, sensor_event) -END_EXPORT_MW_COM_INTERFACE() - -BEGIN_EXPORT_MW_COM_INTERFACE(VehicleStateInterface, - ::score::mw::com::integration_test::VehicleStateProxy, - ::score::mw::com::integration_test::VehicleStateSkeleton) -EXPORT_MW_COM_EVENT(::score::mw::com::integration_test::VehicleState, vehicle_event) -END_EXPORT_MW_COM_INTERFACE() - // Export all types EXPORT_MW_COM_TYPE(MixedPrimitivesPayload, ::score::mw::com::integration_test::MixedPrimitivesPayload) -EXPORT_MW_COM_TYPE(SimpleStruct, ::score::mw::com::integration_test::SimpleStruct) EXPORT_MW_COM_TYPE(ComplexStruct, ::score::mw::com::integration_test::ComplexStruct) -EXPORT_MW_COM_TYPE(NestedStruct, ::score::mw::com::integration_test::NestedStruct) -EXPORT_MW_COM_TYPE(Point, ::score::mw::com::integration_test::Point) -EXPORT_MW_COM_TYPE(Point3D, ::score::mw::com::integration_test::Point3D) -EXPORT_MW_COM_TYPE(SensorData, ::score::mw::com::integration_test::SensorData) -EXPORT_MW_COM_TYPE(VehicleState, ::score::mw::com::integration_test::VehicleState) diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h index 1f3ea6a7c..4a32ed5e0 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/integration_test_gen.h @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2026 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -27,15 +27,15 @@ namespace score::mw::com::integration_test struct MixedPrimitivesPayload { uint64_t u64_val; - int64_t i64_val; + int64_t i64_val; uint32_t u32_val; - int32_t i32_val; - float f32_val; + int32_t i32_val; + float f32_val; uint16_t u16_val; - int16_t i16_val; - uint8_t u8_val; - int8_t i8_val; - bool flag; + int16_t i16_val; + uint8_t u8_val; + int8_t i8_val; + bool flag; }; struct SimpleStruct @@ -43,14 +43,6 @@ struct SimpleStruct uint32_t id; }; -struct ComplexStruct -{ - uint32_t count; - float temperature; - uint8_t is_active; - uint64_t timestamp; -}; - struct NestedStruct { uint32_t id; @@ -88,6 +80,23 @@ struct VehicleState uint32_t mileage; }; +struct ArrayStruct +{ + uint32_t values[5]; +}; + +struct ComplexStruct +{ + uint32_t count; + SimpleStruct simple; + NestedStruct nested; + Point point; + Point3D point3d; + SensorData sensor; + VehicleState vehicle; + ArrayStruct array; +}; + // Macro to generate interface classes #define CREATE_INTERFACE(ClassName, DataType, EventName) \ template \ @@ -98,35 +107,14 @@ struct VehicleState typename Trait::template Event EventName{*this, #EventName}; \ }; -// Combined primitive payload interface +// payload interface CREATE_INTERFACE(MixedPrimitivesInterface, MixedPrimitivesPayload, mixed_event) - -// User-defined type interfaces (one per type) -CREATE_INTERFACE(SimpleStructInterface, SimpleStruct, simple_event) CREATE_INTERFACE(ComplexStructInterface, ComplexStruct, complex_event) -CREATE_INTERFACE(NestedStructInterface, NestedStruct, nested_event) -CREATE_INTERFACE(PointInterface, Point, point_event) -CREATE_INTERFACE(Point3DInterface, Point3D, point3d_event) -CREATE_INTERFACE(SensorDataInterface, SensorData, sensor_event) -CREATE_INTERFACE(VehicleStateInterface, VehicleState, vehicle_event) // Type aliases for proxy and skeleton -using MixedPrimitivesProxy = ::score::mw::com::AsProxy; -using MixedPrimitivesSkeleton = ::score::mw::com::AsSkeleton; -using SimpleStructProxy = ::score::mw::com::AsProxy; -using SimpleStructSkeleton = ::score::mw::com::AsSkeleton; +using MixedPrimitivesProxy = ::score::mw::com::AsProxy; +using MixedPrimitivesSkeleton = ::score::mw::com::AsSkeleton; using ComplexStructProxy = ::score::mw::com::AsProxy; using ComplexStructSkeleton = ::score::mw::com::AsSkeleton; -using NestedStructProxy = ::score::mw::com::AsProxy; -using NestedStructSkeleton = ::score::mw::com::AsSkeleton; -using PointProxy = ::score::mw::com::AsProxy; -using PointSkeleton = ::score::mw::com::AsSkeleton; -using Point3DProxy = ::score::mw::com::AsProxy; -using Point3DSkeleton = ::score::mw::com::AsSkeleton; -using SensorDataProxy = ::score::mw::com::AsProxy; -using SensorDataSkeleton = ::score::mw::com::AsSkeleton; -using VehicleStateProxy = ::score::mw::com::AsProxy; -using VehicleStateSkeleton = ::score::mw::com::AsSkeleton; } // namespace score::mw::com::integration_test - #endif // SCORE_MW_COM_IMPL_RUST_COM_API_INTEGRATION_TEST_LOLA_INTEGRATION_TEST_GEN_H diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs index 15470ef08..349629225 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/lib.rs @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2026 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -17,9 +17,7 @@ //! The tests cover various aspects of the COM API, including producer and consumer interactions, data transmission, and service discovery. //! The tests are designed to validate the correct functioning of the COM API abstractions when interfacing with the Lola middleware, //! ensuring that data is correctly produced, transmitted, and consumed across different scenarios. -//! The test suite includes cases for primitive data types as well as user-defined types, -//! providing a thorough validation of the COM API's capabilities in a real-world integration context. -//! covering all primitive types and user-defined types. +//! The test suite includes cases for primitive data types as well as user-defined types. pub mod test_types; diff --git a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs index 198a1bf5c..3c2975394 100644 --- a/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs +++ b/score/mw/com/impl/rust/com-api/com-api-integration-lola-test/test_types.rs @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2026 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -40,7 +40,6 @@ macro_rules! define_type { } // Combined primitive payload – all primitive types packed into one struct. -// Field order follows descending alignment to match the C++ repr(C) layout. define_type!( MixedPrimitivesPayload, u64_val: u64, @@ -57,22 +56,16 @@ define_type!( // Complex struct types define_type!(SimpleStruct, eq, id: u32); -define_type!(ComplexStruct, count: u32, temperature: f32, is_active: u8, timestamp: u64); define_type!(NestedStruct, id: u32, simple: SimpleStruct, value: f32); define_type!(Point, x: f32, y: f32); define_type!(Point3D, x: f32, y: f32, z: f32); define_type!(SensorData, sensor_id: u16, temperature: f32, humidity: f32, pressure: f32); define_type!(VehicleState, speed: f32, rpm: u16, fuel_level: f32, is_running: u8, mileage: u32); +define_type!(ArrayStruct, eq, values: [u32; 5]); +define_type!(ComplexStruct, count: u32, simple: SimpleStruct, nested: NestedStruct, point: Point, point3d: Point3D, sensor: SensorData, vehicle: VehicleState, array: ArrayStruct); interface!(interface MixedPrimitives, { Id = "MixedPrimitivesInterface", mixed_event: Event }); - -interface!(interface SimpleStruct, { Id = "SimpleStructInterface", simple_event: Event }); interface!(interface ComplexStruct, { Id = "ComplexStructInterface", complex_event: Event }); -interface!(interface NestedStruct, { Id = "NestedStructInterface", nested_event: Event }); -interface!(interface Point, { Id = "PointInterface", point_event: Event }); -interface!(interface Point3D, { Id = "Point3DInterface", point3d_event: Event }); -interface!(interface SensorData, { Id = "SensorDataInterface", sensor_event: Event }); -interface!(interface VehicleState, { Id = "VehicleStateInterface", vehicle_event: Event }); // Generic test macro for send/receive tests #[macro_export]