test_full.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  * C++ unit test for dataspeed_lm/version.h
3  *********************************************************************/
4 
5 #include <gtest/gtest.h>
6 
7 #include <ros/ros.h>
8 #include <ros/package.h>
9 #include <can_msgs/Frame.h>
10 #include <std_msgs/Bool.h>
11 #include <std_msgs/Int8.h>
12 #include <std_msgs/Int16.h>
13 #include <std_msgs/Int32.h>
14 #include <std_msgs/Int64.h>
15 #include <std_msgs/UInt8.h>
16 #include <std_msgs/UInt16.h>
17 #include <std_msgs/UInt32.h>
18 #include <std_msgs/UInt64.h>
19 
20 // String stream
21 #include <iostream>
22 #include <fstream>
23 #include <string>
24 
25 // File under test
26 #include "../src/DbcIterator.hpp"
27 
28 // Duration constants for waits
29 const ros::WallDuration DUR_A = ros::WallDuration(3.0); // Expecting success
30 const ros::WallDuration DUR_B = ros::WallDuration(0.1); // Expecting timeout
31 
33 // https://github.com/ros/ros_comm/blob/ebd9e491e71947889eb81089306698775ab5d2a2/test/test_roscpp/test/src/subscribe_star.cpp#L123
34 
35 template <typename MsgT>
36 class MsgHelper {
37 public:
38  MsgHelper(std::string tag) : count_(0) {
39  tag_ = tag;
40  }
41 
42  void set(const MsgT& msg) { latest_ = msg; stamp_ = ros::Time::now(); }
43 
44  void cb(const boost::shared_ptr<MsgT const>& msg) {
45  set(*msg);
46  ++count_;
47  }
48 
49  bool waitForMessage(ros::WallDuration timeout) const {
51  while (true) {
52  if (count_ > 0) {
53  ROS_DEBUG("Received message (%s)", tag_.c_str());
54  return true;
55  }
56  if ((ros::WallTime::now() - start) > timeout) {
57  ROS_DEBUG("Message TIMED OUT (%s)", tag_.c_str());
58  break;
59  }
60  ros::WallDuration(0.001).sleep();
61  }
62  return false;
63  }
64 
65  void clear() {
66  stamp_ = ros::Time();
67  count_ = 0;
68  latest_ = MsgT();
69  // tag_ is an identifier for the MsgHelper; it stays the same.
70  }
71 
72  MsgT getLatest() const {return latest_;}
73  uint32_t getCount() const {return count_;}
74  ros::Time getStamp() const {return stamp_;}
75 private:
76  MsgT latest_;
77  std::string tag_;
78  uint32_t count_;
80 };
81 
82 
83 bool waitPublisher(const ros::Publisher &pub, ros::WallDuration timeout) {
85  while (true) {
86  if ((pub.getNumSubscribers() > 0)) {
87  return true;
88  }
89  if ((ros::WallTime::now() - start) > timeout) {
90  break;
91  }
92  ros::WallDuration(0.001).sleep();
93  }
94  return false;
95 }
96 
99  while (true) {
100  if ((sub.getNumPublishers() > 0)) {
101  return true;
102  }
103  if ((ros::WallTime::now() - start) > timeout) {
104  break;
105  }
106  ros::WallDuration(0.001).sleep();
107  }
108  return false;
109 }
110 
111 // Check the values output by parsing valid signals
112 TEST(FULL, Basic)
113 {
114  // Message receive helpers
115  typedef std_msgs::Int8 Msg1;
116  typedef std_msgs::Int8 Msg2;
117  typedef std_msgs::Int8 Msg3;
118  typedef std_msgs::Bool Msg4;
119  MsgHelper<can_msgs::Frame> rx0("basictest");
120  MsgHelper<Msg1> rx1("basictest/basicsignal1");
121  MsgHelper<Msg2> rx2("basictest/basicsignal2");
122  MsgHelper<Msg3> rx3("basictest/basicsignal3");
123  MsgHelper<Msg4> rx4("basictest/basicsignal4");
124 
125  // Create ROS topics and wait for publisher connection
126  ros::NodeHandle nh("can_bus_test");
127  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
128  ros::Subscriber sub0 = nh.subscribe("BasicTest", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
129  ros::Subscriber sub1 = nh.subscribe("BasicTest/BasicSignal1", 10, &MsgHelper<Msg1>::cb, &rx1);
130  ros::Subscriber sub2 = nh.subscribe("BasicTest/BasicSignal2", 10, &MsgHelper<Msg2>::cb, &rx2);
131  ros::Subscriber sub3 = nh.subscribe("BasicTest/BasicSignal3", 10, &MsgHelper<Msg3>::cb, &rx3);
132  ros::Subscriber sub4 = nh.subscribe("BasicTest/BasicSignal4", 10, &MsgHelper<Msg4>::cb, &rx4);
133  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
134 
135  // Create a message to publish
136  // Message ID 161 0xA1
137  // Signal 1: 23
138  // Signal 2: 43 (Only 7 bits to accommodate +8 offset)
139  // Signal 3: 53 (Only 7 bits to accommodate +18 offset)
140  // Signal 4: 1
141  can_msgs::Frame msg;
142  msg.header.stamp = ros::Time::now();
143  msg.is_rtr = false;
144  msg.is_error = false;
145  msg.is_extended = false;
146  msg.id = 161;
147  msg.data = {23, 43, 53, 1, 0, 0, 0, 0};
148 
149  // Publish the message and verify topic creation (but we might not get the data)
150  pub.publish(msg);
151  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
152  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
153  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
154  ASSERT_TRUE(waitSubscriber(sub3, DUR_A));
155  ASSERT_TRUE(waitSubscriber(sub4, DUR_A));
156  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear();
157 
158  // Publish the message again and wait for the response (now that the topics are connected)
159  pub.publish(msg);
160  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
161  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
162  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
163  ASSERT_TRUE(rx3.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx3.getCount());
164  ASSERT_TRUE(rx4.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx4.getCount());
165 
166  // Compare the response with the expected values
167  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
168  EXPECT_EQ(rx0.getLatest().data, msg.data);
169  EXPECT_EQ(rx1.getLatest().data, 23);
170  EXPECT_EQ(rx2.getLatest().data, 43 + 8);
171  EXPECT_EQ(rx3.getLatest().data, 53 + 18);
172  EXPECT_EQ(rx4.getLatest().data, true);
173 }
174 
175 // Check the values output by parsing valid signals
176 TEST(FULL, IntelA)
177 {
178  // Message receive helpers
179  typedef std_msgs::Int8 Msg1;
180  typedef std_msgs::UInt8 Msg2;
181  typedef std_msgs::Int16 Msg3;
182  typedef std_msgs::UInt16 Msg4;
183  MsgHelper<can_msgs::Frame> rx0("inteltesta");
184  MsgHelper<Msg1> rx1("inteltesta/intelsignal8");
185  MsgHelper<Msg2> rx2("inteltesta/intelsignalU8");
186  MsgHelper<Msg3> rx3("inteltesta/intelsignal16");
187  MsgHelper<Msg4> rx4("inteltesta/intelsignalU16");
188 
189  // Create ROS topics and wait for publisher connection
190  ros::NodeHandle nh("can_bus_test");
191  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
192  ros::Subscriber sub0 = nh.subscribe("IntelTestA", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
193  ros::Subscriber sub1 = nh.subscribe("IntelTestA/IntelSignal8", 10, &MsgHelper<Msg1>::cb, &rx1);
194  ros::Subscriber sub2 = nh.subscribe("IntelTestA/IntelSignalU8", 10, &MsgHelper<Msg2>::cb, &rx2);
195  ros::Subscriber sub3 = nh.subscribe("IntelTestA/IntelSignal16", 10, &MsgHelper<Msg3>::cb, &rx3);
196  ros::Subscriber sub4 = nh.subscribe("IntelTestA/IntelSignalU16", 10, &MsgHelper<Msg4>::cb, &rx4);
197  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
198 
199  // Create a message to publish
200  // Message ID 177 0xB1
201  // Signal 1: 11 8 bit
202  // Signal 2: 22 unsigned 8 bit
203  // Signal 3: 0xCDEF 16 bit
204  // Signal 4: 0x89AB unsigned 16 bit
205  can_msgs::Frame msg;
206  msg.header.stamp = ros::Time::now();
207  msg.is_rtr = false;
208  msg.is_error = false;
209  msg.is_extended = false;
210  msg.id = 177;
211  msg.data = {11, 22, 0xEF, 0xCD, 0xAB, 0x89, 0, 0};
212 
213  // Publish the message and verify topic creation (but we might not get the data)
214  pub.publish(msg);
215  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
216  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
217  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
218  ASSERT_TRUE(waitSubscriber(sub3, DUR_A));
219  ASSERT_TRUE(waitSubscriber(sub4, DUR_A));
220  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear();
221 
222  // Publish the message again and wait for the response (now that the topics are connected)
223  pub.publish(msg);
224  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
225  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
226  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
227  ASSERT_TRUE(rx3.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx3.getCount());
228  ASSERT_TRUE(rx4.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx4.getCount());
229 
230  // Compare the response with the expected values
231  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
232  EXPECT_EQ(rx0.getLatest().data, msg.data);
233  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)11);
234  EXPECT_EQ(rx2.getLatest().data, (Msg2::_data_type)22);
235  EXPECT_EQ(rx3.getLatest().data, (Msg3::_data_type)0xCDEF);
236  EXPECT_EQ(rx4.getLatest().data, (Msg4::_data_type)0x89AB);
237 }
238 
239 // Check the values output by parsing valid signals
240 TEST(FULL, IntelB)
241 {
242  // Message receive helpers
243  typedef std_msgs::Int32 Msg1;
244  typedef std_msgs::UInt32 Msg2;
245  MsgHelper<can_msgs::Frame> rx0("inteltestb");
246  MsgHelper<Msg1> rx1("inteltestb/intelsignal32");
247  MsgHelper<Msg2> rx2("inteltestb/intelsignalU32");
248 
249  // Create ROS topics and wait for publisher connection
250  ros::NodeHandle nh("can_bus_test");
251  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
252  ros::Subscriber sub0 = nh.subscribe("IntelTestB", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
253  ros::Subscriber sub1 = nh.subscribe("IntelTestB/IntelSignal32", 10, &MsgHelper<Msg1>::cb, &rx1);
254  ros::Subscriber sub2 = nh.subscribe("IntelTestB/IntelSignalU32", 10, &MsgHelper<Msg2>::cb, &rx2);
255  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
256 
257  // Create a message to publish
258  // Message ID 178 0xB2
259  // Signal 1: 0x89ABCDEF 32 bit
260  // Signal 2: 0x01234567 unsigned 32 bit
261  can_msgs::Frame msg;
262  msg.header.stamp = ros::Time::now();
263  msg.is_rtr = false;
264  msg.is_error = false;
265  msg.is_extended = false;
266  msg.id = 178;
267  msg.data = {0xEF, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01};
268 
269  // Publish the message and verify topic creation (but we might not get the data)
270  pub.publish(msg);
271  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
272  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
273  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
274  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear();
275 
276  // Publish the message again and wait for the response (now that the topics are connected)
277  pub.publish(msg);
278  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
279  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
280  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
281 
282  // Compare the response with the expected values
283  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
284  EXPECT_EQ(rx0.getLatest().data, msg.data);
285  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)0x89ABCDEF);
286  EXPECT_EQ(rx2.getLatest().data, (Msg2::_data_type)0x01234567);
287 }
288 
289 // Check the values output by parsing valid signals
290 TEST(FULL, IntelC)
291 {
292  // Message receive helpers
293  typedef std_msgs::Int64 Msg1;
294  MsgHelper<can_msgs::Frame> rx0("inteltestc");
295  MsgHelper<Msg1> rx1("inteltestc/intelsignal64");
296 
297  // Create ROS topics and wait for publisher connection
298  ros::NodeHandle nh("can_bus_test");
299  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
300  ros::Subscriber sub0 = nh.subscribe("IntelTestC", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
301  ros::Subscriber sub1 = nh.subscribe("IntelTestC/IntelSignal64", 10, &MsgHelper<Msg1>::cb, &rx1);
302  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
303 
304  // Create a message to publish
305  // Message ID 177 0xB3
306  // Signal 1: 0x0123456789ABCDEF 64 bit
307  can_msgs::Frame msg;
308  msg.header.stamp = ros::Time::now();
309  msg.is_rtr = false;
310  msg.is_error = false;
311  msg.is_extended = false;
312  msg.id = 179;
313  msg.data = {0xE0, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01};
314 
315  // Publish the message and verify topic creation (but we might not get the data)
316  pub.publish(msg);
317  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
318  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
319  DUR_B.sleep(); rx0.clear(); rx1.clear();
320 
321  // Publish the message again and wait for the response (now that the topics are connected)
322  pub.publish(msg);
323  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
324  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
325 
326  // Compare the response with the expected values
327  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
328  EXPECT_EQ(rx0.getLatest().data, msg.data);
329  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)0x0123456789ABCDE0);
331 }
332 
333 // Check the values output by parsing valid signals
334 TEST(FULL, IntelD)
335 {
336  // Message receive helpers
337  typedef std_msgs::UInt64 Msg1;
338  MsgHelper<can_msgs::Frame> rx0("inteltestd");
339  MsgHelper<Msg1> rx1("inteltestd/intelsignalU64");
340 
341  // Create ROS topics and wait for publisher connection
342  ros::NodeHandle nh("can_bus_test");
343  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
344  ros::Subscriber sub0 = nh.subscribe("IntelTestD", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
345  ros::Subscriber sub1 = nh.subscribe("IntelTestD/IntelSignalU64", 10, &MsgHelper<Msg1>::cb, &rx1);
346  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
347 
348  // Create a message to publish
349  // Message ID 180 0xB4
350  // Signal 1: 0x0123456789ABCDEF unsigned 64 bit
351  can_msgs::Frame msg;
352  msg.header.stamp = ros::Time::now();
353  msg.is_rtr = false;
354  msg.is_error = false;
355  msg.is_extended = false;
356  msg.id = 180;
357  msg.data = {0xE0, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01};
358 
359  // Publish the message and verify topic creation (but we might not get the data)
360  pub.publish(msg);
361  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
362  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
363  DUR_B.sleep(); rx0.clear(); rx1.clear();
364 
365  // Publish the message again and wait for the response (now that the topics are connected)
366  pub.publish(msg);
367  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
368  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
369 
370  // Compare the response with the expected values
371  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
372  EXPECT_EQ(rx0.getLatest().data, msg.data);
373  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)0x0123456789ABCDE0);
375 }
376 
377 // Check the values output by parsing valid signals
378 TEST(FULL, AdvancedA)
379 {
380  // Message receive helpers
381  typedef std_msgs::Int32 Msg1;
382  typedef std_msgs::Int32 Msg2;
383  MsgHelper<can_msgs::Frame> rx0("advancedtesta");
384  MsgHelper<Msg1> rx1("advancedtesta/advancedsignal1");
385  MsgHelper<Msg2> rx2("advancedtesta/advancedsignal2");
386 
387  // Create ROS topics and wait for publisher connection
388  ros::NodeHandle nh("can_bus_test");
389  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
390  ros::Subscriber sub0 = nh.subscribe("AdvancedTestA", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
391  ros::Subscriber sub1 = nh.subscribe("AdvancedTestA/AdvancedSignal1", 10, &MsgHelper<Msg1>::cb, &rx1);
392  ros::Subscriber sub2 = nh.subscribe("AdvancedTestA/AdvancedSignal2", 10, &MsgHelper<Msg2>::cb, &rx2);
393  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
394 
395  // Create a message to publish
396  // Message ID 162 0xA2
397  // Signal 1: 210 little endian (smallest first)
398  // Signal 2: 153 big endian (largest first)
399  can_msgs::Frame msg;
400  msg.header.stamp = ros::Time::now();
401  msg.is_rtr = false;
402  msg.is_error = false;
403  msg.is_extended = false;
404  msg.id = 162;
405  msg.data = {210, 0, 0, 0, 0, 0, 0, 153}; //little
406 
407  // Publish the message and verify topic creation (but we might not get the data)
408  pub.publish(msg);
409  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
410  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
411  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
412  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear();
413 
414  // Publish the message again and wait for the response (now that the topics are connected)
415  pub.publish(msg);
416  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
417  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
418  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
419 
420  // Compare the response with the expected values
421  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
422  EXPECT_EQ(rx0.getLatest().data, msg.data);
423  EXPECT_EQ(rx1.getLatest().data, 210);
424  EXPECT_EQ(rx2.getLatest().data, 153);
426 }
427 
428 // Check the values output by parsing valid signals
429 TEST(FULL, AdvancedB)
430 {
431  // Message receive helpers
432  typedef std_msgs::Int64 Msg1;
433  MsgHelper<can_msgs::Frame> rx0("advancedtestb");
434  MsgHelper<Msg1> rx1("advancedtestb/advancedsignal3");
435 
436  // Create ROS topics and wait for publisher connection
437  ros::NodeHandle nh("can_bus_test");
438  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
439  ros::Subscriber sub0 = nh.subscribe("AdvancedTestB", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
440  ros::Subscriber sub1 = nh.subscribe("AdvancedTestB/AdvancedSignal3", 10, &MsgHelper<Msg1>::cb, &rx1);
441  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
442 
443  // Create a message to publish
444  // Message ID 163 0xA3
445  // Signal 1: 210 64 bit little endian (smallest first)
446  can_msgs::Frame msg;
447  msg.header.stamp = ros::Time::now();
448  msg.is_rtr = false;
449  msg.is_error = false;
450  msg.is_extended = false;
451  msg.id = 163;
452  msg.data = {210, 0, 0, 0, 0, 0, 0, 0}; //little
453 
454  // Publish the message and verify topic creation (but we might not get the data)
455  pub.publish(msg);
456  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
457  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
458  DUR_B.sleep(); rx0.clear(); rx1.clear();
459 
460  // Publish the message again and wait for the response (now that the topics are connected)
461  pub.publish(msg);
462  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
463  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
464 
465  // Compare the response with the expected values
466  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
467  EXPECT_EQ(rx0.getLatest().data, msg.data);
468  EXPECT_EQ(rx1.getLatest().data, 210);
470 }
471 
472 // Check the values output by parsing valid signals
473 TEST(FULL, AdvancedC)
474 {
475  // Message receive helpers
476  typedef std_msgs::Int64 Msg1;
477  MsgHelper<can_msgs::Frame> rx0("advancedtestc");
478  MsgHelper<Msg1> rx1("advancedtestc/advancedsignal4");
479 
480  // Create ROS topics and wait for publisher connection
481  ros::NodeHandle nh("can_bus_test");
482  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
483  ros::Subscriber sub0 = nh.subscribe("AdvancedTestC", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
484  ros::Subscriber sub1 = nh.subscribe("AdvancedTestC/AdvancedSignal4", 10, &MsgHelper<Msg1>::cb, &rx1);
485  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
486 
487  // Create a message to publish
488  // Message ID 164 0xA4
489  // Signal 1: 210 64 bit big endian (largest first)
490  can_msgs::Frame msg;
491  msg.header.stamp = ros::Time::now();
492  msg.is_rtr = false;
493  msg.is_error = false;
494  msg.is_extended = false;
495  msg.id = 164;
496  msg.data = {0, 0, 0, 0, 0, 0, 0, 210}; //little
497 
498  // Publish the message and verify topic creation (but we might not get the data)
499  pub.publish(msg);
500  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
501  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
502  DUR_B.sleep(); rx0.clear(); rx1.clear();
503 
504  // Publish the message again and wait for the response (now that the topics are connected)
505  pub.publish(msg);
506  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
507  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
508 
509  // Compare the response with the expected values
510  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
511  EXPECT_EQ(rx0.getLatest().data, msg.data);
512  EXPECT_EQ(rx1.getLatest().data, 210);
514 }
515 
516 // Check the values output by parsing valid signals
517 TEST(FULL, AdvancedD)
518 {
519  // Message receive helpers
520  typedef std_msgs::Int16 Msg1;
521  typedef std_msgs::UInt16 Msg2;
522  typedef std_msgs::Int16 Msg3;
523  typedef std_msgs::Int16 Msg4; // Factor is negative.
524  MsgHelper<can_msgs::Frame> rx0("advancedtestd");
525  MsgHelper<Msg1> rx1("advancedtestd/advancedsignal5");
526  MsgHelper<Msg2> rx2("advancedtestd/advancedsignal6");
527  MsgHelper<Msg3> rx3("advancedtestd/advancedsignal7");
528  MsgHelper<Msg4> rx4("advancedtestd/advancedsignal8");
529 
530  // Create ROS topics and wait for publisher connection
531  ros::NodeHandle nh("can_bus_test");
532  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
533  ros::Subscriber sub0 = nh.subscribe("AdvancedTestD", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
534  ros::Subscriber sub1 = nh.subscribe("AdvancedTestD/AdvancedSignal5", 10, &MsgHelper<Msg1>::cb, &rx1);
535  ros::Subscriber sub2 = nh.subscribe("AdvancedTestD/AdvancedSignal6", 10, &MsgHelper<Msg2>::cb, &rx2);
536  ros::Subscriber sub3 = nh.subscribe("AdvancedTestD/AdvancedSignal7", 10, &MsgHelper<Msg3>::cb, &rx3);
537  ros::Subscriber sub4 = nh.subscribe("AdvancedTestD/AdvancedSignal8", 10, &MsgHelper<Msg4>::cb, &rx4);
538  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
539 
540  // Create a message to publish
541  // Message ID 165 0xA5
542  // Signal 1: 320 x10 factor signed
543  // Signal 1: 640 x10 factor unsigned
544  // Signal 1: -120 x-10 factor signed
545  // Signal 1: -240 x-10 factor unsigned changed to signed
546  can_msgs::Frame msg;
547  msg.header.stamp = ros::Time::now();
548  msg.is_rtr = false;
549  msg.is_error = false;
550  msg.is_extended = false;
551  msg.id = 165;
552  msg.data = {32, 64, 12, 24}; //little
553 
554  // Publish the message and verify topic creation (but we might not get the data)
555  pub.publish(msg);
556  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
557  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
558  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
559  ASSERT_TRUE(waitSubscriber(sub3, DUR_A));
560  ASSERT_TRUE(waitSubscriber(sub4, DUR_A));
561  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear();
562 
563  // Publish the message again and wait for the response (now that the topics are connected)
564  pub.publish(msg);
565  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
566  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
567  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
568  ASSERT_TRUE(rx3.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx3.getCount());
569  ASSERT_TRUE(rx4.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx4.getCount());
570 
571  // Compare the response with the expected values
572  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
573  EXPECT_EQ(rx0.getLatest().data, msg.data);
574  EXPECT_EQ(rx1.getLatest().data, 320);
575  EXPECT_EQ(rx2.getLatest().data, 640);
576  EXPECT_EQ(rx3.getLatest().data, -120);
577  EXPECT_EQ(rx4.getLatest().data, -240);
578 }
579 
580 // Check the values output by parsing valid signals
581 TEST(FULL, MotorolaA)
582 {
583  // Message receive helpers
584  typedef std_msgs::Int8 Msg1;
585  typedef std_msgs::UInt8 Msg2;
586  typedef std_msgs::Int16 Msg3;
587  typedef std_msgs::UInt16 Msg4;
588  MsgHelper<can_msgs::Frame> rx0("motorolatesta");
589  MsgHelper<Msg1> rx1("motorolatesta/motorolasignal8");
590  MsgHelper<Msg2> rx2("motorolatesta/motorolasignalU8");
591  MsgHelper<Msg3> rx3("motorolatesta/motorolasignal16");
592  MsgHelper<Msg4> rx4("motorolatesta/motorolasignalU16");
593 
594  // Create ROS topics and wait for publisher connection
595  ros::NodeHandle nh("can_bus_test");
596  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
597  ros::Subscriber sub0 = nh.subscribe("MotorolaTestA", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
598  ros::Subscriber sub1 = nh.subscribe("MotorolaTestA/MotorolaSignal8", 10, &MsgHelper<Msg1>::cb, &rx1);
599  ros::Subscriber sub2 = nh.subscribe("MotorolaTestA/MotorolaSignalU8", 10, &MsgHelper<Msg2>::cb, &rx2);
600  ros::Subscriber sub3 = nh.subscribe("MotorolaTestA/MotorolaSignal16", 10, &MsgHelper<Msg3>::cb, &rx3);
601  ros::Subscriber sub4 = nh.subscribe("MotorolaTestA/MotorolaSignalU16", 10, &MsgHelper<Msg4>::cb, &rx4);
602  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
603 
604  // Create a message to publish
605  // Message ID 193 0xC1
606  // Signal 1: 11 8 bit
607  // Signal 2: 22 unsigned 8 bit
608  // Signal 3: 0x89AB 16 bit
609  // Signal 4: 0xCDEF unsigned 16 bit
610  can_msgs::Frame msg;
611  msg.header.stamp = ros::Time::now();
612  msg.is_rtr = false;
613  msg.is_error = false;
614  msg.is_extended = false;
615  msg.id = 193;
616  msg.data = {11, 22, 0, 33, 0, 44, 0, 0};
617  msg.data = {11, 22, 0x89, 0xAB, 0xCD, 0xEF, 0, 0};
618 
619  // Publish the message and verify topic creation (but we might not get the data)
620  pub.publish(msg);
621  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
622  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
623  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
624  ASSERT_TRUE(waitSubscriber(sub3, DUR_A));
625  ASSERT_TRUE(waitSubscriber(sub4, DUR_A));
626  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear();
627 
628  // Publish the message again and wait for the response (now that the topics are connected)
629  pub.publish(msg);
630  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
631  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
632  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
633  ASSERT_TRUE(rx3.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx3.getCount());
634  ASSERT_TRUE(rx4.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx4.getCount());
635 
636  // Compare the response with the expected values
637  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
638  EXPECT_EQ(rx0.getLatest().data, msg.data);
639  EXPECT_EQ(rx1.getLatest().data, 11);
640  EXPECT_EQ(rx2.getLatest().data, 22);
641  EXPECT_EQ(rx3.getLatest().data, (Msg3::_data_type)0x89AB);
642  EXPECT_EQ(rx4.getLatest().data, (Msg4::_data_type)0xCDEF);
643 }
644 
645 // Check the values output by parsing valid signals
646 TEST(FULL, MotorolaB)
647 {
648  // Message receive helpers
649  typedef std_msgs::Int32 Msg1;
650  typedef std_msgs::UInt32 Msg2;
651  MsgHelper<can_msgs::Frame> rx0("motorolatestb");
652  MsgHelper<Msg1> rx1("motorolatestb/motorolasignal32");
653  MsgHelper<Msg2> rx2("motorolatestb/motorolasignalU32");
654 
655  // Create ROS topics and wait for publisher connection
656  ros::NodeHandle nh("can_bus_test");
657  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
658  ros::Subscriber sub0 = nh.subscribe("MotorolaTestB", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
659  ros::Subscriber sub1 = nh.subscribe("MotorolaTestB/MotorolaSignal32", 10, &MsgHelper<Msg1>::cb, &rx1);
660  ros::Subscriber sub2 = nh.subscribe("MotorolaTestB/MotorolaSignalU32", 10, &MsgHelper<Msg2>::cb, &rx2);
661  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
662 
663  // Create a message to publish
664  // Message ID 194 0xC2
665  // Signal 1: 0x01234567 32 bit
666  // Signal 2: 0x89ABCDEF unsigned 32 bit
667  can_msgs::Frame msg;
668  msg.header.stamp = ros::Time::now();
669  msg.is_rtr = false;
670  msg.is_error = false;
671  msg.is_extended = false;
672  msg.id = 194;
673  msg.data = {0, 0, 0, 55, 0, 0, 0, 66};
674  msg.data = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
675 
676  // Publish the message and verify topic creation (but we might not get the data)
677  pub.publish(msg);
678  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
679  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
680  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
681  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear();
682 
683  // Publish the message again and wait for the response (now that the topics are connected)
684  pub.publish(msg);
685  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
686  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
687  ASSERT_TRUE(rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
688 
689  // Compare the response with the expected values
690  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
691  EXPECT_EQ(rx0.getLatest().data, msg.data);
692  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)0x01234567);
693  EXPECT_EQ(rx2.getLatest().data, (Msg2::_data_type)0x89ABCDEF);
694 }
695 
696 // Check the values output by parsing valid signals
697 TEST(FULL, MotorolaC)
698 {
699  // Message receive helpers
700  typedef std_msgs::Int64 Msg1;
701  MsgHelper<can_msgs::Frame> rx0("motorolatestc");
702  MsgHelper<Msg1> rx1("motorolatestc/motorolasignal64");
703 
704  // Create ROS topics and wait for publisher connection
705  ros::NodeHandle nh("can_bus_test");
706  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
707  ros::Subscriber sub0 = nh.subscribe("MotorolaTestC", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
708  ros::Subscriber sub1 = nh.subscribe("MotorolaTestC/MotorolaSignal64", 10, &MsgHelper<Msg1>::cb, &rx1);
709  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
710 
711  // Create a message to publish
712  //Message ID 195 0xC3
713  //Signal 1: 0x0123456789ABCDEF 64 bit
714  can_msgs::Frame msg;
715  msg.header.stamp = ros::Time::now();
716  msg.is_rtr = false;
717  msg.is_error = false;
718  msg.is_extended = false;
719  msg.id = 195;
720  msg.data = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xE0};
721 
722  // Publish the message and verify topic creation (but we might not get the data)
723  pub.publish(msg);
724  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
725  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
726  DUR_B.sleep(); rx0.clear(); rx1.clear();
727 
728  // Publish the message again and wait for the response (now that the topics are connected)
729  pub.publish(msg);
730  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
731  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
732 
733  // Compare the response with the expected values
734  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
735  EXPECT_EQ(rx0.getLatest().data, msg.data);
736  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)0x0123456789ABCDE0);
738 }
739 
740 // Check the values output by parsing valid signals
741 TEST(FULL, MotorolaD)
742 {
743  // Message receive helpers
744  typedef std_msgs::UInt64 Msg1;
745  MsgHelper<can_msgs::Frame> rx0("motorolatestd");
746  MsgHelper<Msg1> rx1("motorolatestd/motorolasignalU64");
747 
748  // Create ROS topics and wait for publisher connection
749  ros::NodeHandle nh("can_bus_test");
750  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
751  ros::Subscriber sub0 = nh.subscribe("MotorolaTestD", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
752  ros::Subscriber sub1 = nh.subscribe("MotorolaTestD/MotorolaSignalU64", 10, &MsgHelper<Msg1>::cb, &rx1);
753  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
754 
755  // Create a message to publish
756  // Message ID 196 0xC4
757  // Signal 1: 0x0123456789ABCDEF unsigned 64 bit
758  can_msgs::Frame msg;
759  msg.header.stamp = ros::Time::now();
760  msg.is_rtr = false;
761  msg.is_error = false;
762  msg.is_extended = false;
763  msg.id = 196;
764  msg.data = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xE0};
765 
766  // Publish the message and verify topic creation (but we might not get the data)
767  pub.publish(msg);
768  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
769  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
770  DUR_B.sleep(); rx0.clear(); rx1.clear();
771 
772  // Publish the message again and wait for the response (now that the topics are connected)
773  pub.publish(msg);
774  ASSERT_TRUE(rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
775  ASSERT_TRUE(rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
776 
777  // Compare the response with the expected values
778  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
779  EXPECT_EQ(rx0.getLatest().data, msg.data);
780  EXPECT_EQ(rx1.getLatest().data, (Msg1::_data_type)0x0123456789ABCDE0);
782 }
783 
784 // Check the values output by parsing valid signals
785 TEST(FULL, Multiplex)
786 {
787  // Message receive helpers
788  typedef std_msgs::UInt8 Msg1;
789  typedef std_msgs::Int8 Msg2;
790  typedef std_msgs::Int8 Msg3;
791  typedef std_msgs::UInt16 Msg4;
792  typedef std_msgs::Int32 Msg5;
793  MsgHelper<can_msgs::Frame> rx0("multiplextest");
794  MsgHelper<Msg1> rx1("multiplextest/multiplexor");
795  MsgHelper<Msg2> rx2("multiplextest/multiplexeda");
796  MsgHelper<Msg3> rx3("multiplextest/multiplexedb");
797  MsgHelper<Msg4> rx4("multiplextest/multiplexedc");
798  MsgHelper<Msg5> rx5("multiplextest/multiplexedd");
799 
800  // Create ROS topics and wait for publisher connection
801  ros::NodeHandle nh("can_bus_test");
802  ros::Publisher pub = nh.advertise<can_msgs::Frame>("can_rx", 10);
803  ros::Subscriber sub0 = nh.subscribe("MultiplexTest", 10, &MsgHelper<can_msgs::Frame>::cb, &rx0);
804  ros::Subscriber sub1 = nh.subscribe("MultiplexTest/Multiplexor", 10, &MsgHelper<Msg1>::cb, &rx1);
805  ros::Subscriber sub2 = nh.subscribe("MultiplexTest/MultiplexedA", 10, &MsgHelper<Msg2>::cb, &rx2);
806  ros::Subscriber sub3 = nh.subscribe("MultiplexTest/MultiplexedB", 10, &MsgHelper<Msg3>::cb, &rx3);
807  ros::Subscriber sub4 = nh.subscribe("MultiplexTest/MultiplexedC", 10, &MsgHelper<Msg4>::cb, &rx4);
808  ros::Subscriber sub5 = nh.subscribe("MultiplexTest/MultiplexedD", 10, &MsgHelper<Msg5>::cb, &rx5);
809  ASSERT_TRUE(waitPublisher(pub, DUR_A)); DUR_B.sleep();
810 
811  // Create a message to publish
812  // Signal 1: 0 multiplexor
813  can_msgs::Frame msg;
814  msg.header.stamp = ros::Time::now();
815  msg.is_rtr = false;
816  msg.is_error = false;
817  msg.is_extended = false;
818  msg.id = 166;
819  msg.data = {0, 0, 0, 0, 0, 0, 0, 0};
820 
821  // Publish the message and verify topic creation (but we might not get the data)
822  pub.publish(msg);
823  ASSERT_TRUE(waitSubscriber(sub0, DUR_A));
824  ASSERT_TRUE(waitSubscriber(sub1, DUR_A));
825  ASSERT_TRUE(waitSubscriber(sub2, DUR_A));
826  ASSERT_TRUE(waitSubscriber(sub3, DUR_A));
827  ASSERT_TRUE(waitSubscriber(sub4, DUR_A));
828  ASSERT_TRUE(waitSubscriber(sub5, DUR_A));
829  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear(); rx5.clear();
830 
831  // Change multiplexor and data
832  // Signal 1: 0x99 multiplexor
833  msg.data = {0x99, 0, 0, 0, 0, 0, 0, 0};
834 
835  // Publish the new message and wait for the response
836  pub.publish(msg);
837  EXPECT_TRUE (rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
838  EXPECT_TRUE (rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
839  EXPECT_FALSE(rx2.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx2.getCount());
840  EXPECT_FALSE(rx3.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx3.getCount());
841  EXPECT_FALSE(rx4.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx4.getCount());
842  EXPECT_FALSE(rx5.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx5.getCount());
843 
844  // Compare the response with the expected values
845  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
846  EXPECT_EQ(rx0.getLatest().data, msg.data);
847  EXPECT_EQ(rx1.getLatest().data, 0x99);
848  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear(); rx5.clear();
849 
850  // Change multiplexor and data
851  // Signal 1: 0x11 multiplexor
852  // Signal 2: 52 multiplexed a
853  msg.data = {0x11, 52, 0, 0, 0, 0, 0, 0};
854 
855  // Publish the new message and wait for the response
856  pub.publish(msg);
857  EXPECT_TRUE (rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
858  EXPECT_TRUE (rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
859  EXPECT_TRUE (rx2.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx2.getCount());
860  EXPECT_FALSE(rx3.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx3.getCount());
861  EXPECT_FALSE(rx4.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx4.getCount());
862  EXPECT_FALSE(rx5.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx5.getCount());
863 
864  // Compare the response with the expected values
865  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
866  EXPECT_EQ(rx0.getLatest().data, msg.data);
867  EXPECT_EQ(rx1.getLatest().data, 0x11);
868  EXPECT_EQ(rx2.getLatest().data, 52);
869  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear(); rx5.clear();
870 
871  // Change multiplexor and data
872  // Signal 1: 0x22 multiplexor
873  // Signal 2: 102 multiplexed b 8 bit
874  // Signal 3: 103 multiplexed c 16 bit unsigned
875  msg.data = {0x22, 102, 103, 0, 0, 0, 0, 0};
876 
877  // Publish the new message and wait for the response
878  pub.publish(msg);
879  EXPECT_TRUE (rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
880  EXPECT_TRUE (rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
881  EXPECT_FALSE(rx2.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx2.getCount());
882  EXPECT_TRUE (rx3.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx3.getCount());
883  EXPECT_TRUE (rx4.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx4.getCount());
884  EXPECT_FALSE(rx5.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx5.getCount());
885 
886  // Compare the response with the expected values
887  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
888  EXPECT_EQ(rx0.getLatest().data, msg.data);
889  EXPECT_EQ(rx1.getLatest().data, 0x22);
890  EXPECT_EQ(rx3.getLatest().data, 102);
891  EXPECT_EQ(rx4.getLatest().data, 103);
892  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear(); rx5.clear();
893 
894  // Change multiplexor and data
895  // Signal 1: 0x33 multiplexor
896  // Signal 2: 0x12345678 multiplexed 32 bit
897  msg.id = 166;
898  msg.data = {0x33, 0x78, 0x56, 0x34, 0x12, 0, 0, 0};
899 
900  // Publish the new message and wait for the response
901  pub.publish(msg);
902  EXPECT_TRUE (rx0.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx0.getCount());
903  EXPECT_TRUE (rx1.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx1.getCount());
904  EXPECT_FALSE(rx2.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx2.getCount());
905  EXPECT_FALSE(rx3.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx3.getCount());
906  EXPECT_FALSE(rx4.waitForMessage(DUR_B)); EXPECT_EQ(0u, rx4.getCount());
907  EXPECT_TRUE (rx5.waitForMessage(DUR_A)); EXPECT_EQ(1u, rx5.getCount());
908 
909  // Compare the response with the expected values
910  EXPECT_EQ(rx0.getLatest().header.stamp, msg.header.stamp);
911  EXPECT_EQ(rx0.getLatest().data, msg.data);
912  EXPECT_EQ(rx1.getLatest().data, 0x33);
913  EXPECT_EQ(rx5.getLatest().data, 0x12345678);
914  DUR_B.sleep(); rx0.clear(); rx1.clear(); rx2.clear(); rx3.clear(); rx4.clear(); rx5.clear();
915 }
916 
917 int main(int argc, char **argv)
918 {
919  ros::init(argc, argv, "test_full");
920 
921  ros::AsyncSpinner spinner(4); // Use 4 threads
922  spinner.start();
923 
924  testing::InitGoogleTest(&argc, argv);
925  return RUN_ALL_TESTS();
926 }
std::string tag_
Definition: test_full.cpp:77
const ros::WallDuration DUR_A
Definition: test_full.cpp:29
ROSCPP_DECL void start()
void publish(const boost::shared_ptr< M > &message) const
bool waitPublisher(const ros::Publisher &pub, ros::WallDuration timeout)
Definition: test_full.cpp:83
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
ros::Time stamp_
Definition: test_full.cpp:79
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
uint32_t getCount() const
Definition: test_full.cpp:73
const ros::WallDuration DUR_B
Definition: test_full.cpp:30
bool waitSubscriber(const ros::Subscriber &sub, ros::WallDuration timeout)
Definition: test_full.cpp:97
TEST(FULL, Basic)
Definition: test_full.cpp:112
bool sleep() const
uint32_t getNumPublishers() const
void clear()
Definition: test_full.cpp:65
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
uint32_t count_
Definition: test_full.cpp:78
bool waitForMessage(ros::WallDuration timeout) const
Definition: test_full.cpp:49
MsgT getLatest() const
Definition: test_full.cpp:72
uint32_t getNumSubscribers() const
static WallTime now()
int main(int argc, char **argv)
Definition: test_full.cpp:917
void cb(const boost::shared_ptr< MsgT const > &msg)
Definition: test_full.cpp:44
static Time now()
MsgT latest_
Definition: test_full.cpp:76
ros::Time getStamp() const
Definition: test_full.cpp:74
MsgHelper(std::string tag)
Definition: test_full.cpp:38
#define ROS_DEBUG(...)


dataspeed_can_tools
Author(s): Micho Radovnikovich
autogenerated on Thu Jul 9 2020 03:41:59