blob: 4c4620ffca12db16a7f1ebf2d664ddb38deb584b [file] [log] [blame]
Ferran Balagueraf5c46b2019-08-30 15:49:15 +01001//
Ferran Balaguer1b941722019-08-28 16:57:18 +01002// Copyright © 2019 Arm Ltd. All rights reserved.
Ferran Balagueraf5c46b2019-08-30 15:49:15 +01003// SPDX-License-Identifier: MIT
4//
5
Ferran Balaguer73882172019-09-02 16:39:42 +01006#include "../ProfilingUtils.hpp"
Ferran Balaguer47d0fe92019-09-04 16:47:34 +01007#include "../EncodeVersion.hpp"
Ferran Balaguer1b941722019-08-28 16:57:18 +01008#include "../SendCounterPacket.hpp"
9#include "SendCounterPacketTests.hpp"
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010010
Ferran Balaguer73882172019-09-02 16:39:42 +010011#include <armnn/Exceptions.hpp>
12
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010013#include <boost/test/unit_test.hpp>
Ferran Balaguer47d0fe92019-09-04 16:47:34 +010014#include <boost/numeric/conversion/cast.hpp>
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010015
Francis Murtagh3a161982019-09-04 15:25:02 +010016#include <chrono>
Ferran Balaguer73882172019-09-02 16:39:42 +010017#include <iostream>
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010018
19BOOST_AUTO_TEST_SUITE(SendCounterPacketTests)
20
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010021BOOST_AUTO_TEST_CASE(MockSendCounterPacketTest)
22{
23 unsigned int size = 0;
24
Ferran Balaguer73882172019-09-02 16:39:42 +010025 MockBuffer mockBuffer(512);
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010026 MockSendCounterPacket sendCounterPacket(mockBuffer);
27
28 sendCounterPacket.SendStreamMetaDataPacket();
29 const char* buffer = reinterpret_cast<const char*>(mockBuffer.GetReadBuffer(size));
30
31 BOOST_TEST(strcmp(buffer, "SendStreamMetaDataPacket") == 0);
32
Matteo Martincigh149528e2019-09-05 12:02:04 +010033 CounterDirectory counterDirectory(1, "counter_directory", 0, 0, 0);
34 sendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010035
36 BOOST_TEST(strcmp(buffer, "SendCounterDirectoryPacket") == 0);
37
38 uint64_t timestamp = 0;
Francis Murtagh3a161982019-09-04 15:25:02 +010039 std::vector<std::pair<uint16_t, uint32_t>> indexValuePairs;
40
41 sendCounterPacket.SendPeriodicCounterCapturePacket(timestamp, indexValuePairs);
Ferran Balagueraf5c46b2019-08-30 15:49:15 +010042
43 BOOST_TEST(strcmp(buffer, "SendPeriodicCounterCapturePacket") == 0);
44
45 uint32_t capturePeriod = 0;
46 std::vector<uint16_t> selectedCounterIds;
47 sendCounterPacket.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
48
49 BOOST_TEST(strcmp(buffer, "SendPeriodicCounterSelectionPacket") == 0);
50
51}
52
Ferran Balaguer73882172019-09-02 16:39:42 +010053BOOST_AUTO_TEST_CASE(SendPeriodicCounterSelectionPacketTest)
54{
55 // Error no space left in buffer
56 MockBuffer mockBuffer1(10);
57 SendCounterPacket sendPacket1(mockBuffer1);
58
59 uint32_t capturePeriod = 1000;
60 std::vector<uint16_t> selectedCounterIds;
61 BOOST_CHECK_THROW(sendPacket1.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds),
Matteo Martincigh149528e2019-09-05 12:02:04 +010062 armnn::profiling::BufferExhaustion);
Ferran Balaguer73882172019-09-02 16:39:42 +010063
64 // Packet without any counters
65 MockBuffer mockBuffer2(512);
66 SendCounterPacket sendPacket2(mockBuffer2);
67
68 sendPacket2.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
69 unsigned int sizeRead = 0;
70 const unsigned char* readBuffer2 = mockBuffer2.GetReadBuffer(sizeRead);
71
72 uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
73 uint32_t headerWord1 = ReadUint32(readBuffer2, 4);
74 uint32_t period = ReadUint32(readBuffer2, 8);
75
76 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 0); // packet family
77 BOOST_TEST(((headerWord0 >> 16) & 0x3FF) == 4); // packet id
78 BOOST_TEST(headerWord1 == 4); // data lenght
79 BOOST_TEST(period == 1000); // capture period
80
81 // Full packet message
82 MockBuffer mockBuffer3(512);
83 SendCounterPacket sendPacket3(mockBuffer3);
84
85 selectedCounterIds.reserve(5);
86 selectedCounterIds.emplace_back(100);
87 selectedCounterIds.emplace_back(200);
88 selectedCounterIds.emplace_back(300);
89 selectedCounterIds.emplace_back(400);
90 selectedCounterIds.emplace_back(500);
91 sendPacket3.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
92 sizeRead = 0;
93 const unsigned char* readBuffer3 = mockBuffer3.GetReadBuffer(sizeRead);
94
95 headerWord0 = ReadUint32(readBuffer3, 0);
96 headerWord1 = ReadUint32(readBuffer3, 4);
97 period = ReadUint32(readBuffer3, 8);
98
99 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 0); // packet family
100 BOOST_TEST(((headerWord0 >> 16) & 0x3FF) == 4); // packet id
101 BOOST_TEST(headerWord1 == 14); // data lenght
102 BOOST_TEST(period == 1000); // capture period
103
104 uint16_t counterId = 0;
105 uint32_t offset = 12;
106
107 // Counter Ids
108 for(const uint16_t& id : selectedCounterIds)
109 {
110 counterId = ReadUint16(readBuffer3, offset);
111 BOOST_TEST(counterId == id);
112 offset += 2;
113 }
114}
115
Francis Murtagh3a161982019-09-04 15:25:02 +0100116BOOST_AUTO_TEST_CASE(SendPeriodicCounterCapturePacketTest)
117{
118 // Error no space left in buffer
119 MockBuffer mockBuffer1(10);
120 SendCounterPacket sendPacket1(mockBuffer1);
121
122 auto captureTimestamp = std::chrono::steady_clock::now();
123 uint64_t time = static_cast<uint64_t >(captureTimestamp.time_since_epoch().count());
124 std::vector<std::pair<uint16_t, uint32_t>> indexValuePairs;
125
126 BOOST_CHECK_THROW(sendPacket1.SendPeriodicCounterCapturePacket(time, indexValuePairs),
127 BufferExhaustion);
128
129 // Packet without any counters
130 MockBuffer mockBuffer2(512);
131 SendCounterPacket sendPacket2(mockBuffer2);
132
133 sendPacket2.SendPeriodicCounterCapturePacket(time, indexValuePairs);
134 unsigned int sizeRead = 0;
135 const unsigned char* readBuffer2 = mockBuffer2.GetReadBuffer(sizeRead);
136
137 uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
138 uint32_t headerWord1 = ReadUint32(readBuffer2, 4);
139 uint64_t readTimestamp = ReadUint64(readBuffer2, 8);
140
141 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 1); // packet family
142 BOOST_TEST(((headerWord0 >> 19) & 0x3F) == 0); // packet class
143 BOOST_TEST(((headerWord0 >> 16) & 0x3) == 0); // packet type
144 BOOST_TEST(headerWord1 == 8); // data length
145 BOOST_TEST(time == readTimestamp); // capture period
146
147 // Full packet message
148 MockBuffer mockBuffer3(512);
149 SendCounterPacket sendPacket3(mockBuffer3);
150
151 indexValuePairs.reserve(5);
152 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(0, 100));
153 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(1, 200));
154 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(2, 300));
155 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(3, 400));
156 indexValuePairs.emplace_back(std::make_pair<uint16_t, uint32_t >(4, 500));
157 sendPacket3.SendPeriodicCounterCapturePacket(time, indexValuePairs);
158 sizeRead = 0;
159 const unsigned char* readBuffer3 = mockBuffer3.GetReadBuffer(sizeRead);
160
161 headerWord0 = ReadUint32(readBuffer3, 0);
162 headerWord1 = ReadUint32(readBuffer3, 4);
163 uint64_t readTimestamp2 = ReadUint64(readBuffer3, 8);
164
165 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 1); // packet family
166 BOOST_TEST(((headerWord0 >> 19) & 0x3F) == 0); // packet class
167 BOOST_TEST(((headerWord0 >> 16) & 0x3) == 0); // packet type
168 BOOST_TEST(headerWord1 == 38); // data length
169 BOOST_TEST(time == readTimestamp2); // capture period
170
171 uint16_t counterIndex = 0;
172 uint32_t counterValue = 100;
173 uint32_t offset = 16;
174
175 // Counter Ids
176 for (auto it = indexValuePairs.begin(), end = indexValuePairs.end(); it != end; ++it)
177 {
178 // Check Counter Index
179 uint16_t readIndex = ReadUint16(readBuffer3, offset);
180 BOOST_TEST(counterIndex == readIndex);
181 counterIndex++;
182 offset += 2;
183
184 // Check Counter Value
185 uint32_t readValue = ReadUint32(readBuffer3, offset);
186 BOOST_TEST(counterValue == readValue);
187 counterValue += 100;
188 offset += 4;
189 }
190
191}
192
Ferran Balaguer47d0fe92019-09-04 16:47:34 +0100193BOOST_AUTO_TEST_CASE(SendStreamMetaDataPacketTest)
194{
195 using boost::numeric_cast;
196
197 uint32_t sizeUint32 = numeric_cast<uint32_t>(sizeof(uint32_t));
198
199 // Error no space left in buffer
200 MockBuffer mockBuffer1(10);
201 SendCounterPacket sendPacket1(mockBuffer1);
Matteo Martincigh149528e2019-09-05 12:02:04 +0100202 BOOST_CHECK_THROW(sendPacket1.SendStreamMetaDataPacket(), armnn::profiling::BufferExhaustion);
Ferran Balaguer47d0fe92019-09-04 16:47:34 +0100203
204 // Full metadata packet
205
206 std::string processName = GetProcessName().substr(0, 60);
207
208 uint32_t infoSize = numeric_cast<uint32_t>(GetSoftwareInfo().size()) > 0 ?
209 numeric_cast<uint32_t>(GetSoftwareInfo().size()) + 1 : 0;
210 uint32_t hardwareVersionSize = numeric_cast<uint32_t>(GetHardwareVersion().size()) > 0 ?
211 numeric_cast<uint32_t>(GetHardwareVersion().size()) + 1 : 0;
212 uint32_t softwareVersionSize = numeric_cast<uint32_t>(GetSoftwareVersion().size()) > 0 ?
213 numeric_cast<uint32_t>(GetSoftwareVersion().size()) + 1 : 0;
214 uint32_t processNameSize = numeric_cast<uint32_t>(processName.size()) > 0 ?
215 numeric_cast<uint32_t>(processName.size()) + 1 : 0;
216
217 uint32_t packetEntries = 5;
218
219 MockBuffer mockBuffer2(512);
220 SendCounterPacket sendPacket2(mockBuffer2);
221 sendPacket2.SendStreamMetaDataPacket();
222 unsigned int sizeRead = 0;
223 const unsigned char* readBuffer2 = mockBuffer2.GetReadBuffer(sizeRead);
224
225 uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
226 uint32_t headerWord1 = ReadUint32(readBuffer2, sizeUint32);
227
228 BOOST_TEST(((headerWord0 >> 26) & 0x3F) == 0); // packet family
229 BOOST_TEST(((headerWord0 >> 16) & 0x3FF) == 0); // packet id
230
231 uint32_t totalLength = numeric_cast<uint32_t>(2 * sizeUint32 + 10 * sizeUint32 + infoSize + hardwareVersionSize +
232 softwareVersionSize + processNameSize + sizeUint32 +
233 2 * packetEntries * sizeUint32);
234
235 BOOST_TEST(headerWord1 == totalLength - (2 * sizeUint32)); // data length
236
237 uint32_t offset = sizeUint32 * 2;
238 BOOST_TEST(ReadUint32(readBuffer2, offset) == SendCounterPacket::PIPE_MAGIC); // pipe_magic
239 offset += sizeUint32;
240 BOOST_TEST(ReadUint32(readBuffer2, offset) == EncodeVersion(1, 0, 0)); // stream_metadata_version
241 offset += sizeUint32;
242 BOOST_TEST(ReadUint32(readBuffer2, offset) == SendCounterPacket::MAX_METADATA_PACKET_LENGTH); // max_data_len
243 offset += sizeUint32;
244 BOOST_TEST(ReadUint32(readBuffer2, offset) == numeric_cast<uint32_t>(getpid())); // pid
245 offset += sizeUint32;
246 uint32_t poolOffset = 10 * sizeUint32;
247 BOOST_TEST(ReadUint32(readBuffer2, offset) == (infoSize ? poolOffset : 0)); // offset_info
248 offset += sizeUint32;
249 poolOffset += infoSize;
250 BOOST_TEST(ReadUint32(readBuffer2, offset) == (hardwareVersionSize ? poolOffset : 0)); // offset_hw_version
251 offset += sizeUint32;
252 poolOffset += hardwareVersionSize;
253 BOOST_TEST(ReadUint32(readBuffer2, offset) == (softwareVersionSize ? poolOffset : 0)); // offset_sw_version
254 offset += sizeUint32;
255 poolOffset += softwareVersionSize;
256 BOOST_TEST(ReadUint32(readBuffer2, offset) == (processNameSize ? poolOffset : 0)); // offset_process_name
257 offset += sizeUint32;
258 poolOffset += processNameSize;
259 BOOST_TEST(ReadUint32(readBuffer2, offset) == (packetEntries ? poolOffset : 0)); // offset_packet_version_table
260 offset += sizeUint32;
261 BOOST_TEST(ReadUint32(readBuffer2, offset) == 0); // reserved
262
263 offset += sizeUint32;
264 if (infoSize)
265 {
266 BOOST_TEST(strcmp(reinterpret_cast<const char *>(&readBuffer2[offset]), GetSoftwareInfo().c_str()) == 0);
267 offset += infoSize;
268 }
269
270 if (hardwareVersionSize)
271 {
272 BOOST_TEST(strcmp(reinterpret_cast<const char *>(&readBuffer2[offset]), GetHardwareVersion().c_str()) == 0);
273 offset += hardwareVersionSize;
274 }
275
276 if (softwareVersionSize)
277 {
278 BOOST_TEST(strcmp(reinterpret_cast<const char *>(&readBuffer2[offset]), GetSoftwareVersion().c_str()) == 0);
279 offset += softwareVersionSize;
280 }
281
282 if (processNameSize)
283 {
284 BOOST_TEST(strcmp(reinterpret_cast<const char *>(&readBuffer2[offset]), GetProcessName().c_str()) == 0);
285 offset += processNameSize;
286 }
287
288 if (packetEntries)
289 {
290 BOOST_TEST((ReadUint32(readBuffer2, offset) >> 16) == packetEntries);
291 offset += sizeUint32;
292 for (uint32_t i = 0; i < packetEntries; ++i)
293 {
294 BOOST_TEST(((ReadUint32(readBuffer2, offset) >> 26) & 0x3F) == 0);
295 BOOST_TEST(((ReadUint32(readBuffer2, offset) >> 16) & 0x3FF) == i);
296 offset += sizeUint32;
297 BOOST_TEST(ReadUint32(readBuffer2, offset) == EncodeVersion(1, 0, 0));
298 offset += sizeUint32;
299 }
300 }
301
302 BOOST_TEST(offset == totalLength);
303}
304
305
Ferran Balagueraf5c46b2019-08-30 15:49:15 +0100306BOOST_AUTO_TEST_SUITE_END()