From 647d07d3dae868d65a81bc6ff803ba652b47ec2d Mon Sep 17 00:00:00 2001 From: dhood Date: Tue, 28 Nov 2017 17:05:30 -0800 Subject: [PATCH 01/25] Add Logger class and give one to nodes --- rclcpp/include/rclcpp/logger.hpp | 61 +++++++++++++++++++ rclcpp/include/rclcpp/node.hpp | 6 ++ .../rclcpp/node_interfaces/node_base.hpp | 6 ++ .../node_interfaces/node_base_interface.hpp | 8 +++ rclcpp/resource/logging.hpp.em | 9 ++- rclcpp/src/rclcpp/node.cpp | 6 ++ .../src/rclcpp/node_interfaces/node_base.cpp | 8 +++ rclcpp/test/test_node.cpp | 12 ++++ 8 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 rclcpp/include/rclcpp/logger.hpp diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp new file mode 100644 index 0000000000..e500d91036 --- /dev/null +++ b/rclcpp/include/rclcpp/logger.hpp @@ -0,0 +1,61 @@ +// Copyright 2017 Open Source Robotics Foundation, Inc. +// +// 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. + +#ifndef RCLCPP__LOGGER_HPP_ +#define RCLCPP__LOGGER_HPP_ + +#include "rclcpp/visibility_control.hpp" + +namespace rclcpp +{ + +class Logger +{ +// Prevent users from calling constructors directly in favour of factory functions. +private: + friend Logger rclcpp::get_logger(const std::string & name); + Logger() : name_(nullptr) {} // used by factory when logging is disabled globally + Logger(const std::string & name) : name_(new std::string(name)) {} + std::shared_ptr name_; + +public: + RCLCPP_PUBLIC + Logger(const Logger &) = default; + + RCLCPP_PUBLIC + const char * get_name() const + { + if (!name_) + { + return nullptr; + } + return name_->c_str(); + } + + RCLCPP_PUBLIC + Logger sublogger(const std::string & suffix) { + if (!name_) { + return Logger(); + } + return Logger(*name_ + "." + suffix); + } +}; + +inline Logger get_logger(const std::string & name) { + return rclcpp::Logger(name); +} + +} // namespace rclcpp + +#endif // RCLCPP__LOGGER_HPP_ diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index bec99549f3..016fc69851 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -108,6 +108,12 @@ class Node : public std::enable_shared_from_this const char * get_namespace() const; + /// Get the logger of the node. + /** \return The logger of the node. */ + RCLCPP_PUBLIC + Logger + get_logger() const; + /// Create and return a callback group. RCLCPP_PUBLIC rclcpp::callback_group::CallbackGroup::SharedPtr diff --git a/rclcpp/include/rclcpp/node_interfaces/node_base.hpp b/rclcpp/include/rclcpp/node_interfaces/node_base.hpp index d3d7834bf5..e9b505a0da 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_base.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_base.hpp @@ -20,6 +20,7 @@ #include #include "rclcpp/context.hpp" +#include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/node_interfaces/node_base_interface.hpp" #include "rclcpp/visibility_control.hpp" @@ -55,6 +56,11 @@ class NodeBase : public NodeBaseInterface const char * get_namespace() const; + RCLCPP_PUBLIC + virtual + Logger + get_logger() const; + RCLCPP_PUBLIC virtual rclcpp::context::Context::SharedPtr diff --git a/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp b/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp index 23e397c7b9..e8774400b2 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp @@ -24,6 +24,7 @@ #include "rclcpp/callback_group.hpp" #include "rclcpp/context.hpp" +#include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/visibility_control.hpp" @@ -52,6 +53,13 @@ class NodeBaseInterface const char * get_namespace() const = 0; + /// Return the logger of the node. + /** \return The logger of the node. */ + RCLCPP_PUBLIC + virtual + Logger + get_logger() const = 0; + /// Return the context of the node. /** \return SharedPtr to the node's context. */ RCLCPP_PUBLIC diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index badef9ba2b..dd67a8b653 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -31,7 +31,7 @@ * \def RCLCPP_LOG_MIN_SEVERITY * Define RCLCPP_LOG_MIN_SEVERITY=RCLCPP_LOG_MIN_SEVERITY_[DEBUG|INFO|WARN|ERROR|FATAL] * in your build options to compile out anything below that severity. - * Use RCUTILS_LOG_MIN_SEVERITY_NONE to compile out all macros. + * Use RCLCPP_LOG_MIN_SEVERITY_NONE to compile out all macros. */ #ifndef RCLCPP_LOG_MIN_SEVERITY #define RCLCPP_LOG_MIN_SEVERITY RCLCPP_LOG_MIN_SEVERITY_DEBUG @@ -76,20 +76,19 @@ def is_supported_feature_combination(feature_combination): @[ for doc_line in feature_combinations[feature_combination].doc_lines]@ * @(doc_line) @[ end for]@ - * \param name The name of the logger + * \param logger The `rclcpp::Logger` to use @[ for param_name, doc_line in feature_combinations[feature_combination].params.items()]@ * \param @(param_name) @(doc_line) @[ end for]@ * \param ... The format string, followed by the variable arguments for the format string */ -// TODO(dhood): Replace the name argument with a logger object. -#define RCLCPP_@(severity)@(suffix)(name, @(''.join([p + ', ' for p in get_macro_parameters(feature_combination).keys()]))...) \ +#define RCLCPP_@(severity)@(suffix)(logger, @(''.join([p + ', ' for p in get_macro_parameters(feature_combination).keys()]))...) \ RCUTILS_LOG_@(severity)@(suffix)_NAMED( \ @{params = get_macro_parameters(feature_combination).keys()}@ @[ if params]@ @(''.join([' ' + p + ', \\\n' for p in params]))@ @[ end if]@ - std::string(name).c_str(), \ + logger.get_name(), \ __VA_ARGS__) @[ end for]@ diff --git a/rclcpp/src/rclcpp/node.cpp b/rclcpp/src/rclcpp/node.cpp index 82c807e656..c9c9076d23 100644 --- a/rclcpp/src/rclcpp/node.cpp +++ b/rclcpp/src/rclcpp/node.cpp @@ -84,6 +84,12 @@ Node::get_namespace() const return node_base_->get_namespace(); } +rclcpp::Logger +Node::get_logger() const +{ + return node_base_->get_logger(); +} + rclcpp::callback_group::CallbackGroup::SharedPtr Node::create_callback_group( rclcpp::callback_group::CallbackGroupType group_type) diff --git a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp index b960dcd546..200f2d3632 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp @@ -176,6 +176,14 @@ NodeBase::get_namespace() const return rcl_node_get_namespace(node_handle_.get()); } +rclcpp::Logger +NodeBase::get_logger() const +{ + // TODO(dhood): calculate once and store in the node + // TODO(dhood): use the namespace (slashes converted to dots) + return rclcpp::get_logger(this->get_name()); +} + rclcpp::context::Context::SharedPtr NodeBase::get_context() { diff --git a/rclcpp/test/test_node.cpp b/rclcpp/test/test_node.cpp index 7230aa565d..b1781a5bf9 100644 --- a/rclcpp/test/test_node.cpp +++ b/rclcpp/test/test_node.cpp @@ -74,6 +74,18 @@ TEST_F(TestNode, get_name_and_namespace) { } } +TEST_F(TestNode, get_logger) { + // Currently the namespace is not taken into account with the node logger name + { + auto node = std::make_shared("my_node"); + EXPECT_STREQ("my_node", node->get_logger().get_name()); + } + { + auto node = std::make_shared("my_node", "/ns"); + EXPECT_STREQ("my_node", node->get_logger().get_name()); + } +} + TEST_F(TestNode, get_clock) { auto node = std::make_shared("my_node", "/ns"); auto ros_clock = node->get_clock(); From 2decda34daecef1fb17214dadc2e31809556492a Mon Sep 17 00:00:00 2001 From: dhood Date: Tue, 28 Nov 2017 17:12:52 -0800 Subject: [PATCH 02/25] Try to improve compiler errors when non-Logger is passed to macros --- rclcpp/include/rclcpp/logger.hpp | 10 ++++++++++ rclcpp/resource/logging.hpp.em | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index e500d91036..f8d46a3df9 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -56,6 +56,16 @@ inline Logger get_logger(const std::string & name) { return rclcpp::Logger(name); } +namespace logging_macro_utilities { + +/// Helper function to give useful compiler errors in logging macros if passed incorrect type. +inline const char * get_logger_name(const Logger & logger) +{ + return logger.get_name(); +} + +} // namespace logging_macro_utilities + } // namespace rclcpp #endif // RCLCPP__LOGGER_HPP_ diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index dd67a8b653..40de63fc65 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -17,6 +17,7 @@ #ifndef RCLCPP__LOGGING_HPP_ #define RCLCPP__LOGGING_HPP_ +#include "rclcpp/logger.hpp" #include "rcutils/logging_macros.h" // These are used for compiling out logging macros lower than a minimum severity. @@ -88,7 +89,7 @@ def is_supported_feature_combination(feature_combination): @[ if params]@ @(''.join([' ' + p + ', \\\n' for p in params]))@ @[ end if]@ - logger.get_name(), \ + rclcpp::logging_macro_utilities::get_logger_name(logger), \ __VA_ARGS__) @[ end for]@ From 31d687f8d7ed7df9d644c68065b2eb3314961c99 Mon Sep 17 00:00:00 2001 From: dhood Date: Tue, 28 Nov 2017 18:16:32 -0800 Subject: [PATCH 03/25] Add define for 'disabling' loggers --- rclcpp/include/rclcpp/logger.hpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index f8d46a3df9..62fbebfa9b 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -17,6 +17,14 @@ #include "rclcpp/visibility_control.hpp" +// When this define evaluates to true (default), logger factory functions will be enabled. +// When false, logger factory functions will create dummy loggers to avoid computational expense. +// This should be used in combination with `RCLCPP_LOG_MIN_SEVERITY` to compile out logging macros. +// TODO(dhood): determine this automatically from `RCLCPP_LOG_MIN_SEVERITY` +#ifndef RCLCPP_LOGGING_ENABLED +#define RCLCPP_LOGGING_ENABLED 1 +#endif + namespace rclcpp { @@ -53,7 +61,11 @@ class Logger }; inline Logger get_logger(const std::string & name) { +#ifdef RCLCPP_LOGGING_ENABLED return rclcpp::Logger(name); +#else + return rclcpp::Logger(); +#endif } namespace logging_macro_utilities { From 6ef5970a9c030f0d410d0655392afcad3a3433e5 Mon Sep 17 00:00:00 2001 From: dhood Date: Tue, 28 Nov 2017 18:21:26 -0800 Subject: [PATCH 04/25] Add/update tests --- rclcpp/CMakeLists.txt | 3 +++ rclcpp/include/rclcpp/logger.hpp | 4 +++- rclcpp/test/test_logger.cpp | 41 ++++++++++++++++++++++++++++++++ rclcpp/test/test_logging.cpp | 33 +++++++------------------ 4 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 rclcpp/test/test_logger.cpp diff --git a/rclcpp/CMakeLists.txt b/rclcpp/CMakeLists.txt index 357a96c91e..6e26fa6654 100644 --- a/rclcpp/CMakeLists.txt +++ b/rclcpp/CMakeLists.txt @@ -297,6 +297,9 @@ if(BUILD_TESTING) target_link_libraries(test_executor ${PROJECT_NAME}) endif() + ament_add_gtest(test_logger test/test_logger.cpp) + target_link_libraries(test_logger ${PROJECT_NAME}) + ament_add_gmock(test_logging test/test_logging.cpp) target_link_libraries(test_logging ${PROJECT_NAME}) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 62fbebfa9b..616d55e4d3 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -15,6 +15,8 @@ #ifndef RCLCPP__LOGGER_HPP_ #define RCLCPP__LOGGER_HPP_ +#include + #include "rclcpp/visibility_control.hpp" // When this define evaluates to true (default), logger factory functions will be enabled. @@ -52,7 +54,7 @@ class Logger } RCLCPP_PUBLIC - Logger sublogger(const std::string & suffix) { + Logger get_child(const std::string & suffix) { if (!name_) { return Logger(); } diff --git a/rclcpp/test/test_logger.cpp b/rclcpp/test/test_logger.cpp new file mode 100644 index 0000000000..770a2e7702 --- /dev/null +++ b/rclcpp/test/test_logger.cpp @@ -0,0 +1,41 @@ +// Copyright 2017 Open Source Robotics Foundation, Inc. +// +// 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 "rclcpp/logger.hpp" + +TEST(TestLogger, factory_functions) { + rclcpp::Logger logger = rclcpp::get_logger("test_logger"); + EXPECT_STREQ("test_logger", logger.get_name()); + rclcpp::Logger logger_copy = rclcpp::Logger(logger); + EXPECT_STREQ("test_logger", logger_copy.get_name()); + + EXPECT_ANY_THROW(rclcpp::Logger null_logger = rclcpp::get_logger(nullptr)); +} + +TEST(TestLogger, hierarchy) { + rclcpp::Logger logger = rclcpp::get_logger("test_logger"); + rclcpp::Logger sublogger = logger.get_child("child"); + EXPECT_STREQ("test_logger.child", sublogger.get_name()); + rclcpp::Logger subsublogger = sublogger.get_child("grandchild"); + EXPECT_STREQ("test_logger.child.grandchild", subsublogger.get_name()); +} + +TEST(TestLogger, helper_functions) { + rclcpp::Logger logger = rclcpp::get_logger("test_logger"); + EXPECT_STREQ(logger.get_name(), rclcpp::logging_macro_utilities::get_logger_name(logger)); +} diff --git a/rclcpp/test/test_logging.cpp b/rclcpp/test/test_logging.cpp index 5f7f890310..29dfda04d3 100644 --- a/rclcpp/test/test_logging.cpp +++ b/rclcpp/test/test_logging.cpp @@ -19,15 +19,15 @@ #include #include +#include "rclcpp/logger.hpp" #include "rclcpp/logging.hpp" #include "rcutils/logging.h" #include "rcutils/time.h" -#define RCLCPP_TEST_LOGGING_MACRO_NAME "name" // Used in testing below - using ::testing::EndsWith; size_t g_log_calls = 0; +rclcpp::Logger g_logger = rclcpp::get_logger("name"); struct LogEvent { @@ -75,7 +75,7 @@ class TestLoggingMacros : public ::testing::Test TEST_F(TestLoggingMacros, test_logging_named) { for (int i : {1, 2, 3}) { - RCLCPP_DEBUG("name", "message %d", i); + RCLCPP_DEBUG(g_logger, "message %d", i); } EXPECT_EQ(3u, g_log_calls); EXPECT_TRUE(g_last_log_event.location != NULL); @@ -87,28 +87,11 @@ TEST_F(TestLoggingMacros, test_logging_named) { EXPECT_EQ(RCUTILS_LOG_SEVERITY_DEBUG, g_last_log_event.level); EXPECT_EQ("name", g_last_log_event.name); EXPECT_EQ("message 3", g_last_log_event.message); - - // Test different name inputs - std::string std_string_name = "name"; - RCLCPP_DEBUG(std_string_name, "message"); - EXPECT_EQ("name", g_last_log_event.name); - - const char * c_string_name = "name"; - RCLCPP_DEBUG(c_string_name, "message"); - EXPECT_EQ("name", g_last_log_event.name); - - RCLCPP_DEBUG(std_string_name + c_string_name, "message"); - EXPECT_EQ("namename", g_last_log_event.name); - - RCLCPP_DEBUG(RCLCPP_TEST_LOGGING_MACRO_NAME, "message"); - EXPECT_EQ(RCLCPP_TEST_LOGGING_MACRO_NAME, g_last_log_event.name); - RCLCPP_DEBUG(std::string(RCLCPP_TEST_LOGGING_MACRO_NAME) + std_string_name, "message"); - EXPECT_EQ("namename", g_last_log_event.name); } TEST_F(TestLoggingMacros, test_logging_once) { for (int i : {1, 2, 3}) { - RCLCPP_INFO_ONCE("name", "message %d", i); + RCLCPP_INFO_ONCE(g_logger, "message %d", i); } EXPECT_EQ(1u, g_log_calls); EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, g_last_log_event.level); @@ -118,7 +101,7 @@ TEST_F(TestLoggingMacros, test_logging_once) { // Check that another instance has a context that's independent to the call above's g_log_calls = 0; for (int i : {1, 2, 3}) { - RCLCPP_INFO_ONCE("name", "second message %d", i); + RCLCPP_INFO_ONCE(g_logger, "second message %d", i); } EXPECT_EQ(1u, g_log_calls); EXPECT_EQ(RCUTILS_LOG_SEVERITY_INFO, g_last_log_event.level); @@ -128,7 +111,7 @@ TEST_F(TestLoggingMacros, test_logging_once) { TEST_F(TestLoggingMacros, test_logging_expression) { for (int i : {1, 2, 3, 4, 5, 6}) { - RCLCPP_INFO_EXPRESSION("name", i % 3, "message %d", i); + RCLCPP_INFO_EXPRESSION(g_logger, i % 3, "message %d", i); } EXPECT_EQ(4u, g_log_calls); EXPECT_EQ("message 5", g_last_log_event.message); @@ -144,7 +127,7 @@ bool mod3() TEST_F(TestLoggingMacros, test_logging_function) { for (int i : {1, 2, 3, 4, 5, 6}) { g_counter = i; - RCLCPP_INFO_FUNCTION("name", &mod3, "message %d", i); + RCLCPP_INFO_FUNCTION(g_logger, &mod3, "message %d", i); } EXPECT_EQ(4u, g_log_calls); EXPECT_EQ("message 5", g_last_log_event.message); @@ -152,7 +135,7 @@ TEST_F(TestLoggingMacros, test_logging_function) { TEST_F(TestLoggingMacros, test_logging_skipfirst) { for (uint32_t i : {1, 2, 3, 4, 5}) { - RCLCPP_WARN_SKIPFIRST("name", "message %u", i); + RCLCPP_WARN_SKIPFIRST(g_logger, "message %u", i); EXPECT_EQ(i - 1, g_log_calls); } } From bb67d17eb79f10f6db6707a051764911a96d9e10 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 08:53:49 -0800 Subject: [PATCH 05/25] Linter fix --- rclcpp/include/rclcpp/logger.hpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 616d55e4d3..e4cb8d1906 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -16,6 +16,7 @@ #define RCLCPP__LOGGER_HPP_ #include +#include #include "rclcpp/visibility_control.hpp" @@ -32,11 +33,16 @@ namespace rclcpp class Logger { -// Prevent users from calling constructors directly in favour of factory functions. private: friend Logger rclcpp::get_logger(const std::string & name); - Logger() : name_(nullptr) {} // used by factory when logging is disabled globally - Logger(const std::string & name) : name_(new std::string(name)) {} + + // Constructors are private to force use of factory functions. + Logger() + : name_(nullptr) {} + + explicit Logger(const std::string & name) + : name_(new std::string(name)) {} + std::shared_ptr name_; public: @@ -46,23 +52,24 @@ class Logger RCLCPP_PUBLIC const char * get_name() const { - if (!name_) - { + if (!name_) { return nullptr; } return name_->c_str(); } RCLCPP_PUBLIC - Logger get_child(const std::string & suffix) { + Logger get_child(const std::string & child_name) + { if (!name_) { return Logger(); } - return Logger(*name_ + "." + suffix); + return Logger(*name_ + "." + child_name); } }; -inline Logger get_logger(const std::string & name) { +inline Logger get_logger(const std::string & name) +{ #ifdef RCLCPP_LOGGING_ENABLED return rclcpp::Logger(name); #else @@ -70,7 +77,8 @@ inline Logger get_logger(const std::string & name) { #endif } -namespace logging_macro_utilities { +namespace logging_macro_utilities +{ /// Helper function to give useful compiler errors in logging macros if passed incorrect type. inline const char * get_logger_name(const Logger & logger) From f7a1e668d72434b787e5713a91ece9a0c6f08182 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 10:47:32 -0800 Subject: [PATCH 06/25] Documentation --- rclcpp/include/rclcpp/logger.hpp | 70 ++++++++++++++++++++++++++++---- rclcpp/include/rclcpp/rclcpp.hpp | 22 ++++++---- 2 files changed, 76 insertions(+), 16 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index e4cb8d1906..9ff40615cd 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -20,9 +20,15 @@ #include "rclcpp/visibility_control.hpp" -// When this define evaluates to true (default), logger factory functions will be enabled. -// When false, logger factory functions will create dummy loggers to avoid computational expense. -// This should be used in combination with `RCLCPP_LOG_MIN_SEVERITY` to compile out logging macros. +/** + * \def RCLCPP_LOGGING_ENABLED + * When this define evaluates to true (default), logger factory functions will + * behave normally. + * When false, logger factory functions will create dummy loggers to avoid + * computational expense in manipulating objects. + * This should be used in combination with `RCLCPP_LOG_MIN_SEVERITY` to compile + * out logging macros. + */ // TODO(dhood): determine this automatically from `RCLCPP_LOG_MIN_SEVERITY` #ifndef RCLCPP_LOGGING_ENABLED #define RCLCPP_LOGGING_ENABLED 1 @@ -36,10 +42,18 @@ class Logger private: friend Logger rclcpp::get_logger(const std::string & name); - // Constructors are private to force use of factory functions. + /// Constructor of a dummy logger. + /** + * This is used when logging is disabled: see `RCLCPP_LOGGING_ENABLED`. + * This cannot be called directly, see `rclcpp::get_logger` instead. + */ Logger() : name_(nullptr) {} + /// Constructor of a named logger. + /** + * This cannot be called directly, see `rclcpp::get_logger` instead. + */ explicit Logger(const std::string & name) : name_(new std::string(name)) {} @@ -49,6 +63,12 @@ class Logger RCLCPP_PUBLIC Logger(const Logger &) = default; + /// Get the name of this logger. + /** + * \return the full name of the logger including any prefixes, or + * \return `nullptr` if this logger is invalid (e.g. because logging is + * disabled). + */ RCLCPP_PUBLIC const char * get_name() const { @@ -58,21 +78,45 @@ class Logger return name_->c_str(); } + /// Return a logger that is a descendant of this logger. + /** + * The child logger's full name will include any hierarchy conventions that + * indicate it is a descendant of this logger. + * For example, ```get_logger('abc').get_child('def')``` will return a logger + * with name `abc.def`. + * + * \param[in] suffix the child logger's suffix + * \return a logger with the fully-qualified name including the suffix, or + * \return a dummy logger if this logger is invalid (e.g. because logging is + * disabled). + */ RCLCPP_PUBLIC - Logger get_child(const std::string & child_name) + Logger get_child(const std::string & suffix) { if (!name_) { return Logger(); } - return Logger(*name_ + "." + child_name); + return Logger(*name_ + "." + suffix); } }; +/// Return a named logger. +/** + * The returned logger's name will include any naming conventions, such as a + * name prefix. + * Currently there are no such naming conventions but they may be introduced in + * the future. + * + * \param[in] name the name of the logger + * \return a logger with the fully-qualified name including naming conventions, or + * \return a dummy logger if logging is disabled. + */ inline Logger get_logger(const std::string & name) { -#ifdef RCLCPP_LOGGING_ENABLED +#if RCLCPP_LOGGING_ENABLED return rclcpp::Logger(name); #else + (void)name; return rclcpp::Logger(); #endif } @@ -80,7 +124,17 @@ inline Logger get_logger(const std::string & name) namespace logging_macro_utilities { -/// Helper function to give useful compiler errors in logging macros if passed incorrect type. +/// Helper function to give useful compiler errors in logging macros. +/** + * This is not intended for regular use: the `Logger::get_name` method should be + * used. + * This will provide a compiler error that includes the `Logger` class if an + * incorrect type is passed as a parameter, e.g. through incorrect usage of + * logging macros such as `RCLCPP_INFO()`. + * + * \param[in] logger the logger to get the name of + * \return the name of the logger + */ inline const char * get_logger_name(const Logger & logger) { return logger.get_name(); diff --git a/rclcpp/include/rclcpp/rclcpp.hpp b/rclcpp/include/rclcpp/rclcpp.hpp index 54881b22a7..01451ccc9b 100644 --- a/rclcpp/include/rclcpp/rclcpp.hpp +++ b/rclcpp/include/rclcpp/rclcpp.hpp @@ -17,7 +17,7 @@ * `rclcpp` provides the canonical C++ API for interacting with ROS. * It consists of these main components: * - * - Nodes + * - Node * - rclcpp::node::Node * - rclcpp/node.hpp * - Publisher @@ -93,6 +93,19 @@ * - rclcpp::node::Node::count_publishers() * - rclcpp::node::Node::count_subscribers() * + * And components related to logging: + * + * - Logging macros: + * - Some examples (not exhaustive): + * - RCLCPP_DEBUG() + * - RCLCPP_INFO() + * - RCLCPP_WARN_ONCE() + * - RCLCPP_ERROR_SKIPFIRST() + * - rclcpp/logging.hpp + * - Logger: + * - rclcpp::Logger + * - rclcpp/logger.hpp + * * Finally, there are many internal API's and utilities: * * - Exceptions: @@ -110,13 +123,6 @@ * - rclcpp::context::Context * - rclcpp/context.hpp * - rclcpp/contexts/default_context.hpp - * - Logging macros: - * - Some examples (not exhaustive): - * - RCLCPP_DEBUG() - * - RCLCPP_INFO() - * - RCLCPP_WARN_ONCE() - * - RCLCPP_ERROR_SKIPFIRST() - * - rclcpp/logging.hpp * - Various utilities: * - rclcpp/function_traits.hpp * - rclcpp/macros.hpp From d92b7ce8c5e299402b7de49e079503bd7624f826 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 12:27:20 -0800 Subject: [PATCH 07/25] Windows fix --- rclcpp/include/rclcpp/logger.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 9ff40615cd..7151dc89f5 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -111,6 +111,7 @@ class Logger * \return a logger with the fully-qualified name including naming conventions, or * \return a dummy logger if logging is disabled. */ +RCLCPP_PUBLIC inline Logger get_logger(const std::string & name) { #if RCLCPP_LOGGING_ENABLED @@ -135,6 +136,7 @@ namespace logging_macro_utilities * \param[in] logger the logger to get the name of * \return the name of the logger */ +RCLCPP_PUBLIC inline const char * get_logger_name(const Logger & logger) { return logger.get_name(); From d47cb7927a319f8feb6256a78083f699fce667d1 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 13:38:24 -0800 Subject: [PATCH 08/25] Move free functions to source file (windows was upset) --- rclcpp/CMakeLists.txt | 1 + rclcpp/include/rclcpp/logger.hpp | 15 ++---------- rclcpp/src/rclcpp/logger.cpp | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 rclcpp/src/rclcpp/logger.cpp diff --git a/rclcpp/CMakeLists.txt b/rclcpp/CMakeLists.txt index 6e26fa6654..c53ac20058 100644 --- a/rclcpp/CMakeLists.txt +++ b/rclcpp/CMakeLists.txt @@ -45,6 +45,7 @@ set(${PROJECT_NAME}_SRCS src/rclcpp/graph_listener.cpp src/rclcpp/intra_process_manager.cpp src/rclcpp/intra_process_manager_impl.cpp + src/rclcpp/logger.cpp src/rclcpp/memory_strategies.cpp src/rclcpp/memory_strategy.cpp src/rclcpp/node.cpp diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 7151dc89f5..3473ffd6a5 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -112,15 +112,7 @@ class Logger * \return a dummy logger if logging is disabled. */ RCLCPP_PUBLIC -inline Logger get_logger(const std::string & name) -{ -#if RCLCPP_LOGGING_ENABLED - return rclcpp::Logger(name); -#else - (void)name; - return rclcpp::Logger(); -#endif -} +Logger get_logger(const std::string & name); namespace logging_macro_utilities { @@ -137,10 +129,7 @@ namespace logging_macro_utilities * \return the name of the logger */ RCLCPP_PUBLIC -inline const char * get_logger_name(const Logger & logger) -{ - return logger.get_name(); -} +const char * get_logger_name(const Logger & logger); } // namespace logging_macro_utilities diff --git a/rclcpp/src/rclcpp/logger.cpp b/rclcpp/src/rclcpp/logger.cpp new file mode 100644 index 0000000000..003c112fe7 --- /dev/null +++ b/rclcpp/src/rclcpp/logger.cpp @@ -0,0 +1,42 @@ +// Copyright 2017 Open Source Robotics Foundation, Inc. +// +// 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 "rclcpp/logger.hpp" + +namespace rclcpp +{ + +Logger get_logger(const std::string & name) +{ +#if RCLCPP_LOGGING_ENABLED + return rclcpp::Logger(name); +#else + (void)name; + return rclcpp::Logger(); +#endif +} + +namespace logging_macro_utilities +{ + +const char * get_logger_name(const Logger & logger) +{ + return logger.get_name(); +} + +} // namespace logging_macro_utilities + +} // namespace rclcpp From be6cd998592c5f87902f9c80dee2d02341b73e1b Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 14:14:08 -0800 Subject: [PATCH 09/25] Fix windows by changing prototype ordering --- rclcpp/include/rclcpp/logger.hpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 3473ffd6a5..be0d4d4f63 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -37,6 +37,22 @@ namespace rclcpp { +class Logger; + +/// Return a named logger. +/** + * The returned logger's name will include any naming conventions, such as a + * name prefix. + * Currently there are no such naming conventions but they may be introduced in + * the future. + * + * \param[in] name the name of the logger + * \return a logger with the fully-qualified name including naming conventions, or + * \return a dummy logger if logging is disabled. + */ +RCLCPP_PUBLIC +Logger get_logger(const std::string & name); + class Logger { private: @@ -100,20 +116,6 @@ class Logger } }; -/// Return a named logger. -/** - * The returned logger's name will include any naming conventions, such as a - * name prefix. - * Currently there are no such naming conventions but they may be introduced in - * the future. - * - * \param[in] name the name of the logger - * \return a logger with the fully-qualified name including naming conventions, or - * \return a dummy logger if logging is disabled. - */ -RCLCPP_PUBLIC -Logger get_logger(const std::string & name); - namespace logging_macro_utilities { From 2002852ca337c708fbbd28cef8b561533941e205 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 14:52:54 -0800 Subject: [PATCH 10/25] Store node logger in NodeBase --- rclcpp/include/rclcpp/logger.hpp | 7 +++++++ rclcpp/include/rclcpp/node_interfaces/node_base.hpp | 4 +++- rclcpp/src/rclcpp/node_interfaces/node_base.cpp | 9 ++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index be0d4d4f63..b36842fb1f 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -37,6 +37,12 @@ namespace rclcpp { +// Forward declaration is used for friend statement. +namespace node_interfaces +{ +class NodeBase; +} + class Logger; /// Return a named logger. @@ -57,6 +63,7 @@ class Logger { private: friend Logger rclcpp::get_logger(const std::string & name); + friend ::rclcpp::node_interfaces::NodeBase; /// Constructor of a dummy logger. /** diff --git a/rclcpp/include/rclcpp/node_interfaces/node_base.hpp b/rclcpp/include/rclcpp/node_interfaces/node_base.hpp index e9b505a0da..ab5f06de2c 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_base.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_base.hpp @@ -58,7 +58,7 @@ class NodeBase : public NodeBaseInterface RCLCPP_PUBLIC virtual - Logger + rclcpp::Logger get_logger() const; RCLCPP_PUBLIC @@ -128,6 +128,8 @@ class NodeBase : public NodeBaseInterface std::shared_ptr node_handle_; + Logger logger_; + rclcpp::callback_group::CallbackGroup::SharedPtr default_callback_group_; std::vector callback_groups_; diff --git a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp index 200f2d3632..14b3575d2b 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp @@ -20,6 +20,7 @@ #include "rclcpp/node_interfaces/node_base.hpp" #include "rclcpp/exceptions.hpp" +#include "rclcpp/logger.hpp" #include "rmw/validate_node_name.h" #include "rmw/validate_namespace.h" @@ -33,6 +34,7 @@ NodeBase::NodeBase( rclcpp::context::Context::SharedPtr context) : context_(context), node_handle_(nullptr), + logger_(), default_callback_group_(nullptr), associated_with_executor_(false), notify_guard_condition_is_valid_(false) @@ -143,6 +145,9 @@ NodeBase::NodeBase( delete node; }); + // TODO(dhood): use the namespace (slashes converted to dots) + logger_ = rclcpp::get_logger(this->get_name()); + // Create the default callback group. using rclcpp::callback_group::CallbackGroupType; default_callback_group_ = create_callback_group(CallbackGroupType::MutuallyExclusive); @@ -179,9 +184,7 @@ NodeBase::get_namespace() const rclcpp::Logger NodeBase::get_logger() const { - // TODO(dhood): calculate once and store in the node - // TODO(dhood): use the namespace (slashes converted to dots) - return rclcpp::get_logger(this->get_name()); + return logger_; } rclcpp::context::Context::SharedPtr From d9d3886b1f9747cc3fdad26ac1bf864a046c2bbf Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 14:56:46 -0800 Subject: [PATCH 11/25] Windows is not happy with this EXPECT_ANY_THROW --- rclcpp/test/test_logger.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/rclcpp/test/test_logger.cpp b/rclcpp/test/test_logger.cpp index 770a2e7702..700fbe44f7 100644 --- a/rclcpp/test/test_logger.cpp +++ b/rclcpp/test/test_logger.cpp @@ -23,8 +23,6 @@ TEST(TestLogger, factory_functions) { EXPECT_STREQ("test_logger", logger.get_name()); rclcpp::Logger logger_copy = rclcpp::Logger(logger); EXPECT_STREQ("test_logger", logger_copy.get_name()); - - EXPECT_ANY_THROW(rclcpp::Logger null_logger = rclcpp::get_logger(nullptr)); } TEST(TestLogger, hierarchy) { From 46000140e95a690defc9b83e469a841311460e83 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 17:43:42 -0800 Subject: [PATCH 12/25] Move get_logger to a NodeLogger interface --- rclcpp/CMakeLists.txt | 1 + rclcpp/include/rclcpp/logger.hpp | 4 +- rclcpp/include/rclcpp/node.hpp | 3 + .../rclcpp/node_interfaces/node_base.hpp | 8 --- .../node_interfaces/node_base_interface.hpp | 8 --- .../rclcpp/node_interfaces/node_logger.hpp | 61 +++++++++++++++++++ .../node_interfaces/node_logger_interface.hpp | 47 ++++++++++++++ rclcpp/src/rclcpp/node.cpp | 4 +- .../src/rclcpp/node_interfaces/node_base.cpp | 11 ---- .../rclcpp/node_interfaces/node_logger.cpp | 34 +++++++++++ 10 files changed, 151 insertions(+), 30 deletions(-) create mode 100644 rclcpp/include/rclcpp/node_interfaces/node_logger.hpp create mode 100644 rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp create mode 100644 rclcpp/src/rclcpp/node_interfaces/node_logger.cpp diff --git a/rclcpp/CMakeLists.txt b/rclcpp/CMakeLists.txt index c53ac20058..5b0ba7319c 100644 --- a/rclcpp/CMakeLists.txt +++ b/rclcpp/CMakeLists.txt @@ -52,6 +52,7 @@ set(${PROJECT_NAME}_SRCS src/rclcpp/node_interfaces/node_base.cpp src/rclcpp/node_interfaces/node_clock.cpp src/rclcpp/node_interfaces/node_graph.cpp + src/rclcpp/node_interfaces/node_logger.cpp src/rclcpp/node_interfaces/node_parameters.cpp src/rclcpp/node_interfaces/node_services.cpp src/rclcpp/node_interfaces/node_timers.cpp diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index b36842fb1f..fec12f5e90 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -40,7 +40,7 @@ namespace rclcpp // Forward declaration is used for friend statement. namespace node_interfaces { -class NodeBase; +class NodeLogger; } class Logger; @@ -63,7 +63,7 @@ class Logger { private: friend Logger rclcpp::get_logger(const std::string & name); - friend ::rclcpp::node_interfaces::NodeBase; + friend ::rclcpp::node_interfaces::NodeLogger; /// Constructor of a dummy logger. /** diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index 016fc69851..8c81cebfbd 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -37,11 +37,13 @@ #include "rclcpp/client.hpp" #include "rclcpp/context.hpp" #include "rclcpp/event.hpp" +#include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/message_memory_strategy.hpp" #include "rclcpp/node_interfaces/node_base_interface.hpp" #include "rclcpp/node_interfaces/node_clock_interface.hpp" #include "rclcpp/node_interfaces/node_graph_interface.hpp" +#include "rclcpp/node_interfaces/node_logger_interface.hpp" #include "rclcpp/node_interfaces/node_parameters_interface.hpp" #include "rclcpp/node_interfaces/node_services_interface.hpp" #include "rclcpp/node_interfaces/node_timers_interface.hpp" @@ -418,6 +420,7 @@ class Node : public std::enable_shared_from_this rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_; rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_; + rclcpp::node_interfaces::NodeLoggerInterface::SharedPtr node_logger_; rclcpp::node_interfaces::NodeTimersInterface::SharedPtr node_timers_; rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_; rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_; diff --git a/rclcpp/include/rclcpp/node_interfaces/node_base.hpp b/rclcpp/include/rclcpp/node_interfaces/node_base.hpp index ab5f06de2c..d3d7834bf5 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_base.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_base.hpp @@ -20,7 +20,6 @@ #include #include "rclcpp/context.hpp" -#include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/node_interfaces/node_base_interface.hpp" #include "rclcpp/visibility_control.hpp" @@ -56,11 +55,6 @@ class NodeBase : public NodeBaseInterface const char * get_namespace() const; - RCLCPP_PUBLIC - virtual - rclcpp::Logger - get_logger() const; - RCLCPP_PUBLIC virtual rclcpp::context::Context::SharedPtr @@ -128,8 +122,6 @@ class NodeBase : public NodeBaseInterface std::shared_ptr node_handle_; - Logger logger_; - rclcpp::callback_group::CallbackGroup::SharedPtr default_callback_group_; std::vector callback_groups_; diff --git a/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp b/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp index e8774400b2..23e397c7b9 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_base_interface.hpp @@ -24,7 +24,6 @@ #include "rclcpp/callback_group.hpp" #include "rclcpp/context.hpp" -#include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/visibility_control.hpp" @@ -53,13 +52,6 @@ class NodeBaseInterface const char * get_namespace() const = 0; - /// Return the logger of the node. - /** \return The logger of the node. */ - RCLCPP_PUBLIC - virtual - Logger - get_logger() const = 0; - /// Return the context of the node. /** \return SharedPtr to the node's context. */ RCLCPP_PUBLIC diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp new file mode 100644 index 0000000000..0c9419e2f5 --- /dev/null +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp @@ -0,0 +1,61 @@ +// Copyright 2016 Open Source Robotics Foundation, Inc. +// +// 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. + +#ifndef RCLCPP__NODE_INTERFACES__NODE_LOGGER_HPP_ +#define RCLCPP__NODE_INTERFACES__NODE_LOGGER_HPP_ + +#include + +#include "rclcpp/logger.hpp" +#include "rclcpp/macros.hpp" +#include "rclcpp/node_interfaces/node_base_interface.hpp" +#include "rclcpp/node_interfaces/node_logger_interface.hpp" +#include "rclcpp/visibility_control.hpp" + +namespace rclcpp +{ +namespace node_interfaces +{ + +/// Implementation of the NodeLogger part of the Node API. +class NodeLogger : public NodeLoggerInterface +{ +public: + RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggerInterface) + + RCLCPP_PUBLIC + explicit NodeLogger(rclcpp::node_interfaces::NodeBaseInterface * node_base); + + RCLCPP_PUBLIC + virtual + ~NodeLogger(); + + RCLCPP_PUBLIC + virtual + rclcpp::Logger + get_logger() const; + +private: + RCLCPP_DISABLE_COPY(NodeLogger) + + /// Handle to the NodeBaseInterface given in the constructor. + rclcpp::node_interfaces::NodeBaseInterface * node_base_; + + Logger logger_; +}; + +} // namespace node_interfaces +} // namespace rclcpp + +#endif // RCLCPP__NODE_INTERFACES__NODE_LOGGER_HPP_ diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp new file mode 100644 index 0000000000..1625e8f39b --- /dev/null +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp @@ -0,0 +1,47 @@ +// Copyright 2017 Open Source Robotics Foundation, Inc. +// +// 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. + +#ifndef RCLCPP__NODE_INTERFACES__NODE_LOGGER_INTERFACE_HPP_ +#define RCLCPP__NODE_INTERFACES__NODE_LOGGER_INTERFACE_HPP_ + +#include + +#include "rclcpp/logger.hpp" +#include "rclcpp/macros.hpp" +#include "rclcpp/node_interfaces/node_base_interface.hpp" +#include "rclcpp/visibility_control.hpp" + +namespace rclcpp +{ +namespace node_interfaces +{ + +/// Pure virtual interface class for the NodeLogger part of the Node API. +class NodeLoggerInterface +{ +public: + RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggerInterface) + + /// Return the logger of the node. + /** \return The logger of the node. */ + RCLCPP_PUBLIC + virtual + Logger + get_logger() const = 0; +}; + +} // namespace node_interfaces +} // namespace rclcpp + +#endif // RCLCPP__NODE_INTERFACES__NODE_LOGGER_INTERFACE_HPP_ diff --git a/rclcpp/src/rclcpp/node.cpp b/rclcpp/src/rclcpp/node.cpp index c9c9076d23..a85fe21b60 100644 --- a/rclcpp/src/rclcpp/node.cpp +++ b/rclcpp/src/rclcpp/node.cpp @@ -26,6 +26,7 @@ #include "rclcpp/node_interfaces/node_base.hpp" #include "rclcpp/node_interfaces/node_clock.hpp" #include "rclcpp/node_interfaces/node_graph.hpp" +#include "rclcpp/node_interfaces/node_logger.hpp" #include "rclcpp/node_interfaces/node_parameters.hpp" #include "rclcpp/node_interfaces/node_services.hpp" #include "rclcpp/node_interfaces/node_timers.hpp" @@ -52,6 +53,7 @@ Node::Node( bool use_intra_process_comms) : node_base_(new rclcpp::node_interfaces::NodeBase(node_name, namespace_, context)), node_graph_(new rclcpp::node_interfaces::NodeGraph(node_base_.get())), + node_logger_(new rclcpp::node_interfaces::NodeLogger(node_base_.get())), node_timers_(new rclcpp::node_interfaces::NodeTimers(node_base_.get())), node_topics_(new rclcpp::node_interfaces::NodeTopics(node_base_.get())), node_services_(new rclcpp::node_interfaces::NodeServices(node_base_.get())), @@ -87,7 +89,7 @@ Node::get_namespace() const rclcpp::Logger Node::get_logger() const { - return node_base_->get_logger(); + return node_logger_->get_logger(); } rclcpp::callback_group::CallbackGroup::SharedPtr diff --git a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp index 14b3575d2b..b960dcd546 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp @@ -20,7 +20,6 @@ #include "rclcpp/node_interfaces/node_base.hpp" #include "rclcpp/exceptions.hpp" -#include "rclcpp/logger.hpp" #include "rmw/validate_node_name.h" #include "rmw/validate_namespace.h" @@ -34,7 +33,6 @@ NodeBase::NodeBase( rclcpp::context::Context::SharedPtr context) : context_(context), node_handle_(nullptr), - logger_(), default_callback_group_(nullptr), associated_with_executor_(false), notify_guard_condition_is_valid_(false) @@ -145,9 +143,6 @@ NodeBase::NodeBase( delete node; }); - // TODO(dhood): use the namespace (slashes converted to dots) - logger_ = rclcpp::get_logger(this->get_name()); - // Create the default callback group. using rclcpp::callback_group::CallbackGroupType; default_callback_group_ = create_callback_group(CallbackGroupType::MutuallyExclusive); @@ -181,12 +176,6 @@ NodeBase::get_namespace() const return rcl_node_get_namespace(node_handle_.get()); } -rclcpp::Logger -NodeBase::get_logger() const -{ - return logger_; -} - rclcpp::context::Context::SharedPtr NodeBase::get_context() { diff --git a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp b/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp new file mode 100644 index 0000000000..82c8dee918 --- /dev/null +++ b/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp @@ -0,0 +1,34 @@ +// Copyright 2017 Open Source Robotics Foundation, Inc. +// +// 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 "rclcpp/node_interfaces/node_logger.hpp" + +using rclcpp::node_interfaces::NodeLogger; + +NodeLogger::NodeLogger(rclcpp::node_interfaces::NodeBaseInterface * node_base) +: node_base_(node_base) +{ + // TODO(dhood): use the namespace (slashes converted to dots) + logger_ = rclcpp::get_logger(node_base_->get_name()); +} + +NodeLogger::~NodeLogger() +{ +} + +rclcpp::Logger +NodeLogger::get_logger() const +{ + return logger_; +} From 1566cd8d9296051e915ddd5008a087828012576e Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 17:59:44 -0800 Subject: [PATCH 13/25] Move Logger into 'logger' namespace --- rclcpp/include/rclcpp/logger.hpp | 8 ++++++-- rclcpp/include/rclcpp/node.hpp | 2 +- .../include/rclcpp/node_interfaces/node_logger.hpp | 4 ++-- .../rclcpp/node_interfaces/node_logger_interface.hpp | 2 +- rclcpp/include/rclcpp/rclcpp.hpp | 4 +++- rclcpp/resource/logging.hpp.em | 2 +- rclcpp/src/rclcpp/logger.cpp | 11 ++++++++--- rclcpp/src/rclcpp/node.cpp | 2 +- rclcpp/src/rclcpp/node_interfaces/node_logger.cpp | 4 ++-- rclcpp/test/test_logger.cpp | 12 ++++++------ rclcpp/test/test_logging.cpp | 2 +- 11 files changed, 32 insertions(+), 21 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index fec12f5e90..19b827b205 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -43,6 +43,8 @@ namespace node_interfaces class NodeLogger; } +namespace logger +{ class Logger; /// Return a named logger. @@ -62,7 +64,7 @@ Logger get_logger(const std::string & name); class Logger { private: - friend Logger rclcpp::get_logger(const std::string & name); + friend Logger rclcpp::logger::get_logger(const std::string & name); friend ::rclcpp::node_interfaces::NodeLogger; /// Constructor of a dummy logger. @@ -123,6 +125,8 @@ class Logger } }; +} // namespace logger + namespace logging_macro_utilities { @@ -138,7 +142,7 @@ namespace logging_macro_utilities * \return the name of the logger */ RCLCPP_PUBLIC -const char * get_logger_name(const Logger & logger); +const char * get_logger_name(const rclcpp::logger::Logger & logger); } // namespace logging_macro_utilities diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index 8c81cebfbd..943ddc9669 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -113,7 +113,7 @@ class Node : public std::enable_shared_from_this /// Get the logger of the node. /** \return The logger of the node. */ RCLCPP_PUBLIC - Logger + rclcpp::logger::Logger get_logger() const; /// Create and return a callback group. diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp index 0c9419e2f5..297ecac511 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp @@ -43,7 +43,7 @@ class NodeLogger : public NodeLoggerInterface RCLCPP_PUBLIC virtual - rclcpp::Logger + rclcpp::logger::Logger get_logger() const; private: @@ -52,7 +52,7 @@ class NodeLogger : public NodeLoggerInterface /// Handle to the NodeBaseInterface given in the constructor. rclcpp::node_interfaces::NodeBaseInterface * node_base_; - Logger logger_; + rclcpp::logger::Logger logger_; }; } // namespace node_interfaces diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp index 1625e8f39b..871b5a9a40 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp @@ -37,7 +37,7 @@ class NodeLoggerInterface /** \return The logger of the node. */ RCLCPP_PUBLIC virtual - Logger + rclcpp::logger::Logger get_logger() const = 0; }; diff --git a/rclcpp/include/rclcpp/rclcpp.hpp b/rclcpp/include/rclcpp/rclcpp.hpp index 01451ccc9b..fc5142fe4b 100644 --- a/rclcpp/include/rclcpp/rclcpp.hpp +++ b/rclcpp/include/rclcpp/rclcpp.hpp @@ -103,7 +103,7 @@ * - RCLCPP_ERROR_SKIPFIRST() * - rclcpp/logging.hpp * - Logger: - * - rclcpp::Logger + * - rclcpp::logger::Logger * - rclcpp/logger.hpp * * Finally, there are many internal API's and utilities: @@ -172,6 +172,8 @@ using rclcpp::timer::GenericTimer; using rclcpp::timer::TimerBase; using rclcpp::timer::WallTimer; using ContextSharedPtr = rclcpp::context::Context::SharedPtr; +using rclcpp::logger::Logger; +using rclcpp::logger::get_logger; using rclcpp::utilities::ok; using rclcpp::utilities::shutdown; using rclcpp::utilities::init; diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index 40de63fc65..43fcdb1be3 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -77,7 +77,7 @@ def is_supported_feature_combination(feature_combination): @[ for doc_line in feature_combinations[feature_combination].doc_lines]@ * @(doc_line) @[ end for]@ - * \param logger The `rclcpp::Logger` to use + * \param logger The `rclcpp::logger::Logger` to use @[ for param_name, doc_line in feature_combinations[feature_combination].params.items()]@ * \param @(param_name) @(doc_line) @[ end for]@ diff --git a/rclcpp/src/rclcpp/logger.cpp b/rclcpp/src/rclcpp/logger.cpp index 003c112fe7..1d392c3b55 100644 --- a/rclcpp/src/rclcpp/logger.cpp +++ b/rclcpp/src/rclcpp/logger.cpp @@ -19,20 +19,25 @@ namespace rclcpp { +namespace logger +{ + Logger get_logger(const std::string & name) { #if RCLCPP_LOGGING_ENABLED - return rclcpp::Logger(name); + return Logger(name); #else (void)name; - return rclcpp::Logger(); + return Logger(); #endif } +} // namespace logger + namespace logging_macro_utilities { -const char * get_logger_name(const Logger & logger) +const char * get_logger_name(const rclcpp::logger::Logger & logger) { return logger.get_name(); } diff --git a/rclcpp/src/rclcpp/node.cpp b/rclcpp/src/rclcpp/node.cpp index a85fe21b60..84faa9d89c 100644 --- a/rclcpp/src/rclcpp/node.cpp +++ b/rclcpp/src/rclcpp/node.cpp @@ -86,7 +86,7 @@ Node::get_namespace() const return node_base_->get_namespace(); } -rclcpp::Logger +rclcpp::logger::Logger Node::get_logger() const { return node_logger_->get_logger(); diff --git a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp b/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp index 82c8dee918..e9a0fc4c2b 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp @@ -20,14 +20,14 @@ NodeLogger::NodeLogger(rclcpp::node_interfaces::NodeBaseInterface * node_base) : node_base_(node_base) { // TODO(dhood): use the namespace (slashes converted to dots) - logger_ = rclcpp::get_logger(node_base_->get_name()); + logger_ = rclcpp::logger::get_logger(node_base_->get_name()); } NodeLogger::~NodeLogger() { } -rclcpp::Logger +rclcpp::logger::Logger NodeLogger::get_logger() const { return logger_; diff --git a/rclcpp/test/test_logger.cpp b/rclcpp/test/test_logger.cpp index 700fbe44f7..5b8fe7a684 100644 --- a/rclcpp/test/test_logger.cpp +++ b/rclcpp/test/test_logger.cpp @@ -19,21 +19,21 @@ #include "rclcpp/logger.hpp" TEST(TestLogger, factory_functions) { - rclcpp::Logger logger = rclcpp::get_logger("test_logger"); + rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); EXPECT_STREQ("test_logger", logger.get_name()); - rclcpp::Logger logger_copy = rclcpp::Logger(logger); + rclcpp::logger::Logger logger_copy = rclcpp::logger::Logger(logger); EXPECT_STREQ("test_logger", logger_copy.get_name()); } TEST(TestLogger, hierarchy) { - rclcpp::Logger logger = rclcpp::get_logger("test_logger"); - rclcpp::Logger sublogger = logger.get_child("child"); + rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); + rclcpp::logger::Logger sublogger = logger.get_child("child"); EXPECT_STREQ("test_logger.child", sublogger.get_name()); - rclcpp::Logger subsublogger = sublogger.get_child("grandchild"); + rclcpp::logger::Logger subsublogger = sublogger.get_child("grandchild"); EXPECT_STREQ("test_logger.child.grandchild", subsublogger.get_name()); } TEST(TestLogger, helper_functions) { - rclcpp::Logger logger = rclcpp::get_logger("test_logger"); + rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); EXPECT_STREQ(logger.get_name(), rclcpp::logging_macro_utilities::get_logger_name(logger)); } diff --git a/rclcpp/test/test_logging.cpp b/rclcpp/test/test_logging.cpp index 29dfda04d3..82a365157d 100644 --- a/rclcpp/test/test_logging.cpp +++ b/rclcpp/test/test_logging.cpp @@ -27,7 +27,7 @@ using ::testing::EndsWith; size_t g_log_calls = 0; -rclcpp::Logger g_logger = rclcpp::get_logger("name"); +rclcpp::logger::Logger g_logger = rclcpp::logger::get_logger("name"); struct LogEvent { From 70f5bbd39958e18c0d89ee8030df34bb4f5f65a3 Mon Sep 17 00:00:00 2001 From: dhood Date: Wed, 29 Nov 2017 18:11:09 -0800 Subject: [PATCH 14/25] Move helper function for macro errors into macro header --- rclcpp/include/rclcpp/logger.hpp | 19 ------------------- rclcpp/resource/logging.hpp.em | 27 ++++++++++++++++++++++++++- rclcpp/src/rclcpp/logger.cpp | 10 ---------- rclcpp/test/test_logger.cpp | 3 ++- 4 files changed, 28 insertions(+), 31 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 19b827b205..faca725270 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -127,25 +127,6 @@ class Logger } // namespace logger -namespace logging_macro_utilities -{ - -/// Helper function to give useful compiler errors in logging macros. -/** - * This is not intended for regular use: the `Logger::get_name` method should be - * used. - * This will provide a compiler error that includes the `Logger` class if an - * incorrect type is passed as a parameter, e.g. through incorrect usage of - * logging macros such as `RCLCPP_INFO()`. - * - * \param[in] logger the logger to get the name of - * \return the name of the logger - */ -RCLCPP_PUBLIC -const char * get_logger_name(const rclcpp::logger::Logger & logger); - -} // namespace logging_macro_utilities - } // namespace rclcpp #endif // RCLCPP__LOGGER_HPP_ diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index 43fcdb1be3..0e0de26c10 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -38,6 +38,31 @@ #define RCLCPP_LOG_MIN_SEVERITY RCLCPP_LOG_MIN_SEVERITY_DEBUG #endif +namespace rclcpp +{ + +namespace logging_macro_utilities +{ + +/// Helper function to give useful compiler errors in logging macros. +/** + * This is not intended for regular use: the `rclcpp::logger::Logger::get_name` + * method should be used. + * This will provide a compiler error that includes the `rclcpp::logger::Logger` + * class if an incorrect type is passed as a parameter, e.g. through incorrect + * usage of logging macros such as `RCLCPP_INFO()`. + * + * \param[in] logger the logger to get the name of + * \return the name of the logger + */ +inline const char * _get_logger_name(const rclcpp::logger::Logger & logger) +{ + return logger.get_name(); +} + +} // namespace logging_macro_utilities + +} // namespace rclcpp @{ from rcutils.logging import feature_combinations @@ -89,7 +114,7 @@ def is_supported_feature_combination(feature_combination): @[ if params]@ @(''.join([' ' + p + ', \\\n' for p in params]))@ @[ end if]@ - rclcpp::logging_macro_utilities::get_logger_name(logger), \ + rclcpp::logging_macro_utilities::_get_logger_name(logger), \ __VA_ARGS__) @[ end for]@ diff --git a/rclcpp/src/rclcpp/logger.cpp b/rclcpp/src/rclcpp/logger.cpp index 1d392c3b55..ace8280282 100644 --- a/rclcpp/src/rclcpp/logger.cpp +++ b/rclcpp/src/rclcpp/logger.cpp @@ -34,14 +34,4 @@ Logger get_logger(const std::string & name) } // namespace logger -namespace logging_macro_utilities -{ - -const char * get_logger_name(const rclcpp::logger::Logger & logger) -{ - return logger.get_name(); -} - -} // namespace logging_macro_utilities - } // namespace rclcpp diff --git a/rclcpp/test/test_logger.cpp b/rclcpp/test/test_logger.cpp index 5b8fe7a684..5e71da4af1 100644 --- a/rclcpp/test/test_logger.cpp +++ b/rclcpp/test/test_logger.cpp @@ -17,6 +17,7 @@ #include #include "rclcpp/logger.hpp" +#include "rclcpp/logging.hpp" TEST(TestLogger, factory_functions) { rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); @@ -35,5 +36,5 @@ TEST(TestLogger, hierarchy) { TEST(TestLogger, helper_functions) { rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); - EXPECT_STREQ(logger.get_name(), rclcpp::logging_macro_utilities::get_logger_name(logger)); + EXPECT_STREQ(logger.get_name(), rclcpp::logging_macro_utilities::_get_logger_name(logger)); } From 05c8bc7c9015c141e6feeca7cff314167665c00b Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 13:26:44 -0800 Subject: [PATCH 15/25] Remove 'logger' namespace --- rclcpp/include/rclcpp/logger.hpp | 6 +----- rclcpp/include/rclcpp/node.hpp | 2 +- .../include/rclcpp/node_interfaces/node_logger.hpp | 4 ++-- .../node_interfaces/node_logger_interface.hpp | 2 +- rclcpp/include/rclcpp/rclcpp.hpp | 4 +--- rclcpp/resource/logging.hpp.em | 14 +++++++------- rclcpp/src/rclcpp/logger.cpp | 9 ++------- rclcpp/src/rclcpp/node.cpp | 2 +- rclcpp/src/rclcpp/node_interfaces/node_logger.cpp | 4 ++-- rclcpp/test/test_logger.cpp | 12 ++++++------ rclcpp/test/test_logging.cpp | 2 +- 11 files changed, 25 insertions(+), 36 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index faca725270..67197b5c1f 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -43,8 +43,6 @@ namespace node_interfaces class NodeLogger; } -namespace logger -{ class Logger; /// Return a named logger. @@ -64,7 +62,7 @@ Logger get_logger(const std::string & name); class Logger { private: - friend Logger rclcpp::logger::get_logger(const std::string & name); + friend Logger rclcpp::get_logger(const std::string & name); friend ::rclcpp::node_interfaces::NodeLogger; /// Constructor of a dummy logger. @@ -125,8 +123,6 @@ class Logger } }; -} // namespace logger - } // namespace rclcpp #endif // RCLCPP__LOGGER_HPP_ diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index 943ddc9669..5cf1c09b23 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -113,7 +113,7 @@ class Node : public std::enable_shared_from_this /// Get the logger of the node. /** \return The logger of the node. */ RCLCPP_PUBLIC - rclcpp::logger::Logger + rclcpp::Logger get_logger() const; /// Create and return a callback group. diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp index 297ecac511..d849f8e014 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp @@ -43,7 +43,7 @@ class NodeLogger : public NodeLoggerInterface RCLCPP_PUBLIC virtual - rclcpp::logger::Logger + rclcpp::Logger get_logger() const; private: @@ -52,7 +52,7 @@ class NodeLogger : public NodeLoggerInterface /// Handle to the NodeBaseInterface given in the constructor. rclcpp::node_interfaces::NodeBaseInterface * node_base_; - rclcpp::logger::Logger logger_; + rclcpp::Logger logger_; }; } // namespace node_interfaces diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp index 871b5a9a40..9f4f51dae2 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp @@ -37,7 +37,7 @@ class NodeLoggerInterface /** \return The logger of the node. */ RCLCPP_PUBLIC virtual - rclcpp::logger::Logger + rclcpp::Logger get_logger() const = 0; }; diff --git a/rclcpp/include/rclcpp/rclcpp.hpp b/rclcpp/include/rclcpp/rclcpp.hpp index fc5142fe4b..01451ccc9b 100644 --- a/rclcpp/include/rclcpp/rclcpp.hpp +++ b/rclcpp/include/rclcpp/rclcpp.hpp @@ -103,7 +103,7 @@ * - RCLCPP_ERROR_SKIPFIRST() * - rclcpp/logging.hpp * - Logger: - * - rclcpp::logger::Logger + * - rclcpp::Logger * - rclcpp/logger.hpp * * Finally, there are many internal API's and utilities: @@ -172,8 +172,6 @@ using rclcpp::timer::GenericTimer; using rclcpp::timer::TimerBase; using rclcpp::timer::WallTimer; using ContextSharedPtr = rclcpp::context::Context::SharedPtr; -using rclcpp::logger::Logger; -using rclcpp::logger::get_logger; using rclcpp::utilities::ok; using rclcpp::utilities::shutdown; using rclcpp::utilities::init; diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index 0e0de26c10..d913c9ff15 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -46,16 +46,16 @@ namespace logging_macro_utilities /// Helper function to give useful compiler errors in logging macros. /** - * This is not intended for regular use: the `rclcpp::logger::Logger::get_name` - * method should be used. - * This will provide a compiler error that includes the `rclcpp::logger::Logger` - * class if an incorrect type is passed as a parameter, e.g. through incorrect - * usage of logging macros such as `RCLCPP_INFO()`. + * This is not intended for regular use: the `rclcpp::Logger::get_name` method + * should be used. + * This will provide a compiler error that includes the `rclcpp::Logger` class + * if an incorrect type is passed as a parameter, e.g. through incorrect usage + * of logging macros such as `RCLCPP_INFO()`. * * \param[in] logger the logger to get the name of * \return the name of the logger */ -inline const char * _get_logger_name(const rclcpp::logger::Logger & logger) +inline const char * _get_logger_name(const rclcpp::Logger & logger) { return logger.get_name(); } @@ -102,7 +102,7 @@ def is_supported_feature_combination(feature_combination): @[ for doc_line in feature_combinations[feature_combination].doc_lines]@ * @(doc_line) @[ end for]@ - * \param logger The `rclcpp::logger::Logger` to use + * \param logger The `rclcpp::Logger` to use @[ for param_name, doc_line in feature_combinations[feature_combination].params.items()]@ * \param @(param_name) @(doc_line) @[ end for]@ diff --git a/rclcpp/src/rclcpp/logger.cpp b/rclcpp/src/rclcpp/logger.cpp index ace8280282..16e92d1d45 100644 --- a/rclcpp/src/rclcpp/logger.cpp +++ b/rclcpp/src/rclcpp/logger.cpp @@ -19,19 +19,14 @@ namespace rclcpp { -namespace logger -{ - Logger get_logger(const std::string & name) { #if RCLCPP_LOGGING_ENABLED - return Logger(name); + return rclcpp::Logger(name); #else (void)name; - return Logger(); + return rclcpp::Logger(); #endif } -} // namespace logger - } // namespace rclcpp diff --git a/rclcpp/src/rclcpp/node.cpp b/rclcpp/src/rclcpp/node.cpp index 84faa9d89c..a85fe21b60 100644 --- a/rclcpp/src/rclcpp/node.cpp +++ b/rclcpp/src/rclcpp/node.cpp @@ -86,7 +86,7 @@ Node::get_namespace() const return node_base_->get_namespace(); } -rclcpp::logger::Logger +rclcpp::Logger Node::get_logger() const { return node_logger_->get_logger(); diff --git a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp b/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp index e9a0fc4c2b..82c8dee918 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp @@ -20,14 +20,14 @@ NodeLogger::NodeLogger(rclcpp::node_interfaces::NodeBaseInterface * node_base) : node_base_(node_base) { // TODO(dhood): use the namespace (slashes converted to dots) - logger_ = rclcpp::logger::get_logger(node_base_->get_name()); + logger_ = rclcpp::get_logger(node_base_->get_name()); } NodeLogger::~NodeLogger() { } -rclcpp::logger::Logger +rclcpp::Logger NodeLogger::get_logger() const { return logger_; diff --git a/rclcpp/test/test_logger.cpp b/rclcpp/test/test_logger.cpp index 5e71da4af1..602252ed3e 100644 --- a/rclcpp/test/test_logger.cpp +++ b/rclcpp/test/test_logger.cpp @@ -20,21 +20,21 @@ #include "rclcpp/logging.hpp" TEST(TestLogger, factory_functions) { - rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); + rclcpp::Logger logger = rclcpp::get_logger("test_logger"); EXPECT_STREQ("test_logger", logger.get_name()); - rclcpp::logger::Logger logger_copy = rclcpp::logger::Logger(logger); + rclcpp::Logger logger_copy = rclcpp::Logger(logger); EXPECT_STREQ("test_logger", logger_copy.get_name()); } TEST(TestLogger, hierarchy) { - rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); - rclcpp::logger::Logger sublogger = logger.get_child("child"); + rclcpp::Logger logger = rclcpp::get_logger("test_logger"); + rclcpp::Logger sublogger = logger.get_child("child"); EXPECT_STREQ("test_logger.child", sublogger.get_name()); - rclcpp::logger::Logger subsublogger = sublogger.get_child("grandchild"); + rclcpp::Logger subsublogger = sublogger.get_child("grandchild"); EXPECT_STREQ("test_logger.child.grandchild", subsublogger.get_name()); } TEST(TestLogger, helper_functions) { - rclcpp::logger::Logger logger = rclcpp::logger::get_logger("test_logger"); + rclcpp::Logger logger = rclcpp::get_logger("test_logger"); EXPECT_STREQ(logger.get_name(), rclcpp::logging_macro_utilities::_get_logger_name(logger)); } diff --git a/rclcpp/test/test_logging.cpp b/rclcpp/test/test_logging.cpp index 82a365157d..29dfda04d3 100644 --- a/rclcpp/test/test_logging.cpp +++ b/rclcpp/test/test_logging.cpp @@ -27,7 +27,7 @@ using ::testing::EndsWith; size_t g_log_calls = 0; -rclcpp::logger::Logger g_logger = rclcpp::logger::get_logger("name"); +rclcpp::Logger g_logger = rclcpp::get_logger("name"); struct LogEvent { From c80ac8511dea99fb96aa0cbb0c5fb83df4190e24 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 13:50:14 -0800 Subject: [PATCH 16/25] Return type on separate line --- rclcpp/include/rclcpp/logger.hpp | 9 ++++++--- rclcpp/src/rclcpp/logger.cpp | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 67197b5c1f..8e4a29d4ac 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -57,7 +57,8 @@ class Logger; * \return a dummy logger if logging is disabled. */ RCLCPP_PUBLIC -Logger get_logger(const std::string & name); +Logger +get_logger(const std::string & name); class Logger { @@ -93,7 +94,8 @@ class Logger * disabled). */ RCLCPP_PUBLIC - const char * get_name() const + const char * + get_name() const { if (!name_) { return nullptr; @@ -114,7 +116,8 @@ class Logger * disabled). */ RCLCPP_PUBLIC - Logger get_child(const std::string & suffix) + Logger + get_child(const std::string & suffix) { if (!name_) { return Logger(); diff --git a/rclcpp/src/rclcpp/logger.cpp b/rclcpp/src/rclcpp/logger.cpp index 16e92d1d45..03b5e0c332 100644 --- a/rclcpp/src/rclcpp/logger.cpp +++ b/rclcpp/src/rclcpp/logger.cpp @@ -19,7 +19,8 @@ namespace rclcpp { -Logger get_logger(const std::string & name) +rclcpp::Logger +get_logger(const std::string & name) { #if RCLCPP_LOGGING_ENABLED return rclcpp::Logger(name); From 8d91bf3a05a32be56a3fd9f2c42090dd5739eaef Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 13:50:25 -0800 Subject: [PATCH 17/25] Update copyright year --- rclcpp/include/rclcpp/node_interfaces/node_logger.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp index d849f8e014..69306636df 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp @@ -1,4 +1,4 @@ -// Copyright 2016 Open Source Robotics Foundation, Inc. +// Copyright 2017 Open Source Robotics Foundation, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. From a9c0ef74323bdb92495e74f0b17eea6acd237476 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 14:13:23 -0800 Subject: [PATCH 18/25] Give lifecycle nodes a logger --- .../include/rclcpp_lifecycle/lifecycle_node.hpp | 9 +++++++++ rclcpp_lifecycle/src/lifecycle_node.cpp | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp b/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp index 8b2d1b7c19..7bd4249590 100644 --- a/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp +++ b/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp @@ -32,10 +32,12 @@ #include "rclcpp/client.hpp" #include "rclcpp/context.hpp" #include "rclcpp/event.hpp" +#include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/message_memory_strategy.hpp" #include "rclcpp/node_interfaces/node_base_interface.hpp" #include "rclcpp/node_interfaces/node_graph_interface.hpp" +#include "rclcpp/node_interfaces/node_logger_interface.hpp" #include "rclcpp/node_interfaces/node_parameters_interface.hpp" #include "rclcpp/node_interfaces/node_services_interface.hpp" #include "rclcpp/node_interfaces/node_timers_interface.hpp" @@ -108,6 +110,12 @@ class LifecycleNode : public node_interfaces::LifecycleNodeInterface, const char * get_namespace() const; + /// Get the logger of the node. + /** \return The logger of the node. */ + RCLCPP_LIFECYCLE_PUBLIC + rclcpp::Logger + get_logger() const; + /// Create and return a callback group. RCLCPP_LIFECYCLE_PUBLIC rclcpp::callback_group::CallbackGroup::SharedPtr @@ -467,6 +475,7 @@ class LifecycleNode : public node_interfaces::LifecycleNodeInterface, rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_; rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_; + rclcpp::node_interfaces::NodeLoggerInterface::SharedPtr node_logger_; rclcpp::node_interfaces::NodeTimersInterface::SharedPtr node_timers_; rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_; rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_; diff --git a/rclcpp_lifecycle/src/lifecycle_node.cpp b/rclcpp_lifecycle/src/lifecycle_node.cpp index ad5bd26520..2a0772e359 100644 --- a/rclcpp_lifecycle/src/lifecycle_node.cpp +++ b/rclcpp_lifecycle/src/lifecycle_node.cpp @@ -25,9 +25,11 @@ #include "rclcpp/exceptions.hpp" #include "rclcpp/graph_listener.hpp" +#include "rclcpp/logger.hpp" #include "rclcpp/node.hpp" #include "rclcpp/node_interfaces/node_base.hpp" #include "rclcpp/node_interfaces/node_graph.hpp" +#include "rclcpp/node_interfaces/node_logger.hpp" #include "rclcpp/node_interfaces/node_parameters.hpp" #include "rclcpp/node_interfaces/node_services.hpp" #include "rclcpp/node_interfaces/node_timers.hpp" @@ -56,6 +58,7 @@ LifecycleNode::LifecycleNode( bool use_intra_process_comms) : node_base_(new rclcpp::node_interfaces::NodeBase(node_name, namespace_, context)), node_graph_(new rclcpp::node_interfaces::NodeGraph(node_base_.get())), + node_logger_(new rclcpp::node_interfaces::NodeLogger(node_base_.get())), node_timers_(new rclcpp::node_interfaces::NodeTimers(node_base_.get())), node_topics_(new rclcpp::node_interfaces::NodeTopics(node_base_.get())), node_services_(new rclcpp::node_interfaces::NodeServices(node_base_.get())), @@ -95,6 +98,12 @@ LifecycleNode::get_namespace() const return node_base_->get_namespace(); } +rclcpp::Logger +LifecycleNode::get_logger() const +{ + return node_logger_->get_logger(); +} + rclcpp::callback_group::CallbackGroup::SharedPtr LifecycleNode::create_callback_group( rclcpp::callback_group::CallbackGroupType group_type) From ab695af83aba4c6d320e5f0ace0f0c97af58fcc5 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 14:14:44 -0800 Subject: [PATCH 19/25] Add test for lifecycle node logger Move the default_state_machine tests to another file because having different test fixtures was causing init to be called twice. --- rclcpp_lifecycle/CMakeLists.txt | 9 + .../test/test_default_state_machine.cpp | 205 ++++++++++++++++++ rclcpp_lifecycle/test/test_lifecycle_node.cpp | 182 +--------------- 3 files changed, 220 insertions(+), 176 deletions(-) create mode 100644 rclcpp_lifecycle/test/test_default_state_machine.cpp diff --git a/rclcpp_lifecycle/CMakeLists.txt b/rclcpp_lifecycle/CMakeLists.txt index 7bf52ef221..af4e3e28c8 100644 --- a/rclcpp_lifecycle/CMakeLists.txt +++ b/rclcpp_lifecycle/CMakeLists.txt @@ -54,6 +54,15 @@ if(BUILD_TESTING) ) target_link_libraries(test_lifecycle_node ${PROJECT_NAME}) endif() + ament_add_gtest(test_default_state_machine test/test_default_state_machine.cpp) + if(TARGET test_default_state_machine) + target_include_directories(test_default_state_machine PUBLIC + ${rcl_lifecycle_INCLUDE_DIRS} + ${rclcpp_INCLUDE_DIRS} + ${rclcpp_lifecycle_INCLUDE_DIRS} + ) + target_link_libraries(test_default_state_machine ${PROJECT_NAME}) + endif() ament_add_gtest(test_state_machine_info test/test_state_machine_info.cpp) if(TARGET test_state_machine_info) target_include_directories(test_state_machine_info PUBLIC diff --git a/rclcpp_lifecycle/test/test_default_state_machine.cpp b/rclcpp_lifecycle/test/test_default_state_machine.cpp new file mode 100644 index 0000000000..01153e353a --- /dev/null +++ b/rclcpp_lifecycle/test/test_default_state_machine.cpp @@ -0,0 +1,205 @@ +// Copyright 2015 Open Source Robotics Foundation, Inc. +// +// 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 "lifecycle_msgs/msg/state.hpp" +#include "lifecycle_msgs/msg/transition.hpp" + +#include "rclcpp/rclcpp.hpp" +#include "rclcpp_lifecycle/lifecycle_node.hpp" + +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: + static void SetUpTestCase() + { + rclcpp::init(0, nullptr); + } +}; + +class EmptyLifecycleNode : public rclcpp_lifecycle::LifecycleNode +{ +public: + explicit EmptyLifecycleNode(std::string node_name) + : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) + {} +}; + +template +class MoodyLifecycleNode : public rclcpp_lifecycle::LifecycleNode +{ +public: + explicit MoodyLifecycleNode(std::string node_name) + : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) + {} + + size_t number_of_callbacks = 0; + +protected: + rcl_lifecycle_transition_key_t + on_configure(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_CONFIGURING, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_activate(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_ACTIVATING, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_deactivate(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_DEACTIVATING, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_cleanup(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_CLEANINGUP, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_shutdown(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_SHUTTINGDOWN, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_error(const rclcpp_lifecycle::State &); +}; + +template<> +rcl_lifecycle_transition_key_t +MoodyLifecycleNode::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; +} +template<> +rcl_lifecycle_transition_key_t +MoodyLifecycleNode::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; +} + +TEST_F(TestDefaultStateMachine, empty_initializer) { + auto test_node = std::make_shared("testnode"); + EXPECT_STREQ("testnode", test_node->get_name()); + EXPECT_STREQ("/", test_node->get_namespace()); + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); +} + +TEST_F(TestDefaultStateMachine, trigger_transition) { + auto test_node = std::make_shared("testnode"); + + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); + EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( + rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); +} + +TEST_F(TestDefaultStateMachine, trigger_transition_with_error_code) { + auto test_node = std::make_shared("testnode"); + + rcl_lifecycle_transition_key_t ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + test_node->configure(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->activate(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->deactivate(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->cleanup(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->shutdown(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); +} + +TEST_F(TestDefaultStateMachine, good_mood) { + auto test_node = std::make_shared>("testnode"); + + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); + EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( + rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); + + // check if all callbacks were successfully overwritten + EXPECT_EQ(static_cast(5), test_node->number_of_callbacks); +} + +TEST_F(TestDefaultStateMachine, bad_mood) { + auto test_node = std::make_shared>("testnode"); + + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); + 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(1), test_node->number_of_callbacks); +} diff --git a/rclcpp_lifecycle/test/test_lifecycle_node.cpp b/rclcpp_lifecycle/test/test_lifecycle_node.cpp index 01153e353a..bf0869a118 100644 --- a/rclcpp_lifecycle/test/test_lifecycle_node.cpp +++ b/rclcpp_lifecycle/test/test_lifecycle_node.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Open Source Robotics Foundation, Inc. +// Copyright 2017 Open Source Robotics Foundation, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,31 +14,13 @@ #include -#include -#include -#include -#include "lifecycle_msgs/msg/state.hpp" -#include "lifecycle_msgs/msg/transition.hpp" +#include #include "rclcpp/rclcpp.hpp" #include "rclcpp_lifecycle/lifecycle_node.hpp" -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 +class TestLifecycleNode : public ::testing::Test { protected: static void SetUpTestCase() @@ -47,159 +29,7 @@ class TestDefaultStateMachine : public ::testing::Test } }; -class EmptyLifecycleNode : public rclcpp_lifecycle::LifecycleNode -{ -public: - explicit EmptyLifecycleNode(std::string node_name) - : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) - {} -}; - -template -class MoodyLifecycleNode : public rclcpp_lifecycle::LifecycleNode -{ -public: - explicit MoodyLifecycleNode(std::string node_name) - : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) - {} - - size_t number_of_callbacks = 0; - -protected: - rcl_lifecycle_transition_key_t - on_configure(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_CONFIGURING, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_activate(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_ACTIVATING, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_deactivate(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_DEACTIVATING, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_cleanup(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_CLEANINGUP, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_shutdown(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_SHUTTINGDOWN, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_error(const rclcpp_lifecycle::State &); -}; - -template<> -rcl_lifecycle_transition_key_t -MoodyLifecycleNode::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; -} -template<> -rcl_lifecycle_transition_key_t -MoodyLifecycleNode::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; -} - -TEST_F(TestDefaultStateMachine, empty_initializer) { - auto test_node = std::make_shared("testnode"); - EXPECT_STREQ("testnode", test_node->get_name()); - EXPECT_STREQ("/", test_node->get_namespace()); - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); -} - -TEST_F(TestDefaultStateMachine, trigger_transition) { - auto test_node = std::make_shared("testnode"); - - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); - EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( - rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); -} - -TEST_F(TestDefaultStateMachine, trigger_transition_with_error_code) { - auto test_node = std::make_shared("testnode"); - - rcl_lifecycle_transition_key_t ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - test_node->configure(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->activate(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->deactivate(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->cleanup(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->shutdown(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); -} - -TEST_F(TestDefaultStateMachine, good_mood) { - auto test_node = std::make_shared>("testnode"); - - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); - EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( - rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); - - // check if all callbacks were successfully overwritten - EXPECT_EQ(static_cast(5), test_node->number_of_callbacks); -} - -TEST_F(TestDefaultStateMachine, bad_mood) { - auto test_node = std::make_shared>("testnode"); - - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); - 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(1), test_node->number_of_callbacks); +TEST_F(TestLifecycleNode, get_logger) { + auto node = std::make_shared("my_node", "/ns"); + EXPECT_STREQ("my_node", node->get_logger().get_name()); } From a519b725c4ad6dc9dc809119123c2e400a64ea60 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 18:14:51 -0800 Subject: [PATCH 20/25] Switch to static_assert for logger check --- rclcpp/resource/logging.hpp.em | 31 ++++--------------------------- rclcpp/test/test_logger.cpp | 5 ----- 2 files changed, 4 insertions(+), 32 deletions(-) diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index d913c9ff15..5b5652c840 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -17,6 +17,8 @@ #ifndef RCLCPP__LOGGING_HPP_ #define RCLCPP__LOGGING_HPP_ +#include + #include "rclcpp/logger.hpp" #include "rcutils/logging_macros.h" @@ -38,32 +40,6 @@ #define RCLCPP_LOG_MIN_SEVERITY RCLCPP_LOG_MIN_SEVERITY_DEBUG #endif -namespace rclcpp -{ - -namespace logging_macro_utilities -{ - -/// Helper function to give useful compiler errors in logging macros. -/** - * This is not intended for regular use: the `rclcpp::Logger::get_name` method - * should be used. - * This will provide a compiler error that includes the `rclcpp::Logger` class - * if an incorrect type is passed as a parameter, e.g. through incorrect usage - * of logging macros such as `RCLCPP_INFO()`. - * - * \param[in] logger the logger to get the name of - * \return the name of the logger - */ -inline const char * _get_logger_name(const rclcpp::Logger & logger) -{ - return logger.get_name(); -} - -} // namespace logging_macro_utilities - -} // namespace rclcpp - @{ from rcutils.logging import feature_combinations from rcutils.logging import get_macro_parameters @@ -109,12 +85,13 @@ def is_supported_feature_combination(feature_combination): * \param ... The format string, followed by the variable arguments for the format string */ #define RCLCPP_@(severity)@(suffix)(logger, @(''.join([p + ', ' for p in get_macro_parameters(feature_combination).keys()]))...) \ + static_assert(std::is_same::value, "First argument to logging macros must be an rclcpp::Logger"); \ RCUTILS_LOG_@(severity)@(suffix)_NAMED( \ @{params = get_macro_parameters(feature_combination).keys()}@ @[ if params]@ @(''.join([' ' + p + ', \\\n' for p in params]))@ @[ end if]@ - rclcpp::logging_macro_utilities::_get_logger_name(logger), \ + logger.get_name(), \ __VA_ARGS__) @[ end for]@ diff --git a/rclcpp/test/test_logger.cpp b/rclcpp/test/test_logger.cpp index 602252ed3e..258cdd0959 100644 --- a/rclcpp/test/test_logger.cpp +++ b/rclcpp/test/test_logger.cpp @@ -33,8 +33,3 @@ TEST(TestLogger, hierarchy) { rclcpp::Logger subsublogger = sublogger.get_child("grandchild"); EXPECT_STREQ("test_logger.child.grandchild", subsublogger.get_name()); } - -TEST(TestLogger, helper_functions) { - rclcpp::Logger logger = rclcpp::get_logger("test_logger"); - EXPECT_STREQ(logger.get_name(), rclcpp::logging_macro_utilities::_get_logger_name(logger)); -} From c3960b775a05801bd578e4d84b28922c3a0abf03 Mon Sep 17 00:00:00 2001 From: dhood Date: Thu, 30 Nov 2017 19:14:10 -0800 Subject: [PATCH 21/25] global ns scope in macro calls just in case --- rclcpp/resource/logging.hpp.em | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rclcpp/resource/logging.hpp.em b/rclcpp/resource/logging.hpp.em index 5b5652c840..238f01963a 100644 --- a/rclcpp/resource/logging.hpp.em +++ b/rclcpp/resource/logging.hpp.em @@ -85,7 +85,7 @@ def is_supported_feature_combination(feature_combination): * \param ... The format string, followed by the variable arguments for the format string */ #define RCLCPP_@(severity)@(suffix)(logger, @(''.join([p + ', ' for p in get_macro_parameters(feature_combination).keys()]))...) \ - static_assert(std::is_same::value, "First argument to logging macros must be an rclcpp::Logger"); \ + static_assert(::std::is_same::value, "First argument to logging macros must be an rclcpp::Logger"); \ RCUTILS_LOG_@(severity)@(suffix)_NAMED( \ @{params = get_macro_parameters(feature_combination).keys()}@ @[ if params]@ From 5142bab096dd63278d55d3bc2dbd740225fbab31 Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 4 Dec 2017 09:13:25 -0800 Subject: [PATCH 22/25] Revert "Add test for lifecycle node logger" (make diff smaller) demos use the loggers and we don't test other node stuff in lifecycle_node --- rclcpp_lifecycle/CMakeLists.txt | 9 - .../test/test_default_state_machine.cpp | 205 ------------------ rclcpp_lifecycle/test/test_lifecycle_node.cpp | 182 +++++++++++++++- 3 files changed, 176 insertions(+), 220 deletions(-) delete mode 100644 rclcpp_lifecycle/test/test_default_state_machine.cpp diff --git a/rclcpp_lifecycle/CMakeLists.txt b/rclcpp_lifecycle/CMakeLists.txt index af4e3e28c8..7bf52ef221 100644 --- a/rclcpp_lifecycle/CMakeLists.txt +++ b/rclcpp_lifecycle/CMakeLists.txt @@ -54,15 +54,6 @@ if(BUILD_TESTING) ) target_link_libraries(test_lifecycle_node ${PROJECT_NAME}) endif() - ament_add_gtest(test_default_state_machine test/test_default_state_machine.cpp) - if(TARGET test_default_state_machine) - target_include_directories(test_default_state_machine PUBLIC - ${rcl_lifecycle_INCLUDE_DIRS} - ${rclcpp_INCLUDE_DIRS} - ${rclcpp_lifecycle_INCLUDE_DIRS} - ) - target_link_libraries(test_default_state_machine ${PROJECT_NAME}) - endif() ament_add_gtest(test_state_machine_info test/test_state_machine_info.cpp) if(TARGET test_state_machine_info) target_include_directories(test_state_machine_info PUBLIC diff --git a/rclcpp_lifecycle/test/test_default_state_machine.cpp b/rclcpp_lifecycle/test/test_default_state_machine.cpp deleted file mode 100644 index 01153e353a..0000000000 --- a/rclcpp_lifecycle/test/test_default_state_machine.cpp +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2015 Open Source Robotics Foundation, Inc. -// -// 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 "lifecycle_msgs/msg/state.hpp" -#include "lifecycle_msgs/msg/transition.hpp" - -#include "rclcpp/rclcpp.hpp" -#include "rclcpp_lifecycle/lifecycle_node.hpp" - -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: - static void SetUpTestCase() - { - rclcpp::init(0, nullptr); - } -}; - -class EmptyLifecycleNode : public rclcpp_lifecycle::LifecycleNode -{ -public: - explicit EmptyLifecycleNode(std::string node_name) - : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) - {} -}; - -template -class MoodyLifecycleNode : public rclcpp_lifecycle::LifecycleNode -{ -public: - explicit MoodyLifecycleNode(std::string node_name) - : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) - {} - - size_t number_of_callbacks = 0; - -protected: - rcl_lifecycle_transition_key_t - on_configure(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_CONFIGURING, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_activate(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_ACTIVATING, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_deactivate(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_DEACTIVATING, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_cleanup(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_CLEANINGUP, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_shutdown(const rclcpp_lifecycle::State &) - { - EXPECT_EQ(State::TRANSITION_STATE_SHUTTINGDOWN, get_current_state().id()); - ++number_of_callbacks; - return Mood::cb_ret; - } - - rcl_lifecycle_transition_key_t - on_error(const rclcpp_lifecycle::State &); -}; - -template<> -rcl_lifecycle_transition_key_t -MoodyLifecycleNode::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; -} -template<> -rcl_lifecycle_transition_key_t -MoodyLifecycleNode::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; -} - -TEST_F(TestDefaultStateMachine, empty_initializer) { - auto test_node = std::make_shared("testnode"); - EXPECT_STREQ("testnode", test_node->get_name()); - EXPECT_STREQ("/", test_node->get_namespace()); - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); -} - -TEST_F(TestDefaultStateMachine, trigger_transition) { - auto test_node = std::make_shared("testnode"); - - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); - EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( - rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); -} - -TEST_F(TestDefaultStateMachine, trigger_transition_with_error_code) { - auto test_node = std::make_shared("testnode"); - - rcl_lifecycle_transition_key_t ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - test_node->configure(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->activate(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->deactivate(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->cleanup(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); - ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; - - test_node->shutdown(ret); - EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); -} - -TEST_F(TestDefaultStateMachine, good_mood) { - auto test_node = std::make_shared>("testnode"); - - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); - EXPECT_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( - rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); - EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( - rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); - - // check if all callbacks were successfully overwritten - EXPECT_EQ(static_cast(5), test_node->number_of_callbacks); -} - -TEST_F(TestDefaultStateMachine, bad_mood) { - auto test_node = std::make_shared>("testnode"); - - EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); - 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(1), test_node->number_of_callbacks); -} diff --git a/rclcpp_lifecycle/test/test_lifecycle_node.cpp b/rclcpp_lifecycle/test/test_lifecycle_node.cpp index bf0869a118..01153e353a 100644 --- a/rclcpp_lifecycle/test/test_lifecycle_node.cpp +++ b/rclcpp_lifecycle/test/test_lifecycle_node.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Open Source Robotics Foundation, Inc. +// Copyright 2015 Open Source Robotics Foundation, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,13 +14,31 @@ #include - #include +#include +#include + +#include "lifecycle_msgs/msg/state.hpp" +#include "lifecycle_msgs/msg/transition.hpp" #include "rclcpp/rclcpp.hpp" #include "rclcpp_lifecycle/lifecycle_node.hpp" -class TestLifecycleNode : public ::testing::Test +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: static void SetUpTestCase() @@ -29,7 +47,159 @@ class TestLifecycleNode : public ::testing::Test } }; -TEST_F(TestLifecycleNode, get_logger) { - auto node = std::make_shared("my_node", "/ns"); - EXPECT_STREQ("my_node", node->get_logger().get_name()); +class EmptyLifecycleNode : public rclcpp_lifecycle::LifecycleNode +{ +public: + explicit EmptyLifecycleNode(std::string node_name) + : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) + {} +}; + +template +class MoodyLifecycleNode : public rclcpp_lifecycle::LifecycleNode +{ +public: + explicit MoodyLifecycleNode(std::string node_name) + : rclcpp_lifecycle::LifecycleNode(std::move(node_name)) + {} + + size_t number_of_callbacks = 0; + +protected: + rcl_lifecycle_transition_key_t + on_configure(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_CONFIGURING, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_activate(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_ACTIVATING, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_deactivate(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_DEACTIVATING, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_cleanup(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_CLEANINGUP, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_shutdown(const rclcpp_lifecycle::State &) + { + EXPECT_EQ(State::TRANSITION_STATE_SHUTTINGDOWN, get_current_state().id()); + ++number_of_callbacks; + return Mood::cb_ret; + } + + rcl_lifecycle_transition_key_t + on_error(const rclcpp_lifecycle::State &); +}; + +template<> +rcl_lifecycle_transition_key_t +MoodyLifecycleNode::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; +} +template<> +rcl_lifecycle_transition_key_t +MoodyLifecycleNode::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; +} + +TEST_F(TestDefaultStateMachine, empty_initializer) { + auto test_node = std::make_shared("testnode"); + EXPECT_STREQ("testnode", test_node->get_name()); + EXPECT_STREQ("/", test_node->get_namespace()); + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); +} + +TEST_F(TestDefaultStateMachine, trigger_transition) { + auto test_node = std::make_shared("testnode"); + + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); + EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( + rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); +} + +TEST_F(TestDefaultStateMachine, trigger_transition_with_error_code) { + auto test_node = std::make_shared("testnode"); + + rcl_lifecycle_transition_key_t ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + test_node->configure(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->activate(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->deactivate(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->cleanup(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); + ret = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR; + + test_node->shutdown(ret); + EXPECT_EQ(lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS, ret); +} + +TEST_F(TestDefaultStateMachine, good_mood) { + auto test_node = std::make_shared>("testnode"); + + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_ACTIVATE)).id()); + EXPECT_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( + rclcpp_lifecycle::Transition(Transition::TRANSITION_CLEANUP)).id()); + EXPECT_EQ(State::PRIMARY_STATE_FINALIZED, test_node->trigger_transition( + rclcpp_lifecycle::Transition(Transition::TRANSITION_SHUTDOWN)).id()); + + // check if all callbacks were successfully overwritten + EXPECT_EQ(static_cast(5), test_node->number_of_callbacks); +} + +TEST_F(TestDefaultStateMachine, bad_mood) { + auto test_node = std::make_shared>("testnode"); + + EXPECT_EQ(State::PRIMARY_STATE_UNCONFIGURED, test_node->get_current_state().id()); + 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(1), test_node->number_of_callbacks); } From af66f6c19dd03781bc152ed71786d9afcb2e70c9 Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 4 Dec 2017 12:09:56 -0800 Subject: [PATCH 23/25] Update for rcutils function name change --- rclcpp/test/test_logging.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rclcpp/test/test_logging.cpp b/rclcpp/test/test_logging.cpp index 29dfda04d3..323a3abdb0 100644 --- a/rclcpp/test/test_logging.cpp +++ b/rclcpp/test/test_logging.cpp @@ -46,7 +46,7 @@ class TestLoggingMacros : public ::testing::Test { g_log_calls = 0; ASSERT_EQ(RCUTILS_RET_OK, rcutils_logging_initialize()); - rcutils_logging_set_default_severity_threshold(RCUTILS_LOG_SEVERITY_DEBUG); + rcutils_logging_set_default_logger_level(RCUTILS_LOG_SEVERITY_DEBUG); auto rcutils_logging_console_output_handler = []( rcutils_log_location_t * location, From 05d86cf32997ac63cab154bcee1d7b4e7a6671e7 Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 4 Dec 2017 12:15:44 -0800 Subject: [PATCH 24/25] Add reference to Node::get_logger() in doxygen --- rclcpp/include/rclcpp/rclcpp.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rclcpp/include/rclcpp/rclcpp.hpp b/rclcpp/include/rclcpp/rclcpp.hpp index 01451ccc9b..3156d716af 100644 --- a/rclcpp/include/rclcpp/rclcpp.hpp +++ b/rclcpp/include/rclcpp/rclcpp.hpp @@ -105,6 +105,7 @@ * - Logger: * - rclcpp::Logger * - rclcpp/logger.hpp + * - rclcpp::node::Node::get_logger() * * Finally, there are many internal API's and utilities: * From 7769fb4c380af513ff952446d7d8d556dafba6c2 Mon Sep 17 00:00:00 2001 From: dhood Date: Mon, 4 Dec 2017 13:46:25 -0800 Subject: [PATCH 25/25] Rename NodeLoggerInterface to NodeLoggingInterface --- rclcpp/CMakeLists.txt | 2 +- rclcpp/include/rclcpp/logger.hpp | 4 ++-- rclcpp/include/rclcpp/node.hpp | 4 ++-- .../{node_logger.hpp => node_logging.hpp} | 20 +++++++++---------- ...terface.hpp => node_logging_interface.hpp} | 12 +++++------ rclcpp/src/rclcpp/node.cpp | 6 +++--- .../{node_logger.cpp => node_logging.cpp} | 10 +++++----- .../rclcpp_lifecycle/lifecycle_node.hpp | 4 ++-- rclcpp_lifecycle/src/lifecycle_node.cpp | 6 +++--- 9 files changed, 34 insertions(+), 34 deletions(-) rename rclcpp/include/rclcpp/node_interfaces/{node_logger.hpp => node_logging.hpp} (69%) rename rclcpp/include/rclcpp/node_interfaces/{node_logger_interface.hpp => node_logging_interface.hpp} (75%) rename rclcpp/src/rclcpp/node_interfaces/{node_logger.cpp => node_logging.cpp} (77%) diff --git a/rclcpp/CMakeLists.txt b/rclcpp/CMakeLists.txt index 5b0ba7319c..7190709afc 100644 --- a/rclcpp/CMakeLists.txt +++ b/rclcpp/CMakeLists.txt @@ -52,7 +52,7 @@ set(${PROJECT_NAME}_SRCS src/rclcpp/node_interfaces/node_base.cpp src/rclcpp/node_interfaces/node_clock.cpp src/rclcpp/node_interfaces/node_graph.cpp - src/rclcpp/node_interfaces/node_logger.cpp + src/rclcpp/node_interfaces/node_logging.cpp src/rclcpp/node_interfaces/node_parameters.cpp src/rclcpp/node_interfaces/node_services.cpp src/rclcpp/node_interfaces/node_timers.cpp diff --git a/rclcpp/include/rclcpp/logger.hpp b/rclcpp/include/rclcpp/logger.hpp index 8e4a29d4ac..e9b110baaf 100644 --- a/rclcpp/include/rclcpp/logger.hpp +++ b/rclcpp/include/rclcpp/logger.hpp @@ -40,7 +40,7 @@ namespace rclcpp // Forward declaration is used for friend statement. namespace node_interfaces { -class NodeLogger; +class NodeLogging; } class Logger; @@ -64,7 +64,7 @@ class Logger { private: friend Logger rclcpp::get_logger(const std::string & name); - friend ::rclcpp::node_interfaces::NodeLogger; + friend ::rclcpp::node_interfaces::NodeLogging; /// Constructor of a dummy logger. /** diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index 5cf1c09b23..942e750bad 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -43,7 +43,7 @@ #include "rclcpp/node_interfaces/node_base_interface.hpp" #include "rclcpp/node_interfaces/node_clock_interface.hpp" #include "rclcpp/node_interfaces/node_graph_interface.hpp" -#include "rclcpp/node_interfaces/node_logger_interface.hpp" +#include "rclcpp/node_interfaces/node_logging_interface.hpp" #include "rclcpp/node_interfaces/node_parameters_interface.hpp" #include "rclcpp/node_interfaces/node_services_interface.hpp" #include "rclcpp/node_interfaces/node_timers_interface.hpp" @@ -420,7 +420,7 @@ class Node : public std::enable_shared_from_this rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_; rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_; - rclcpp::node_interfaces::NodeLoggerInterface::SharedPtr node_logger_; + rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging_; rclcpp::node_interfaces::NodeTimersInterface::SharedPtr node_timers_; rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_; rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_; diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logging.hpp similarity index 69% rename from rclcpp/include/rclcpp/node_interfaces/node_logger.hpp rename to rclcpp/include/rclcpp/node_interfaces/node_logging.hpp index 69306636df..0cffed11d6 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logging.hpp @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef RCLCPP__NODE_INTERFACES__NODE_LOGGER_HPP_ -#define RCLCPP__NODE_INTERFACES__NODE_LOGGER_HPP_ +#ifndef RCLCPP__NODE_INTERFACES__NODE_LOGGING_HPP_ +#define RCLCPP__NODE_INTERFACES__NODE_LOGGING_HPP_ #include #include "rclcpp/logger.hpp" #include "rclcpp/macros.hpp" #include "rclcpp/node_interfaces/node_base_interface.hpp" -#include "rclcpp/node_interfaces/node_logger_interface.hpp" +#include "rclcpp/node_interfaces/node_logging_interface.hpp" #include "rclcpp/visibility_control.hpp" namespace rclcpp @@ -28,18 +28,18 @@ namespace rclcpp namespace node_interfaces { -/// Implementation of the NodeLogger part of the Node API. -class NodeLogger : public NodeLoggerInterface +/// Implementation of the NodeLogging part of the Node API. +class NodeLogging : public NodeLoggingInterface { public: - RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggerInterface) + RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggingInterface) RCLCPP_PUBLIC - explicit NodeLogger(rclcpp::node_interfaces::NodeBaseInterface * node_base); + explicit NodeLogging(rclcpp::node_interfaces::NodeBaseInterface * node_base); RCLCPP_PUBLIC virtual - ~NodeLogger(); + ~NodeLogging(); RCLCPP_PUBLIC virtual @@ -47,7 +47,7 @@ class NodeLogger : public NodeLoggerInterface get_logger() const; private: - RCLCPP_DISABLE_COPY(NodeLogger) + RCLCPP_DISABLE_COPY(NodeLogging) /// Handle to the NodeBaseInterface given in the constructor. rclcpp::node_interfaces::NodeBaseInterface * node_base_; @@ -58,4 +58,4 @@ class NodeLogger : public NodeLoggerInterface } // namespace node_interfaces } // namespace rclcpp -#endif // RCLCPP__NODE_INTERFACES__NODE_LOGGER_HPP_ +#endif // RCLCPP__NODE_INTERFACES__NODE_LOGGING_HPP_ diff --git a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp b/rclcpp/include/rclcpp/node_interfaces/node_logging_interface.hpp similarity index 75% rename from rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp rename to rclcpp/include/rclcpp/node_interfaces/node_logging_interface.hpp index 9f4f51dae2..c549ca28be 100644 --- a/rclcpp/include/rclcpp/node_interfaces/node_logger_interface.hpp +++ b/rclcpp/include/rclcpp/node_interfaces/node_logging_interface.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef RCLCPP__NODE_INTERFACES__NODE_LOGGER_INTERFACE_HPP_ -#define RCLCPP__NODE_INTERFACES__NODE_LOGGER_INTERFACE_HPP_ +#ifndef RCLCPP__NODE_INTERFACES__NODE_LOGGING_INTERFACE_HPP_ +#define RCLCPP__NODE_INTERFACES__NODE_LOGGING_INTERFACE_HPP_ #include @@ -27,11 +27,11 @@ namespace rclcpp namespace node_interfaces { -/// Pure virtual interface class for the NodeLogger part of the Node API. -class NodeLoggerInterface +/// Pure virtual interface class for the NodeLogging part of the Node API. +class NodeLoggingInterface { public: - RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggerInterface) + RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggingInterface) /// Return the logger of the node. /** \return The logger of the node. */ @@ -44,4 +44,4 @@ class NodeLoggerInterface } // namespace node_interfaces } // namespace rclcpp -#endif // RCLCPP__NODE_INTERFACES__NODE_LOGGER_INTERFACE_HPP_ +#endif // RCLCPP__NODE_INTERFACES__NODE_LOGGING_INTERFACE_HPP_ diff --git a/rclcpp/src/rclcpp/node.cpp b/rclcpp/src/rclcpp/node.cpp index a85fe21b60..3e29a9449d 100644 --- a/rclcpp/src/rclcpp/node.cpp +++ b/rclcpp/src/rclcpp/node.cpp @@ -26,7 +26,7 @@ #include "rclcpp/node_interfaces/node_base.hpp" #include "rclcpp/node_interfaces/node_clock.hpp" #include "rclcpp/node_interfaces/node_graph.hpp" -#include "rclcpp/node_interfaces/node_logger.hpp" +#include "rclcpp/node_interfaces/node_logging.hpp" #include "rclcpp/node_interfaces/node_parameters.hpp" #include "rclcpp/node_interfaces/node_services.hpp" #include "rclcpp/node_interfaces/node_timers.hpp" @@ -53,7 +53,7 @@ Node::Node( bool use_intra_process_comms) : node_base_(new rclcpp::node_interfaces::NodeBase(node_name, namespace_, context)), node_graph_(new rclcpp::node_interfaces::NodeGraph(node_base_.get())), - node_logger_(new rclcpp::node_interfaces::NodeLogger(node_base_.get())), + node_logging_(new rclcpp::node_interfaces::NodeLogging(node_base_.get())), node_timers_(new rclcpp::node_interfaces::NodeTimers(node_base_.get())), node_topics_(new rclcpp::node_interfaces::NodeTopics(node_base_.get())), node_services_(new rclcpp::node_interfaces::NodeServices(node_base_.get())), @@ -89,7 +89,7 @@ Node::get_namespace() const rclcpp::Logger Node::get_logger() const { - return node_logger_->get_logger(); + return node_logging_->get_logger(); } rclcpp::callback_group::CallbackGroup::SharedPtr diff --git a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp b/rclcpp/src/rclcpp/node_interfaces/node_logging.cpp similarity index 77% rename from rclcpp/src/rclcpp/node_interfaces/node_logger.cpp rename to rclcpp/src/rclcpp/node_interfaces/node_logging.cpp index 82c8dee918..bba4d49cfd 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_logger.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_logging.cpp @@ -12,23 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "rclcpp/node_interfaces/node_logger.hpp" +#include "rclcpp/node_interfaces/node_logging.hpp" -using rclcpp::node_interfaces::NodeLogger; +using rclcpp::node_interfaces::NodeLogging; -NodeLogger::NodeLogger(rclcpp::node_interfaces::NodeBaseInterface * node_base) +NodeLogging::NodeLogging(rclcpp::node_interfaces::NodeBaseInterface * node_base) : node_base_(node_base) { // TODO(dhood): use the namespace (slashes converted to dots) logger_ = rclcpp::get_logger(node_base_->get_name()); } -NodeLogger::~NodeLogger() +NodeLogging::~NodeLogging() { } rclcpp::Logger -NodeLogger::get_logger() const +NodeLogging::get_logger() const { return logger_; } diff --git a/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp b/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp index 7bd4249590..5453502335 100644 --- a/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp +++ b/rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp @@ -37,7 +37,7 @@ #include "rclcpp/message_memory_strategy.hpp" #include "rclcpp/node_interfaces/node_base_interface.hpp" #include "rclcpp/node_interfaces/node_graph_interface.hpp" -#include "rclcpp/node_interfaces/node_logger_interface.hpp" +#include "rclcpp/node_interfaces/node_logging_interface.hpp" #include "rclcpp/node_interfaces/node_parameters_interface.hpp" #include "rclcpp/node_interfaces/node_services_interface.hpp" #include "rclcpp/node_interfaces/node_timers_interface.hpp" @@ -475,7 +475,7 @@ class LifecycleNode : public node_interfaces::LifecycleNodeInterface, rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_; rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_; - rclcpp::node_interfaces::NodeLoggerInterface::SharedPtr node_logger_; + rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging_; rclcpp::node_interfaces::NodeTimersInterface::SharedPtr node_timers_; rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_; rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_; diff --git a/rclcpp_lifecycle/src/lifecycle_node.cpp b/rclcpp_lifecycle/src/lifecycle_node.cpp index 2a0772e359..4d9ec2fe5f 100644 --- a/rclcpp_lifecycle/src/lifecycle_node.cpp +++ b/rclcpp_lifecycle/src/lifecycle_node.cpp @@ -29,7 +29,7 @@ #include "rclcpp/node.hpp" #include "rclcpp/node_interfaces/node_base.hpp" #include "rclcpp/node_interfaces/node_graph.hpp" -#include "rclcpp/node_interfaces/node_logger.hpp" +#include "rclcpp/node_interfaces/node_logging.hpp" #include "rclcpp/node_interfaces/node_parameters.hpp" #include "rclcpp/node_interfaces/node_services.hpp" #include "rclcpp/node_interfaces/node_timers.hpp" @@ -58,7 +58,7 @@ LifecycleNode::LifecycleNode( bool use_intra_process_comms) : node_base_(new rclcpp::node_interfaces::NodeBase(node_name, namespace_, context)), node_graph_(new rclcpp::node_interfaces::NodeGraph(node_base_.get())), - node_logger_(new rclcpp::node_interfaces::NodeLogger(node_base_.get())), + node_logging_(new rclcpp::node_interfaces::NodeLogging(node_base_.get())), node_timers_(new rclcpp::node_interfaces::NodeTimers(node_base_.get())), node_topics_(new rclcpp::node_interfaces::NodeTopics(node_base_.get())), node_services_(new rclcpp::node_interfaces::NodeServices(node_base_.get())), @@ -101,7 +101,7 @@ LifecycleNode::get_namespace() const rclcpp::Logger LifecycleNode::get_logger() const { - return node_logger_->get_logger(); + return node_logging_->get_logger(); } rclcpp::callback_group::CallbackGroup::SharedPtr