MockTransport.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 
6 #include "MockTransport.h"
7 
8 #include <algorithm> // for min, max
9 #include <cassert>
10 #include <iostream>
11 
12 #include <VisionaryEndian.h>
13 
14 namespace visionary_test {
15 
16 template <class T, class TSrc>
17 static void appendTo(T& dest, const TSrc& src)
18 {
19  dest.insert(dest.end(), src.cbegin(), src.cend());
20 }
21 
22 MockTransport::MockTransport() : m_state(kSEND_IDLE), m_onRecv(nop), m_onSend(nop)
23 {
24 }
25 
27  : m_state(kSEND_IDLE), m_onRecv(nop), m_onSend(nop), m_mockRecvBuffer(buffer)
28 {
29 }
30 
31 MockTransport::MockTransport(std::initializer_list<ByteBuffer::value_type> init)
32  : m_state(kSEND_IDLE), m_onRecv(nop), m_onSend(nop), m_mockRecvBuffer(init)
33 {
34 }
35 
37 
39 {
40 }
41 
43 {
44  m_mockRecvBuffer = buffer;
45  return *this;
46 }
47 
48 MockTransport& MockTransport::recvBuffer(std::initializer_list<ByteBuffer::value_type> init)
49 {
50  m_mockRecvBuffer.assign(init);
51  return *this;
52 }
53 
55 {
57  return *this;
58 }
59 
61 {
62  m_fakeSendReturn = retval;
63  return *this;
64 }
65 
66 MockTransport& MockTransport::onRecv(std::function<void()> fct)
67 {
68  m_onRecv = fct;
69  return *this;
70 }
71 
73 {
74  m_onRecv();
75 }
76 
78 {
79  m_onSend();
80 }
81 
83 {
84  switch (m_state)
85  {
86  case kSEND_STARTED:
87  case kSEND_CONTD:
89  break;
90  default:
92  break;
93  }
94 
95  m_mockSendBuffer.insert(m_mockSendBuffer.begin(),
96  reinterpret_cast<const std::uint8_t*>(pBuffer),
97  reinterpret_cast<const std::uint8_t*>(pBuffer) + size);
98 
99  sendHandler();
100 
102 }
103 
105 {
106  switch (m_state)
107  {
108  case kRECV_STARTED:
109  case kRECV_CONTD:
111  break;
112  default:
114  break;
115  }
116 
117  recvHandler();
118 
119  using IterDiffType = ByteBuffer::iterator::difference_type;
120 
121  const auto returnSize = std::min(maxBytesToReceive, m_mockRecvBuffer.size());
122 
123  ByteBuffer::iterator recvEndPos{std::next(m_mockRecvBuffer.begin(), static_cast<IterDiffType>(returnSize))};
124 
125  buffer.assign(m_mockRecvBuffer.begin(), recvEndPos);
126  m_mockRecvBuffer.erase(m_mockRecvBuffer.begin(), recvEndPos);
127 
128  return static_cast<visionary::ITransport::recv_return_t>(returnSize);
129 }
130 
132 {
133  return recv(buffer, nBytesToReceive);
134 }
135 
137 {
138  return 0;
139 }
141 {
142  return 0;
143 }
144 
146 {
148 
149  ByteBuffer buffer({0x02u, 0x02u, 0x02u, 0x02u}); // prefix
150 
151  buffer.reserve(payload.size() + 4u + 4u + 2u); // 4*STX, length, hubCntr, noC
152 
153  const std::uint32_t length = static_cast<std::uint32_t>(payload.size()) + 2u; // hubCntr + noC
154  appendTo(buffer, Endian::convertToVector<std::uint32_t>(length));
155 
156  buffer.push_back(header.hubCntr);
157  buffer.push_back(header.noC);
158 
159  appendTo(buffer, payload);
160 
161  return buffer;
162 }
163 
165  ByteBuffer::const_iterator& it,
166  const ByteBuffer::const_iterator& end)
167 {
169 
170  for (unsigned n = 4u; n > 0u; --n)
171  {
172  if (it == end)
173  {
174  // premature end of data
175  return false;
176  }
177  if (*it != 0x02u)
178  {
179  // expected STX not found
180  return false;
181  }
182  ++it;
183  }
184 
185  if (!Endian::template convertFrom<std::uint32_t>(header.length, it, end))
186  {
187  return false;
188  }
189  if (!Endian::template convertFrom<std::uint8_t>(header.hubCntr, it, end))
190  {
191  return false;
192  }
193  if (!Endian::template convertFrom<std::uint8_t>(header.noC, it, end))
194  {
195  return false;
196  }
197 
198  return true;
199 }
200 
201 //-----------------------------------------------------------------------------------------------------
202 
204 {
205 }
206 
208 {
210  return *this;
211 }
212 
214 {
215  m_fakeReqId = reqId;
216  return *this;
217 }
218 
220 {
222  return *this;
223 }
224 
226 {
227  m_name = name;
228  return *this;
229 }
230 
232 {
234  return *this;
235 }
236 
238  const std::string& name,
239  const ByteBuffer& parametersBuf)
240 {
242 
243  ByteBuffer buffer;
244  buffer.reserve(parametersBuf.size() + 4u + 2u + 2u);
245 
246  appendTo(buffer, Endian::convertToVector<std::uint32_t>(header.sessionId));
247  appendTo(buffer, Endian::convertToVector<std::uint16_t>(header.reqId));
248  appendTo(buffer, header.cmdMode);
249 
250  for (auto c : name)
251  {
252  buffer.push_back(static_cast<std::uint8_t>(c));
253  }
254 
255  appendTo(buffer, parametersBuf);
256 
257  return buildProtocol(header, buffer);
258 }
259 
261  ByteBuffer::const_iterator& it,
262  const ByteBuffer::const_iterator& end)
263 {
264  if (!parseProtocol(header, it, end))
265  {
266  return false;
267  }
268 
270 
271  if (!Endian::template convertFrom<std::uint32_t>(header.sessionId, it, end))
272  {
273  return false;
274  }
275  if (!Endian::template convertFrom<std::uint16_t>(header.reqId, it, end))
276  {
277  return false;
278  }
279 
280  header.cmdMode.clear();
281  header.cmdMode.reserve(2u);
282 
283  for (size_t n = 2u; n > 0; --n)
284  {
285  if (it == end)
286  {
287  // iterator hits end prematurely
288  return false;
289  }
290  header.cmdMode.push_back(static_cast<char>(*it));
291  ++it;
292  }
293 
294  return true;
295 }
296 
298 {
299  // we build a new package only at the send -> recv transition
300  // (assumption: only one command was send, for which now the reply is read)
301  const bool enableBuildPkg = (kRECV_STARTED == m_state);
302 
304 
305  if (enableBuildPkg)
306  {
307  ByteBuffer::const_iterator it{m_mockSendBuffer.cbegin()};
308  ByteBuffer::const_iterator end{m_mockSendBuffer.cend()};
309 
310  m_optCmdHeader.reset();
311 
312  const bool reqOk = parseCmd(header, it, end);
313  if (reqOk)
314  {
316  m_cmdpayload.assign(it, end);
317  }
318  }
319 
321 
322  if (enableBuildPkg)
323  {
324  if (m_forceReply || m_optCmdHeader.has_value())
325  {
326  m_header.hubCntr = header.hubCntr;
327  m_header.noC = header.noC;
330 
332  }
333  }
334 }
335 
336 } // namespace visionary_test
visionary_test::MockTransport::parseProtocol
static bool parseProtocol(ProtocolReqRespHeader &header, ByteBuffer::const_iterator &it, const ByteBuffer::const_iterator &end)
Definition: MockTransport.cpp:164
visionary_test::MockCoLa2Transport::m_header
CmdReqRespHeader m_header
Definition: MockTransport.h:207
visionary_test::MockTransport::recvHandler
virtual void recvHandler()
Definition: MockTransport.cpp:72
VisionaryEndian.h
visionary_test::MockTransport::m_fakeSendReturn
Opt< send_return_t > m_fakeSendReturn
Definition: MockTransport.h:149
boost::foreach_detail_::next
void next(auto_any_t cur, type2type< T, C > *)
Definition: foreach.hpp:757
T
T
Definition: mem_fn_cc.hpp:25
visionary_test::MockTransport::getLastError
int getLastError() override
Definition: MockTransport.cpp:140
visionary_test::MockCoLa2Transport::m_fakeReqId
Opt< std::uint16_t > m_fakeReqId
Definition: MockTransport.h:223
visionary_test::MockTransport::MockTransport
MockTransport()
Definition: MockTransport.cpp:22
visionary::ITransport::recv_return_t
ssize_t recv_return_t
Definition: ITransport.h:29
visionary_test::MockTransport::m_onSend
std::function< void()> m_onSend
Definition: MockTransport.h:163
visionary_test::MockTransport::kSEND_STARTED
@ kSEND_STARTED
Definition: MockTransport.h:154
visionary::ITransport::ByteBuffer
std::vector< std::uint8_t > ByteBuffer
Definition: ITransport.h:22
visionary_test::MockTransport::ProtocolReqRespHeader
Definition: MockTransport.h:101
visionary_test::MockCoLa2Transport::buildCmd
static ByteBuffer buildCmd(const CmdReqRespHeader &header, const std::string &name, const ByteBuffer &parametersBuf)
Definition: MockTransport.cpp:237
visionary_test::MockCoLa2Transport::reqId
MockCoLa2Transport & reqId(std::uint16_t reqId)
Definition: MockTransport.cpp:213
visionary_test::MockTransport::read
recv_return_t read(ByteBuffer &buffer, std::size_t nBytesToReceive) override
Definition: MockTransport.cpp:131
visionary_test::MockTransport::ProtocolReqRespHeader::noC
std::uint8_t noC
Definition: MockTransport.h:108
visionary_test::MockCoLa2Transport::cmdMode
MockCoLa2Transport & cmdMode(const std::string &cmdMode)
Definition: MockTransport.cpp:219
visionary_test::MockTransport::kSEND_CONTD
@ kSEND_CONTD
Definition: MockTransport.h:155
visionary_test::Opt::reset
void reset()
Definition: MockTransport.h:75
visionary_test::MockCoLa2Transport::m_forceReply
bool m_forceReply
Definition: MockTransport.h:225
visionary_test::MockCoLa2Transport::returnvals
MockCoLa2Transport & returnvals(const ByteBuffer &parameterBuf)
Definition: MockTransport.cpp:231
visionary_test::appendTo
static void appendTo(T &dest, const TSrc &src)
Definition: MockTransport.cpp:17
visionary_test::MockTransport::onRecv
MockTransport & onRecv(std::function< void()> fct)
Definition: MockTransport.cpp:66
visionary_test::MockTransport::sendHandler
virtual void sendHandler()
Definition: MockTransport.cpp:77
visionary_test::MockTransport::m_state
enum visionary_test::MockTransport::@13 m_state
visionary_test::MockTransport::noFakeSendReturn
MockTransport & noFakeSendReturn()
Definition: MockTransport.cpp:54
visionary_test::MockTransport::m_mockRecvBuffer
ByteBuffer m_mockRecvBuffer
Definition: MockTransport.h:164
visionary_test::MockCoLa2Transport::m_fakeSessionId
Opt< std::uint32_t > m_fakeSessionId
Definition: MockTransport.h:221
MockTransport.h
visionary_test::MockTransport::ProtocolReqRespHeader::hubCntr
std::uint8_t hubCntr
Definition: MockTransport.h:107
boost::foreach_detail_::end
auto_any< BOOST_DEDUCED_TYPENAME foreach_iterator< T, C >::type > end(auto_any_t col, type2type< T, C > *, boost::mpl::true_ *)
Definition: foreach.hpp:700
visionary_test::MockTransport::kRECV_STARTED
@ kRECV_STARTED
Definition: MockTransport.h:156
visionary_test::MockTransport::nop
static void nop()
Definition: MockTransport.cpp:38
visionary_test::MockCoLa2Transport::recvHandler
void recvHandler() override
Definition: MockTransport.cpp:297
visionary_test::MockTransport::buildProtocol
static ByteBuffer buildProtocol(const ProtocolReqRespHeader &header, const ByteBuffer &payload)
Definition: MockTransport.cpp:145
visionary_test::MockCoLa2Transport::m_optCmdHeader
Opt< CmdReqRespHeader > m_optCmdHeader
Definition: MockTransport.h:215
visionary_test::MockCoLa2Transport::m_cmdpayload
ByteBuffer m_cmdpayload
Definition: MockTransport.h:218
visionary_test::MockTransport::send
send_return_t send(const char *buffer, size_t size) override
Definition: MockTransport.cpp:82
visionary::Endian
Definition: VisionaryEndian.h:162
visionary_test::MockTransport
Definition: MockTransport.h:98
visionary::ITransport::send_return_t
ssize_t send_return_t
Definition: ITransport.h:28
visionary_test::MockCoLa2Transport
Definition: MockTransport.h:168
visionary_test::MockCoLa2Transport::CmdReqRespHeader::sessionId
std::uint32_t sessionId
Definition: MockTransport.h:176
visionary_test::MockTransport::fakeSendReturn
MockTransport & fakeSendReturn(send_return_t retval)
Definition: MockTransport.cpp:60
visionary_test::MockTransport::~MockTransport
virtual ~MockTransport()
visionary_test::MockTransport::recv
recv_return_t recv(ByteBuffer &buffer, std::size_t maxBytesToReceive) override
Definition: MockTransport.cpp:104
visionary_test::MockTransport::m_onRecv
std::function< void()> m_onRecv
Definition: MockTransport.h:161
visionary_test::MockCoLa2Transport::m_returnvals
ByteBuffer m_returnvals
Definition: MockTransport.h:211
visionary_test::MockCoLa2Transport::name
MockCoLa2Transport & name(const std::string &name)
Definition: MockTransport.cpp:225
visionary_test::MockTransport::recvBuffer
MockTransport & recvBuffer(const ByteBuffer &buffer)
Definition: MockTransport.cpp:42
visionary_test::MockCoLa2Transport::MockCoLa2Transport
MockCoLa2Transport()
Definition: MockTransport.cpp:203
visionary_test::MockTransport::m_mockSendBuffer
ByteBuffer m_mockSendBuffer
Definition: MockTransport.h:165
length
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
visionary_test::Opt::value_or
T value_or(const U &default_value) const
Definition: MockTransport.h:81
init
void init(const M_string &remappings)
visionary_test
Definition: MockTransport.cpp:14
visionary_test::MockTransport::shutdown
int shutdown() override
Definition: MockTransport.cpp:136
visionary_test::MockCoLa2Transport::CmdReqRespHeader::reqId
std::uint16_t reqId
Definition: MockTransport.h:177
header
const std::string header
visionary_test::MockCoLa2Transport::m_name
std::string m_name
Definition: MockTransport.h:209
visionary_test::MockCoLa2Transport::sessionId
MockCoLa2Transport & sessionId(std::uint32_t sessionId)
Definition: MockTransport.cpp:207
visionary_test::MockCoLa2Transport::parseCmd
static bool parseCmd(CmdReqRespHeader &header, ByteBuffer::const_iterator &it, const ByteBuffer::const_iterator &end)
Definition: MockTransport.cpp:260
visionary_test::MockCoLa2Transport::CmdReqRespHeader::cmdMode
std::string cmdMode
Definition: MockTransport.h:178
visionary_test::MockTransport::kRECV_CONTD
@ kRECV_CONTD
Definition: MockTransport.h:157
visionary_test::MockCoLa2Transport::CmdReqRespHeader
Definition: MockTransport.h:171


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:44:22