service_exception.cpp
Go to the documentation of this file.
1 #include <cstdlib>
2 #include <gtest/gtest.h>
3 #include <list>
4 
5 #include "ros/ros.h"
6 #include "std_srvs/Empty.h"
7 #include <log4cxx/appenderskeleton.h>
8 #ifdef _MSC_VER
9  // Have to be able to encode wchar LogStrings on windows.
10 # include <log4cxx/helpers/transcoder.h>
11 #endif
12 #include <ros/console.h>
13 #include <ros/poll_manager.h>
14 
15 class ListAppender : public log4cxx::AppenderSkeleton
16 {
17 public:
18  void append(const log4cxx::spi::LoggingEventPtr& event, log4cxx::helpers::Pool&)
19  {
20  list.push_back(event);
21  }
22 
23  void close()
24  {
25  this->closed = true;
26  }
27 
28  bool isClosed() const
29  {
30  return closed;
31  }
32 
33  bool requiresLayout() const
34  {
35  return false;
36  }
37 
38  const std::list<log4cxx::spi::LoggingEventPtr>& getList() const
39  {
40  return list;
41  }
42 
43 protected:
44  std::list<log4cxx::spi::LoggingEventPtr> list;
45 };
46 typedef log4cxx::helpers::ObjectPtrT<ListAppender> ListAppenderPtr;
47 
48 static const char EXCEPTION[] = "custom exception message";
49 
50 bool throwingService(std_srvs::Empty::Request&, std_srvs::Empty::Request&)
51 {
52  throw std::runtime_error(EXCEPTION);
53  return true;
54 }
55 
56 static const char SERVICE[] = "service_exception";
57 
58 TEST(roscpp, ServiceThrowingException)
59 {
60  ros::AsyncSpinner spinner(1);
61  spinner.start();
62 
65 
66  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("ros.roscpp");
67  ListAppenderPtr appender = new ListAppender();
68  logger->addAppender(appender);
69 
70  ros::ServiceClient client = n.serviceClient<std_srvs::Empty>(SERVICE, true);
71  std_srvs::Empty srv;
72  bool success = client.call(srv);
73  ASSERT_FALSE(success);
74 
75  bool found_error_output = false;
76  const std::list<log4cxx::spi::LoggingEventPtr>& list = appender->getList();
77  for (std::list<log4cxx::spi::LoggingEventPtr>::const_iterator it = list.begin(); it != list.end(); it++)
78  {
79 #ifdef _MSC_VER
80  LOG4CXX_ENCODE_CHAR(tmpstr, (*it)->getMessage()); // has to handle LogString with wchar types.
81  const std::string& msg = tmpstr; // tmpstr gets instantiated inside the LOG4CXX_ENCODE_CHAR macro
82 #else
83  const log4cxx::LogString& msg = (*it)->getMessage();
84 #endif
85  size_t pos_error = msg.find("Service call failed:");
86  size_t pos_exception = msg.find(EXCEPTION);
87  if (pos_error != std::string::npos && pos_exception != std::string::npos)
88  {
89  found_error_output = true;
90  }
91  }
92  ASSERT_TRUE(found_error_output);
93 }
94 
95 int main(int argc, char **argv)
96 {
97  testing::InitGoogleTest(&argc, argv);
98  ros::init(argc, argv, "service_exception");
99  return RUN_ALL_TESTS();
100 }
ListAppender::append
void append(const log4cxx::spi::LoggingEventPtr &event, log4cxx::helpers::Pool &)
Definition: service_exception.cpp:18
ListAppender::isClosed
bool isClosed() const
Definition: service_exception.cpp:28
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
ListAppender::list
std::list< log4cxx::spi::LoggingEventPtr > list
Definition: service_exception.cpp:44
ros::AsyncSpinner::start
void start()
ros.h
EXCEPTION
static const char EXCEPTION[]
Definition: service_exception.cpp:48
TEST
TEST(roscpp, ServiceThrowingException)
Definition: service_exception.cpp:58
ros::AsyncSpinner
ros::NodeHandle::serviceClient
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
throwingService
bool throwingService(std_srvs::Empty::Request &, std_srvs::Empty::Request &)
Definition: service_exception.cpp:50
ros::NodeHandle::advertiseService
ServiceServer advertiseService(AdvertiseServiceOptions &ops)
ListAppender::getList
const std::list< log4cxx::spi::LoggingEventPtr > & getList() const
Definition: service_exception.cpp:38
ListAppender
Definition: service_exception.cpp:15
ListAppender::close
void close()
Definition: service_exception.cpp:23
roscpp
ros::ServiceServer
console.h
main
int main(int argc, char **argv)
Definition: service_exception.cpp:95
ListAppenderPtr
log4cxx::helpers::ObjectPtrT< ListAppender > ListAppenderPtr
Definition: service_exception.cpp:46
ros::ServiceClient
SERVICE
static const char SERVICE[]
Definition: service_exception.cpp:56
poll_manager.h
ListAppender::requiresLayout
bool requiresLayout() const
Definition: service_exception.cpp:33
ros::ServiceClient::call
bool call(const MReq &req, MRes &resp, const std::string &service_md5sum)
ros::NodeHandle


test_roscpp
Author(s): Morgan Quigley, Josh Faust, Brian Gerkey, Troy Straszheim, Dirk Thomas , Jacob Perron
autogenerated on Thu Nov 23 2023 04:02:02