blob: b678350bb3abbc55bbd018d453fe8958d21e4153 [file] [log] [blame]
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01001//
2// Copyright © 2019 Arm Ltd. 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 <armnn/Exceptions.hpp>
11
12#include <boost/test/unit_test.hpp>
13
14using namespace armnn::profiling;
15
16BOOST_AUTO_TEST_SUITE(BufferTests)
17
18BOOST_AUTO_TEST_CASE(PacketBufferTest0)
19{
20 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
21
22 BOOST_TEST(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 BOOST_TEST(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 BOOST_TEST(readData0 == 10);
45 BOOST_TEST(readData1 == 20);
46 BOOST_TEST(readData2 == 30);
47 BOOST_TEST(readData3 == 40);
48
49 // Mark read
50 packetBuffer->MarkRead();
51
52 // Size of buffer become 0 after marked read
53 BOOST_TEST(packetBuffer->GetSize() == 0);
54}
55
56BOOST_AUTO_TEST_CASE(PacketBufferTest1)
57{
58 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
59
60 BOOST_TEST(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 BOOST_TEST(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 BOOST_TEST(readData0 == 10);
81 BOOST_TEST(readData1 == 20);
82 BOOST_TEST(readData2 == 30);
83 BOOST_TEST(readData3 == 40);
84
85 packetBuffer->MarkRead();
86
87 BOOST_TEST(packetBuffer->GetSize() == 0);
88}
89
90BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
91 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(512);
92
93 BOOST_TEST(packetBuffer->GetSize() == 0);
94
95 auto writeBuffer = packetBuffer->GetWritableData();
96
97 WriteUint32(writeBuffer, 0, 10);
98 WriteUint32(writeBuffer, 4, 20);
99 WriteUint32(writeBuffer, 8, 30);
100 WriteUint32(writeBuffer, 12, 40);
101
102 packetBuffer->Release();
103
104 // Size of buffer become 0 after release
105 BOOST_TEST(packetBuffer->GetSize() == 0);
106}
107
108BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
109{
110 std::unique_ptr<IPacketBuffer> packetBuffer = std::make_unique<PacketBuffer>(8);
111
112 // Cannot commit data bigger than the max size of the buffer
113 BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
114}
115
116BOOST_AUTO_TEST_CASE(BufferReserveTest)
117{
118 BufferManager bufferManager(1, 512);
119 unsigned int reservedSize = 0;
120 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
121
122 // Successfully reserved the buffer with requested size
123 BOOST_TEST(reservedSize == 512);
124 BOOST_TEST(packetBuffer.get());
125}
126
127BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)
128{
129 BufferManager bufferManager(1, 512);
130 unsigned int reservedSize = 0;
131
132 // Cannot reserve buffer bigger than maximum buffer size
133 BOOST_CHECK_THROW(bufferManager.Reserve(1024, reservedSize), armnn::RuntimeException);
134}
135
136BOOST_AUTO_TEST_CASE(BufferExhaustionTest)
137{
138 BufferManager bufferManager(1, 512);
139 unsigned int reservedSize = 0;
140 auto packetBuffer = bufferManager.Reserve(512, reservedSize);
141
142 // Successfully reserved the buffer with requested size
143 BOOST_TEST(reservedSize == 512);
144 BOOST_TEST(packetBuffer.get());
145
146 // Cannot reserve buffer when buffer is not available
147 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize), BufferExhaustion);
148}
149
150BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
151{
152 BufferManager bufferManager(3, 512);
153 unsigned int reservedSize0 = 0;
154 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
155
156 // Successfully reserved the buffer with requested size
157 BOOST_TEST(reservedSize0 == 512);
158 BOOST_TEST(packetBuffer0.get());
159
160 unsigned int reservedSize1 = 0;
161 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
162
163 // Successfully reserved the buffer with requested size
164 BOOST_TEST(reservedSize1 == 128);
165 BOOST_TEST(packetBuffer1.get());
166
167 unsigned int reservedSize2 = 0;
168 auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2);
169
170 // Successfully reserved the buffer with requested size
171 BOOST_TEST(reservedSize2 == 512);
172 BOOST_TEST(packetBuffer2.get());
173
174 // Cannot reserve when buffer is not available
175 unsigned int reservedSize3 = 0;
176 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize3), BufferExhaustion);
177}
178
179BOOST_AUTO_TEST_CASE(BufferReleaseTest)
180{
181 BufferManager bufferManager(2, 512);
182 unsigned int reservedSize0 = 0;
183 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
184
185 // Successfully reserved the buffer with requested size
186 BOOST_TEST(reservedSize0 == 512);
187 BOOST_TEST(packetBuffer0.get());
188
189 unsigned int reservedSize1 = 0;
190 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
191
192 // Successfully reserved the buffer with requested size
193 BOOST_TEST(reservedSize1 == 128);
194 BOOST_TEST(packetBuffer1.get());
195
196 // Cannot reserve when buffer is not available
197 unsigned int reservedSize2 = 0;
198 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
199
200 bufferManager.Release(packetBuffer0);
201
202 // Buffer should become available after release
203 auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
204
205 BOOST_TEST(reservedSize2 == 128);
206 BOOST_TEST(packetBuffer2.get());
207}
208
209BOOST_AUTO_TEST_CASE(BufferCommitTest)
210{
211 BufferManager bufferManager(2, 512);
212 unsigned int reservedSize0 = 0;
213 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
214
215 BOOST_TEST(reservedSize0 == 512);
216 BOOST_TEST(packetBuffer0.get());
217
218 unsigned int reservedSize1 = 0;
219 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
220
221 BOOST_TEST(reservedSize1 == 128);
222 BOOST_TEST(packetBuffer1.get());
223
224 unsigned int reservedSize2 = 0;
225 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
226
227 bufferManager.Commit(packetBuffer0, 256);
228
229 // Buffer should become readable after commit
230 auto packetBuffer2 = bufferManager.GetReadableBuffer();
231 BOOST_TEST(packetBuffer2.get());
232 BOOST_TEST(packetBuffer2->GetSize() == 256);
233
234 // Buffer not set back to available list after commit
235 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
236}
237
238BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
239{
240 BufferManager bufferManager(2, 512);
241 unsigned int reservedSize0 = 0;
242 auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0);
243
244 BOOST_TEST(reservedSize0 == 512);
245 BOOST_TEST(packetBuffer0.get());
246
247 unsigned int reservedSize1 = 0;
248 auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
249
250 BOOST_TEST(reservedSize1 == 128);
251 BOOST_TEST(packetBuffer1.get());
252
253 // Cannot reserve when buffer is not available
254 unsigned int reservedSize2 = 0;
255 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
256
257 bufferManager.Commit(packetBuffer0, 256);
258
259 // Buffer should become readable after commit
260 auto packetBuffer2 = bufferManager.GetReadableBuffer();
261 BOOST_TEST(packetBuffer2.get());
262 BOOST_TEST(packetBuffer2->GetSize() == 256);
263
264 // Buffer not set back to available list after commit
265 BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion);
266
267 bufferManager.MarkRead(packetBuffer2);
268
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);
274
275 BOOST_TEST(reservedSize3 == 56);
276 BOOST_TEST(packetBuffer3.get());
277}
278
279BOOST_AUTO_TEST_SUITE_END()