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 }
std::uint8_t uint8_t
Definition: std.hpp:24
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
Definition: templates.hpp:324
TransferType getTransferType() const
Definition: frame.hpp:75
ITransferBuffer * create(const TransferBufferManagerKey &key)
MonotonicTime getMonotonicTimestamp() const
Definition: frame.hpp:128
static const NodeID Broadcast
Definition: transfer.hpp:122
uavcan::UtcTime tsUtc(uint64_t usec)
TransferID getTransferID() const
uint8_t setPayload(const uint8_t *data, unsigned len)
Definition: uc_frame.cpp:16
static bool match(const uavcan::IncomingTransfer &it, const uavcan::RxFrame &frame, const uint8_t *payload, unsigned payload_len)
TransferID getTransferID() const
Definition: frame.hpp:79
virtual int write(unsigned offset, const uint8_t *data, unsigned len)=0
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
Definition: templates.hpp:238
virtual int read(unsigned offset, uint8_t *data, unsigned len) const =0
NodeID getSrcNodeID() const
Definition: frame.hpp:77
static void fill(T(&a)[Size], R value)
uavcan::MonotonicTime tsMono(uint64_t usec)
UtcTime getUtcTimestamp() const
Definition: frame.hpp:133
TEST(SingleFrameIncomingTransfer, Basic)
TransferType getTransferType() const
uavcan::CanFrame frame
Definition: can.cpp:78
MonotonicTime getMonotonicTimestamp() const
void setEndOfTransfer(bool x)
Definition: frame.hpp:82
ITransferBuffer * access(const TransferBufferManagerKey &key)
static uavcan::RxFrame makeFrame()


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39