diff --git a/libuavcan/test/transport/transfer_listener.cpp b/libuavcan/test/transport/transfer_listener.cpp index 947134c957..199b904dc7 100644 --- a/libuavcan/test/transport/transfer_listener.cpp +++ b/libuavcan/test/transport/transfer_listener.cpp @@ -9,15 +9,22 @@ class Emulator : public IncomingTransferEmulatorBase { uavcan::TransferListenerBase& target_; + const uavcan::DataTypeDescriptor data_type_; public: Emulator(uavcan::TransferListenerBase& target, const uavcan::DataTypeDescriptor& type, uavcan::NodeID dst_node_id = 127) - : IncomingTransferEmulatorBase(type, dst_node_id) + : IncomingTransferEmulatorBase(dst_node_id) , target_(target) + , data_type_(type) { } void sendOneFrame(const uavcan::RxFrame& frame) { target_.handleFrame(frame); } + + Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload) + { + return IncomingTransferEmulatorBase::makeTransfer(transfer_type, source_node_id, payload, data_type_); + } }; @@ -94,8 +101,8 @@ TEST(TransferListener, CrcFailure) const Transfer tr_mft = emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 42, "123456789abcdefghik"); const Transfer tr_sft = emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 11, "abcd"); - std::vector ser_mft = serializeTransfer(tr_mft, type); - std::vector ser_sft = serializeTransfer(tr_sft, type); + std::vector ser_mft = serializeTransfer(tr_mft); + std::vector ser_sft = serializeTransfer(tr_sft); ASSERT_TRUE(ser_mft.size() > 1); ASSERT_TRUE(ser_sft.size() == 1); @@ -176,8 +183,8 @@ TEST(TransferListener, Cleanup) const Transfer tr_mft = emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 42, "123456789abcdefghik"); const Transfer tr_sft = emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 11, "abcd"); - const std::vector ser_mft = serializeTransfer(tr_mft, type); - const std::vector ser_sft = serializeTransfer(tr_sft, type); + const std::vector ser_mft = serializeTransfer(tr_mft); + const std::vector ser_sft = serializeTransfer(tr_sft); ASSERT_TRUE(ser_mft.size() > 1); ASSERT_TRUE(ser_sft.size() == 1); diff --git a/libuavcan/test/transport/transfer_test_helpers.cpp b/libuavcan/test/transport/transfer_test_helpers.cpp index c75e0f5be0..b4ca9e4c45 100644 --- a/libuavcan/test/transport/transfer_test_helpers.cpp +++ b/libuavcan/test/transport/transfer_test_helpers.cpp @@ -25,7 +25,7 @@ TEST(TransferTestHelpers, Transfer) tba.access()->write(0, reinterpret_cast(TEST_DATA.c_str()), TEST_DATA.length())); // Reading back - const Transfer transfer(mfit); + const Transfer transfer(mfit, uavcan::DataTypeDescriptor()); ASSERT_EQ(TEST_DATA, transfer.payload); } @@ -37,9 +37,9 @@ TEST(TransferTestHelpers, MFTSerialization) type.hash.value[i] = i; static const std::string DATA = "To go wrong in one's own way is better than to go right in someone else's."; - const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 2, 42, 127, DATA); + const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 2, 42, 127, DATA, type); - const std::vector ser = serializeTransfer(transfer, type); + const std::vector ser = serializeTransfer(transfer); std::cout << "Serialized transfer:\n"; for (std::vector::const_iterator it = ser.begin(); it != ser.end(); ++it) @@ -68,26 +68,26 @@ TEST(TransferTestHelpers, SFTSerialization) type.hash.value[i] = i; { - const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 7, 42, 0, "Nvrfrget"); - const std::vector ser = serializeTransfer(transfer, type); + const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 7, 42, 0, "Nvrfrget", type); + const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } { - const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_REQUEST, 7, 42, 127, "7-chars"); - const std::vector ser = serializeTransfer(transfer, type); + const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_REQUEST, 7, 42, 127, "7-chars", type); + const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } { - const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 7, 42, 0, ""); - const std::vector ser = serializeTransfer(transfer, type); + const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 7, 42, 0, "", type); + const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } { - const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 7, 42, 127, ""); - const std::vector ser = serializeTransfer(transfer, type); + const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 7, 42, 127, "", type); + const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } diff --git a/libuavcan/test/transport/transfer_test_helpers.hpp b/libuavcan/test/transport/transfer_test_helpers.hpp index abfa455470..57853f688c 100644 --- a/libuavcan/test/transport/transfer_test_helpers.hpp +++ b/libuavcan/test/transport/transfer_test_helpers.hpp @@ -10,7 +10,9 @@ #include #include - +/** + * UAVCAN transfer representation used in various tests. + */ struct Transfer { uint64_t ts_monotonic; @@ -19,15 +21,17 @@ struct Transfer uavcan::TransferID transfer_id; uavcan::NodeID src_node_id; uavcan::NodeID dst_node_id; + uavcan::DataTypeDescriptor data_type; std::string payload; - Transfer(const uavcan::IncomingTransfer& tr) + Transfer(const uavcan::IncomingTransfer& tr, const uavcan::DataTypeDescriptor& data_type) : ts_monotonic(tr.getMonotonicTimestamp()) , ts_utc(tr.getUtcTimestamp()) , transfer_type(tr.getTransferType()) , transfer_id(tr.getTransferID()) , src_node_id(tr.getSrcNodeID()) , dst_node_id() // default is invalid + , data_type(data_type) { unsigned int offset = 0; while (true) @@ -48,13 +52,14 @@ struct Transfer Transfer(uint64_t ts_monotonic, uint64_t ts_utc, uavcan::TransferType transfer_type, uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, uavcan::NodeID dst_node_id, - const std::string& payload) + const std::string& payload, const uavcan::DataTypeDescriptor& data_type) : ts_monotonic(ts_monotonic) , ts_utc(ts_utc) , transfer_type(transfer_type) , transfer_id(transfer_id) , src_node_id(src_node_id) , dst_node_id(dst_node_id) + , data_type(data_type) , payload(payload) { } @@ -103,7 +108,7 @@ public: void handleIncomingTransfer(uavcan::IncomingTransfer& transfer) { - const Transfer rx(transfer); + const Transfer rx(transfer, *Base::getDataTypeDescriptor()); transfers_.push(rx); std::cout << "Received transfer: " << rx.toString() << std::endl; } @@ -137,7 +142,7 @@ public: namespace { -std::vector serializeTransfer(const Transfer& transfer, const uavcan::DataTypeDescriptor& type) +std::vector serializeTransfer(const Transfer& transfer) { bool need_crc = false; switch (transfer.transfer_type) @@ -158,7 +163,7 @@ std::vector serializeTransfer(const Transfer& transfer, const u std::vector raw_payload; if (need_crc) { - uavcan::Crc16 payload_crc(type.hash.value, uavcan::DataTypeHash::NUM_BYTES); + uavcan::Crc16 payload_crc(transfer.data_type.hash.value, uavcan::DataTypeHash::NUM_BYTES); payload_crc.add(reinterpret_cast(transfer.payload.c_str()), transfer.payload.length()); // Little endian raw_payload.push_back(payload_crc.get() & 0xFF); @@ -177,8 +182,8 @@ std::vector serializeTransfer(const Transfer& transfer, const u const int bytes_left = raw_payload.size() - offset; EXPECT_TRUE(bytes_left >= 0); - uavcan::Frame frm(type.id, transfer.transfer_type, transfer.src_node_id, transfer.dst_node_id, frame_index, - transfer.transfer_id); + uavcan::Frame frm(transfer.data_type.id, transfer.transfer_type, transfer.src_node_id, transfer.dst_node_id, + frame_index, transfer.transfer_id); const int spres = frm.setPayload(&*(raw_payload.begin() + offset), bytes_left); if (spres < 0) { @@ -208,26 +213,25 @@ std::vector serializeTransfer(const Transfer& transfer, const u class IncomingTransferEmulatorBase { - const uavcan::DataTypeDescriptor type_; uint64_t ts_; uavcan::TransferID tid_; uavcan::NodeID dst_node_id_; public: - IncomingTransferEmulatorBase(const uavcan::DataTypeDescriptor& type, uavcan::NodeID dst_node_id = 127) - : type_(type) - , ts_(0) + IncomingTransferEmulatorBase(uavcan::NodeID dst_node_id) + : ts_(0) , dst_node_id_(dst_node_id) { } virtual ~IncomingTransferEmulatorBase() { } - Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload) + Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload, + const uavcan::DataTypeDescriptor& type) { ts_ += 100; const uavcan::NodeID dst_node_id = (transfer_type == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST) ? uavcan::NodeID::BROADCAST : dst_node_id_; - const Transfer tr(ts_, ts_ + 1000000000ul, transfer_type, tid_, source_node_id, dst_node_id, payload); + const Transfer tr(ts_, ts_ + 1000000000ul, transfer_type, tid_, source_node_id, dst_node_id, payload, type); tid_.increment(); return tr; } @@ -259,7 +263,7 @@ public: { std::vector > sers; while (num_transfers--) - sers.push_back(serializeTransfer(*transfers++, type_)); + sers.push_back(serializeTransfer(*transfers++)); send(sers); }