tx_queue.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  * Copyright (C) 2019 Theodoros Ntakouris <zarkopafilis@gmail.com>
4  */
5 
6 #include <gtest/gtest.h>
8 #include "can.hpp"
9 
10 TEST(CanTxQueue, TxQueue)
11 {
12  using uavcan::CanTxQueue;
14  using uavcan::CanFrame;
15 
16  ASSERT_GE(40, sizeof(CanTxQueueEntry)); // should be true for any platforms, though not required
17 
18  // 2 blocks per entry now, due to AvlTree
20 
21  SystemClockMock clockmock;
22 
23  CanTxQueue queue(pool, clockmock, 99999);
24  EXPECT_TRUE(queue.isEmpty());
25 
26  const uavcan::CanIOFlags flags = 0;
27 
28  // Descending priority
29  const CanFrame f0 = makeCanFrame(0, "f0", EXT);
30  const CanFrame f1 = makeCanFrame(10, "f1", EXT);
31  const CanFrame f2 = makeCanFrame(20, "f2", EXT);
32  const CanFrame f3 = makeCanFrame(100, "f3", EXT);
33  const CanFrame f4 = makeCanFrame(10000, "f4", EXT);
34  const CanFrame f5 = makeCanFrame(99999, "f5", EXT);
35  const CanFrame f6 = makeCanFrame(999999, "f6", EXT);
36 
37  /*
38  * Basic priority insertion
39  */
40  queue.push(f4, tsMono(100), flags);
41  EXPECT_FALSE(queue.isEmpty());
42  EXPECT_TRUE(queue.contains(f4));
43  EXPECT_EQ(1, queue.getSize());
44  EXPECT_EQ(2, pool.getNumUsedBlocks());
45 
46  EXPECT_EQ(f4, queue.peek()->frame);
47  EXPECT_TRUE(queue.topPriorityHigherOrEqual(f5));
48  EXPECT_TRUE(queue.topPriorityHigherOrEqual(f4)); // Equal
49  EXPECT_FALSE(queue.topPriorityHigherOrEqual(f3));
50 
51  queue.push(f3, tsMono(200), flags);
52  EXPECT_EQ(f3, queue.peek()->frame);
53  EXPECT_EQ(2, queue.getSize());
54 
55 
56  queue.push(f0, tsMono(300), flags);
57  EXPECT_EQ(f0, queue.peek()->frame);
58  EXPECT_EQ(3, queue.getSize());
59 
60 
61  queue.push(f1, tsMono(400), flags);
62  EXPECT_EQ(f0, queue.peek()->frame); // Still f0, since it is highest
63  EXPECT_TRUE(queue.topPriorityHigherOrEqual(f0)); // Equal
64  EXPECT_TRUE(queue.topPriorityHigherOrEqual(f1));
65 
66  EXPECT_EQ(0, queue.getRejectedFrameCount());
67  EXPECT_EQ(4, queue.getSize());
68 
69  EXPECT_TRUE(queue.contains(f0));
70  EXPECT_TRUE(queue.contains(f1));
71  EXPECT_TRUE(queue.contains(f3));
72  EXPECT_TRUE(queue.contains(f4));
73 
74  EXPECT_FALSE(queue.contains(f2));
75  EXPECT_FALSE(queue.contains(f5));
76  EXPECT_FALSE(queue.contains(f6));
77 
78  /*
79  * Removing
80  */
81 
82  CanTxQueueEntry* entry = queue.peek();
83  EXPECT_TRUE(entry);
84 
85  queue.remove(entry);
86  EXPECT_TRUE(entry);
87  EXPECT_EQ(3, queue.getSize());
88 
89  EXPECT_FALSE(queue.contains(f0));
90  EXPECT_TRUE(queue.contains(f1));
91  EXPECT_TRUE(queue.contains(f3));
92  EXPECT_TRUE(queue.contains(f4));
93  EXPECT_FALSE(queue.contains(f2));
94  EXPECT_FALSE(queue.contains(f5));
95  EXPECT_FALSE(queue.contains(f6));
96 
97  while (queue.peek() != UAVCAN_NULLPTR) {
98  queue.remove(queue.peek());
99  }
100 
101  EXPECT_FALSE(queue.peek());
102  EXPECT_FALSE(queue.contains(f0));
103  EXPECT_FALSE(queue.contains(f5));
104 
105  EXPECT_EQ(0, queue.getSize());
106  EXPECT_EQ(0, pool.getNumUsedBlocks());
107  EXPECT_FALSE(queue.peek());
108  EXPECT_FALSE(queue.topPriorityHigherOrEqual(f0));
109 
110  /*
111  * Expiration Auto Remove on Peek
112  */
113 
114  queue.push(f0, tsMono(999), flags);
115  queue.push(f4, tsMono(101), flags);
116 
117  clockmock.monotonic = 102; // make f4 expire
118  EXPECT_TRUE(queue.contains(f0));
119  EXPECT_TRUE(queue.contains(f4)); // f0 is higher priority, so will get traversed first -- f4 not yet removed
120 
121  CanTxQueueEntry* peek = queue.peek();
122  EXPECT_EQ(f0, peek->frame);
123 
124  queue.remove(peek);
125 
126  EXPECT_EQ(1, queue.getSize());
127  EXPECT_EQ(2, pool.getNumUsedBlocks());
128 
129  EXPECT_FALSE(queue.peek()); // f4 will be removed now that queue only contains f4
130  EXPECT_FALSE(queue.contains(f4));
131 
132  EXPECT_EQ(0, queue.getSize());
133  EXPECT_EQ(0, pool.getNumUsedBlocks());
134 
135  queue.push(f4, tsMono(98), flags); // already expired
136 
137  EXPECT_FALSE(queue.peek());
138  EXPECT_EQ(1, queue.getRejectedFrameCount());
139  EXPECT_EQ(0, queue.getSize());
140  EXPECT_EQ(0, pool.getNumUsedBlocks());
141 
142  /*
143  * Add multiple so that we reach OOM
144  */
145 
146  queue.push(f0, tsMono(900), flags);
147  EXPECT_EQ(2, pool.getNumUsedBlocks());
148 
149  queue.push(f1, tsMono(1000), flags);
150  EXPECT_EQ(4, pool.getNumUsedBlocks());
151 
152  queue.push(f2, tsMono(1100), flags);
153  EXPECT_EQ(6, pool.getNumUsedBlocks());
154 
155  queue.push(f3, tsMono(1200), flags);
156  EXPECT_EQ(8, pool.getNumUsedBlocks());
157  EXPECT_TRUE(queue.contains(f3));
158 
159  queue.push(f4, tsMono(1300), flags);
160  EXPECT_EQ(8, pool.getNumUsedBlocks());
161  EXPECT_FALSE(queue.contains(f4));
162 
163  EXPECT_EQ(4, queue.getSize());
164  EXPECT_EQ(8, pool.getNumUsedBlocks());
165  EXPECT_FALSE(queue.contains(f4)); // OOM happened on insertion
166  EXPECT_EQ(2, queue.getRejectedFrameCount());
167 
168  /*
169  * Remove all - cleanup
170  */
171 
172  while (queue.peek() != UAVCAN_NULLPTR) {
173  queue.remove(queue.peek());
174  }
175 
176  EXPECT_EQ(0, queue.getSize());
177  EXPECT_EQ(0, pool.getNumUsedBlocks());
178 }
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
makeCanFrame
uavcan::CanFrame makeCanFrame(uint32_t id, const std::string &str_data, FrameType type)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:278
TEST
TEST(CanTxQueue, TxQueue)
Definition: tx_queue.cpp:10
uavcan::CanFrame
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:24
SystemClockMock::monotonic
uint64_t monotonic
Definition: libuavcan/libuavcan/test/clock.hpp:15
uavcan::PoolAllocator
Definition: dynamic_memory.hpp:51
can_io.hpp
can.hpp
uavcan::CanTxQueueEntry
Definition: can_io.hpp:40
tsMono
uavcan::MonotonicTime tsMono(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:97
uavcan::PoolAllocator::getNumUsedBlocks
uint16_t getNumUsedBlocks() const
Definition: dynamic_memory.hpp:85
uavcan::CanIOFlags
uint16_t CanIOFlags
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:140
uavcan::CanTxQueue
Definition: can_io.hpp:78
SystemClockMock
Definition: libuavcan/libuavcan/test/clock.hpp:12
EXT
@ EXT
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:277


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