2 // Copyright © 2019 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include "BufferManager.hpp"
7 #include "PacketBuffer.hpp"
8 #include "ProfilingUtils.hpp"
10 #include <armnn/Exceptions.hpp>
12 #include <boost/test/unit_test.hpp>
14 using namespace armnn::profiling;
16 BOOST_AUTO_TEST_SUITE(BufferTests)
18 BOOST_AUTO_TEST_CASE(PacketBufferTest0)
20 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
22 BOOST_TEST(packetBuffer->GetSize() == 0);
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);
31 packetBuffer->Commit(16);
33 // Size of buffer is equal to committed data
34 BOOST_TEST(packetBuffer->GetSize() == 16);
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);
43 // Check that data is correct
44 BOOST_TEST(readData0 == 10);
45 BOOST_TEST(readData1 == 20);
46 BOOST_TEST(readData2 == 30);
47 BOOST_TEST(readData3 == 40);
50 packetBuffer->MarkRead();
52 // Size of buffer become 0 after marked read
53 BOOST_TEST(packetBuffer->GetSize() == 0);
56 BOOST_AUTO_TEST_CASE(PacketBufferTest1)
58 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
60 BOOST_TEST(packetBuffer->GetSize() == 0);
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);
69 packetBuffer->Commit(16);
71 BOOST_TEST(packetBuffer->GetSize() == 16);
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);
80 BOOST_TEST(readData0 == 10);
81 BOOST_TEST(readData1 == 20);
82 BOOST_TEST(readData2 == 30);
83 BOOST_TEST(readData3 == 40);
85 packetBuffer->MarkRead();
87 BOOST_TEST(packetBuffer->GetSize() == 0);
90 BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
91 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
93 BOOST_TEST(packetBuffer->GetSize() == 0);
95 auto writeBuffer = packetBuffer->GetWritableData();
97 WriteUint32(writeBuffer, 0, 10);
98 WriteUint32(writeBuffer, 4, 20);
99 WriteUint32(writeBuffer, 8, 30);
100 WriteUint32(writeBuffer, 12, 40);
102 packetBuffer->Release();
104 // Size of buffer become 0 after release
105 BOOST_TEST(packetBuffer->GetSize() == 0);
108 BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
110 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(8);
112 // Cannot commit data bigger than the max size of the buffer
113 BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
116 BOOST_AUTO_TEST_CASE(BufferReserveTest)
118 BufferManager bufferManager(1, 512);
119 unsigned int reservedSize = 0;
120 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
122 // Successfully reserved the buffer with requested size
123 BOOST_TEST(reservedSize == 512);
124 BOOST_TEST(packetBuffer.get());
127 BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)
129 BufferManager bufferManager(1, 512);
130 unsigned int reservedSize = 0;
132 // Cannot reserve buffer bigger than maximum buffer size
133 BOOST_CHECK_THROW(bufferManager.Reserve(1024, reservedSize), armnn::InvalidArgumentException);
136 BOOST_AUTO_TEST_CASE(BufferExhaustionTest)
138 BufferManager bufferManager(1, 512);
139 unsigned int reservedSize = 0;
140 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
142 // Successfully reserved the buffer with requested size
143 BOOST_TEST(reservedSize == 512);
144 BOOST_TEST(packetBuffer.get());
146 // Cannot reserve buffer when buffer is not available
147 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize), BufferExhaustion);
150 BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
152 BufferManager bufferManager(3, 512);
153 unsigned int reservedSize0 = 0;
154 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
156 // Successfully reserved the buffer with requested size
157 BOOST_TEST(reservedSize0 == 512);
158 BOOST_TEST(packetBuffer0.get());
160 unsigned int reservedSize1 = 0;
161 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
163 // Successfully reserved the buffer with requested size
164 BOOST_TEST(reservedSize1 == 128);
165 BOOST_TEST(packetBuffer1.get());
167 unsigned int reservedSize2 = 0;
168 auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
170 // Successfully reserved the buffer with requested size
171 BOOST_TEST(reservedSize2 == 512);
172 BOOST_TEST(packetBuffer2.get());
174 // Cannot reserve when buffer is not available
175 unsigned int reservedSize3 = 0;
176 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize3), BufferExhaustion);
179 BOOST_AUTO_TEST_CASE(BufferReleaseTest)
181 BufferManager bufferManager(2, 512);
182 unsigned int reservedSize0 = 0;
183 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
185 // Successfully reserved the buffer with requested size
186 BOOST_TEST(reservedSize0 == 512);
187 BOOST_TEST(packetBuffer0.get());
189 unsigned int reservedSize1 = 0;
190 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
192 // Successfully reserved the buffer with requested size
193 BOOST_TEST(reservedSize1 == 128);
194 BOOST_TEST(packetBuffer1.get());
196 // Cannot reserve when buffer is not available
197 unsigned int reservedSize2 = 0;
198 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
200 bufferManager.Release(packetBuffer0);
202 // Buffer should become available after release
203 auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
205 BOOST_TEST(reservedSize2 == 128);
206 BOOST_TEST(packetBuffer2.get());
209 BOOST_AUTO_TEST_CASE(BufferCommitTest)
211 BufferManager bufferManager(2, 512);
212 unsigned int reservedSize0 = 0;
213 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
215 BOOST_TEST(reservedSize0 == 512);
216 BOOST_TEST(packetBuffer0.get());
218 unsigned int reservedSize1 = 0;
219 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
221 BOOST_TEST(reservedSize1 == 128);
222 BOOST_TEST(packetBuffer1.get());
224 unsigned int reservedSize2 = 0;
225 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
227 bufferManager.Commit(packetBuffer0, 256);
229 // Buffer should become readable after commit
230 auto packetBuffer2 = bufferManager.GetReadableBuffer();
231 BOOST_TEST(packetBuffer2.get());
232 BOOST_TEST(packetBuffer2->GetSize() == 256);
234 // Buffer not set back to available list after commit
235 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
238 BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
240 BufferManager bufferManager(2, 512);
241 unsigned int reservedSize0 = 0;
242 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
244 BOOST_TEST(reservedSize0 == 512);
245 BOOST_TEST(packetBuffer0.get());
247 unsigned int reservedSize1 = 0;
248 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
250 BOOST_TEST(reservedSize1 == 128);
251 BOOST_TEST(packetBuffer1.get());
253 // Cannot reserve when buffer is not available
254 unsigned int reservedSize2 = 0;
255 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
257 bufferManager.Commit(packetBuffer0, 256);
259 // Buffer should become readable after commit
260 auto packetBuffer2 = bufferManager.GetReadableBuffer();
261 BOOST_TEST(packetBuffer2.get());
262 BOOST_TEST(packetBuffer2->GetSize() == 256);
264 // Buffer not set back to available list after commit
265 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
267 bufferManager.MarkRead(packetBuffer2);
269 //Buffer should set back to available list after marked read and can be reserved
270 auto readBuffer = bufferManager.GetReadableBuffer();
271 BOOST_TEST(!readBuffer);
272 unsigned int reservedSize3 = 0;
273 auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
275 BOOST_TEST(reservedSize3 == 56);
276 BOOST_TEST(packetBuffer3.get());
279 BOOST_AUTO_TEST_SUITE_END()