From 1c37ea5f423825561ee1c1b92788f6a5118becf7 Mon Sep 17 00:00:00 2001 From: Irene Bandera Moreno Date: Fri, 3 Nov 2023 11:53:20 +0100 Subject: [PATCH] Generate schemas in ROS 2 msg format (#69) * Create demangle files Signed-off-by: Irene Bandera * Add demangle test Signed-off-by: Irene Bandera * Remap demangle -> ros2_mangling & add comments Signed-off-by: Irene Bandera * Add mangling functions Signed-off-by: Irene Bandera * Update versions.md Signed-off-by: Irene Bandera * Move ROS 2 Mangling methods to cpp_utils package Signed-off-by: Irene Bandera * Store schemas in ROS 2 msg format Signed-off-by: Irene Bandera * Update versions.md Signed-off-by: Irene Bandera * Apply changes Signed-off-by: Irene Bandera * Uncrustify Signed-off-by: Irene Bandera --------- Signed-off-by: Irene Bandera --- .../types/dynamic_types/schema.hpp | 12 + .../{schema.cpp => schema_idl.cpp} | 8 +- .../cpp/types/dynamic_types/schema_msg.cpp | 331 ++++++++++++++++++ .../types/dynamic_types/CMakeLists.txt | 56 ++- ...{dtypes_tests.cpp => dtypes_idl_tests.cpp} | 4 +- .../types/dynamic_types/dtypes_msg_tests.cpp | 102 ++++++ .../types/msgs/arrays_and_sequences.msg | 7 + .../types/msgs/basic_array_struct.msg | 6 + .../dynamic_types/types/msgs/basic_struct.msg | 4 + .../types/msgs/char_sequence.msg | 1 + .../types/msgs/complex_nested_arrays.msg | 14 + .../types/msgs/float_bounded_sequence.msg | 1 + .../dynamic_types/types/msgs/hello_world.msg | 2 + .../types/msgs/numeric_array.msg | 1 + ddspipe_participants/test/CMakeLists.txt | 1 + versions.md | 4 + 16 files changed, 547 insertions(+), 7 deletions(-) rename ddspipe_core/src/cpp/types/dynamic_types/{schema.cpp => schema_idl.cpp} (99%) create mode 100644 ddspipe_core/src/cpp/types/dynamic_types/schema_msg.cpp rename ddspipe_core/test/unittest/types/dynamic_types/{dtypes_tests.cpp => dtypes_idl_tests.cpp} (94%) create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/dtypes_msg_tests.cpp create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/arrays_and_sequences.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_array_struct.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_struct.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/char_sequence.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/complex_nested_arrays.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/float_bounded_sequence.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/hello_world.msg create mode 100644 ddspipe_core/test/unittest/types/dynamic_types/types/msgs/numeric_array.msg diff --git a/ddspipe_core/include/ddspipe_core/types/dynamic_types/schema.hpp b/ddspipe_core/include/ddspipe_core/types/dynamic_types/schema.hpp index 91f115e4..b61b64ba 100644 --- a/ddspipe_core/include/ddspipe_core/types/dynamic_types/schema.hpp +++ b/ddspipe_core/include/ddspipe_core/types/dynamic_types/schema.hpp @@ -27,10 +27,22 @@ namespace ddspipe { namespace core { namespace types { +namespace idl { + DDSPIPE_CORE_DllAPI std::string generate_idl_schema( const fastrtps::types::DynamicType_ptr& dynamic_type); +} /* namespace idl */ + +namespace msg { + +DDSPIPE_CORE_DllAPI +std::string generate_ros2_schema( + const fastrtps::types::DynamicType_ptr& dynamic_type); + +} /* namespace msg */ + } /* namespace types */ } /* namespace core */ } /* namespace ddspipe */ diff --git a/ddspipe_core/src/cpp/types/dynamic_types/schema.cpp b/ddspipe_core/src/cpp/types/dynamic_types/schema_idl.cpp similarity index 99% rename from ddspipe_core/src/cpp/types/dynamic_types/schema.cpp rename to ddspipe_core/src/cpp/types/dynamic_types/schema_idl.cpp index 33394386..7bdb68a6 100644 --- a/ddspipe_core/src/cpp/types/dynamic_types/schema.cpp +++ b/ddspipe_core/src/cpp/types/dynamic_types/schema_idl.cpp @@ -13,7 +13,7 @@ // limitations under the License. /** - * @file schema.cpp + * @file schema_idl.cpp */ #include @@ -35,6 +35,7 @@ namespace eprosima { namespace ddspipe { namespace core { namespace types { +namespace idl { constexpr const char* TYPE_OPENING = "\n{\n"; @@ -232,6 +233,7 @@ std::string type_kind_to_str( default: throw utils::InconsistencyException( STR_ENTRY << "Type " << dyn_type->get_name() << " has not correct kind."); + } } @@ -381,8 +383,11 @@ std::ostream& union_to_str( os << "case " << std::to_string(label) << ":"; } + os << "\n" << TAB_SEPARATOR << TAB_SEPARATOR << type_kind_to_str(member.second->get_descriptor()->get_type()) << " " << member.second->get_name() << ";\n"; + + } // Close definition @@ -445,6 +450,7 @@ std::string generate_idl_schema( return generate_dyn_type_schema_from_tree(parent_type); } +} /* namespace idl */ } /* namespace types */ } /* namespace core */ } /* namespace ddspipe */ diff --git a/ddspipe_core/src/cpp/types/dynamic_types/schema_msg.cpp b/ddspipe_core/src/cpp/types/dynamic_types/schema_msg.cpp new file mode 100644 index 00000000..58087b4f --- /dev/null +++ b/ddspipe_core/src/cpp/types/dynamic_types/schema_msg.cpp @@ -0,0 +1,331 @@ +// Copyright 2023 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file schema_msg.cpp + */ + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +namespace eprosima { +namespace ddspipe { +namespace core { +namespace types { +namespace msg { + +constexpr const char* TYPE_SEPARATOR = + "================================================================================\n"; + +struct TreeNodeType +{ + TreeNodeType( + std::string member_name, + std::string type_kind_name, + bool is_struct = false) + : member_name(member_name) + , type_kind_name(type_kind_name) + , is_struct(is_struct) + { + } + + std::string member_name; + std::string type_kind_name; + bool is_struct; +}; + +// Forward declaration +std::string type_kind_to_str( + const fastrtps::types::DynamicType_ptr& type); + +fastrtps::types::DynamicType_ptr container_internal_type( + const fastrtps::types::DynamicType_ptr& dyn_type) +{ + return dyn_type->get_descriptor()->get_element_type(); +} + +std::vector array_size( + const fastrtps::types::DynamicType_ptr& dyn_type, + bool unidimensional = true) +{ + if (unidimensional) + { + return {dyn_type->get_descriptor()->get_total_bounds()}; + } + else + { + std::vector result; + for (unsigned int i = 0; i < dyn_type->get_descriptor()->get_bounds_size(); i++) + { + result.push_back(dyn_type->get_descriptor()->get_bounds(i)); + } + return result; + } +} + +std::vector> get_members_sorted( + const fastrtps::types::DynamicType_ptr& dyn_type) +{ + std::vector> result; + + std::map members; + dyn_type->get_all_members(members); + + for (const auto& member : members) + { + result.emplace_back( + std::make_pair( + utils::demangle_if_ros_type(member.second->get_name()), + member.second->get_descriptor()->get_type())); + } + return result; +} + +std::string container_kind_to_str( + const fastrtps::types::DynamicType_ptr& dyn_type, + bool allow_bounded = false) +{ + auto internal_type = container_internal_type(dyn_type); + auto this_array_size = array_size(dyn_type); + + std::stringstream ss; + ss << type_kind_to_str(internal_type); + + for (const auto& bound : this_array_size) + { + if (bound != fastrtps::types::BOUND_UNLIMITED) + { + if (allow_bounded) + { + ss << "[<=" << bound << "]"; + } + else + { + ss << "[" << bound << "]"; + } + } + else + { + ss << "[]"; + } + } + + return ss.str(); +} + +std::string type_kind_to_str( + const fastrtps::types::DynamicType_ptr& dyn_type) +{ + switch (dyn_type->get_kind()) + { + case fastrtps::types::TK_BOOLEAN: + return "bool"; + + case fastrtps::types::TK_BYTE: + return "uint8"; + + case fastrtps::types::TK_INT16: + return "int16"; + + case fastrtps::types::TK_INT32: + return "int32"; + + case fastrtps::types::TK_INT64: + return "int64"; + + case fastrtps::types::TK_UINT16: + return "uint16"; + + case fastrtps::types::TK_UINT32: + return "uint32"; + + case fastrtps::types::TK_UINT64: + return "uint64"; + + case fastrtps::types::TK_FLOAT32: + return "float32"; + + case fastrtps::types::TK_FLOAT64: + return "float64"; + + case fastrtps::types::TK_CHAR8: + return "int8"; + + case fastrtps::types::TK_STRING8: + return "string"; + + case fastrtps::types::TK_ARRAY: + return container_kind_to_str(dyn_type); + + case fastrtps::types::TK_SEQUENCE: + return container_kind_to_str(dyn_type, true); + + case fastrtps::types::TK_STRUCTURE: + return utils::demangle_if_ros_type(dyn_type->get_name()); + + case fastrtps::types::TK_FLOAT128: + case fastrtps::types::TK_CHAR16: + case fastrtps::types::TK_STRING16: + case fastrtps::types::TK_ENUM: + case fastrtps::types::TK_BITSET: + case fastrtps::types::TK_MAP: + case fastrtps::types::TK_UNION: + case fastrtps::types::TK_NONE: + throw utils::UnsupportedException( + STR_ENTRY << "Type " << utils::demangle_if_ros_type( + dyn_type->get_name()) << " is not supported in ROS2 msg."); + + default: + throw utils::InconsistencyException( + STR_ENTRY << "Type " << utils::demangle_if_ros_type( + dyn_type->get_name()) << " has not correct kind."); + } +} + +utils::TreeNode generate_dyn_type_tree( + const fastrtps::types::DynamicType_ptr& type, + const std::string& member_name = "PARENT") +{ + // Get kind + fastrtps::types::TypeKind kind = type->get_kind(); + + switch (kind) + { + case fastrtps::types::TK_STRUCTURE: + { + // If is struct, the call is recursive. + // Create new tree node + utils::TreeNode parent(member_name, utils::demangle_if_ros_type(type->get_name()), true); + + // Get all members of this struct + std::vector> members_by_name = get_members_sorted(type); + + for (const auto& member : members_by_name) + { + // Add each member with its name as a new node in a branch (recursion) + parent.add_branch( + generate_dyn_type_tree(member.second, member.first)); + } + return parent; + } + break; + + case fastrtps::types::TK_ARRAY: + case fastrtps::types::TK_SEQUENCE: + { + // If container (array or struct) has exactly one branch + // Calculate child branch + auto internal_type = container_internal_type(type); + + // Create this node + utils::TreeNode container(member_name, type_kind_to_str(type)); + // Add branch + container.add_branch(generate_dyn_type_tree(internal_type, "CONTAINER_MEMBER")); + + return container; + } + break; + + default: + return utils::TreeNode(member_name, type_kind_to_str(type)); + break; + } +} + +std::ostream& node_to_str( + std::ostream& os, + const TreeNodeType& node) +{ + os << node.type_kind_name << " " << node.member_name; + + return os; +} + +std::ostream& generate_schema_from_node( + std::ostream& os, + const utils::TreeNode& node) +{ + // We know for sure this is called from structs + + for (auto const& child : node.branches()) + { + node_to_str(os, child.info); + os << "\n"; + } + + return os; +} + +std::string generate_dyn_type_schema_from_tree( + const utils::TreeNode& parent_node) +{ + std::set types_written; + + std::stringstream ss; + + // Write down main node + generate_schema_from_node(ss, parent_node); + types_written.insert(parent_node.info.type_kind_name); + + // For every Node, check if it is a struct. + // If it is, check if it is not yet written + // If it is not, write it down + for (const auto& node : parent_node.all_nodes()) + { + if (node.info.is_struct && types_written.find(node.info.type_kind_name) == types_written.end()) + { + // Add types separator + ss << TYPE_SEPARATOR; + + // Add types name + ss << "MSG: fastdds/" << node.info.type_kind_name << "\n"; + + // Add next type + generate_schema_from_node(ss, node); + types_written.insert(node.info.type_kind_name); + } + } + + return ss.str(); +} + +std::string generate_ros2_schema( + const fastrtps::types::DynamicType_ptr& dynamic_type) +{ + // Generate type tree + utils::TreeNode parent_type = generate_dyn_type_tree(dynamic_type); + + // From tree, generate string + return generate_dyn_type_schema_from_tree(parent_type); +} + +} /* namespace msg */ +} /* namespace types */ +} /* namespace core */ +} /* namespace ddspipe */ +} /* namespace eprosima */ diff --git a/ddspipe_core/test/unittest/types/dynamic_types/CMakeLists.txt b/ddspipe_core/test/unittest/types/dynamic_types/CMakeLists.txt index d968e0f3..22b8f36c 100644 --- a/ddspipe_core/test/unittest/types/dynamic_types/CMakeLists.txt +++ b/ddspipe_core/test/unittest/types/dynamic_types/CMakeLists.txt @@ -12,13 +12,61 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(TEST_NAME dtypes_tests) +#################### +# dtypes_idl_tests # +#################### + +set(TEST_NAME dtypes_idl_tests) # Add to test sources every FastDDSGen file generated file(GLOB DATATYPE_SOURCES_CXX "types/**/*.cxx") set(TEST_SOURCES - dtypes_tests.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/types/dynamic_types/schema.cpp + dtypes_idl_tests.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/types/dynamic_types/schema_idl.cpp + ${DATATYPE_SOURCES_CXX} + ) + +set(TEST_LIST + ) + +set(TEST_EXTRA_LIBRARIES + fastcdr + fastrtps + cpp_utils + $<$:iphlpapi$Shlwapi> + ) + +# Add to needed sources every .idl file +file( + GLOB + RESULT_SOURCES_IDL + RELATIVE + "${CMAKE_CURRENT_SOURCE_DIR}" + "types/idls/*.idl") + +set(TEST_NEEDED_SOURCES + ${RESULT_SOURCES_IDL} + ) + +add_unittest_executable( + "${TEST_NAME}" + "${TEST_SOURCES}" + "${TEST_LIST}" + "${TEST_EXTRA_LIBRARIES}" + "${TEST_NEEDED_SOURCES}" + ) + +#################### +# dtypes_msg_tests # +#################### + +set(TEST_NAME dtypes_msg_tests) + +# Add to test sources every FastDDSGen file generated +file(GLOB DATATYPE_SOURCES_CXX "types/**/*.cxx") +set(TEST_SOURCES + dtypes_msg_tests.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/types/dynamic_types/schema_msg.cpp ${DATATYPE_SOURCES_CXX} ) @@ -38,7 +86,7 @@ file( RESULT_SOURCES_MSG RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" - "types/idls/*.idl") + "types/msgs/*.msg") set(TEST_NEEDED_SOURCES ${RESULT_SOURCES_MSG} diff --git a/ddspipe_core/test/unittest/types/dynamic_types/dtypes_tests.cpp b/ddspipe_core/test/unittest/types/dynamic_types/dtypes_idl_tests.cpp similarity index 94% rename from ddspipe_core/test/unittest/types/dynamic_types/dtypes_tests.cpp rename to ddspipe_core/test/unittest/types/dynamic_types/dtypes_idl_tests.cpp index 34c008fa..da96ed59 100644 --- a/ddspipe_core/test/unittest/types/dynamic_types/dtypes_tests.cpp +++ b/ddspipe_core/test/unittest/types/dynamic_types/dtypes_idl_tests.cpp @@ -59,7 +59,7 @@ void execute_test_by_type( fastrtps::types::DynamicType_ptr dyn_type = get_dynamic_type(type); // Get schema generated - std::string schema = ddspipe::core::types::generate_idl_schema(dyn_type); + std::string schema = ddspipe::core::types::idl::generate_idl_schema(dyn_type); // Compare schemas compare_schemas(idl_file, schema); @@ -87,7 +87,7 @@ TEST_P(ParametrizedTests, msg_schema_generation) test::execute_test_by_type(type_); } -INSTANTIATE_TEST_SUITE_P(dtypes_tests, ParametrizedTests, ::testing::Values( +INSTANTIATE_TEST_SUITE_P(dtypes_idl_tests, ParametrizedTests, ::testing::Values( test::SupportedType::hello_world, test::SupportedType::numeric_array, test::SupportedType::char_sequence, diff --git a/ddspipe_core/test/unittest/types/dynamic_types/dtypes_msg_tests.cpp b/ddspipe_core/test/unittest/types/dynamic_types/dtypes_msg_tests.cpp new file mode 100644 index 00000000..1bce3080 --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/dtypes_msg_tests.cpp @@ -0,0 +1,102 @@ +// Copyright 2023 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include +#include +#include +#include +#include "types/all_types.hpp" + +using namespace eprosima; + +namespace test { + +std::string read_msg_from_file_( + const std::string& file_name) +{ + return utils::file_to_string(file_name.c_str()); +} + +std::string file_name_by_type( + SupportedType type) +{ + return std::string("types/msgs/") + to_string(type) + ".msg"; +} + +void compare_schemas( + const std::string& schema1, + const std::string& schema2) +{ + ASSERT_EQ(schema1, schema2); +} + +void execute_test_by_type( + SupportedType type) +{ + // Get msg file in string with the value expected to be generated in the schema + std::string msg_file = read_msg_from_file_(file_name_by_type(type)); + + // Get Dynamic type + fastrtps::types::DynamicType_ptr dyn_type = get_dynamic_type(type); + + // Get schema generated + std::string schema = ddspipe::core::types::msg::generate_ros2_schema(dyn_type); + + // Compare schemas + compare_schemas(msg_file, schema); +} + +} // namespace test + +class ParametrizedTests : public ::testing::TestWithParam +{ +public: + + void SetUp() + { + type_ = GetParam(); + } + + test::SupportedType type_; +}; + +/** + * TODO + */ +TEST_P(ParametrizedTests, msg_schema_generation) +{ + test::execute_test_by_type(type_); +} + +INSTANTIATE_TEST_SUITE_P(dtypes_msg_tests, ParametrizedTests, ::testing::Values( + test::SupportedType::hello_world, + test::SupportedType::numeric_array, + test::SupportedType::char_sequence, + test::SupportedType::basic_struct, + test::SupportedType::basic_array_struct, + test::SupportedType::float_bounded_sequence, + test::SupportedType::arrays_and_sequences, + test::SupportedType::complex_nested_arrays + )); + +int main( + int argc, + char** argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/arrays_and_sequences.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/arrays_and_sequences.msg new file mode 100644 index 00000000..1942bc58 --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/arrays_and_sequences.msg @@ -0,0 +1,7 @@ +AnInternalObject[] unlimited_vector +AnInternalObject[<=10] limited_vector +AnInternalObject[10] limited_array +================================================================================ +MSG: fastdds/AnInternalObject +float32 x +bool positive diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_array_struct.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_array_struct.msg new file mode 100644 index 00000000..a012398a --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_array_struct.msg @@ -0,0 +1,6 @@ +uint32 index +TheOtherObjectInArray[5] sub_structs +================================================================================ +MSG: fastdds/TheOtherObjectInArray +int32 some_num +bool positive diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_struct.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_struct.msg new file mode 100644 index 00000000..eb9814cb --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/basic_struct.msg @@ -0,0 +1,4 @@ +TheOtherObject sub_struct +================================================================================ +MSG: fastdds/TheOtherObject +int32 some_num diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/char_sequence.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/char_sequence.msg new file mode 100644 index 00000000..bf4b2456 --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/char_sequence.msg @@ -0,0 +1 @@ +int8[] chars diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/complex_nested_arrays.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/complex_nested_arrays.msg new file mode 100644 index 00000000..5eebc2f4 --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/complex_nested_arrays.msg @@ -0,0 +1,14 @@ +FirstLevelElement[3] array_of_elements +================================================================================ +MSG: fastdds/ThirdLevelElement +float64 x +float64 y +================================================================================ +MSG: fastdds/SecondLevelElement +ThirdLevelElement an_element_alone +ThirdLevelElement[<=1] a_limited_other_value +================================================================================ +MSG: fastdds/FirstLevelElement +string useless_name +SecondLevelElement[] sub +ThirdLevelElement an_element_alone diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/float_bounded_sequence.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/float_bounded_sequence.msg new file mode 100644 index 00000000..77503c2e --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/float_bounded_sequence.msg @@ -0,0 +1 @@ +float32[<=13] numbers diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/hello_world.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/hello_world.msg new file mode 100644 index 00000000..63e3fbcb --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/hello_world.msg @@ -0,0 +1,2 @@ +uint32 index +string message diff --git a/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/numeric_array.msg b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/numeric_array.msg new file mode 100644 index 00000000..d391c85d --- /dev/null +++ b/ddspipe_core/test/unittest/types/dynamic_types/types/msgs/numeric_array.msg @@ -0,0 +1 @@ +int32[3] points diff --git a/ddspipe_participants/test/CMakeLists.txt b/ddspipe_participants/test/CMakeLists.txt index 4e105ab7..38838ec5 100644 --- a/ddspipe_participants/test/CMakeLists.txt +++ b/ddspipe_participants/test/CMakeLists.txt @@ -13,3 +13,4 @@ # limitations under the License. add_subdirectory(blackbox) +# add_subdirectory(unittest) diff --git a/versions.md b/versions.md index 6cdc7c2e..77970d29 100644 --- a/versions.md +++ b/versions.md @@ -3,6 +3,10 @@ This file includes the released versions of **DDS-Pipe** project along with their contributions to the project. The *Forthcoming* section includes those features added in `main` branch that are not yet in a stable release. +## Forthcoming + +* Store schemas in OMG IDL and ROS 2 msg format. + ## Version 0.2.0 * Add missing DLLs.