5 #include <gtest/gtest.h>
8 #include <root_ns_a/EmptyMessage.hpp>
9 #include <root_ns_a/MavlinkMessage.hpp>
10 #include "../clock.hpp"
11 #include "../transport/can/can.hpp"
15 template <
typename DataType>
42 std::vector<ReceivedDataStructureCopy>
extended;
81 "sizeof(uavcan::Subscriber<root_ns_a::MavlinkMessage, Listener::ExtendedBinder>): " <<
97 root_ns_a::MavlinkMessage expected_msg;
98 expected_msg.seq = 0x42;
99 expected_msg.sysid = 0x72;
100 expected_msg.compid = 0x08;
101 expected_msg.msgid = 0xa5;
102 expected_msg.payload =
"Msg";
104 const uint8_t transfer_payload[] = {0x42, 0x72, 0x08, 0xa5,
'M',
's',
'g'};
109 std::vector<uavcan::RxFrame> rx_frames;
110 for (
uint8_t i = 0; i < 4; i++)
119 frame.setStartOfTransfer(
true);
120 frame.setEndOfTransfer(
true);
121 frame.setPayload(transfer_payload, 7);
123 rx_frames.push_back(rx_frame);
129 ASSERT_EQ(0,
node.getDispatcher().getNumMessageListeners());
131 ASSERT_EQ(0, sub_extended.
start(listener.bindExtended()));
132 ASSERT_EQ(0, sub_extended2.
start(listener.bindExtended()));
133 ASSERT_EQ(0, sub_simple.
start(listener.bindSimple()));
134 ASSERT_EQ(0, sub_simple2.
start(listener.bindSimple()));
136 ASSERT_EQ(4,
node.getDispatcher().getNumMessageListeners());
138 sub_extended2.
stop();
141 ASSERT_EQ(2,
node.getDispatcher().getNumMessageListeners());
143 for (
unsigned i = 0; i < rx_frames.size(); i++)
145 can_driver.
ifaces[0].pushRx(rx_frames[i]);
146 can_driver.
ifaces[1].pushRx(rx_frames[i]);
154 ASSERT_EQ(listener.extended.size(), rx_frames.size());
155 for (
unsigned i = 0; i < rx_frames.size(); i++)
157 const Listener::ReceivedDataStructureCopy
s = listener.extended.at(i);
158 ASSERT_TRUE(
s.msg == expected_msg);
159 ASSERT_EQ(rx_frames[i].getSrcNodeID(),
s.src_node_id);
160 ASSERT_EQ(rx_frames[i].getTransferID(),
s.transfer_id);
161 ASSERT_EQ(rx_frames[i].getTransferType(),
s.transfer_type);
162 ASSERT_EQ(rx_frames[i].getMonotonicTimestamp(),
s.ts_monotonic);
163 ASSERT_EQ(rx_frames[i].getIfaceIndex(),
s.iface_index);
166 ASSERT_EQ(listener.simple.size(), rx_frames.size());
167 for (
unsigned i = 0; i < rx_frames.size(); i++)
169 ASSERT_TRUE(listener.simple.at(i) == expected_msg);
178 ASSERT_EQ(2,
node.getDispatcher().getNumMessageListeners());
181 sub_extended2.
stop();
185 ASSERT_EQ(0,
node.getDispatcher().getNumMessageListeners());
191 FAIL() <<
"I just went mad";
207 ASSERT_EQ(0,
node.getDispatcher().getNumMessageListeners());
209 ASSERT_EQ(1,
node.getDispatcher().getNumMessageListeners());
213 for (
uint8_t i = 0; i < 4; i++)
219 frame.setStartOfTransfer(
true);
220 frame.setEndOfTransfer(
true);
223 can_driver.
ifaces[0].pushRx(rx_frame);
224 can_driver.
ifaces[1].pushRx(rx_frame);
231 ASSERT_EQ(1,
node.getDispatcher().getNumMessageListeners());
233 ASSERT_EQ(0,
node.getDispatcher().getNumMessageListeners());
237 TEST(Subscriber, SingleFrameTransfer)
252 "sizeof(uavcan::Subscriber<root_ns_a::EmptyMessage, Listener::SimpleBinder>): " <<
257 sub.
start(listener.bindSimple());
259 for (
uint8_t i = 0; i < 4; i++)
265 frame.setStartOfTransfer(
true);
266 frame.setEndOfTransfer(
true);
269 can_driver.
ifaces[0].pushRx(rx_frame);
270 can_driver.
ifaces[1].pushRx(rx_frame);
277 ASSERT_EQ(4, listener.simple.size());
278 for (
unsigned i = 0; i < 4; i++)
280 ASSERT_TRUE(listener.simple.at(i) == root_ns_a::EmptyMessage());