2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include "../SendCounterPacket.hpp"
7 #include "../ProfilingUtils.hpp"
9 #include <armnn/Exceptions.hpp>
11 #include <boost/test/unit_test.hpp>
16 BOOST_AUTO_TEST_SUITE(SendCounterPacketTests)
18 using namespace armnn::profiling;
20 class MockBuffer : public IBufferWrapper
23 MockBuffer(unsigned int size)
25 m_Buffer(std::make_unique<unsigned char[]>(size)) {}
27 unsigned char* Reserve(unsigned int requestedSize, unsigned int& reservedSize) override
29 if (requestedSize > m_BufferSize)
31 reservedSize = m_BufferSize;
35 reservedSize = requestedSize;
38 return m_Buffer.get();
41 void Commit(unsigned int size) override {}
43 const unsigned char* GetReadBuffer(unsigned int& size) override
45 size = static_cast<unsigned int>(strlen(reinterpret_cast<const char*>(m_Buffer.get())) + 1);
46 return m_Buffer.get();
49 void Release( unsigned int size) override {}
52 unsigned int m_BufferSize;
53 std::unique_ptr<unsigned char[]> m_Buffer;
56 class MockSendCounterPacket : public ISendCounterPacket
59 MockSendCounterPacket(IBufferWrapper& sendBuffer) : m_Buffer(sendBuffer) {}
61 void SendStreamMetaDataPacket() override
63 std::string message("SendStreamMetaDataPacket");
64 unsigned int reserved = 0;
65 unsigned char* buffer = m_Buffer.Reserve(1024, reserved);
66 memcpy(buffer, message.c_str(), static_cast<unsigned int>(message.size()) + 1);
69 void SendCounterDirectoryPacket(const Category& category, const std::vector<Counter>& counters) override
71 std::string message("SendCounterDirectoryPacket");
72 unsigned int reserved = 0;
73 unsigned char* buffer = m_Buffer.Reserve(1024, reserved);
74 memcpy(buffer, message.c_str(), static_cast<unsigned int>(message.size()) + 1);
77 void SendPeriodicCounterCapturePacket(uint64_t timestamp,
78 const std::vector<std::pair<uint16_t, uint32_t>>& values) override
80 std::string message("SendPeriodicCounterCapturePacket");
81 unsigned int reserved = 0;
82 unsigned char* buffer = m_Buffer.Reserve(1024, reserved);
83 memcpy(buffer, message.c_str(), static_cast<unsigned int>(message.size()) + 1);
86 void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,
87 const std::vector<uint16_t>& selectedCounterIds) override
89 std::string message("SendPeriodicCounterSelectionPacket");
90 unsigned int reserved = 0;
91 unsigned char* buffer = m_Buffer.Reserve(1024, reserved);
92 memcpy(buffer, message.c_str(), static_cast<unsigned int>(message.size()) + 1);
93 m_Buffer.Commit(reserved);
96 void SetReadyToRead() override
100 IBufferWrapper& m_Buffer;
103 BOOST_AUTO_TEST_CASE(MockSendCounterPacketTest)
105 unsigned int size = 0;
107 MockBuffer mockBuffer(512);
108 MockSendCounterPacket sendCounterPacket(mockBuffer);
110 sendCounterPacket.SendStreamMetaDataPacket();
111 const char* buffer = reinterpret_cast<const char*>(mockBuffer.GetReadBuffer(size));
113 BOOST_TEST(strcmp(buffer, "SendStreamMetaDataPacket") == 0);
116 std::vector<Counter> counters;
117 sendCounterPacket.SendCounterDirectoryPacket(category, counters);
119 BOOST_TEST(strcmp(buffer, "SendCounterDirectoryPacket") == 0);
121 uint64_t timestamp = 0;
122 std::vector<std::pair<uint16_t, uint32_t>> indexValuePairs;
124 sendCounterPacket.SendPeriodicCounterCapturePacket(timestamp, indexValuePairs);
126 BOOST_TEST(strcmp(buffer, "SendPeriodicCounterCapturePacket") == 0);
128 uint32_t capturePeriod = 0;
129 std::vector<uint16_t> selectedCounterIds;
130 sendCounterPacket.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
132 BOOST_TEST(strcmp(buffer, "SendPeriodicCounterSelectionPacket") == 0);
136 BOOST_AUTO_TEST_CASE(SendPeriodicCounterSelectionPacketTest)
138 // Error no space left in buffer
139 MockBuffer mockBuffer1(10);
140 SendCounterPacket sendPacket1(mockBuffer1);
142 uint32_t capturePeriod = 1000;
143 std::vector<uint16_t> selectedCounterIds;
144 BOOST_CHECK_THROW(sendPacket1.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds),
147 // Packet without any counters
148 MockBuffer mockBuffer2(512);
149 SendCounterPacket sendPacket2(mockBuffer2);
151 sendPacket2.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
152 unsigned int sizeRead = 0;
153 const unsigned char* readBuffer2 = mockBuffer2.GetReadBuffer(sizeRead);
155 uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
156 uint32_t headerWord1 = ReadUint32(readBuffer2, 4);
157 uint32_t period = ReadUint32(readBuffer2, 8);
159 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 0); // packet family
160 BOOST_TEST(((headerWord0 >> 16) & 0x3FF) == 4); // packet id
161 BOOST_TEST(headerWord1 == 4); // data lenght
162 BOOST_TEST(period == 1000); // capture period
164 // Full packet message
165 MockBuffer mockBuffer3(512);
166 SendCounterPacket sendPacket3(mockBuffer3);
168 selectedCounterIds.reserve(5);
169 selectedCounterIds.emplace_back(100);
170 selectedCounterIds.emplace_back(200);
171 selectedCounterIds.emplace_back(300);
172 selectedCounterIds.emplace_back(400);
173 selectedCounterIds.emplace_back(500);
174 sendPacket3.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
176 const unsigned char* readBuffer3 = mockBuffer3.GetReadBuffer(sizeRead);
178 headerWord0 = ReadUint32(readBuffer3, 0);
179 headerWord1 = ReadUint32(readBuffer3, 4);
180 period = ReadUint32(readBuffer3, 8);
182 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 0); // packet family
183 BOOST_TEST(((headerWord0 >> 16) & 0x3FF) == 4); // packet id
184 BOOST_TEST(headerWord1 == 14); // data lenght
185 BOOST_TEST(period == 1000); // capture period
187 uint16_t counterId = 0;
188 uint32_t offset = 12;
191 for(const uint16_t& id : selectedCounterIds)
193 counterId = ReadUint16(readBuffer3, offset);
194 BOOST_TEST(counterId == id);
199 BOOST_AUTO_TEST_CASE(SendPeriodicCounterCapturePacketTest)
201 // Error no space left in buffer
202 MockBuffer mockBuffer1(10);
203 SendCounterPacket sendPacket1(mockBuffer1);
205 auto captureTimestamp = std::chrono::steady_clock::now();
206 uint64_t time = static_cast<uint64_t >(captureTimestamp.time_since_epoch().count());
207 std::vector<std::pair<uint16_t, uint32_t>> indexValuePairs;
209 BOOST_CHECK_THROW(sendPacket1.SendPeriodicCounterCapturePacket(time, indexValuePairs),
212 // Packet without any counters
213 MockBuffer mockBuffer2(512);
214 SendCounterPacket sendPacket2(mockBuffer2);
216 sendPacket2.SendPeriodicCounterCapturePacket(time, indexValuePairs);
217 unsigned int sizeRead = 0;
218 const unsigned char* readBuffer2 = mockBuffer2.GetReadBuffer(sizeRead);
220 uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
221 uint32_t headerWord1 = ReadUint32(readBuffer2, 4);
222 uint64_t readTimestamp = ReadUint64(readBuffer2, 8);
224 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 1); // packet family
225 BOOST_TEST(((headerWord0 >> 19) & 0x3F) == 0); // packet class
226 BOOST_TEST(((headerWord0 >> 16) & 0x3) == 0); // packet type
227 BOOST_TEST(headerWord1 == 8); // data length
228 BOOST_TEST(time == readTimestamp); // capture period
230 // Full packet message
231 MockBuffer mockBuffer3(512);
232 SendCounterPacket sendPacket3(mockBuffer3);
234 indexValuePairs.reserve(5);
235 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(0, 100));
236 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(1, 200));
237 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(2, 300));
238 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(3, 400));
239 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(4, 500));
240 sendPacket3.SendPeriodicCounterCapturePacket(time, indexValuePairs);
242 const unsigned char* readBuffer3 = mockBuffer3.GetReadBuffer(sizeRead);
244 headerWord0 = ReadUint32(readBuffer3, 0);
245 headerWord1 = ReadUint32(readBuffer3, 4);
246 uint64_t readTimestamp2 = ReadUint64(readBuffer3, 8);
248 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 1); // packet family
249 BOOST_TEST(((headerWord0 >> 19) & 0x3F) == 0); // packet class
250 BOOST_TEST(((headerWord0 >> 16) & 0x3) == 0); // packet type
251 BOOST_TEST(headerWord1 == 38); // data length
252 BOOST_TEST(time == readTimestamp2); // capture period
254 uint16_t counterIndex = 0;
255 uint32_t counterValue = 100;
256 uint32_t offset = 16;
259 for (auto it = indexValuePairs.begin(), end = indexValuePairs.end(); it != end; ++it)
261 // Check Counter Index
262 uint16_t readIndex = ReadUint16(readBuffer3, offset);
263 BOOST_TEST(counterIndex == readIndex);
267 // Check Counter Value
268 uint32_t readValue = ReadUint32(readBuffer3, offset);
269 BOOST_TEST(counterValue == readValue);
276 BOOST_AUTO_TEST_SUITE_END()