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