service for transition graph (#555)

* service for transition graph

* remove keys, transition id unique, label ambiguous

* semicolon for macro call
This commit is contained in:
Karsten Knese 2018-10-11 14:03:57 -07:00 committed by GitHub
parent bedb3ae361
commit 3353ffbb15
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 250 additions and 168 deletions

View file

@ -46,18 +46,18 @@ public:
size_t number_of_callbacks = 0;
protected:
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_configure(const rclcpp_lifecycle::State &)
{
++number_of_callbacks;
throw std::runtime_error("custom exception raised in configure callback");
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_error(const rclcpp_lifecycle::State &)
{
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
};
@ -68,16 +68,17 @@ TEST_F(TestCallbackExceptions, positive_on_error) {
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_CONFIGURE)).id());
// check if all callbacks were successfully overwritten
EXPECT_EQ(static_cast<size_t>(2), test_node->number_of_callbacks);
EXPECT_EQ(2u, test_node->number_of_callbacks);
}
TEST_F(TestCallbackExceptions, positive_on_error_with_code) {
auto test_node = std::make_shared<PositiveCallbackExceptionNode>("testnode");
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id());
rcl_lifecycle_transition_key_t ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn ret =
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
test_node->configure(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR, ret);
EXPECT_EQ(rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR, ret);
}
class NegativeCallbackExceptionNode : public rclcpp_lifecycle::LifecycleNode
@ -90,18 +91,18 @@ public:
size_t number_of_callbacks = 0;
protected:
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_configure(const rclcpp_lifecycle::State &)
{
++number_of_callbacks;
throw std::runtime_error("custom exception raised in configure callback");
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_error(const rclcpp_lifecycle::State &)
{
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_FAILURE;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
}
};
@ -112,14 +113,14 @@ TEST_F(TestCallbackExceptions, negative_on_error) {
EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_CONFIGURE)).id());
// check if all callbacks were successfully overwritten
EXPECT_EQ(static_cast<size_t>(2), test_node->number_of_callbacks);
EXPECT_EQ(2u, test_node->number_of_callbacks);
}
TEST_F(TestCallbackExceptions, negative_on_error_with_code) {
auto test_node = std::make_shared<NegativeCallbackExceptionNode>("testnode");
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id());
rcl_lifecycle_transition_key_t ret = RCL_RET_OK;
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn ret;
test_node->configure(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR, ret);
EXPECT_EQ(rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR, ret);
}

View file

@ -27,17 +27,6 @@
using lifecycle_msgs::msg::State;
using lifecycle_msgs::msg::Transition;
struct GoodMood
{
static constexpr rcl_lifecycle_transition_key_t cb_ret =
lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
};
struct BadMood
{
static constexpr rcl_lifecycle_transition_key_t cb_ret =
lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_FAILURE;
};
class TestDefaultStateMachine : public ::testing::Test
{
protected:
@ -55,6 +44,21 @@ public:
{}
};
struct GoodMood
{
using CallbackReturnT =
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn;
static constexpr CallbackReturnT cb_ret = static_cast<CallbackReturnT>(
lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS);
};
struct BadMood
{
using CallbackReturnT =
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn;
static constexpr CallbackReturnT cb_ret = static_cast<CallbackReturnT>(
lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_FAILURE);
};
template<class Mood = GoodMood>
class MoodyLifecycleNode : public rclcpp_lifecycle::LifecycleNode
{
@ -66,7 +70,7 @@ public:
size_t number_of_callbacks = 0;
protected:
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_configure(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_CONFIGURING, get_current_state().id());
@ -74,7 +78,7 @@ protected:
return Mood::cb_ret;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_activate(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_ACTIVATING, get_current_state().id());
@ -82,7 +86,7 @@ protected:
return Mood::cb_ret;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_deactivate(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_DEACTIVATING, get_current_state().id());
@ -90,7 +94,7 @@ protected:
return Mood::cb_ret;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_cleanup(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_CLEANINGUP, get_current_state().id());
@ -98,7 +102,7 @@ protected:
return Mood::cb_ret;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_shutdown(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_SHUTTINGDOWN, get_current_state().id());
@ -106,25 +110,26 @@ protected:
return Mood::cb_ret;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_error(const rclcpp_lifecycle::State &);
};
template<>
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
MoodyLifecycleNode<GoodMood>::on_error(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_ERRORPROCESSING, get_current_state().id());
ADD_FAILURE();
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
template<>
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
MoodyLifecycleNode<BadMood>::on_error(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_ERRORPROCESSING, get_current_state().id());
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
TEST_F(TestDefaultStateMachine, empty_initializer) {
@ -138,40 +143,44 @@ TEST_F(TestDefaultStateMachine, trigger_transition) {
auto test_node = std::make_shared<EmptyLifecycleNode>("testnode");
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id());
EXPECT_EQ(State::PRIMARY_STATE_INACTIVE, test_node->trigger_transition(
ASSERT_EQ(State::PRIMARY_STATE_INACTIVE, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_CONFIGURE)).id());
EXPECT_EQ(State::PRIMARY_STATE_ACTIVE, test_node->trigger_transition(
ASSERT_EQ(State::PRIMARY_STATE_ACTIVE, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id());
EXPECT_EQ(State::PRIMARY_STATE_INACTIVE, test_node->trigger_transition(
ASSERT_EQ(State::PRIMARY_STATE_INACTIVE, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_DEACTIVATE)).id());
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->trigger_transition(
ASSERT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id());
EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id());
ASSERT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_UNCONFIGURED_SHUTDOWN)).id());
}
TEST_F(TestDefaultStateMachine, trigger_transition_with_error_code) {
auto test_node = std::make_shared<EmptyLifecycleNode>("testnode");
rcl_lifecycle_transition_key_t ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR;
auto success = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
auto reset_key = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
auto ret = reset_key;
test_node->configure(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret);
ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR;
EXPECT_EQ(success, ret);
ret = reset_key;
test_node->activate(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret);
ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR;
EXPECT_EQ(success, ret);
ret = reset_key;
test_node->deactivate(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret);
ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR;
EXPECT_EQ(success, ret);
ret = reset_key;
test_node->cleanup(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret);
ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR;
EXPECT_EQ(success, ret);
ret = reset_key;
test_node->shutdown(ret);
EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret);
EXPECT_EQ(success, ret);
}
TEST_F(TestDefaultStateMachine, good_mood) {
@ -187,10 +196,10 @@ TEST_F(TestDefaultStateMachine, good_mood) {
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id());
EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id());
rclcpp_lifecycle::Transition(Transition::TRANSITION_UNCONFIGURED_SHUTDOWN)).id());
// check if all callbacks were successfully overwritten
EXPECT_EQ(static_cast<size_t>(5), test_node->number_of_callbacks);
EXPECT_EQ(5u, test_node->number_of_callbacks);
}
TEST_F(TestDefaultStateMachine, bad_mood) {
@ -201,7 +210,7 @@ TEST_F(TestDefaultStateMachine, bad_mood) {
rclcpp_lifecycle::Transition(Transition::TRANSITION_CONFIGURE)).id());
// check if all callbacks were successfully overwritten
EXPECT_EQ(static_cast<size_t>(1), test_node->number_of_callbacks);
EXPECT_EQ(1u, test_node->number_of_callbacks);
}
TEST_F(TestDefaultStateMachine, lifecycle_subscriber) {

View file

@ -46,91 +46,91 @@ public:
size_t number_of_callbacks = 0;
protected:
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_configure(const rclcpp_lifecycle::State &)
{
ADD_FAILURE();
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_activate(const rclcpp_lifecycle::State &)
{
ADD_FAILURE();
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_deactivate(const rclcpp_lifecycle::State &)
{
ADD_FAILURE();
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_cleanup(const rclcpp_lifecycle::State &)
{
ADD_FAILURE();
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_shutdown(const rclcpp_lifecycle::State &)
{
ADD_FAILURE();
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
// Custom callbacks
public:
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_custom_configure(const rclcpp_lifecycle::State & previous_state)
{
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, previous_state.id());
EXPECT_EQ(State::TRANSITION_STATE_CONFIGURING, get_current_state().id());
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_custom_activate(const rclcpp_lifecycle::State & previous_state)
{
EXPECT_EQ(State::PRIMARY_STATE_INACTIVE, previous_state.id());
EXPECT_EQ(State::TRANSITION_STATE_ACTIVATING, get_current_state().id());
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_custom_deactivate(const rclcpp_lifecycle::State & previous_state)
{
EXPECT_EQ(State::PRIMARY_STATE_ACTIVE, previous_state.id());
EXPECT_EQ(State::TRANSITION_STATE_DEACTIVATING, get_current_state().id());
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_custom_cleanup(const rclcpp_lifecycle::State & previous_state)
{
EXPECT_EQ(State::PRIMARY_STATE_INACTIVE, previous_state.id());
EXPECT_EQ(State::TRANSITION_STATE_CLEANINGUP, get_current_state().id());
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
rcl_lifecycle_transition_key_t
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
on_custom_shutdown(const rclcpp_lifecycle::State &)
{
EXPECT_EQ(State::TRANSITION_STATE_SHUTTINGDOWN, get_current_state().id());
++number_of_callbacks;
return lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS;
return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
}
};
@ -158,8 +158,8 @@ TEST_F(TestRegisterCustomCallbacks, custom_callbacks) {
EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id());
EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition(
rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id());
rclcpp_lifecycle::Transition(Transition::TRANSITION_UNCONFIGURED_SHUTDOWN)).id());
// check if all callbacks were successfully overwritten
EXPECT_EQ(static_cast<size_t>(5), test_node->number_of_callbacks);
EXPECT_EQ(5u, test_node->number_of_callbacks);
}

View file

@ -44,7 +44,7 @@ TEST_F(TestStateWrapper, wrapper) {
}
{
rcl_lifecycle_state_t lc_state = {"my_c_state", 2, NULL, NULL, 0};
rcl_lifecycle_state_t lc_state = {"my_c_state", 2, NULL, 0};
rclcpp_lifecycle::State c_state(lc_state.id, lc_state.label);
EXPECT_EQ(2, c_state.id());
EXPECT_FALSE(c_state.label().empty());
@ -52,7 +52,7 @@ TEST_F(TestStateWrapper, wrapper) {
}
{
rcl_lifecycle_state_t lc_state = {"my_c_state", 2, NULL, NULL, 0};
rcl_lifecycle_state_t lc_state = {"my_c_state", 2, NULL, 0};
rclcpp_lifecycle::State c_state(&lc_state);
EXPECT_EQ(2, c_state.id());
EXPECT_FALSE(c_state.label().empty());
@ -61,7 +61,7 @@ TEST_F(TestStateWrapper, wrapper) {
{
rcl_lifecycle_state_t * lc_state =
new rcl_lifecycle_state_t {"my_c_state", 3, NULL, NULL, 0};
new rcl_lifecycle_state_t {"my_c_state", 3, NULL, 0};
rclcpp_lifecycle::State c_state(lc_state->id, lc_state->label);
EXPECT_EQ(3, c_state.id());
EXPECT_FALSE(c_state.label().empty());
@ -107,12 +107,12 @@ TEST_F(TestStateWrapper, assignment_operator) {
TEST_F(TestStateWrapper, assignment_operator2) {
// Non-owning State
rcl_lifecycle_state_t * lc_state1 =
new rcl_lifecycle_state_t{"my_c_state1", 1, NULL, NULL, 0};
new rcl_lifecycle_state_t{"my_c_state1", 1, NULL, 0};
auto non_owning_state1 = std::make_shared<rclcpp_lifecycle::State>(lc_state1);
// Non-owning State
rcl_lifecycle_state_t * lc_state2 =
new rcl_lifecycle_state_t{"my_c_state2", 2, NULL, NULL, 0};
new rcl_lifecycle_state_t{"my_c_state2", 2, NULL, 0};
auto non_owning_state2 = std::make_shared<rclcpp_lifecycle::State>(lc_state2);
*non_owning_state2 = *non_owning_state1;
@ -130,7 +130,7 @@ TEST_F(TestStateWrapper, assignment_operator2) {
TEST_F(TestStateWrapper, assignment_operator3) {
// Non-owning State
rcl_lifecycle_state_t * lc_state1 =
new rcl_lifecycle_state_t{"my_c_state1", 1, NULL, NULL, 0};
new rcl_lifecycle_state_t{"my_c_state1", 1, NULL, 0};
auto non_owning_state1 = std::make_shared<rclcpp_lifecycle::State>(lc_state1);
// owning State
@ -150,7 +150,7 @@ TEST_F(TestStateWrapper, assignment_operator3) {
TEST_F(TestStateWrapper, assignment_operator4) {
// Non-owning State
rcl_lifecycle_state_t * lc_state1 =
new rcl_lifecycle_state_t{"my_c_state1", 1, NULL, NULL, 0};
new rcl_lifecycle_state_t{"my_c_state1", 1, NULL, 0};
auto non_owning_state1 = std::make_shared<rclcpp_lifecycle::State>(lc_state1);
// owning State