libuav original
Dependents: UAVCAN UAVCAN_Subscriber
incoming_transfer.cpp
00001 /* 00002 * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com> 00003 */ 00004 00005 #include <algorithm> 00006 #include <gtest/gtest.h> 00007 #include <uavcan/transport/transfer_listener.hpp> 00008 #include "../clock.hpp" 00009 #include "transfer_test_helpers.hpp" 00010 00011 00012 static uavcan::RxFrame makeFrame() 00013 { 00014 uavcan::RxFrame frame(uavcan::Frame(123, uavcan::TransferTypeMessageBroadcast, 1, uavcan::NodeID::Broadcast, 0), 00015 tsMono(123), tsUtc(456), 0); 00016 uint8_t data[8]; 00017 for (uint8_t i = 0; i < sizeof(data); i++) 00018 { 00019 data[i] = i; 00020 } 00021 frame.setPayload(data, sizeof(data)); 00022 frame.setEndOfTransfer(true); 00023 return frame; 00024 } 00025 00026 00027 static bool match(const uavcan::IncomingTransfer& it, const uavcan::RxFrame& frame, 00028 const uint8_t* payload, unsigned payload_len) 00029 { 00030 // Fields extracted from the frame struct 00031 EXPECT_EQ(it.getMonotonicTimestamp(), frame.getMonotonicTimestamp()); 00032 EXPECT_EQ(it.getUtcTimestamp(), frame.getUtcTimestamp()); 00033 EXPECT_EQ(it.getSrcNodeID(), frame.getSrcNodeID()); 00034 EXPECT_EQ(it.getTransferID(), frame.getTransferID()); 00035 EXPECT_EQ(it.getTransferType(), frame.getTransferType()); 00036 00037 // Payload comparison 00038 static const unsigned BUFLEN = 1024; 00039 uint8_t buf_reference[BUFLEN], buf_actual[BUFLEN]; 00040 00041 if (payload_len > BUFLEN) 00042 { 00043 std::cout << "match(): Payload is too long" << std::endl; 00044 exit(1); 00045 } 00046 00047 std::fill(buf_reference, buf_reference + BUFLEN, 0); 00048 std::fill(buf_actual, buf_actual + BUFLEN, 0); 00049 std::copy(payload, payload + payload_len, buf_reference); 00050 00051 EXPECT_EQ(payload_len, it.read(0, buf_actual, payload_len * 3)); 00052 EXPECT_EQ(0, it.read(payload_len, buf_actual, payload_len * 3)); 00053 00054 return std::equal(buf_reference, buf_reference + BUFLEN, buf_actual); 00055 } 00056 00057 00058 TEST(SingleFrameIncomingTransfer, Basic) 00059 { 00060 using uavcan::RxFrame; 00061 using uavcan::SingleFrameIncomingTransfer; 00062 00063 const RxFrame frame = makeFrame(); 00064 SingleFrameIncomingTransfer it(frame); 00065 00066 ASSERT_TRUE(match(it, frame, frame.getPayloadPtr(), frame.getPayloadLen())); 00067 } 00068 00069 00070 TEST(MultiFrameIncomingTransfer, Basic) 00071 { 00072 using uavcan::RxFrame; 00073 using uavcan::MultiFrameIncomingTransfer; 00074 00075 uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 100, uavcan::MemPoolBlockSize> poolmgr; 00076 uavcan::TransferBufferManager bufmgr(256, poolmgr); 00077 00078 const RxFrame frame = makeFrame(); 00079 uavcan::TransferBufferManagerKey bufmgr_key(frame.getSrcNodeID(), frame.getTransferType()); 00080 uavcan::TransferBufferAccessor tba(bufmgr, bufmgr_key); 00081 00082 MultiFrameIncomingTransfer it(frame.getMonotonicTimestamp(), frame.getUtcTimestamp(), frame, tba); 00083 00084 /* 00085 * Empty read must fail 00086 */ 00087 uint8_t data_byte = 0; 00088 ASSERT_GT(0, it.read(0, &data_byte, 1)); // Error - no such buffer 00089 00090 /* 00091 * Filling the test data 00092 */ 00093 const std::string data = "123Hello world"; 00094 const uint8_t* const data_ptr = reinterpret_cast<const uint8_t*>(data.c_str()); 00095 ASSERT_FALSE(bufmgr.access(bufmgr_key)); 00096 ASSERT_TRUE(bufmgr.create(bufmgr_key)); 00097 ASSERT_EQ(data.length(), bufmgr.access(bufmgr_key)->write(0, data_ptr, unsigned(data.length()))); 00098 00099 /* 00100 * Check 00101 */ 00102 ASSERT_TRUE(match(it, frame, data_ptr, unsigned(data.length()))); 00103 00104 /* 00105 * Buffer release 00106 */ 00107 ASSERT_TRUE(bufmgr.access(bufmgr_key)); 00108 it.release(); 00109 ASSERT_FALSE(bufmgr.access(bufmgr_key)); 00110 }
Generated on Tue Jul 12 2022 17:17:32 by 1.7.2