1 //
2 // Copyright © 2019 Arm Ltd and Contributors. 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 <common/include/SwTrace.hpp>
11
12 #include <armnn/Exceptions.hpp>
13
14 #include <boost/test/unit_test.hpp>
15
16 using namespace armnn::profiling;
17
18 BOOST_AUTO_TEST_SUITE(BufferTests)
19
BOOST_AUTO_TEST_CASE(PacketBufferTest0)20 BOOST_AUTO_TEST_CASE(PacketBufferTest0)
21 {
22 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
23
24 BOOST_TEST(packetBuffer->GetSize() == 0);
25
26 // Write data to the buffer
27 WriteUint32(packetBuffer, 0, 10);
28 WriteUint32(packetBuffer, 4, 20);
29 WriteUint32(packetBuffer, 8, 30);
30 WriteUint32(packetBuffer, 12, 40);
31
32 // Commit
33 packetBuffer->Commit(16);
34
35 // Size of buffer is equal to committed data
36 BOOST_TEST(packetBuffer->GetSize() == 16);
37
38 // Read data from the buffer
39 auto readBuffer = packetBuffer->GetReadableData();
40 uint32_t readData0 = ReadUint32(readBuffer, 0);
41 uint32_t readData1 = ReadUint32(readBuffer, 4);
42 uint32_t readData2 = ReadUint32(readBuffer, 8);
43 uint32_t readData3 = ReadUint32(readBuffer, 12);
44
45 // Check that data is correct
46 BOOST_TEST(readData0 == 10);
47 BOOST_TEST(readData1 == 20);
48 BOOST_TEST(readData2 == 30);
49 BOOST_TEST(readData3 == 40);
50
51 // Mark read
52 packetBuffer->MarkRead();
53
54 // Size of buffer become 0 after marked read
55 BOOST_TEST(packetBuffer->GetSize() == 0);
56 }
57
BOOST_AUTO_TEST_CASE(PacketBufferTest1)58 BOOST_AUTO_TEST_CASE(PacketBufferTest1)
59 {
60 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
61
62 BOOST_TEST(packetBuffer->GetSize() == 0);
63
64 // Write data to the buffer using GetWritableData
65 auto writeBuffer = packetBuffer->GetWritableData();
66 WriteUint32(writeBuffer, 0, 10);
67 WriteUint32(writeBuffer, 4, 20);
68 WriteUint32(writeBuffer, 8, 30);
69 WriteUint32(writeBuffer, 12, 40);
70
71 packetBuffer->Commit(16);
72
73 BOOST_TEST(packetBuffer->GetSize() == 16);
74
75 // Read data from the buffer
76 auto readBuffer = packetBuffer->GetReadableData();
77 uint32_t readData0 = ReadUint32(readBuffer, 0);
78 uint32_t readData1 = ReadUint32(readBuffer, 4);
79 uint32_t readData2 = ReadUint32(readBuffer, 8);
80 uint32_t readData3 = ReadUint32(readBuffer, 12);
81
82 BOOST_TEST(readData0 == 10);
83 BOOST_TEST(readData1 == 20);
84 BOOST_TEST(readData2 == 30);
85 BOOST_TEST(readData3 == 40);
86
87 packetBuffer->MarkRead();
88
89 BOOST_TEST(packetBuffer->GetSize() == 0);
90 }
91
BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest)92 BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
93 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
94
95 BOOST_TEST(packetBuffer->GetSize() == 0);
96
97 auto writeBuffer = packetBuffer->GetWritableData();
98
99 WriteUint32(writeBuffer, 0, 10);
100 WriteUint32(writeBuffer, 4, 20);
101 WriteUint32(writeBuffer, 8, 30);
102 WriteUint32(writeBuffer, 12, 40);
103
104 packetBuffer->Release();
105
106 // Size of buffer become 0 after release
107 BOOST_TEST(packetBuffer->GetSize() == 0);
108 }
109
BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)110 BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
111 {
112 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8);
113
114 // Cannot commit data bigger than the max size of the buffer
115 BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
116 }
117
BOOST_AUTO_TEST_CASE(BufferReserveTest)118 BOOST_AUTO_TEST_CASE(BufferReserveTest)
119 {
120 BufferManager bufferManager(1, 512);
121 unsigned int reservedSize = 0;
122 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
123
124 // Successfully reserved the buffer with requested size
125 BOOST_TEST(reservedSize == 512);
126 BOOST_TEST(packetBuffer.get());
127 }
128
BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)129 BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)
130 {
131 BufferManager bufferManager(1, 512);
132 unsigned int reservedSize = 0;
133
134 // Cannot reserve buffer bigger than maximum buffer size
135 auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
136 BOOST_TEST(reservedSize == 0);
137 BOOST_TEST(!reservedBuffer.get());
138 }
139
BOOST_AUTO_TEST_CASE(BufferExhaustionTest)140 BOOST_AUTO_TEST_CASE(BufferExhaustionTest)
141 {
142 BufferManager bufferManager(1, 512);
143 unsigned int reservedSize = 0;
144 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
145
146 // Successfully reserved the buffer with requested size
147 BOOST_TEST(reservedSize == 512);
148 BOOST_TEST(packetBuffer.get());
149
150 // Cannot reserve buffer when buffer is not available
151 // NOTE: because the buffer manager now has surge capacity of
152 // initial size * 3 we should be able to reserve three
153 // buffers before exhaustion
154 packetBuffer = bufferManager.Reserve(512, reservedSize);
155
156 // Successfully reserved the second buffer with requested size
157 BOOST_TEST(reservedSize == 512);
158 BOOST_TEST(packetBuffer.get());
159
160 packetBuffer = bufferManager.Reserve(512, reservedSize);
161
162 // Successfully reserved the third buffer with requested size
163 BOOST_TEST(reservedSize == 512);
164 BOOST_TEST(packetBuffer.get());
165
166 auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
167 BOOST_TEST(reservedSize == 0);
168 BOOST_TEST(!reservedBuffer.get());
169 }
170
BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)171 BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
172 {
173 BufferManager bufferManager(3, 512);
174 unsigned int reservedSize0 = 0;
175 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
176
177 // Successfully reserved the buffer with requested size
178 BOOST_TEST(reservedSize0 == 512);
179 BOOST_TEST(packetBuffer0.get());
180
181 unsigned int reservedSize1 = 0;
182 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
183
184 // Successfully reserved the buffer with requested size
185 BOOST_TEST(reservedSize1 == 128);
186 BOOST_TEST(packetBuffer1.get());
187
188 unsigned int reservedSize2 = 0;
189 auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
190
191 // Successfully reserved the buffer with requested size
192 BOOST_TEST(reservedSize2 == 512);
193 BOOST_TEST(packetBuffer2.get());
194
195 // NOTE: the buffer now has a surge capacity of initial size * 3
196 // so we can grab 9 of them prior to exhaustion now
197 for (unsigned int i = 0; i < 6 ; ++i)
198 {
199 // grab another six buffers to exhaust the surge capacity
200 unsigned int reservedSize = 0;
201 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
202
203 // Successfully reserved the third buffer with requested size
204 BOOST_TEST(reservedSize == 512);
205 BOOST_TEST(packetBuffer.get());
206 }
207
208 // Cannot reserve when buffer is not available
209 unsigned int reservedSize3 = 0;
210 auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
211 BOOST_TEST(reservedSize3 == 0);
212 BOOST_TEST(!reservedBuffer.get());
213 }
214
BOOST_AUTO_TEST_CASE(BufferReleaseTest)215 BOOST_AUTO_TEST_CASE(BufferReleaseTest)
216 {
217 BufferManager bufferManager(2, 512);
218 unsigned int reservedSize0 = 0;
219 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
220
221 // Successfully reserved the buffer with requested size
222 BOOST_TEST(reservedSize0 == 512);
223 BOOST_TEST(packetBuffer0.get());
224
225 unsigned int reservedSize1 = 0;
226 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
227
228 // Successfully reserved the buffer with requested size
229 BOOST_TEST(reservedSize1 == 128);
230 BOOST_TEST(packetBuffer1.get());
231
232 // NOTE: now that we have a surge capacity of up to
233 // initial size * 3 we need to allocate four more
234 // buffers to exhaust the manager
235 for (unsigned int i = 0; i < 4 ; ++i)
236 {
237 // grab another six buffers to exhaust the surge capacity
238 unsigned int reservedSize = 0;
239 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
240
241 // Successfully reserved the third buffer with requested size
242 BOOST_TEST(reservedSize == 512);
243 BOOST_TEST(packetBuffer.get());
244 }
245
246 // Cannot reserve when buffer is not available
247 unsigned int reservedSize2 = 0;
248 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
249 BOOST_TEST(reservedSize2 == 0);
250 BOOST_TEST(!reservedBuffer.get());
251
252 bufferManager.Release(packetBuffer0);
253
254 // Buffer should become available after release
255 auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
256
257 BOOST_TEST(reservedSize2 == 128);
258 BOOST_TEST(packetBuffer2.get());
259 }
260
BOOST_AUTO_TEST_CASE(BufferCommitTest)261 BOOST_AUTO_TEST_CASE(BufferCommitTest)
262 {
263 BufferManager bufferManager(2, 512);
264 unsigned int reservedSize0 = 0;
265 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
266
267 BOOST_TEST(reservedSize0 == 512);
268 BOOST_TEST(packetBuffer0.get());
269
270 unsigned int reservedSize1 = 0;
271 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
272
273 BOOST_TEST(reservedSize1 == 128);
274 BOOST_TEST(packetBuffer1.get());
275
276 // NOTE: now that we have a surge capacity of up to
277 // initial size * 3 we need to allocate four more
278 // buffers to exhaust the manager
279 for (unsigned int i = 0; i < 4 ; ++i)
280 {
281 // grab another six buffers to exhaust the surge capacity
282 unsigned int reservedSize = 0;
283 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
284
285 // Successfully reserved the third buffer with requested size
286 BOOST_TEST(reservedSize == 512);
287 BOOST_TEST(packetBuffer.get());
288 }
289
290 unsigned int reservedSize2 = 0;
291 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
292 BOOST_TEST(reservedSize2 == 0);
293 BOOST_TEST(!reservedBuffer.get());
294
295 bufferManager.Commit(packetBuffer0, 256);
296
297 // Buffer should become readable after commit
298 auto packetBuffer2 = bufferManager.GetReadableBuffer();
299 BOOST_TEST(packetBuffer2.get());
300 BOOST_TEST(packetBuffer2->GetSize() == 256);
301
302 // Buffer not set back to available list after commit
303 unsigned int reservedSize = 0;
304 reservedBuffer = bufferManager.Reserve(512, reservedSize);
305 BOOST_TEST(reservedSize == 0);
306 BOOST_TEST(!reservedBuffer.get());
307 }
308
BOOST_AUTO_TEST_CASE(BufferMarkReadTest)309 BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
310 {
311 BufferManager bufferManager(2, 512);
312 unsigned int reservedSize0 = 0;
313 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
314
315 BOOST_TEST(reservedSize0 == 512);
316 BOOST_TEST(packetBuffer0.get());
317
318 unsigned int reservedSize1 = 0;
319 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
320
321 BOOST_TEST(reservedSize1 == 128);
322 BOOST_TEST(packetBuffer1.get());
323
324 // NOTE: now that we have a surge capacity of up to
325 // initial size * 3 we need to allocate four more
326 // buffers to exhaust the manager
327 for (unsigned int i = 0; i < 4 ; ++i)
328 {
329 // grab another six buffers to exhaust the surge capacity
330 unsigned int reservedSize = 0;
331 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
332
333 // Successfully reserved the third buffer with requested size
334 BOOST_TEST(reservedSize == 512);
335 BOOST_TEST(packetBuffer.get());
336 }
337
338 // Cannot reserve when buffer is not available
339 unsigned int reservedSize2 = 0;
340 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
341 BOOST_TEST(reservedSize2 == 0);
342 BOOST_TEST(!reservedBuffer.get());
343
344 bufferManager.Commit(packetBuffer0, 256);
345
346 // Buffer should become readable after commit
347 auto packetBuffer2 = bufferManager.GetReadableBuffer();
348 BOOST_TEST(packetBuffer2.get());
349 BOOST_TEST(packetBuffer2->GetSize() == 256);
350
351 // Buffer not set back to available list after commit
352 reservedBuffer = bufferManager.Reserve(512, reservedSize2);
353 BOOST_TEST(reservedSize2 == 0);
354 BOOST_TEST(!reservedBuffer.get());
355
356 bufferManager.MarkRead(packetBuffer2);
357
358 //Buffer should set back to available list after marked read and can be reserved
359 auto readBuffer = bufferManager.GetReadableBuffer();
360 BOOST_TEST(!readBuffer);
361 unsigned int reservedSize3 = 0;
362 auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
363
364 BOOST_TEST(reservedSize3 == 56);
365 BOOST_TEST(packetBuffer3.get());
366 }
367
BOOST_AUTO_TEST_CASE(ReadSwTraceMessageExceptionTest0)368 BOOST_AUTO_TEST_CASE(ReadSwTraceMessageExceptionTest0)
369 {
370 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
371
372 BOOST_TEST(packetBuffer->GetSize() == 0);
373
374 // Write zero data to the buffer
375 WriteUint32(packetBuffer, 0, 0);
376 WriteUint32(packetBuffer, 4, 0);
377 WriteUint32(packetBuffer, 8, 0);
378 WriteUint32(packetBuffer, 12, 0);
379
380 // Commit
381 packetBuffer->Commit(16);
382
383 unsigned int uint32_t_size = sizeof(uint32_t);
384 unsigned int offset = uint32_t_size;
385 BOOST_CHECK_THROW(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
386 arm::pipe::ProfilingException);
387
388 }
389
BOOST_AUTO_TEST_CASE(ReadSwTraceMessageExceptionTest1)390 BOOST_AUTO_TEST_CASE(ReadSwTraceMessageExceptionTest1)
391 {
392 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
393
394 BOOST_TEST(packetBuffer->GetSize() == 0);
395
396 // Write data to the buffer
397 WriteUint32(packetBuffer, 0, 10);
398 WriteUint32(packetBuffer, 4, 20);
399 WriteUint32(packetBuffer, 8, 30);
400 WriteUint32(packetBuffer, 12, 40);
401
402 // Commit
403 packetBuffer->Commit(16);
404
405 unsigned int uint32_t_size = sizeof(uint32_t);
406 unsigned int offset = uint32_t_size;
407 BOOST_CHECK_THROW(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
408 arm::pipe::ProfilingException);
409
410 }
411
412 BOOST_AUTO_TEST_SUITE_END()
413