blob: 7a92ee19e530e23a982237141e3a0e37e6ba7762 [file] [log] [blame]
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01001//
Kevin Mayc1351792020-07-28 11:29:04 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "BufferManager.hpp"
7#include "PacketBuffer.hpp"
8#include "ProfilingUtils.hpp"
9
Jim Flynnbbfe6032020-07-20 16:57:44 +010010#include <common/include/SwTrace.hpp>
11
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010012#include <armnn/Exceptions.hpp>
13
14#include <boost/test/unit_test.hpp>
15
16using namespace armnn::profiling;
17
18BOOST_AUTO_TEST_SUITE(BufferTests)
19
20BOOST_AUTO_TEST_CASE(PacketBufferTest0)
21{
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000022 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010023
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
58BOOST_AUTO_TEST_CASE(PacketBufferTest1)
59{
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000060 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010061
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
92BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000093 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010094
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
110BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
111{
Matteo Martincigh2ffcc412019-11-05 11:47:40 +0000112 IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100113
114 // Cannot commit data bigger than the max size of the buffer
115 BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
116}
117
118BOOST_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
129BOOST_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
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100135 auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
136 BOOST_TEST(reservedSize == 0);
137 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100138}
139
140BOOST_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
Jim Flynn0204f092020-06-22 20:41:43 +0100151 // 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
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100166 auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
167 BOOST_TEST(reservedSize == 0);
168 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100169}
170
171BOOST_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
Jim Flynn0204f092020-06-22 20:41:43 +0100195 // 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
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100208 // Cannot reserve when buffer is not available
209 unsigned int reservedSize3 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100210 auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
211 BOOST_TEST(reservedSize3 == 0);
212 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100213}
214
215BOOST_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
Jim Flynn0204f092020-06-22 20:41:43 +0100232 // 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
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100246 // Cannot reserve when buffer is not available
247 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100248 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
249 BOOST_TEST(reservedSize2 == 0);
250 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100251
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
261BOOST_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
Jim Flynn0204f092020-06-22 20:41:43 +0100276 // 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
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100290 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100291 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
292 BOOST_TEST(reservedSize2 == 0);
293 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100294
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
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100303 unsigned int reservedSize = 0;
304 reservedBuffer = bufferManager.Reserve(512, reservedSize);
305 BOOST_TEST(reservedSize == 0);
306 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100307}
308
309BOOST_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
Jim Flynn0204f092020-06-22 20:41:43 +0100324 // 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
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100338 // Cannot reserve when buffer is not available
339 unsigned int reservedSize2 = 0;
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100340 auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
341 BOOST_TEST(reservedSize2 == 0);
342 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100343
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
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +0100352 reservedBuffer = bufferManager.Reserve(512, reservedSize2);
353 BOOST_TEST(reservedSize2 == 0);
354 BOOST_TEST(!reservedBuffer.get());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100355
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
Kevin Mayc1351792020-07-28 11:29:04 +0100368BOOST_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;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100385 BOOST_CHECK_THROW(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
386 arm::pipe::ProfilingException);
Kevin Mayc1351792020-07-28 11:29:04 +0100387
388}
389
390BOOST_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;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100407 BOOST_CHECK_THROW(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
408 arm::pipe::ProfilingException);
Kevin Mayc1351792020-07-28 11:29:04 +0100409
410}
411
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +0100412BOOST_AUTO_TEST_SUITE_END()