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