ArmNN
 22.05.01
BufferTests.cpp
Go to the documentation of this file.
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 }
TEST_SUITE("BufferTests")
Definition: BufferTests.cpp:16