Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "ros/console.h"
00031
00032 #include <gtest/gtest.h>
00033
00034 #include <boost/thread.hpp>
00035
00036 #include "log4cxx/appenderskeleton.h"
00037 #include "log4cxx/spi/loggingevent.h"
00038
00039 #include <vector>
00040
00041 class TestAppender : public log4cxx::AppenderSkeleton
00042 {
00043 public:
00044 struct Info
00045 {
00046 log4cxx::LevelPtr level_;
00047 std::string message_;
00048 std::string logger_name_;
00049 };
00050
00051 typedef std::vector<Info> V_Info;
00052
00053 V_Info info_;
00054
00055 protected:
00056 virtual void append(const log4cxx::spi::LoggingEventPtr& event, log4cxx::helpers::Pool& pool)
00057 {
00058 Info info;
00059 info.level_ = event->getLevel();
00060 info.message_ = event->getMessage();
00061 info.logger_name_ = event->getLoggerName();
00062
00063 info_.push_back( info );
00064 }
00065
00066 virtual void close()
00067 {
00068 }
00069 virtual bool requiresLayout() const
00070 {
00071 return false;
00072 }
00073 };
00074
00075 void threadFunc(boost::barrier* b)
00076 {
00077 b->wait();
00078 ROS_INFO("Hello");
00079 }
00080
00081
00082 TEST(Rosconsole, threadedCalls)
00083 {
00084 log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(ROSCONSOLE_DEFAULT_NAME);
00085
00086 TestAppender* appender = new TestAppender;
00087 logger->addAppender( appender );
00088
00089 boost::thread_group tg;
00090 boost::barrier b(10);
00091 for (uint32_t i = 0; i < 10; ++i)
00092 {
00093 tg.create_thread(boost::bind(threadFunc, &b));
00094 }
00095 tg.join_all();
00096
00097 ASSERT_EQ(appender->info_.size(), 10ULL);
00098
00099 logger->removeAppender(appender);
00100 }
00101
00102 int main(int argc, char **argv)
00103 {
00104 testing::InitGoogleTest(&argc, argv);
00105 ros::Time::init();
00106
00107 return RUN_ALL_TESTS();
00108 }