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 }