Keep domain id if ROS_DOMAIN_ID is invalid. (#689) (#694)

Signed-off-by: Michel Hidalgo <michel@ekumenlabs.com>
This commit is contained in:
Michel Hidalgo 2020-06-26 14:27:44 -03:00 committed by GitHub
parent fed3515c7e
commit 29f999a1cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 8 deletions

View file

@ -14,6 +14,7 @@
#include "rcl/domain_id.h" #include "rcl/domain_id.h"
#include <errno.h>
#include <limits.h> #include <limits.h>
#include "rcutils/get_env.h" #include "rcutils/get_env.h"
@ -40,10 +41,15 @@ rcl_get_default_domain_id(size_t * domain_id)
get_env_error_str); get_env_error_str);
return RCL_RET_ERROR; return RCL_RET_ERROR;
} }
if (ros_domain_id) { if (ros_domain_id && strcmp(ros_domain_id, "") != 0) {
unsigned long number = strtoul(ros_domain_id, NULL, 0); // NOLINT(runtime/int) char * end = NULL;
if (number == ULONG_MAX) { unsigned long number = strtoul(ros_domain_id, &end, 0); // NOLINT(runtime/int)
RCL_SET_ERROR_MSG("failed to interpret ROS_DOMAIN_ID as integral number"); if (number == 0UL && *end != '\0') {
RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is not an integral number");
return RCL_RET_ERROR;
}
if ((number == ULONG_MAX && errno == ERANGE) || number > SIZE_MAX) {
RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is out of range");
return RCL_RET_ERROR; return RCL_RET_ERROR;
} }
*domain_id = (size_t)number; *domain_id = (size_t)number;

View file

@ -22,15 +22,31 @@
TEST(TestGetDomainId, test_nominal) { TEST(TestGetDomainId, test_nominal) {
ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "42")); ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "42"));
size_t domain_id = 0u; size_t domain_id = RCL_DEFAULT_DOMAIN_ID;
EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id)); EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id));
EXPECT_EQ(42u, domain_id); EXPECT_EQ(42u, domain_id);
ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "998446744073709551615")); ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", ""));
domain_id = 0u; domain_id = RCL_DEFAULT_DOMAIN_ID;
EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id));
EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id);
ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "0000"));
domain_id = RCL_DEFAULT_DOMAIN_ID;
EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id));
EXPECT_EQ(0u, domain_id);
ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "0 not really"));
domain_id = RCL_DEFAULT_DOMAIN_ID;
EXPECT_EQ(RCL_RET_ERROR, rcl_get_default_domain_id(&domain_id)); EXPECT_EQ(RCL_RET_ERROR, rcl_get_default_domain_id(&domain_id));
rcl_reset_error(); rcl_reset_error();
EXPECT_EQ(0u, domain_id); EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id);
ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "998446744073709551615"));
domain_id = RCL_DEFAULT_DOMAIN_ID;
EXPECT_EQ(RCL_RET_ERROR, rcl_get_default_domain_id(&domain_id));
rcl_reset_error();
EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id);
EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_get_default_domain_id(nullptr)); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_get_default_domain_id(nullptr));
} }