From 4efd92ac7f27028c063864793535184061791438 Mon Sep 17 00:00:00 2001 From: Emerson Knapp <537409+emersonknapp@users.noreply.github.com> Date: Tue, 25 Jul 2023 22:01:30 -0700 Subject: [PATCH] Fix same named types overriding typesources (#759) * Fix same named types overriding typesources Signed-off-by: Emerson Knapp (cherry picked from commit 89c6713707ec8d45f3d1b89e8b6f522999a7d5e8) --- rosidl_generator_tests/CMakeLists.txt | 1 + rosidl_generator_tests/msg/BasicIdl.idl | 7 +++ .../rosidl_generator_c/test_descriptions.c | 48 +++++++++++++++++++ rosidl_pycommon/rosidl_pycommon/__init__.py | 7 ++- 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 rosidl_generator_tests/msg/BasicIdl.idl diff --git a/rosidl_generator_tests/CMakeLists.txt b/rosidl_generator_tests/CMakeLists.txt index 4510a9221..514a42853 100644 --- a/rosidl_generator_tests/CMakeLists.txt +++ b/rosidl_generator_tests/CMakeLists.txt @@ -34,6 +34,7 @@ if(BUILD_TESTING) ${test_interface_files_ACTION_FILES} ${test_interface_files_MSG_FILES} ${test_interface_files_SRV_FILES} + msg/BasicIdl.idl ADD_LINTER_TESTS SKIP_INSTALL ) diff --git a/rosidl_generator_tests/msg/BasicIdl.idl b/rosidl_generator_tests/msg/BasicIdl.idl new file mode 100644 index 000000000..af25ccd5e --- /dev/null +++ b/rosidl_generator_tests/msg/BasicIdl.idl @@ -0,0 +1,7 @@ +module rosidl_generator_tests { + module msg { + struct BasicIdl { + float x; + }; + }; +}; diff --git a/rosidl_generator_tests/test/rosidl_generator_c/test_descriptions.c b/rosidl_generator_tests/test/rosidl_generator_c/test_descriptions.c index fbe127faa..8e907b68a 100644 --- a/rosidl_generator_tests/test/rosidl_generator_c/test_descriptions.c +++ b/rosidl_generator_tests/test/rosidl_generator_c/test_descriptions.c @@ -29,7 +29,9 @@ #include "rosidl_runtime_c/type_description/type_source__struct.h" #include "rosidl_generator_tests/action/fibonacci.h" +#include "rosidl_generator_tests/msg/basic_idl.h" #include "rosidl_generator_tests/msg/defaults.h" +#include "rosidl_generator_tests/msg/empty.h" #include "rosidl_generator_tests/srv/empty.h" #include "type_description_interfaces/msg/field.h" @@ -67,6 +69,7 @@ bool string_char_equal(const rosidl_runtime_c__String * lhs, const char * rhs) int test_description_linkage(); int test_copied_type_description_struct_hashes(); int test_source_defined(); +int test_same_name_types(); int main(void) { @@ -86,6 +89,11 @@ int main(void) fprintf(stderr, "test_source_defined() FAILED\n"); rc++; } + printf("Testing same named types...\n"); + if (test_same_name_types()) { + fprintf(stderr, "test_same_name_types() FAILED\n"); + rc++; + } if (rc != 0) { fprintf(stderr, "Some tests failed!\n"); @@ -254,6 +262,18 @@ int test_source_defined() { return 1; } + + // IDL + check_src = rosidl_generator_tests__msg__BasicIdl__get_individual_type_description_source(NULL); + if (!check_src) { + fprintf(stderr, "BasicIdl.idl sources not available.\n"); + return 1; + } + if (!string_char_equal(&check_src->encoding, "idl")) { + fprintf(stderr, "BasicIdl.idl source encoding '%s' is not 'idl'\n", check_src->encoding.data); + return 1; + } + return 0; } @@ -292,3 +312,31 @@ int test_copied_type_description_struct_hashes() #undef runtimehash return rc; } + +int test_same_name_types() +{ + // Msg and srv with same name in this package + // Regression check case, this was receiving "srv" encoding with Empty.srv sources + const rosidl_runtime_c__type_description__TypeSource * empty_msg_src = + rosidl_generator_tests__msg__Empty__get_individual_type_description_source(NULL); + if (!string_char_equal(&empty_msg_src->type_name, "rosidl_generator_tests/msg/Empty")) { + fprintf(stderr, "Empty.msg source name not as expected\n"); + return 1; + } + if (!string_char_equal(&empty_msg_src->encoding, "msg")) { + fprintf(stderr, "Empty.msg source not encoded as msg\n"); + return 1; + } + + const rosidl_runtime_c__type_description__TypeSource * empty_srv_src = + rosidl_generator_tests__srv__Empty__get_individual_type_description_source(NULL); + if (!string_char_equal(&empty_srv_src->type_name, "rosidl_generator_tests/srv/Empty")) { + fprintf(stderr, "Empty.srv source name not as expected\n"); + return 1; + } + if (!string_char_equal(&empty_srv_src->encoding, "srv")) { + fprintf(stderr, "Empty.srv source not encoded as srv\n"); + return 1; + } + return 0; +} diff --git a/rosidl_pycommon/rosidl_pycommon/__init__.py b/rosidl_pycommon/rosidl_pycommon/__init__.py index b9ba04913..deae9bcc7 100644 --- a/rosidl_pycommon/rosidl_pycommon/__init__.py +++ b/rosidl_pycommon/rosidl_pycommon/__init__.py @@ -70,7 +70,9 @@ def generate_files( ros_interface_files = {} for ros_interface_file in args.get('ros_interface_files', []): p = pathlib.Path(ros_interface_file) - ros_interface_files[p.stem] = p + # e.g. ('msg', 'Empty') + key = (p.suffix[1:], p.stem) + ros_interface_files[key] = p for idl_tuple in args.get('idl_tuples', []): idl_parts = idl_tuple.rsplit(':', 1) @@ -85,7 +87,8 @@ def generate_files( type_description_info = json.load(f) idl_stem = idl_rel_path.stem - type_source_file = ros_interface_files.get(idl_stem, locator.get_absolute_path()) + type_source_key = (idl_rel_path.parts[-2], idl_stem) + type_source_file = ros_interface_files.get(type_source_key, locator.get_absolute_path()) if not keep_case: idl_stem = convert_camel_case_to_lower_case_underscore(idl_stem) try: