incoming_transfer.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <algorithm>
6 #include <gtest/gtest.h>
8 #include "../clock.hpp"
10 
11 
13 {
15  tsMono(123), tsUtc(456), 0);
16  uint8_t data[8];
17  for (uint8_t i = 0; i < sizeof(data); i++)
18  {
19  data[i] = i;
20  }
21  frame.setPayload(data, sizeof(data));
22  frame.setEndOfTransfer(true);
23  return frame;
24 }
25 
26 
27 static bool match(const uavcan::IncomingTransfer& it, const uavcan::RxFrame& frame,
28  const uint8_t* payload, unsigned payload_len)
29 {
30  // Fields extracted from the frame struct
31  EXPECT_EQ(it.getMonotonicTimestamp(), frame.getMonotonicTimestamp());
32  EXPECT_EQ(it.getUtcTimestamp(), frame.getUtcTimestamp());
33  EXPECT_EQ(it.getSrcNodeID(), frame.getSrcNodeID());
34  EXPECT_EQ(it.getTransferID(), frame.getTransferID());
35  EXPECT_EQ(it.getTransferType(), frame.getTransferType());
36 
37  // Payload comparison
38  static const unsigned BUFLEN = 1024;
39  uint8_t buf_reference[BUFLEN], buf_actual[BUFLEN];
40 
41  if (payload_len > BUFLEN)
42  {
43  std::cout << "match(): Payload is too long" << std::endl;
44  exit(1);
45  }
46 
47  std::fill(buf_reference, buf_reference + BUFLEN, 0);
48  std::fill(buf_actual, buf_actual + BUFLEN, 0);
49  std::copy(payload, payload + payload_len, buf_reference);
50 
51  EXPECT_EQ(payload_len, it.read(0, buf_actual, payload_len * 3));
52  EXPECT_EQ(0, it.read(payload_len, buf_actual, payload_len * 3));
53 
54  return std::equal(buf_reference, buf_reference + BUFLEN, buf_actual);
55 }
56 
57 
58 TEST(SingleFrameIncomingTransfer, Basic)
59 {
60  using uavcan::RxFrame;
62 
63  const RxFrame frame = makeFrame();
64  SingleFrameIncomingTransfer it(frame);
65 
66  ASSERT_TRUE(match(it, frame, frame.getPayloadPtr(), frame.getPayloadLen()));
67 }
68 
69 
70 TEST(MultiFrameIncomingTransfer, Basic)
71 {
72  using uavcan::RxFrame;
74 
76  uavcan::TransferBufferManager bufmgr(256, poolmgr);
77 
78  const RxFrame frame = makeFrame();
79  uavcan::TransferBufferManagerKey bufmgr_key(frame.getSrcNodeID(), frame.getTransferType());
80  uavcan::TransferBufferAccessor tba(bufmgr, bufmgr_key);
81 
82  MultiFrameIncomingTransfer it(frame.getMonotonicTimestamp(), frame.getUtcTimestamp(), frame, tba);
83 
84  /*
85  * Empty read must fail
86  */
87  uint8_t data_byte = 0;
88  ASSERT_GT(0, it.read(0, &data_byte, 1)); // Error - no such buffer
89 
90  /*
91  * Filling the test data
92  */
93  const std::string data = "123Hello world";
94  const uint8_t* const data_ptr = reinterpret_cast<const uint8_t*>(data.c_str());
95  ASSERT_FALSE(bufmgr.access(bufmgr_key));
96  ASSERT_TRUE(bufmgr.create(bufmgr_key));
97  ASSERT_EQ(data.length(), bufmgr.access(bufmgr_key)->write(0, data_ptr, unsigned(data.length())));
98 
99  /*
100  * Check
101  */
102  ASSERT_TRUE(match(it, frame, data_ptr, unsigned(data.length())));
103 
104  /*
105  * Buffer release
106  */
107  ASSERT_TRUE(bufmgr.access(bufmgr_key));
108  it.release();
109  ASSERT_FALSE(bufmgr.access(bufmgr_key));
110 }
uavcan::IncomingTransfer::getTransferID
TransferID getTransferID() const
Definition: transfer_listener.hpp:65
uavcan::IncomingTransfer::getUtcTimestamp
UtcTime getUtcTimestamp() const
Definition: transfer_listener.hpp:62
makeFrame
static uavcan::RxFrame makeFrame()
Definition: incoming_transfer.cpp:12
uavcan::IncomingTransfer
Definition: transfer_listener.hpp:24
uavcan::MultiFrameIncomingTransfer
Definition: transfer_listener.hpp:86
uavcan::TransferBufferManager::create
ITransferBuffer * create(const TransferBufferManagerKey &key)
Definition: uc_transfer_buffer.cpp:312
uavcan::TransferBufferAccessor
Definition: transfer_buffer.hpp:180
match
static bool match(const uavcan::IncomingTransfer &it, const uavcan::RxFrame &frame, const uint8_t *payload, unsigned payload_len)
Definition: incoming_transfer.cpp:27
uavcan::PoolAllocator< uavcan::MemPoolBlockSize *100, uavcan::MemPoolBlockSize >
uavcan::TransferBufferManagerKey
Definition: transfer_buffer.hpp:63
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
transfer_listener.hpp
uavcan::TransferTypeMessageBroadcast
@ TransferTypeMessageBroadcast
Definition: transfer.hpp:22
uavcan::RxFrame
Definition: frame.hpp:104
uavcan::equal
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
Definition: templates.hpp:324
uavcan::TransferBufferManager
Definition: transfer_buffer.hpp:153
uavcan::ITransferBuffer::write
virtual int write(unsigned offset, const uint8_t *data, unsigned len)=0
transfer_test_helpers.hpp
uavcan::NodeID::Broadcast
static const NodeID Broadcast
Definition: transfer.hpp:122
uavcan::ITransferBuffer::read
virtual int read(unsigned offset, uint8_t *data, unsigned len) const =0
frame
uavcan::CanFrame frame
Definition: can.cpp:78
uavcan::IncomingTransfer::getSrcNodeID
NodeID getSrcNodeID() const
Definition: transfer_listener.hpp:66
tsMono
uavcan::MonotonicTime tsMono(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:97
uavcan::Frame
Definition: frame.hpp:17
tsUtc
uavcan::UtcTime tsUtc(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:98
uavcan::SingleFrameIncomingTransfer
Definition: transfer_listener.hpp:73
TEST
TEST(SingleFrameIncomingTransfer, Basic)
Definition: incoming_transfer.cpp:58
fill
static void fill(T(&a)[Size], R value)
Definition: transfer_buffer.cpp:30
uavcan::copy
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
Definition: templates.hpp:238
uavcan::TransferBufferManager::access
ITransferBuffer * access(const TransferBufferManagerKey &key)
Definition: uc_transfer_buffer.cpp:302
uavcan::IncomingTransfer::getMonotonicTimestamp
MonotonicTime getMonotonicTimestamp() const
Definition: transfer_listener.hpp:61
uavcan::IncomingTransfer::getTransferType
TransferType getTransferType() const
Definition: transfer_listener.hpp:64


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02