diff --git a/rcl/include/rcl/types.h b/rcl/include/rcl/types.h index f837a9c2a..bca7bbe7e 100644 --- a/rcl/include/rcl/types.h +++ b/rcl/include/rcl/types.h @@ -111,6 +111,12 @@ typedef rmw_ret_t rcl_ret_t; /// Failed to take an event from the event handle #define RCL_RET_EVENT_TAKE_FAILED 2001 +/// rcl_lifecycle state register ret codes in 30XX +/// rcl_lifecycle state registered +#define RCL_RET_LIFECYCLE_STATE_REGISTERED 3000 +/// rcl_lifecycle state not registered +#define RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED 3001 + /// typedef for rmw_serialized_message_t; typedef rmw_serialized_message_t rcl_serialized_message_t; diff --git a/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h b/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h index 6d05e01ee..785099e02 100644 --- a/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h +++ b/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h @@ -77,6 +77,7 @@ rcl_lifecycle_get_zero_initialized_state(); * \param[in] label label of the state * \param[in] allocator a valid allocator used to initialized the lifecycle state * \return `RCL_RET_OK` if state was initialized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -106,7 +107,7 @@ rcl_lifecycle_state_init( * \param[inout] state struct to be finalized * \param[in] allocator a valid allocator used to finalize the lifecycle state * \return `RCL_RET_OK` if the state was finalized successfully, or - * \return `RCL_RET_ERROR` if an unspecified error occurs. + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid. */ RCL_LIFECYCLE_PUBLIC RCL_WARN_UNUSED @@ -152,6 +153,7 @@ rcl_lifecycle_get_zero_initialized_transition(); * \param[in] goal the objetive of the transition * \param[in] allocator a valid allocator used to finalize the lifecycle state * \return `RCL_RET_OK` if the transition is initialized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -182,6 +184,7 @@ rcl_lifecycle_transition_init( * \param[inout] transition struct to be finalized * \param[in] allocator a valid allocator used to finalize the transition * \return `RCL_RET_OK` if the state was finalized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -229,6 +232,7 @@ rcl_lifecycle_get_zero_initialized_state_machine(); * the state_machine pointer is only used to initialize the interfaces * \param[in] allocator a valid allocator used to initialized the state machine * \return `RCL_RET_OK` if the state machine was initialized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if input params is NULL, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -264,6 +268,7 @@ rcl_lifecycle_state_machine_init( * \param[in] node_handle valid (not finalized) handle to the node * \param[in] allocator a valid allocator used to finalize the state machine * \return `RCL_RET_OK` if the state was finalized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -290,7 +295,7 @@ rcl_lifecycle_state_machine_fini( * * \param[in] state_machine pointer to the state machine struct * \return `RCL_RET_OK` if the state is initialized, or - * \return `RCL_RET_ERROR` if an unspecified error occurs. + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid. */ RCL_LIFECYCLE_PUBLIC RCL_WARN_UNUSED @@ -365,6 +370,7 @@ rcl_lifecycle_get_transition_by_label( * \param[in] publish_notification if the value is `true` a message will be published * notifying the transition, otherwise no message will be published * \return `RCL_RET_OK` if the transition was triggered successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -394,6 +400,7 @@ rcl_lifecycle_trigger_transition_by_id( * \param[in] publish_notification if the value is `true` a message will be published * notifying the transition, otherwise no message will be published * \return `RCL_RET_OK` if the transition was triggered successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC diff --git a/rcl_lifecycle/include/rcl_lifecycle/transition_map.h b/rcl_lifecycle/include/rcl_lifecycle/transition_map.h index 24af35bcc..748ff85b9 100644 --- a/rcl_lifecycle/include/rcl_lifecycle/transition_map.h +++ b/rcl_lifecycle/include/rcl_lifecycle/transition_map.h @@ -53,6 +53,7 @@ rcl_lifecycle_get_zero_initialized_transition_map(); * * \param[in] transition_map pointer to the transition map struct to check * \return `RCL_RET_OK` if the transition map is initialized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if the transition map is not initialized. */ RCL_LIFECYCLE_PUBLIC @@ -78,6 +79,7 @@ rcl_lifecycle_transition_map_is_initialized( * \param[inout] transition_map struct to be deinitialized * \param[in] allocator a valid allocator used to deinitialized the state machine * \return `RCL_RET_OK` if the state was deinitialized successfully, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC @@ -99,18 +101,18 @@ rcl_lifecycle_transition_map_fini( * Uses Atomics | No * Lock-Free | Yes * - * \param[in] map to be modified + * \param[in] transition_map to be modified * \param[in] state the state to register * \param[in] allocator a valid allocator used to register the state machine * \return `RCL_RET_OK` if the state was registered successfully, or * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or - * \return `RCL_RET_ERROR` if an unspecified error occurs. + * \return `RCL_RET_LIFECYCLE_STATE_REGISTERED` if state is already registered. */ RCL_LIFECYCLE_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_lifecycle_register_state( - rcl_lifecycle_transition_map_t * map, + rcl_lifecycle_transition_map_t * transition_map, rcl_lifecycle_state_t state, const rcl_allocator_t * allocator); @@ -131,6 +133,8 @@ rcl_lifecycle_register_state( * \param[in] allocator a valid allocator used to register the state machine * \return `RCL_RET_OK` if the state was deinitialized successfully, or * \return `RCL_RET_BAD_ALLOC` if allocating memory failed, or + * \return `RCL_RET_INVALID_ARGUMENT` if any arguments are invalid, or + * \return `RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED` if state is not registered, or * \return `RCL_RET_ERROR` if an unspecified error occurs. */ RCL_LIFECYCLE_PUBLIC diff --git a/rcl_lifecycle/src/rcl_lifecycle.c b/rcl_lifecycle/src/rcl_lifecycle.c index ee3d7feff..9a4f6369e 100644 --- a/rcl_lifecycle/src/rcl_lifecycle.c +++ b/rcl_lifecycle/src/rcl_lifecycle.c @@ -53,25 +53,19 @@ rcl_lifecycle_state_init( const char * label, const rcl_allocator_t * allocator) { - if (!allocator) { - RCL_SET_ERROR_MSG("can't initialize state, no allocator given\n"); - return RCL_RET_ERROR; - } - if (!state) { - RCL_SET_ERROR_MSG("state pointer is null\n"); - return RCL_RET_ERROR; - } - if (!label) { - RCL_SET_ERROR_MSG("State label is null\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't initialize state, no allocator given\n", return RCL_RET_INVALID_ARGUMENT); + + RCL_CHECK_FOR_NULL_WITH_MSG( + state, "state pointer is null\n", return RCL_RET_INVALID_ARGUMENT); + + RCL_CHECK_FOR_NULL_WITH_MSG( + label, "State label is null\n", return RCL_RET_INVALID_ARGUMENT); state->id = id; state->label = rcutils_strndup(label, strlen(label), *allocator); - if (!state->label) { - RCL_SET_ERROR_MSG("failed to duplicate label for rcl_lifecycle_state_t\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + state->label, "failed to duplicate label for rcl_lifecycle_state_t\n", return RCL_RET_ERROR); return RCL_RET_OK; } @@ -81,12 +75,10 @@ rcl_lifecycle_state_fini( rcl_lifecycle_state_t * state, const rcl_allocator_t * allocator) { - RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_ERROR); + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_INVALID_ARGUMENT); - if (!allocator) { - RCL_SET_ERROR_MSG("can't free state, no allocator given\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't free state, no allocator given\n", return RCL_RET_INVALID_ARGUMENT); // it is already NULL if (!state) { return RCL_RET_OK; @@ -120,30 +112,24 @@ rcl_lifecycle_transition_init( rcl_lifecycle_state_t * goal, const rcl_allocator_t * allocator) { - if (!allocator) { - RCL_SET_ERROR_MSG("can't initialize transition, no allocator given\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't initialize transition, no allocator given\n", + return RCL_RET_INVALID_ARGUMENT); - if (!transition) { - RCL_SET_ERROR_MSG("transition pointer is null\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + transition, "transition pointer is null\n", return RCL_RET_INVALID_ARGUMENT); - if (!label) { - RCL_SET_ERROR_MSG("label pointer is null\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + label, "label pointer is null\n", return RCL_RET_INVALID_ARGUMENT); transition->start = start; transition->goal = goal; transition->id = id; transition->label = rcutils_strndup(label, strlen(label), *allocator); - if (!transition->label) { - RCL_SET_ERROR_MSG("failed to duplicate label for rcl_lifecycle_transition_t\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + transition->label, "failed to duplicate label for rcl_lifecycle_transition_t\n", + return RCL_RET_ERROR); return RCL_RET_OK; } @@ -153,10 +139,8 @@ rcl_lifecycle_transition_fini( rcl_lifecycle_transition_t * transition, const rcl_allocator_t * allocator) { - if (!allocator) { - RCL_SET_ERROR_MSG("can't finalize transition, no allocator given\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't finalize transition, no allocator given\n", return RCL_RET_INVALID_ARGUMENT); // it is already NULL if (!transition) { return RCL_RET_OK; @@ -206,18 +190,15 @@ rcl_lifecycle_state_machine_init( bool default_states, const rcl_allocator_t * allocator) { - if (!state_machine) { - RCL_SET_ERROR_MSG("State machine is null\n"); - return RCL_RET_ERROR; - } - if (!node_handle) { - RCL_SET_ERROR_MSG("Node handle is null\n"); - return RCL_RET_ERROR; - } - if (!allocator) { - RCL_SET_ERROR_MSG("can't initialize state machine, no allocator given\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + state_machine, "State machine is null\n", return RCL_RET_INVALID_ARGUMENT); + + RCL_CHECK_FOR_NULL_WITH_MSG( + node_handle, "Node handle is null\n", return RCL_RET_INVALID_ARGUMENT); + + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't initialize state machine, no allocator given\n", + return RCL_RET_INVALID_ARGUMENT); rcl_ret_t ret = rcl_lifecycle_com_interface_init( &state_machine->com_interface, node_handle, @@ -247,10 +228,8 @@ rcl_lifecycle_state_machine_fini( rcl_node_t * node_handle, const rcl_allocator_t * allocator) { - if (!allocator) { - RCL_SET_ERROR_MSG("can't free state machine, no allocator given\n"); - return RCL_RET_ERROR; - } + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't free state machine, no allocator given\n", return RCL_RET_INVALID_ARGUMENT); rcl_ret_t fcn_ret = RCL_RET_OK; @@ -278,17 +257,17 @@ rcl_lifecycle_state_machine_fini( rcl_ret_t rcl_lifecycle_state_machine_is_initialized(const rcl_lifecycle_state_machine_t * state_machine) { - if (!state_machine->com_interface.srv_get_state.impl) { - RCL_SET_ERROR_MSG("get_state service is null"); - return RCL_RET_ERROR; - } - if (!state_machine->com_interface.srv_change_state.impl) { - RCL_SET_ERROR_MSG("change_state service is null"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + state_machine->com_interface.srv_get_state.impl, "get_state service is null\n", + return RCL_RET_INVALID_ARGUMENT); + + RCL_CHECK_FOR_NULL_WITH_MSG( + state_machine->com_interface.srv_change_state.impl, "change_state service is null\n", + return RCL_RET_INVALID_ARGUMENT); + if (rcl_lifecycle_transition_map_is_initialized(&state_machine->transition_map) != RCL_RET_OK) { RCL_SET_ERROR_MSG("transition map is null"); - return RCL_RET_ERROR; + return RCL_RET_INVALID_ARGUMENT; } return RCL_RET_OK; } @@ -342,16 +321,11 @@ _trigger_transition( bool publish_notification) { // If we have a faulty transition pointer - if (!transition) { - RCL_SET_ERROR_MSG("Transition is not registered."); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + transition, "Transition is not registered.", return RCL_RET_INVALID_ARGUMENT); - if (!transition->goal) { - RCUTILS_LOG_ERROR_NAMED( - ROS_PACKAGE_NAME, "No valid goal is set"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + transition->goal, "No valid goal is set.", return RCL_RET_INVALID_ARGUMENT); state_machine->current_state = transition->goal; if (publish_notification) { @@ -374,10 +348,8 @@ rcl_lifecycle_trigger_transition_by_id( uint8_t id, bool publish_notification) { - if (!state_machine) { - RCUTILS_LOG_ERROR_NAMED(ROS_PACKAGE_NAME, "state machine pointer is null"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + state_machine, "state machine pointer is null.", return RCL_RET_INVALID_ARGUMENT); const rcl_lifecycle_transition_t * transition = rcl_lifecycle_get_transition_by_id(state_machine->current_state, id); @@ -391,10 +363,8 @@ rcl_lifecycle_trigger_transition_by_label( const char * label, bool publish_notification) { - if (!state_machine) { - RCUTILS_LOG_ERROR_NAMED(ROS_PACKAGE_NAME, "state machine pointer is null"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + state_machine, "state machine pointer is null.", return RCL_RET_INVALID_ARGUMENT); const rcl_lifecycle_transition_t * transition = rcl_lifecycle_get_transition_by_label(state_machine->current_state, label); diff --git a/rcl_lifecycle/src/transition_map.c b/rcl_lifecycle/src/transition_map.c index 083e05332..6b7454ce5 100644 --- a/rcl_lifecycle/src/transition_map.c +++ b/rcl_lifecycle/src/transition_map.c @@ -43,6 +43,8 @@ rcl_ret_t rcl_lifecycle_transition_map_is_initialized(const rcl_lifecycle_transition_map_t * transition_map) { rcl_ret_t is_initialized = RCL_RET_OK; + RCL_CHECK_FOR_NULL_WITH_MSG( + transition_map, "transition_map pointer is null\n", return RCL_RET_INVALID_ARGUMENT); if (!transition_map->states && !transition_map->transitions) { is_initialized = RCL_RET_ERROR; } @@ -55,10 +57,12 @@ rcl_lifecycle_transition_map_fini( const rcutils_allocator_t * allocator) { RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_ERROR); - if (!allocator) { - RCL_SET_ERROR_MSG("can't free transition map, no allocator given\n"); - return RCL_RET_ERROR; - } + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_INVALID_ARGUMENT); + + RCL_CHECK_FOR_NULL_WITH_MSG( + transition_map, "transition_map pointer is null\n", return RCL_RET_INVALID_ARGUMENT); + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "can't free transition map, no allocator given\n", return RCL_RET_INVALID_ARGUMENT); rcl_ret_t fcn_ret = RCL_RET_OK; @@ -87,26 +91,27 @@ rcl_lifecycle_register_state( rcl_lifecycle_state_t state, const rcutils_allocator_t * allocator) { - RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_ERROR); + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_INVALID_ARGUMENT); + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_LIFECYCLE_STATE_REGISTERED); + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_BAD_ALLOC); + RCL_CHECK_FOR_NULL_WITH_MSG( + transition_map, "transition_map pointer is null\n", return RCL_RET_INVALID_ARGUMENT); if (rcl_lifecycle_get_state(transition_map, state.id) != NULL) { RCL_SET_ERROR_MSG_WITH_FORMAT_STRING("state %u is already registered\n", state.id); - return RCL_RET_ERROR; + return RCL_RET_LIFECYCLE_STATE_REGISTERED; } - RCUTILS_CHECK_ALLOCATOR_WITH_MSG( - allocator, "invalid allocator", return RCUTILS_RET_INVALID_ARGUMENT) - + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT) // add new primary state memory unsigned int new_states_size = transition_map->states_size + 1; rcl_lifecycle_state_t * new_states = allocator->reallocate( transition_map->states, new_states_size * sizeof(rcl_lifecycle_state_t), allocator->state); - if (!new_states) { - RCL_SET_ERROR_MSG("failed to reallocate memory for new states"); - return RCL_RET_ERROR; - } + RCL_CHECK_FOR_NULL_WITH_MSG( + new_states, "failed to reallocate memory for new states\n", return RCL_RET_BAD_ALLOC); transition_map->states_size = new_states_size; transition_map->states = new_states; transition_map->states[transition_map->states_size - 1] = state; @@ -122,20 +127,24 @@ rcl_lifecycle_register_transition( { RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_ERROR); RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_BAD_ALLOC); + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_INVALID_ARGUMENT); + RCUTILS_CAN_RETURN_WITH_ERROR_OF(RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED); - RCUTILS_CHECK_ALLOCATOR_WITH_MSG( - allocator, "invalid allocator", return RCL_RET_ERROR) + RCL_CHECK_FOR_NULL_WITH_MSG( + transition_map, "transition_map pointer is null\n", return RCL_RET_INVALID_ARGUMENT); + RCL_CHECK_ALLOCATOR_WITH_MSG( + allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT); rcl_lifecycle_state_t * state = rcl_lifecycle_get_state(transition_map, transition.start->id); if (!state) { RCL_SET_ERROR_MSG_WITH_FORMAT_STRING("state %u is not registered\n", transition.start->id); - return RCL_RET_ERROR; + return RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED; } rcl_lifecycle_state_t * goal = rcl_lifecycle_get_state(transition_map, transition.goal->id); if (!goal) { RCL_SET_ERROR_MSG_WITH_FORMAT_STRING("state %u is not registered\n", transition.goal->id); - return RCL_RET_ERROR; + return RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED; } // Attempt to add new transition, don't update map if it fails unsigned int new_transitions_size = transition_map->transitions_size + 1; @@ -162,7 +171,7 @@ rcl_lifecycle_register_transition( allocator->state); if (!new_valid_transitions) { RCL_SET_ERROR_MSG("failed to reallocate memory for new transitions on state"); - return RCL_RET_ERROR; + return RCL_RET_BAD_ALLOC; } state->valid_transition_size = new_valid_transitions_size; state->valid_transitions = new_valid_transitions; @@ -177,6 +186,8 @@ rcl_lifecycle_get_state( rcl_lifecycle_transition_map_t * transition_map, unsigned int state_id) { + RCL_CHECK_FOR_NULL_WITH_MSG( + transition_map, "transition_map pointer is null\n", return NULL); for (unsigned int i = 0; i < transition_map->states_size; ++i) { if (transition_map->states[i].id == state_id) { return &transition_map->states[i]; @@ -190,6 +201,8 @@ rcl_lifecycle_get_transitions( rcl_lifecycle_transition_map_t * transition_map, unsigned int transition_id) { + RCL_CHECK_FOR_NULL_WITH_MSG( + transition_map, "transition_map pointer is null\n", return NULL); for (unsigned int i = 0; i < transition_map->transitions_size; ++i) { if (transition_map->transitions[i].id == transition_id) { return &transition_map->transitions[i]; diff --git a/rcl_lifecycle/test/test_default_state_machine.cpp b/rcl_lifecycle/test/test_default_state_machine.cpp index 79a0e77ac..c8de67b33 100644 --- a/rcl_lifecycle/test/test_default_state_machine.cpp +++ b/rcl_lifecycle/test/test_default_state_machine.cpp @@ -99,7 +99,7 @@ test_trigger_transition( */ TEST_F(TestDefaultStateMachine, zero_init) { rcl_lifecycle_state_machine_t state_machine = rcl_lifecycle_get_zero_initialized_state_machine(); - EXPECT_EQ(rcl_lifecycle_state_machine_is_initialized(&state_machine), RCL_RET_ERROR); + EXPECT_EQ(rcl_lifecycle_state_machine_is_initialized(&state_machine), RCL_RET_INVALID_ARGUMENT); rcl_reset_error(); const rcl_lifecycle_transition_map_t * transition_map = &state_machine.transition_map; EXPECT_EQ(transition_map->states_size, 0u); @@ -240,7 +240,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { if (*it == lifecycle_msgs__msg__Transition__TRANSITION_CONFIGURE || *it == lifecycle_msgs__msg__Transition__TRANSITION_UNCONFIGURED_SHUTDOWN) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -260,7 +262,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_CONFIGURE_FAILURE || *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_CONFIGURE_ERROR) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -281,7 +285,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_INACTIVE_SHUTDOWN) {continue;} RCUTILS_LOG_INFO_NAMED(ROS_PACKAGE_NAME, "applying key %u", *it); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -301,7 +307,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_ACTIVATE_FAILURE || *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_ACTIVATE_ERROR) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -321,7 +329,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_ACTIVE_SHUTDOWN) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -341,7 +351,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_DEACTIVATE_FAILURE || *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_DEACTIVATE_ERROR) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -367,7 +379,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_CLEANUP_FAILURE || *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_CLEANUP_ERROR) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -393,7 +407,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_SHUTDOWN_FAILURE || *it == lifecycle_msgs__msg__Transition__TRANSITION_ON_SHUTDOWN_ERROR) {continue;} - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, @@ -409,7 +425,9 @@ TEST_F(TestDefaultStateMachine, wrong_default_sequence) { lifecycle_msgs__msg__State__PRIMARY_STATE_FINALIZED); for (auto it = transition_ids.begin(); it != transition_ids.end(); ++it) { - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); + EXPECT_EQ( + RCL_RET_INVALID_ARGUMENT, + rcl_lifecycle_trigger_transition_by_id(&state_machine, *it, false)); rcl_reset_error(); EXPECT_EQ( state_machine.current_state->id, diff --git a/rcl_lifecycle/test/test_rcl_lifecycle.cpp b/rcl_lifecycle/test/test_rcl_lifecycle.cpp index ad1c5a346..f2e0722a7 100644 --- a/rcl_lifecycle/test/test_rcl_lifecycle.cpp +++ b/rcl_lifecycle/test/test_rcl_lifecycle.cpp @@ -50,15 +50,15 @@ TEST(TestRclLifecycle, lifecycle_state) { unsigned int expected_id = 42; const char expected_label[] = "label"; rcl_ret_t ret = rcl_lifecycle_state_init(&state, expected_id, &expected_label[0], nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_state_init(&state, expected_id, nullptr, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_state_init(nullptr, expected_id, &expected_label[0], &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); rcl_allocator_t bad_allocator = rcl_get_default_allocator(); @@ -73,7 +73,7 @@ TEST(TestRclLifecycle, lifecycle_state) { EXPECT_STREQ(&expected_label[0], state.label); ret = rcl_lifecycle_state_fini(&state, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); // Already finalized @@ -116,22 +116,22 @@ TEST(TestRclLifecycle, lifecycle_transition) { ret = rcl_lifecycle_transition_init( nullptr, expected_id, nullptr, nullptr, nullptr, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_transition_init( &transition, expected_id, nullptr, nullptr, nullptr, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_transition_init( nullptr, expected_id, nullptr, nullptr, nullptr, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_transition_init( &transition, expected_id, nullptr, nullptr, nullptr, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_transition_init( @@ -168,11 +168,11 @@ TEST(TestRclLifecycle, lifecycle_transition) { EXPECT_STREQ(&expected_label[0], transition.label); ret = rcl_lifecycle_transition_fini(nullptr, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_transition_fini(&transition, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); // Already finalized @@ -239,65 +239,65 @@ TEST(TestRclLifecycle, state_machine) { // Check various arguments are null ret = rcl_lifecycle_state_machine_init( nullptr, &node, pn, cs, gs, gas, gat, gtg, false, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, nullptr, pn, cs, gs, gas, gat, gtg, false, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, nullptr, cs, gs, gas, gat, gtg, false, &allocator); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, pn, nullptr, gs, gas, gat, gtg, false, &allocator); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, pn, cs, nullptr, gas, gat, gtg, false, &allocator); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, pn, cs, gs, nullptr, gat, gtg, false, &allocator); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, pn, cs, gs, gas, nullptr, gtg, false, &allocator); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, pn, cs, gs, gas, gat, nullptr, false, &allocator); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( &state_machine, &node, pn, cs, gs, gas, gat, gtg, false, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); @@ -307,7 +307,12 @@ TEST(TestRclLifecycle, state_machine) { EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; // Transition_map is not initialized - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + rcutils_reset_error(); + + state_machine.com_interface.srv_change_state.impl = nullptr; + // get_state service is valid, but not change_state service + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); // Allocate some memory and initialize states and transitions so is_initialized will pass @@ -327,19 +332,19 @@ TEST(TestRclLifecycle, state_machine) { ASSERT_NE(nullptr, state_machine.transition_map.transitions); state_machine.transition_map.transitions[0] = rcl_lifecycle_get_zero_initialized_transition(); - EXPECT_EQ(RCL_RET_OK, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); // get_state service is valid, but not change_state service void * temp_function = state_machine.com_interface.srv_change_state.impl; state_machine.com_interface.srv_change_state.impl = nullptr; - EXPECT_EQ(RCL_RET_ERROR, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); state_machine.com_interface.srv_change_state.impl = reinterpret_cast(temp_function); // allocator is nullptr ret = rcl_lifecycle_state_machine_fini(&state_machine, &node, nullptr); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_fini(&state_machine, &node, &allocator); @@ -435,7 +440,7 @@ TEST(TestRclLifecycle, state_transitions) { rcutils_reset_error(); ret = rcl_lifecycle_trigger_transition_by_id(nullptr, 0, false); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_trigger_transition_by_id( @@ -443,7 +448,7 @@ TEST(TestRclLifecycle, state_transitions) { EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; ret = rcl_lifecycle_trigger_transition_by_label(nullptr, "transition_success", true); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); ret = rcl_lifecycle_trigger_transition_by_label(&state_machine, "transition_success", true); @@ -452,7 +457,7 @@ TEST(TestRclLifecycle, state_transitions) { // If using the public interface to register transitions, this case should already be checked. state_machine.current_state->valid_transitions[0].goal = nullptr; ret = rcl_lifecycle_trigger_transition_by_label(&state_machine, "transition_success", true); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); rcl_print_state_machine(&state_machine); diff --git a/rcl_lifecycle/test/test_transition_map.cpp b/rcl_lifecycle/test/test_transition_map.cpp index 990460367..0c7102e86 100644 --- a/rcl_lifecycle/test/test_transition_map.cpp +++ b/rcl_lifecycle/test/test_transition_map.cpp @@ -68,7 +68,7 @@ TEST_F(TestTransitionMap, initialized) { EXPECT_EQ(RCL_RET_OK, rcl_lifecycle_transition_map_is_initialized(&transition_map)); ret = rcl_lifecycle_register_state(&transition_map, state0, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_LIFECYCLE_STATE_REGISTERED, ret); rcutils_reset_error(); rcl_lifecycle_state_t state1 = {"my_state_1", 1, NULL, 0}; @@ -82,7 +82,7 @@ TEST_F(TestTransitionMap, initialized) { rcl_lifecycle_state_t * original_ptr = transition_map.states; size_t original_size = transition_map.states_size; ret = rcl_lifecycle_register_state(&transition_map, unregistered, &bad_allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_BAD_ALLOC, ret); rcutils_reset_error(); EXPECT_EQ(transition_map.states, original_ptr); EXPECT_EQ(original_size, transition_map.states_size); @@ -116,7 +116,7 @@ TEST_F(TestTransitionMap, initialized) { start_state, &unregistered}; ret = rcl_lifecycle_register_transition( &transition_map, transition_bad1, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED, ret); rcutils_reset_error(); EXPECT_EQ(old_transitions_ptr, transition_map.transitions); EXPECT_EQ(original_size, transition_map.transitions_size); @@ -127,7 +127,7 @@ TEST_F(TestTransitionMap, initialized) { &unregistered, goal_state}; ret = rcl_lifecycle_register_transition( &transition_map, transition_bad2, &allocator); - EXPECT_EQ(RCL_RET_ERROR, ret); + EXPECT_EQ(RCL_RET_LIFECYCLE_STATE_NOT_REGISTERED, ret); rcutils_reset_error(); EXPECT_EQ(old_transitions_ptr, transition_map.transitions); EXPECT_EQ(original_size, transition_map.transitions_size);