blob: 7a06843ab3a23e2e02e26376086b04b440fca83e [file] [log] [blame]
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "BufferManager.hpp"
7#include "PacketBuffer.hpp"
8#include "ProfilingUtils.hpp"
9
10#include <armnn/Exceptions.hpp>
11
12#include <boost/test/unit_test.hpp>
13
14using namespace armnn::profiling;
15
16BOOST_AUTO_TEST_SUITE(BufferTests)
17
18BOOST_AUTO_TEST_CASE(PacketBufferTest0)
19{
20 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
21
22 BOOST_TEST(packetBuffer->GetSize() == 0);
23
24 // Write data to the buffer
25 WriteUint32(packetBuffer, 0, 10);
26 WriteUint32(packetBuffer, 4, 20);
27 WriteUint32(packetBuffer, 8, 30);
28 WriteUint32(packetBuffer, 12, 40);
29
30 // Commit
31 packetBuffer->Commit(16);
32
33 // Size of buffer is equal to committed data
34 BOOST_TEST(packetBuffer->GetSize() == 16);
35
36 // Read data from the buffer
37 auto readBuffer = packetBuffer->GetReadableData();
38 uint32_t readData0 = ReadUint32(readBuffer, 0);
39 uint32_t readData1 = ReadUint32(readBuffer, 4);
40 uint32_t readData2 = ReadUint32(readBuffer, 8);
41 uint32_t readData3 = ReadUint32(readBuffer, 12);
42
43 // Check that data is correct
44 BOOST_TEST(readData0 == 10);
45 BOOST_TEST(readData1 == 20);
46 BOOST_TEST(readData2 == 30);
47 BOOST_TEST(readData3 == 40);
48
49 // Mark read
50 packetBuffer->MarkRead();
51
52 // Size of buffer become 0 after marked read
53 BOOST_TEST(packetBuffer->GetSize() == 0);
54}
55
56BOOST_AUTO_TEST_CASE(PacketBufferTest1)
57{
58 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
59
60 BOOST_TEST(packetBuffer->GetSize() == 0);
61
62 // Write data to the buffer using GetWritableData
63 auto writeBuffer = packetBuffer->GetWritableData();
64 WriteUint32(writeBuffer, 0, 10);
65 WriteUint32(writeBuffer, 4, 20);
66 WriteUint32(writeBuffer, 8, 30);
67 WriteUint32(writeBuffer, 12, 40);
68
69 packetBuffer->Commit(16);
70
71 BOOST_TEST(packetBuffer->GetSize() == 16);
72
73 // Read data from the buffer
74 auto readBuffer = packetBuffer->GetReadableData();
75 uint32_t readData0 = ReadUint32(readBuffer, 0);
76 uint32_t readData1 = ReadUint32(readBuffer, 4);
77 uint32_t readData2 = ReadUint32(readBuffer, 8);
78 uint32_t readData3 = ReadUint32(readBuffer, 12);
79
80 BOOST_TEST(readData0 == 10);
81 BOOST_TEST(readData1 == 20);
82 BOOST_TEST(readData2 == 30);
83 BOOST_TEST(readData3 == 40);
84
85 packetBuffer->MarkRead();
86
87 BOOST_TEST(packetBuffer->GetSize() == 0);
88}
89
90BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
91 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
92
93 BOOST_TEST(packetBuffer->GetSize() == 0);
94
95 auto writeBuffer = packetBuffer->GetWritableData();
96
97 WriteUint32(writeBuffer, 0, 10);
98 WriteUint32(writeBuffer, 4, 20);
99 WriteUint32(writeBuffer, 8, 30);
100 WriteUint32(writeBuffer, 12, 40);
101
102 packetBuffer->Release();
103
104 // Size of buffer become 0 after release
105 BOOST_TEST(packetBuffer->GetSize() == 0);
106}
107
108BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
109{
110 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(8);
111
112 // Cannot commit data bigger than the max size of the buffer
113 BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
114}
115
116BOOST_AUTO_TEST_CASE(BufferReserveTest)
117{
118 BufferManager bufferManager(1, 512);
119 unsigned int reservedSize = 0;
120 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
121
122 // Successfully reserved the buffer with requested size
123 BOOST_TEST(reservedSize == 512);
124 BOOST_TEST(packetBuffer.get());
125}
126
127BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)
128{
129 BufferManager bufferManager(1, 512);
130 unsigned int reservedSize = 0;
131
132 // Cannot reserve buffer bigger than maximum buffer size
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100133 auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
134 BOOST_TEST(reservedSize == 0);
135 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100136}
137
138BOOST_AUTO_TEST_CASE(BufferExhaustionTest)
139{
140 BufferManager bufferManager(1, 512);
141 unsigned int reservedSize = 0;
142 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
143
144 // Successfully reserved the buffer with requested size
145 BOOST_TEST(reservedSize == 512);
146 BOOST_TEST(packetBuffer.get());
147
148 // Cannot reserve buffer when buffer is not available
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100149 auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
150 BOOST_TEST(reservedSize == 0);
151 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100152}
153
154BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
155{
156 BufferManager bufferManager(3, 512);
157 unsigned int reservedSize0 = 0;
158 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
159
160 // Successfully reserved the buffer with requested size
161 BOOST_TEST(reservedSize0 == 512);
162 BOOST_TEST(packetBuffer0.get());
163
164 unsigned int reservedSize1 = 0;
165 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
166
167 // Successfully reserved the buffer with requested size
168 BOOST_TEST(reservedSize1 == 128);
169 BOOST_TEST(packetBuffer1.get());
170
171 unsigned int reservedSize2 = 0;
172 auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
173
174 // Successfully reserved the buffer with requested size
175 BOOST_TEST(reservedSize2 == 512);
176 BOOST_TEST(packetBuffer2.get());
177
178 // Cannot reserve when buffer is not available
179 unsigned int reservedSize3 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100180 auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
181 BOOST_TEST(reservedSize3 == 0);
182 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100183}
184
185BOOST_AUTO_TEST_CASE(BufferReleaseTest)
186{
187 BufferManager bufferManager(2, 512);
188 unsigned int reservedSize0 = 0;
189 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
190
191 // Successfully reserved the buffer with requested size
192 BOOST_TEST(reservedSize0 == 512);
193 BOOST_TEST(packetBuffer0.get());
194
195 unsigned int reservedSize1 = 0;
196 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
197
198 // Successfully reserved the buffer with requested size
199 BOOST_TEST(reservedSize1 == 128);
200 BOOST_TEST(packetBuffer1.get());
201
202 // Cannot reserve when buffer is not available
203 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100204 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
205 BOOST_TEST(reservedSize2 == 0);
206 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100207
208 bufferManager.Release(packetBuffer0);
209
210 // Buffer should become available after release
211 auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
212
213 BOOST_TEST(reservedSize2 == 128);
214 BOOST_TEST(packetBuffer2.get());
215}
216
217BOOST_AUTO_TEST_CASE(BufferCommitTest)
218{
219 BufferManager bufferManager(2, 512);
220 unsigned int reservedSize0 = 0;
221 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
222
223 BOOST_TEST(reservedSize0 == 512);
224 BOOST_TEST(packetBuffer0.get());
225
226 unsigned int reservedSize1 = 0;
227 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
228
229 BOOST_TEST(reservedSize1 == 128);
230 BOOST_TEST(packetBuffer1.get());
231
232 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100233 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
234 BOOST_TEST(reservedSize2 == 0);
235 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100236
237 bufferManager.Commit(packetBuffer0, 256);
238
239 // Buffer should become readable after commit
240 auto packetBuffer2 = bufferManager.GetReadableBuffer();
241 BOOST_TEST(packetBuffer2.get());
242 BOOST_TEST(packetBuffer2->GetSize() == 256);
243
244 // Buffer not set back to available list after commit
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100245 unsigned int reservedSize = 0;
246 reservedBuffer = bufferManager.Reserve(512, reservedSize);
247 BOOST_TEST(reservedSize == 0);
248 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100249}
250
251BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
252{
253 BufferManager bufferManager(2, 512);
254 unsigned int reservedSize0 = 0;
255 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
256
257 BOOST_TEST(reservedSize0 == 512);
258 BOOST_TEST(packetBuffer0.get());
259
260 unsigned int reservedSize1 = 0;
261 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
262
263 BOOST_TEST(reservedSize1 == 128);
264 BOOST_TEST(packetBuffer1.get());
265
266 // Cannot reserve when buffer is not available
267 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100268 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
269 BOOST_TEST(reservedSize2 == 0);
270 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100271
272 bufferManager.Commit(packetBuffer0, 256);
273
274 // Buffer should become readable after commit
275 auto packetBuffer2 = bufferManager.GetReadableBuffer();
276 BOOST_TEST(packetBuffer2.get());
277 BOOST_TEST(packetBuffer2->GetSize() == 256);
278
279 // Buffer not set back to available list after commit
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100280 reservedBuffer = bufferManager.Reserve(512, reservedSize2);
281 BOOST_TEST(reservedSize2 == 0);
282 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100283
284 bufferManager.MarkRead(packetBuffer2);
285
286 //Buffer should set back to available list after marked read and can be reserved
287 auto readBuffer = bufferManager.GetReadableBuffer();
288 BOOST_TEST(!readBuffer);
289 unsigned int reservedSize3 = 0;
290 auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
291
292 BOOST_TEST(reservedSize3 == 56);
293 BOOST_TEST(packetBuffer3.get());
294}
295
296BOOST_AUTO_TEST_SUITE_END()