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 #include "ros/ros.h"
00029 #include "std_msgs/String.h"
00030 #include "std_msgs/Int16.h"
00031 #include "test_roslisp/ComplexMessage.h"
00032 #include <gtest/gtest.h>
00033 #include <ros/time.h>
00034 #include <ros/console.h>
00035 
00036 using std::vector;
00037 
00038 int num_messages_received=0;
00039 int service_client_status=0;
00040 int service_client_response=0;
00041 
00042 using test_roslisp::ComplexMessage;
00043 using test_roslisp::Foo;
00044 using test_roslisp::Bar;
00045 
00046 inline bool operator== (const Bar& b, const Bar& b2)
00047 {
00048   return ((b.y == b2.y) && (b.x==b2.x));
00049 }
00050 
00051 inline bool operator== (const Foo& f, const Foo& f2)
00052 {
00053   return ((f.y==f2.y) && (f.z[0]==f2.z[0]) && (f.z[1]==f2.z[1]));
00054 }
00055 
00056 inline
00057 bool operator== (const ComplexMessage& c, const ComplexMessage& c2)
00058 {
00059   unsigned i=0;
00060   
00061   if (c.ind != c2.ind)
00062     return false;
00063   
00064   for ( i=0; i<4; i++)
00065     if (!(c.x[i] == c2.x[i]))
00066       return false;
00067   
00068   for ( i=0; i<c.y.size(); i++)
00069     if (!(c.y[i] == c2.y[i]))
00070       return false;
00071   
00072   for ( i=0; i<c2.z.size(); i++) 
00073     if (!(c.z[i] == c2.z[i]))
00074       return false;
00075 
00076   for ( i=0; i<c.w.size(); i++)
00077     if (!(c.w[i].data == c2.w[i].data))
00078       return false;
00079 
00080   if (c.qux != c2.qux)
00081   {
00082     ROS_INFO ("Qux 1 is %u and qux 2 is %u", c.qux, c2.qux);
00083     return false;
00084   }
00085   
00086   return true;
00087 }
00088 
00089 class ComplexTester
00090 {
00091   
00092   
00093   
00094   
00095 public:
00096   ComplexTester() : ok_(true), num_received_(0)
00097   {
00098     ping_sub_ = nh_.subscribe("ping", 1000, &ComplexTester::pingCallback, this);
00099     pong_pub_ = nh_.advertise<ComplexMessage>("pong", 1000);
00100     pang_sub_ = nh_.subscribe("pang", 1000, &ComplexTester::pangCallback, this);
00101     ros::Duration d(3);
00102     d.sleep();
00103     ping_vec_.resize(8);
00104   }
00105   
00106   void pingCallback (const test_roslisp::ComplexMessage::ConstPtr& msg)
00107   {
00108     ping_vec_[msg->ind] = *msg;
00109     pong_pub_.publish(*msg);
00110   }
00111 
00112   void pangCallback (const test_roslisp::ComplexMessage::ConstPtr& msg)
00113   {
00114     ok_ &= (ping_vec_[msg->ind] == *msg);
00115     num_received_++;
00116   }
00117   
00118   bool done()
00119   {
00120     return (num_received_ >= 10);
00121   }
00122 
00123   bool isOk()
00124   {
00125     return ok_;
00126   }
00127   
00128 private:
00129   
00130   vector<ComplexMessage> ping_vec_;
00131   bool ok_;
00132   unsigned num_received_;
00133   ros::Subscriber pang_sub_, ping_sub_;
00134   ros::Publisher pong_pub_;
00135   ros::NodeHandle nh_;
00136 };  
00137 
00138 
00139 
00140 
00141 TEST(Roslisp, ComplexTalkerListener)
00142 {
00143   
00144   ros::Duration d(1);
00145   unsigned wait_max = 180;
00146 
00147   ComplexTester t;
00148   
00149   for (unsigned i=0; (i<wait_max) && (!t.done()); i++) {
00150     d.sleep();
00151     ros::spinOnce();
00152   }
00153 
00154   EXPECT_TRUE(t.done());
00155   EXPECT_TRUE(t.isOk());
00156 }
00157 
00158 
00159 
00164 void chatterCallback(const std_msgs::StringConstPtr& msg)
00165 {
00166   num_messages_received++;
00167 }
00168 
00169 
00170 TEST(Roslisp, TalkerListener)
00171 {
00172   
00173   ros::NodeHandle n;
00174   ros::Subscriber sub = n.subscribe("chatter_echo", 1000, chatterCallback);
00175   ros::Duration d(1);
00176 
00177   int wait_max=180;
00178 
00179   for (int i=0; i<wait_max && n.ok(); i++) {
00180     d.sleep();
00181     ros::spinOnce();
00182     ROS_INFO_STREAM ("Have waited " << i << " out of " << wait_max << " seconds to receive 5 messages from chatter_echo");
00183     if (num_messages_received>5)
00184       break;
00185   }
00186   EXPECT_TRUE(num_messages_received>5);
00187   ROS_INFO_STREAM ("Successfully received " << num_messages_received << " echoed messages");
00188 }
00189 
00190 TEST(Roslisp, BrokenTalkerListener)
00191 {
00192   
00193   ros::NodeHandle n;
00194   ros::Publisher chatter_pub = n.advertise<std_msgs::String>("error_chatter", 1000);
00195   ros::Subscriber sub = n.subscribe("error_chatter_echo", 1000, chatterCallback);
00196   ros::Duration d(1);
00197 
00198   std_msgs::String msg;
00199   std::stringstream ss;
00200   ss << "error"; 
00201   msg.data = ss.str();
00202   chatter_pub.publish(msg);
00203   ros::spinOnce();
00204   d.sleep();
00205   
00206   int wait_max=20;
00207   num_messages_received = 0;
00208   for (int i=0; i<wait_max && n.ok(); i++) {
00209     ss << i;
00210     msg.data = ss.str();
00211     chatter_pub.publish(msg);
00212     d.sleep();
00213     ros::spinOnce();
00214     ROS_INFO_STREAM ("Have waited " << i << " out of " << wait_max << " seconds to receive 1 message from chatter_echo");
00215     if (num_messages_received > 0)
00216       break;
00217   }
00218   EXPECT_TRUE(num_messages_received>0);
00219   ROS_INFO_STREAM ("Successfully received " << num_messages_received << " echoed messages");
00220 }
00221 
00222 void clientStatusCallback (const std_msgs::Int16ConstPtr& msg)
00223 {
00224   service_client_response = msg->data;
00225   service_client_status = 1;
00226 }
00227 
00228 TEST(Roslisp, Service)
00229 {
00230   
00231   ros::NodeHandle n;
00232   ros::Subscriber sub=n.subscribe("client_status", 1000, clientStatusCallback);
00233   ros::Duration d(1);
00234   unsigned wait_max=180;
00235   for (unsigned i=0; i<wait_max && n.ok(); i++) {
00236     d.sleep();
00237     ros::spinOnce();
00238     ROS_INFO_STREAM ("Have waited " << i << " out of " << wait_max << " seconds to receive confirmation from service client test");
00239     if (service_client_status)
00240       break;
00241   }
00242 
00243   EXPECT_EQ (66, service_client_response);
00244 }
00245 
00246     
00247 
00248 int main(int argc, char **argv)
00249 {
00250   testing::InitGoogleTest(&argc, argv);
00251   ros::init(argc, argv, "roslisp-tester");
00252   return RUN_ALL_TESTS();
00253 }