6 #include <gtest/gtest.h>
10 uint64_t timestamp_usec,
int iface_index)
14 std::cout <<
"Frame mismatch:\n"
15 <<
" " << rxframe.toString(uavcan::CanFrame::StrAligned) <<
"\n"
16 <<
" " <<
frame.toString(uavcan::CanFrame::StrAligned) << std::endl;
23 TEST(CanIOManager, Reception)
44 EXPECT_EQ(100, clockmock.
utc);
55 driver.
ifaces.at(0).pushRx(frames[0][0]);
56 driver.
ifaces.at(1).pushRx(frames[1][0]);
58 driver.
ifaces.at(0).pushRx(frames[0][1]);
59 driver.
ifaces.at(1).pushRx(frames[1][1]);
61 driver.
ifaces.at(0).pushRx(frames[0][2]);
62 driver.
ifaces.at(1).pushRx(frames[1][2]);
99 driver.
ifaces.at(1).pushRx(frames[0][0]);
100 driver.
ifaces.at(1).rx_failure =
true;
103 driver.
ifaces.at(0).num_errors = 9000;
104 driver.
ifaces.at(1).num_errors = 100500;
115 TEST(CanIOManager, Transmission)
129 CanIOManager iomgr(driver, pool, clockmock, 9999);
130 ASSERT_EQ(2, iomgr.getNumIfaces());
132 const int ALL_IFACES_MASK = 3;
143 EXPECT_EQ(2, iomgr.send(frames[0],
tsMono(100),
tsMono(0), ALL_IFACES_MASK, flags));
144 EXPECT_TRUE(driver.
ifaces.at(0).matchAndPopTx(frames[0], 100));
145 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[0], 100));
146 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[0]));
147 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[0]));
149 EXPECT_EQ(1, iomgr.send(frames[1],
tsMono(200),
tsMono(100), 2, flags));
150 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[1], 200));
152 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[1]));
155 EXPECT_EQ(0, clockmock.
utc);
156 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
157 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
158 EXPECT_EQ(0, iomgr.getIfacePerfCounters(0).errors);
159 EXPECT_EQ(0, iomgr.getIfacePerfCounters(1).errors);
167 driver.
ifaces.at(0).writeable =
false;
168 EXPECT_LT(0, iomgr.send(frames[0],
tsMono(201),
tsMono(200), ALL_IFACES_MASK, flags));
169 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[0], 201));
171 EXPECT_EQ(200, clockmock.
utc);
172 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
173 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
175 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[0]));
179 driver.
ifaces.at(1).writeable =
false;
180 EXPECT_EQ(0, iomgr.send(frames[1],
tsMono(777),
tsMono(300), ALL_IFACES_MASK, flags));
182 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[0]));
183 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[1]));
186 EXPECT_EQ(0, iomgr.send(frames[2],
tsMono(888),
tsMono(400), 1, flags));
188 EXPECT_EQ(400, clockmock.
utc);
189 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
190 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
193 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[1]));
200 driver.
ifaces.at(0).writeable =
true;
201 driver.
ifaces.at(1).writeable =
true;
203 EXPECT_LT(0, iomgr.send(frames[0],
tsMono(999),
tsMono(500), 2, flags));
204 EXPECT_TRUE(driver.
ifaces.at(0).matchAndPopTx(frames[1], 777));
205 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[0], 999));
206 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
207 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
208 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[1]));
209 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[0]));
213 EXPECT_EQ(0, iomgr.receive(dummy_rx_frame,
tsMono(0), flags));
214 EXPECT_TRUE(driver.
ifaces.at(0).matchAndPopTx(frames[2], 888));
215 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[1], 777));
217 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[2]));
218 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[1]));
221 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
222 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
224 EXPECT_EQ(0, iomgr.getIfacePerfCounters(0).errors);
225 EXPECT_EQ(0, iomgr.getIfacePerfCounters(1).errors);
230 driver.
ifaces.at(0).writeable =
false;
231 driver.
ifaces.at(1).writeable =
false;
234 EXPECT_EQ(0, iomgr.send(frames[2],
tsMono(2222),
tsMono(1000), ALL_IFACES_MASK, flags));
235 EXPECT_EQ(0, iomgr.send(frames[0],
tsMono(3333),
tsMono(1100), 2, flags));
237 EXPECT_EQ(0, iomgr.send(frames[1],
tsMono(4444),
tsMono(1200), ALL_IFACES_MASK, flags));
239 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[1]));
240 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[0]));
245 EXPECT_EQ(1200, clockmock.
utc);
246 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
247 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
250 driver.
ifaces.at(0).writeable =
true;
251 driver.
ifaces.at(1).writeable =
true;
253 driver.
ifaces.at(0).pushRx(rx_frames[0]);
254 driver.
ifaces.at(1).pushRx(rx_frames[1]);
258 EXPECT_EQ(1, iomgr.receive(rx_frame,
tsMono(0), flags));
260 EXPECT_TRUE(driver.
ifaces.at(0).matchAndPopTx(frames[1], 4444));
261 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[0], 3333));
263 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[1]));
264 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[0]));
266 EXPECT_EQ(1, iomgr.receive(rx_frame,
tsMono(0), flags));
268 EXPECT_TRUE(driver.
ifaces.at(0).matchAndPopTx(frames[2], 2222));
269 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[1], 4444));
271 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[2]));
272 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[1]));
277 EXPECT_EQ(1200, clockmock.
utc);
278 EXPECT_TRUE(driver.
ifaces.at(0).tx.empty());
279 EXPECT_TRUE(driver.
ifaces.at(1).tx.empty());
280 EXPECT_EQ(0, iomgr.getIfacePerfCounters(0).errors);
281 EXPECT_EQ(0, iomgr.getIfacePerfCounters(1).errors);
288 EXPECT_EQ(-uavcan::ErrDriver, iomgr.receive(rx_frame,
tsMono(2000), flags));
289 EXPECT_EQ(-uavcan::ErrDriver,
290 iomgr.send(frames[0],
tsMono(2100),
tsMono(2000), ALL_IFACES_MASK, flags));
292 EXPECT_EQ(1200, clockmock.
utc);
294 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[0]));
295 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[0]));
299 driver.
ifaces.at(0).writeable =
true;
300 driver.
ifaces.at(1).writeable =
true;
301 driver.
ifaces.at(0).tx_failure =
true;
302 driver.
ifaces.at(1).tx_failure =
true;
304 EXPECT_GE(0, iomgr.send(frames[0],
tsMono(2200),
tsMono(0), ALL_IFACES_MASK, flags));
305 EXPECT_TRUE(driver.
ifaces.at(0).matchPendingTx(frames[0]));
306 EXPECT_TRUE(driver.
ifaces.at(1).matchPendingTx(frames[0]));
311 driver.
ifaces.at(0).tx_failure =
false;
312 driver.
ifaces.at(1).tx_failure =
false;
313 EXPECT_EQ(0, iomgr.receive(rx_frame,
tsMono(2500), flags));
314 EXPECT_TRUE(driver.
ifaces.at(0).matchAndPopTx(frames[0], 2200));
315 EXPECT_TRUE(driver.
ifaces.at(1).matchAndPopTx(frames[0], 2200));
324 EXPECT_EQ(1, iomgr.getIfacePerfCounters(0).frames_rx);
325 EXPECT_EQ(1, iomgr.getIfacePerfCounters(1).frames_rx);
327 EXPECT_EQ(6, iomgr.getIfacePerfCounters(0).frames_tx);
328 EXPECT_EQ(9, iomgr.getIfacePerfCounters(1).frames_tx);
347 CanIOManager iomgr(driver, pool, clockmock);
348 ASSERT_EQ(2, iomgr.getNumIfaces());
351 fr1.id = 123 | CanFrame::FlagEFF;
354 fr2.id = 456 | CanFrame::FlagEFF;
361 ASSERT_LE(0, iomgr.receive(rfr1,
tsMono(100), flags));
363 ASSERT_TRUE(rfr1 == fr1);
368 ASSERT_LE(0, iomgr.receive(rfr1,
tsMono(100), flags));
370 ASSERT_LE(0, iomgr.receive(rfr2,
tsMono(100), flags));
372 ASSERT_TRUE(rfr1 == fr1);
373 ASSERT_TRUE(rfr2 == fr2);
379 EXPECT_EQ(0, iomgr.getIfacePerfCounters(0).frames_rx);
380 EXPECT_EQ(0, iomgr.getIfacePerfCounters(1).frames_rx);
382 EXPECT_EQ(3, iomgr.getIfacePerfCounters(0).frames_tx);
383 EXPECT_EQ(0, iomgr.getIfacePerfCounters(1).frames_tx);