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 }