IVGCVSW-3440 Fix intermittently failing send thread test
[platform/upstream/armnn.git] / src / profiling / test / BufferTests.cpp
1 //
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
14 using namespace armnn::profiling;
15
16 BOOST_AUTO_TEST_SUITE(BufferTests)
17
18 BOOST_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
56 BOOST_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
90 BOOST_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
108 BOOST_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
116 BOOST_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
127 BOOST_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::InvalidArgumentException);
134 }
135
136 BOOST_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
150 BOOST_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
179 BOOST_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
209 BOOST_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
238 BOOST_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
279 BOOST_AUTO_TEST_SUITE_END()