• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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