iface_mock.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
6 #include "can.hpp"
7 
9 {
10  using uavcan::CanFrame;
12 
13  SystemClockMock clockmock;
14  CanDriverMock driver(3, clockmock);
15 
16  const uavcan::CanFrame* pending_tx[uavcan::MaxCanIfaces] = { };
17 
18  ASSERT_EQ(3, driver.getNumIfaces());
19 
20  // All WR, no RD
21  CanSelectMasks masks;
22  masks.write = 7;
23  masks.read = 7;
24  EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
25  EXPECT_EQ(7, masks.write);
26  EXPECT_EQ(0, masks.read);
27 
28  for (unsigned i = 0; i < 3; i++)
29  {
30  driver.ifaces.at(i).writeable = false;
31  }
32 
33  // No WR, no RD
34  masks.write = 7;
35  masks.read = 7;
36  EXPECT_EQ(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
37  EXPECT_EQ(0, masks.write);
38  EXPECT_EQ(0, masks.read);
39  EXPECT_EQ(100, clockmock.monotonic);
40  EXPECT_EQ(100, clockmock.utc);
41 
42  // No WR, #1 RD
43  const CanFrame fr1 = makeCanFrame(123, "foo", EXT);
44  driver.ifaces.at(1).pushRx(fr1);
45  masks.write = 7;
46  masks.read = 6;
47  EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
48  EXPECT_EQ(0, masks.write);
49  EXPECT_EQ(2, masks.read);
50  CanFrame fr2;
51  uavcan::MonotonicTime ts_monotonic;
52  uavcan::UtcTime ts_utc;
53  uavcan::CanIOFlags flags = 0;
54  EXPECT_EQ(1, driver.getIface(1)->receive(fr2, ts_monotonic, ts_utc, flags));
55  EXPECT_EQ(0, flags);
56  EXPECT_EQ(fr1, fr2);
57  EXPECT_EQ(100, ts_monotonic.toUSec());
58  EXPECT_EQ(0, ts_utc.toUSec());
59 
60  // #0 WR, #1 RD, Select failure
61  driver.ifaces.at(0).writeable = true;
62  driver.select_failure = true;
63  masks.write = 1;
64  masks.read = 7;
65  EXPECT_EQ(-1, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
66  EXPECT_EQ(1, masks.write); // Leaving masks unchanged - the library must ignore them
67  EXPECT_EQ(7, masks.read);
68 }
69 
70 TEST(CanDriverMock, Loopback)
71 {
72  using uavcan::CanFrame;
74 
75  SystemClockMock clockmock;
76  CanDriverMock driver(1, clockmock);
77 
78  const uavcan::CanFrame* pending_tx[uavcan::MaxCanIfaces] = { };
79 
80  CanSelectMasks masks;
81  masks.write = 1;
82  masks.read = 1;
83  EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
84  EXPECT_EQ(1, masks.write);
85  EXPECT_EQ(0, masks.read);
86 
87  clockmock.advance(200);
88 
89  CanFrame fr1;
90  fr1.id = 123 | CanFrame::FlagEFF;
91  EXPECT_EQ(1, driver.getIface(0)->send(fr1, uavcan::MonotonicTime::fromUSec(10000), uavcan::CanIOFlagLoopback));
92 
93  masks.write = 0;
94  masks.read = 1;
95  EXPECT_LT(0, driver.select(masks, pending_tx, uavcan::MonotonicTime::fromUSec(100)));
96  EXPECT_EQ(0, masks.write);
97  EXPECT_EQ(1, masks.read);
98 
99  CanFrame fr2;
100  uavcan::MonotonicTime ts_monotonic;
101  uavcan::UtcTime ts_utc;
102  uavcan::CanIOFlags flags = 0;
103  EXPECT_EQ(1, driver.getIface(0)->receive(fr2, ts_monotonic, ts_utc, flags));
104  EXPECT_EQ(uavcan::CanIOFlagLoopback, flags);
105  EXPECT_EQ(fr1, fr2);
106  EXPECT_EQ(200, ts_monotonic.toUSec());
107  EXPECT_EQ(0, ts_utc.toUSec());
108 }
uavcan::ICanIface::send
virtual int16_t send(const CanFrame &frame, MonotonicTime tx_deadline, CanIOFlags flags)=0
TEST
TEST(CanDriverMock, Basic)
Definition: iface_mock.cpp:8
uavcan::UtcTime
Implicitly convertible to/from uavcan.Timestamp.
Definition: time.hpp:191
SystemClockMock::advance
void advance(uint64_t usec) const
Definition: libuavcan/libuavcan/test/clock.hpp:28
CanDriverMock::select
virtual uavcan::int16_t select(uavcan::CanSelectMasks &inout_masks, const uavcan::CanFrame *(&pending_tx)[uavcan::MaxCanIfaces], uavcan::MonotonicTime deadline)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:211
makeCanFrame
uavcan::CanFrame makeCanFrame(uint32_t id, const std::string &str_data, FrameType type)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:278
uavcan::CanFrame
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:24
SystemClockMock::monotonic
uint64_t monotonic
Definition: libuavcan/libuavcan/test/clock.hpp:15
uavcan::CanIOFlagLoopback
static const CanIOFlags CanIOFlagLoopback
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:141
CanDriverMock::getNumIfaces
virtual uavcan::uint8_t getNumIfaces() const
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:274
uavcan::MaxCanIfaces
@ MaxCanIfaces
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:19
uavcan::TimeBase< MonotonicTime, MonotonicDuration >::fromUSec
static MonotonicTime fromUSec(uint64_t us)
Definition: time.hpp:112
CanDriverMock::ifaces
std::vector< CanIfaceMock > ifaces
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:193
CanDriverMock::select_failure
bool select_failure
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:195
uavcan::CanSelectMasks
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:119
can.hpp
CanDriverMock
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:190
CanDriverMock::getIface
virtual uavcan::ICanIface * getIface(uavcan::uint8_t iface_index)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:272
uavcan::ICanIface::receive
virtual int16_t receive(CanFrame &out_frame, MonotonicTime &out_ts_monotonic, UtcTime &out_ts_utc, CanIOFlags &out_flags)=0
uavcan::CanIOFlags
uint16_t CanIOFlags
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:140
SystemClockMock
Definition: libuavcan/libuavcan/test/clock.hpp:12
uavcan::MonotonicTime
Definition: time.hpp:184
SystemClockMock::utc
uint64_t utc
Definition: libuavcan/libuavcan/test/clock.hpp:16
EXT
@ EXT
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:277
uavcan::TimeBase::toUSec
uint64_t toUSec() const
Definition: time.hpp:120


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