6 #include <gtest/gtest.h> 9 #include "../clock.hpp" 13 TEST(Frame, MessageParseCompile)
34 const std::string payload_string =
"hello\xD4";
40 ASSERT_FALSE(frame.parse(CanFrame(can_id | CanFrame::FlagRTR, reinterpret_cast<const uint8_t*>(
""), 0)));
46 EXPECT_EQ(TransferID(20), frame.getTransferID());
47 EXPECT_TRUE(frame.isStartOfTransfer());
48 EXPECT_TRUE(frame.isEndOfTransfer());
49 EXPECT_FALSE(frame.getToggle());
51 EXPECT_TRUE(frame.getDstNodeID().isBroadcast());
53 EXPECT_EQ(20000, frame.getDataTypeID().get());
54 EXPECT_EQ(16, frame.getPriority().get());
56 EXPECT_EQ(payload_string.length() - 1, frame.getPayloadLen());
57 EXPECT_TRUE(
std::equal(frame.getPayloadPtr(), frame.getPayloadPtr() + frame.getPayloadLen(),
58 payload_string.begin()));
60 std::cout << frame.toString() << std::endl;
68 ASSERT_TRUE(frame.compile(can_frame));
71 EXPECT_EQ(payload_string.length(), can_frame.dlc);
72 std::cout << can_frame.toString() << std::endl;
77 EXPECT_TRUE(
std::equal(can_frame.data, can_frame.data + can_frame.dlc,
78 reinterpret_cast<const uint8_t*>(&payload_string[0])));
83 ASSERT_FALSE(Frame() == frame);
84 ASSERT_TRUE(Frame() != frame);
86 ASSERT_TRUE(Frame() == frame);
87 ASSERT_FALSE(Frame() != frame);
91 TEST(Frame, ServiceParseCompile)
116 const std::string payload_string =
"hello\x6a";
122 ASSERT_FALSE(frame.parse(CanFrame(can_id | CanFrame::FlagRTR, reinterpret_cast<const uint8_t*>(
""), 0)));
128 EXPECT_EQ(TransferID(10), frame.getTransferID());
129 EXPECT_FALSE(frame.isStartOfTransfer());
130 EXPECT_TRUE(frame.isEndOfTransfer());
131 EXPECT_TRUE(frame.getToggle());
135 EXPECT_EQ(200, frame.getDataTypeID().get());
136 EXPECT_EQ(31, frame.getPriority().get());
138 EXPECT_EQ(payload_string.length(), frame.getPayloadLen() + 1);
139 EXPECT_TRUE(
std::equal(frame.getPayloadPtr(), frame.getPayloadPtr() + frame.getPayloadLen(),
140 reinterpret_cast<const uint8_t*
>(&payload_string[0])));
142 std::cout << frame.toString() << std::endl;
150 ASSERT_TRUE(frame.compile(can_frame));
153 EXPECT_EQ(payload_string.length(), can_frame.dlc);
154 EXPECT_TRUE(
std::equal(can_frame.data, can_frame.data + can_frame.dlc,
155 reinterpret_cast<const uint8_t*>(&payload_string[0])));
160 ASSERT_FALSE(Frame() == frame);
161 ASSERT_TRUE(Frame() != frame);
163 ASSERT_TRUE(Frame() == frame);
164 ASSERT_FALSE(Frame() != frame);
168 TEST(Frame, AnonymousParseCompile)
188 const std::string payload_string =
"hello\xd4";
191 payload_crc.
add(reinterpret_cast<const uint8_t*>(payload_string.c_str()),
unsigned(payload_string.length()));
198 EXPECT_EQ(TransferID(20), frame.getTransferID());
199 EXPECT_TRUE(frame.isStartOfTransfer());
200 EXPECT_TRUE(frame.isEndOfTransfer());
201 EXPECT_FALSE(frame.getToggle());
202 EXPECT_TRUE(frame.getSrcNodeID().isBroadcast());
203 EXPECT_TRUE(frame.getDstNodeID().isBroadcast());
205 EXPECT_EQ(1, frame.getDataTypeID().get());
206 EXPECT_EQ(0, frame.getPriority().get());
208 EXPECT_EQ(payload_string.length() - 1, frame.getPayloadLen());
209 EXPECT_TRUE(
std::equal(frame.getPayloadPtr(), frame.getPayloadPtr() + frame.getPayloadLen(),
210 reinterpret_cast<const uint8_t*
>(&payload_string[0])));
212 std::cout << frame.toString() << std::endl;
217 const uint32_t DiscriminatorMask = 0x00FFFC00;
218 const uint32_t NoDiscriminatorMask = 0xFF0003FF;
223 ASSERT_TRUE(frame.compile(can_frame));
225 can_frame.id & NoDiscriminatorMask & uavcan::CanFrame::MaskExtID);
227 EXPECT_EQ(payload_string.length(), can_frame.dlc);
228 EXPECT_TRUE(
std::equal(can_frame.data, can_frame.data + can_frame.dlc,
229 reinterpret_cast<const uint8_t*>(&payload_string[0])));
231 EXPECT_EQ((can_frame.id & DiscriminatorMask & uavcan::CanFrame::MaskExtID) >> 10, payload_crc.
get() & 16383);
236 ASSERT_FALSE(Frame() == frame);
237 ASSERT_TRUE(Frame() != frame);
239 ASSERT_TRUE(Frame() == frame);
240 ASSERT_FALSE(Frame() != frame);
253 ASSERT_FALSE(frame.parse(can));
255 for (
unsigned i = 0; i <
sizeof(CanFrame::data); i++)
279 can.id = CanFrame::FlagEFF |
287 ASSERT_FALSE(frame.parse(can));
290 ASSERT_TRUE(frame.parse(can));
291 EXPECT_TRUE(frame.isStartOfTransfer());
292 EXPECT_TRUE(frame.isEndOfTransfer());
293 EXPECT_FALSE(frame.getToggle());
294 ASSERT_EQ(2, frame.getPriority().get());
295 ASSERT_EQ(NodeID(42), frame.getSrcNodeID());
296 ASSERT_EQ(NodeID::Broadcast, frame.getDstNodeID());
297 ASSERT_EQ(456, frame.getDataTypeID().get());
298 ASSERT_EQ(TransferID(15), frame.getTransferID());
313 CanRxFrame can_rx_frame;
317 ASSERT_FALSE(rx_frame.parse(can_rx_frame));
321 can_rx_frame.id = CanFrame::FlagEFF |
327 ASSERT_FALSE(rx_frame.parse(can_rx_frame));
329 can_rx_frame.data[0] = 0xc0;
330 can_rx_frame.dlc = 1;
332 ASSERT_TRUE(rx_frame.parse(can_rx_frame));
333 ASSERT_EQ(1, rx_frame.getMonotonicTimestamp().toUSec());
334 ASSERT_EQ(0, rx_frame.getIfaceIndex());
336 can_rx_frame.ts_mono =
tsMono(123);
337 can_rx_frame.iface_index = 2;
340 ASSERT_TRUE(frame.compile(can_rx_frame));
342 ASSERT_TRUE(rx_frame.parse(can_rx_frame));
343 ASSERT_EQ(123, rx_frame.getMonotonicTimestamp().toUSec());
344 ASSERT_EQ(2, rx_frame.getIfaceIndex());
345 ASSERT_EQ(456, rx_frame.getDataTypeID().get());
357 EXPECT_EQ(
"prio=255 dtid=65535 tt=3 snid=255 dnid=255 sot=0 eot=0 togl=0 tid=0 payload=[] ts_m=0.000000 ts_utc=0.000000 iface=0",
358 rx_frame.toString());
366 for (
unsigned i = 0; i <
sizeof(data); i++)
370 rx_frame.setPayload(data,
sizeof(data));
372 rx_frame.setStartOfTransfer(
true);
373 rx_frame.setEndOfTransfer(
true);
374 rx_frame.flipToggle();
377 EXPECT_EQ(
"prio=31 dtid=65535 tt=2 snid=127 dnid=0 sot=1 eot=1 togl=1 tid=31 payload=[00 01 02 03 04 05 06] " 378 "ts_m=18446744073709.551615 ts_utc=18446744073709.551615 iface=3",
379 rx_frame.toString());
383 EXPECT_EQ(
"prio=255 dtid=65535 tt=3 snid=255 dnid=255 sot=0 eot=0 togl=0 tid=0 payload=[]", frame.toString());
387 EXPECT_EQ(
"prio=31 dtid=65535 tt=2 snid=127 dnid=0 sot=1 eot=1 togl=1 tid=31 payload=[00 01 02 03 04 05 06]",
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
static const uint8_t NumericallyMax
static MonotonicTime fromUSec(uint64_t us)
static const uint32_t MaskExtID
static const NodeID Broadcast
static MonotonicTime getMax()
TEST(Frame, MessageParseCompile)
uavcan::MonotonicTime tsMono(uint64_t usec)
static const uint16_t MaxPossibleDataTypeIDValue
uavcan::CanFrame makeCanFrame(uint32_t id, const std::string &str_data, FrameType type)