From a506c898bc3f8248264abdde14e9ffc3afd5c857 Mon Sep 17 00:00:00 2001 From: Mikael Arguedas Date: Mon, 17 Jul 2017 16:56:05 -0700 Subject: [PATCH] Test nodehandles (#64) * Added unit tests for the nodehandles * fix copy-n-paste test suite * disable failing namespace test tracked upstream * various minor fixups --- test_nodelet/CMakeLists.txt | 17 +- test_nodelet/src/nodehandles.cpp | 30 ++++ .../test_nodehandles_different_namespaces.cpp | 154 +++++++++++++++++ ...test_nodehandles_different_namespaces.test | 12 ++ .../test_nodehandles_manager_namespaced.cpp | 155 ++++++++++++++++++ .../test_nodehandles_manager_namespaced.test | 9 + .../test/test_nodehandles_same_namespaces.cpp | 153 +++++++++++++++++ .../test_nodehandles_same_namespaces.test | 8 + test_nodelet/test_nodelet.xml | 5 + 9 files changed, 542 insertions(+), 1 deletion(-) create mode 100644 test_nodelet/src/nodehandles.cpp create mode 100644 test_nodelet/test/test_nodehandles_different_namespaces.cpp create mode 100644 test_nodelet/test/test_nodehandles_different_namespaces.test create mode 100644 test_nodelet/test/test_nodehandles_manager_namespaced.cpp create mode 100644 test_nodelet/test/test_nodehandles_manager_namespaced.test create mode 100644 test_nodelet/test/test_nodehandles_same_namespaces.cpp create mode 100644 test_nodelet/test/test_nodehandles_same_namespaces.test diff --git a/test_nodelet/CMakeLists.txt b/test_nodelet/CMakeLists.txt index eaaa0889..48dfbef9 100644 --- a/test_nodelet/CMakeLists.txt +++ b/test_nodelet/CMakeLists.txt @@ -13,7 +13,7 @@ if(CATKIN_ENABLE_TESTING) ) #common commands for building c++ executables and libraries - add_library(${PROJECT_NAME} src/plus.cpp src/console_tests.cpp src/failing_nodelet.cpp) + add_library(${PROJECT_NAME} src/plus.cpp src/console_tests.cpp src/failing_nodelet.cpp src/nodehandles.cpp) target_link_libraries(${PROJECT_NAME} ${BOOST_LIBRARIES} ${catkin_LIBRARIES} ) @@ -32,6 +32,21 @@ if(CATKIN_ENABLE_TESTING) add_rostest(test/test_bond_break_on_shutdown.launch) add_rostest(test/test_unload_called_twice.launch) + add_rostest_gtest(test_nodehandles_different_namespaces + test/test_nodehandles_different_namespaces.test + test/test_nodehandles_different_namespaces.cpp) + target_link_libraries(test_nodehandles_different_namespaces ${catkin_LIBRARIES}) + + add_rostest_gtest(test_nodehandles_same_namespaces + test/test_nodehandles_same_namespaces.test + test/test_nodehandles_same_namespaces.cpp) + target_link_libraries(test_nodehandles_same_namespaces ${catkin_LIBRARIES}) + + add_rostest_gtest(test_nodehandles_manager_namespaced + test/test_nodehandles_manager_namespaced.test + test/test_nodehandles_manager_namespaced.cpp) + target_link_libraries(test_nodehandles_manager_namespaced ${catkin_LIBRARIES}) + # Not a real test. Tries to measure overhead of CallbackQueueManager. add_executable(benchmark src/benchmark.cpp) target_link_libraries(benchmark ${BOOST_LIBRARIES} diff --git a/test_nodelet/src/nodehandles.cpp b/test_nodelet/src/nodehandles.cpp new file mode 100644 index 00000000..50d5d4ef --- /dev/null +++ b/test_nodelet/src/nodehandles.cpp @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace test_nodelet +{ + +class NodehandleTest : public nodelet::Nodelet +{ +public: + NodehandleTest(){}; + virtual void onInit() + { + ros::NodeHandle nh = this->getNodeHandle(); + ros::NodeHandle pnh = this->getPrivateNodeHandle(); + global_pub_ = nh.advertise("/global", 1000); + namespaced_pub_ = nh.advertise("namespaced", 1000); + private_pub_ = pnh.advertise("private", 1000); + } +private: + ros::Publisher global_pub_, namespaced_pub_, private_pub_; +}; + +} // namespace test_nodelet + +PLUGINLIB_EXPORT_CLASS(test_nodelet::NodehandleTest, nodelet::Nodelet); diff --git a/test_nodelet/test/test_nodehandles_different_namespaces.cpp b/test_nodelet/test/test_nodehandles_different_namespaces.cpp new file mode 100644 index 00000000..59a1a461 --- /dev/null +++ b/test_nodelet/test/test_nodehandles_different_namespaces.cpp @@ -0,0 +1,154 @@ +/********************************************************************* +* test_nodehandles_different_namespaces.cpp +* +* Software License Agreement (BSD License) +* +* Copyright (c) 2016, University of Patras +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of University of Patras nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +* Authors: Aris Synodinos +*********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +TEST(DifferentNamespaces, NodeletPrivateNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Bool") == 0) { + found_topic = true; + EXPECT_STREQ("/nodelet_namespace/nodehandle_test/private", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(DifferentNamespaces, NodeletNamespacedNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Byte") == 0) { + found_topic = true; + EXPECT_STREQ("/nodelet_namespace/namespaced", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(DifferentNamespaces, NodeletGlobalNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Time") == 0) { + found_topic = true; + EXPECT_STREQ("/global", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(DifferentNamespaces, NodePrivateNodehandle) { + ros::NodeHandle nh("~"); + ros::Publisher pub = nh.advertise("private", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Empty") == 0) { + found_topic = true; + EXPECT_STREQ("/test_namespace/test_nodehandles/private", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(DifferentNamespaces, NodeNamespacedNodehandle) { + ros::NodeHandle nh; + ros::Publisher pub = nh.advertise("namespaced", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/String") == 0) { + found_topic = true; + EXPECT_STREQ("/test_namespace/namespaced", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(DifferentNamespaces, NodeGlobalNodehandle) { + ros::NodeHandle nh; + ros::Publisher pub = nh.advertise("/public", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Float32") == 0) { + found_topic = true; + EXPECT_STREQ("/public", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + ros::init(argc, argv, "test_nodehandles_different_namespaces"); + return RUN_ALL_TESTS(); +} diff --git a/test_nodelet/test/test_nodehandles_different_namespaces.test b/test_nodelet/test/test_nodehandles_different_namespaces.test new file mode 100644 index 00000000..7b09ad04 --- /dev/null +++ b/test_nodelet/test/test_nodehandles_different_namespaces.test @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test_nodelet/test/test_nodehandles_manager_namespaced.cpp b/test_nodelet/test/test_nodehandles_manager_namespaced.cpp new file mode 100644 index 00000000..b4d07569 --- /dev/null +++ b/test_nodelet/test/test_nodehandles_manager_namespaced.cpp @@ -0,0 +1,155 @@ +/********************************************************************* +* test_nodehandles_same_namespaces.cpp +* +* Software License Agreement (BSD License) +* +* Copyright (c) 2016, University of Patras +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of University of Patras nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +* Authors: Aris Synodinos +*********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +TEST(ManagerNamespaced, NodeletPrivateNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Bool") == 0) { + found_topic = true; + EXPECT_STREQ("/nodehandle_test/private", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +// TODO(mikaelarguedas) reenable this once +// https://github.com/ros/nodelet_core/issues/7 is fixed +// TEST(ManagerNamespaced, NodeletNamespacedNodehandle) { +// ros::NodeHandle nh; +// ros::Duration(2).sleep(); +// ros::master::V_TopicInfo master_topics; +// ros::master::getTopics(master_topics); +// bool found_topic = false; +// +// for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { +// const ros::master::TopicInfo& info = *it; +// if (info.datatype.compare("std_msgs/Byte") == 0) { +// found_topic = true; +// EXPECT_STREQ("/namespaced", info.name.c_str()); +// } +// } +// EXPECT_TRUE(found_topic); +// } + +TEST(ManagerNamespaced, NodeletGlobalNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Time") == 0) { + found_topic = true; + EXPECT_STREQ("/global", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(ManagerNamespaced, NodePrivateNodehandle) { + ros::NodeHandle nh("~"); + ros::Publisher pub = nh.advertise("private", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Empty") == 0) { + found_topic = true; + EXPECT_STREQ("/test_nodehandles/private", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(ManagerNamespaced, NodeNamespacedNodehandle) { + ros::NodeHandle nh; + ros::Publisher pub = nh.advertise("namespaced", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/String") == 0) { + found_topic = true; + EXPECT_STREQ("/namespaced", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(ManagerNamespaced, NodeGlobalNodehandle) { + ros::NodeHandle nh; + ros::Publisher pub = nh.advertise("/public", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Float32") == 0) { + found_topic = true; + EXPECT_STREQ("/public", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + ros::init(argc, argv, "test_nodehandles_manager_namespaced"); + return RUN_ALL_TESTS(); +} diff --git a/test_nodelet/test/test_nodehandles_manager_namespaced.test b/test_nodelet/test/test_nodehandles_manager_namespaced.test new file mode 100644 index 00000000..72e21dc1 --- /dev/null +++ b/test_nodelet/test/test_nodehandles_manager_namespaced.test @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/test_nodelet/test/test_nodehandles_same_namespaces.cpp b/test_nodelet/test/test_nodehandles_same_namespaces.cpp new file mode 100644 index 00000000..d81bbf92 --- /dev/null +++ b/test_nodelet/test/test_nodehandles_same_namespaces.cpp @@ -0,0 +1,153 @@ +/********************************************************************* +* test_nodehandles_same_namespaces.cpp +* +* Software License Agreement (BSD License) +* +* Copyright (c) 2016, University of Patras +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of University of Patras nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +* Authors: Aris Synodinos +*********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +TEST(SameNamespaces, NodeletPrivateNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Bool") == 0) { + found_topic = true; + EXPECT_STREQ("/common_namespace/nodehandle_test/private", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(SameNamespaces, NodeletNamespacedNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Byte") == 0) { + found_topic = true; + EXPECT_STREQ("/common_namespace/namespaced", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(SameNamespaces, NodeletGlobalNodehandle) { + ros::NodeHandle nh; + ros::Duration(2).sleep(); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Time") == 0) { + found_topic = true; + EXPECT_STREQ("/global", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(SameNamespaces, NodePrivateNodehandle) { + ros::NodeHandle nh("~"); + ros::Publisher pub = nh.advertise("private", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Empty") == 0) { + found_topic = true; + EXPECT_STREQ("/common_namespace/test_nodehandles/private", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(SameNamespaces, NodeNamespacedNodehandle) { + ros::NodeHandle nh; + ros::Publisher pub = nh.advertise("namespaced", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/String") == 0) { + found_topic = true; + EXPECT_STREQ("/common_namespace/namespaced", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +TEST(SameNamespaces, NodeGlobalNodehandle) { + ros::NodeHandle nh; + ros::Publisher pub = nh.advertise("/public", 10); + ros::master::V_TopicInfo master_topics; + ros::master::getTopics(master_topics); + bool found_topic = false; + + for (ros::master::V_TopicInfo::iterator it = master_topics.begin() ; it != master_topics.end(); it++) { + const ros::master::TopicInfo& info = *it; + if (info.datatype.compare("std_msgs/Float32") == 0) { + found_topic = true; + EXPECT_STREQ("/public", info.name.c_str()); + } + } + EXPECT_TRUE(found_topic); +} + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + ros::init(argc, argv, "test_nodehandles_same_namespaces"); + return RUN_ALL_TESTS(); +} diff --git a/test_nodelet/test/test_nodehandles_same_namespaces.test b/test_nodelet/test/test_nodehandles_same_namespaces.test new file mode 100644 index 00000000..fd9f82b6 --- /dev/null +++ b/test_nodelet/test/test_nodehandles_same_namespaces.test @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test_nodelet/test_nodelet.xml b/test_nodelet/test_nodelet.xml index 62197f7f..4f7a0e1b 100644 --- a/test_nodelet/test_nodelet.xml +++ b/test_nodelet/test_nodelet.xml @@ -14,4 +14,9 @@ A node that fails to initialize properly. + + + A node that creates public and private nodehandles. + +