blob: de791c1da019eda9b9bd6cc5f750955c66d19ac7 [file] [log] [blame]
Matteo Martincigh0aed4f92019-10-01 14:25:34 +01001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Matteo Martincigh0aed4f92019-10-01 14:25:34 +01003// SPDX-License-Identifier: MIT
4//
5
Rob Hughes9542f902021-07-14 09:48:54 +01006#include <armnnUtils/Threads.hpp>
Matteo Martincigh0aed4f92019-10-01 14:25:34 +01007#include <ProfilingUtils.hpp>
8
Matthew Sloyan371b70e2020-09-11 10:14:57 +01009#include <armnn/utility/NumericCast.hpp>
10
Jim Flynnbbfe6032020-07-20 16:57:44 +010011#include <common/include/SwTrace.hpp>
12
Sadik Armagan1625efc2021-06-10 18:24:34 +010013#include <doctest/doctest.h>
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010014
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000015using namespace arm::pipe;
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010016
Sadik Armagan1625efc2021-06-10 18:24:34 +010017TEST_SUITE("TimelinePacketTests")
18{
19TEST_CASE("TimelineLabelPacketTestNoBuffer")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010020{
21 const uint64_t profilingGuid = 123456u;
22 const std::string label = "some label";
23 unsigned int numberOfBytesWritten = 789u;
24 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
25 label,
26 nullptr,
27 512u,
28 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010029 CHECK(result == TimelinePacketStatus::BufferExhaustion);
30 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010031}
32
Sadik Armagan1625efc2021-06-10 18:24:34 +010033TEST_CASE("TimelineLabelPacketTestBufferExhaustionZeroValue")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010034{
35 std::vector<unsigned char> buffer(512, 0);
36
37 const uint64_t profilingGuid = 123456u;
38 const std::string label = "some label";
39 unsigned int numberOfBytesWritten = 789u;
40 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
41 label,
42 buffer.data(),
43 0,
44 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010045 CHECK(result == TimelinePacketStatus::BufferExhaustion);
46 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010047}
48
Sadik Armagan1625efc2021-06-10 18:24:34 +010049TEST_CASE("TimelineLabelPacketTestBufferExhaustionFixedValue")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010050{
51 std::vector<unsigned char> buffer(10, 0);
52
53 const uint64_t profilingGuid = 123456u;
54 const std::string label = "some label";
55 unsigned int numberOfBytesWritten = 789u;
56 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
57 label,
58 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +010059 armnn::numeric_cast<unsigned int>(buffer.size()),
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010060 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010061 CHECK(result == TimelinePacketStatus::BufferExhaustion);
62 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010063}
64
Sadik Armagan1625efc2021-06-10 18:24:34 +010065TEST_CASE("TimelineLabelPacketTestInvalidLabel")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010066{
67 std::vector<unsigned char> buffer(512, 0);
68
69 const uint64_t profilingGuid = 123456u;
70 const std::string label = "s0m€ l@b€l";
71 unsigned int numberOfBytesWritten = 789u;
72 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
73 label,
74 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +010075 armnn::numeric_cast<unsigned int>(buffer.size()),
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010076 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010077 CHECK(result == TimelinePacketStatus::Error);
78 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010079}
80
Sadik Armagan1625efc2021-06-10 18:24:34 +010081TEST_CASE("TimelineLabelPacketTestSingleConstructionOfData")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010082{
83 std::vector<unsigned char> buffer(512, 0);
84
85 const uint64_t profilingGuid = 123456u;
86 const std::string label = "some label";
87 unsigned int numberOfBytesWritten = 789u;
88 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
89 label,
90 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +010091 armnn::numeric_cast<unsigned int>(buffer.size()),
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010092 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010093 CHECK(result == TimelinePacketStatus::Ok);
94 CHECK(numberOfBytesWritten == 28);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010095
96 unsigned int uint32_t_size = sizeof(uint32_t);
97 unsigned int uint64_t_size = sizeof(uint64_t);
98
99 // Check the packet header
100 unsigned int offset = 0;
Jan Eilersb884ea42019-10-16 09:54:15 +0100101 uint32_t decl_Id = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100102 CHECK(decl_Id == uint32_t(0));
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100103
104 // Check the profiling GUID
105 offset += uint32_t_size;
106 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100107 CHECK(readProfilingGuid == profilingGuid);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100108
109 // Check the SWTrace label
110 offset += uint64_t_size;
111 uint32_t swTraceLabelLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100112 CHECK(swTraceLabelLength == 11); // Label length including the null-terminator
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100113
114 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100115 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100116 label.data(), // The original label
117 swTraceLabelLength - 1) == 0); // The length of the label
118
119 offset += swTraceLabelLength * uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100120 CHECK(buffer[offset] == '\0'); // The null-terminator at the end of the SWTrace label
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100121}
122
Sadik Armagan1625efc2021-06-10 18:24:34 +0100123TEST_CASE("TimelineRelationshipPacketNullBufferTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100124{
125 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
126 const uint64_t relationshipGuid = 123456u;
127 const uint64_t headGuid = 234567u;
128 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100129 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100130 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000131 TimelinePacketStatus result = WriteTimelineRelationshipBinary(relationshipType,
132 relationshipGuid,
133 headGuid,
134 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100135 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000136 nullptr,
137 512u,
138 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100139 CHECK(result == TimelinePacketStatus::BufferExhaustion);
140 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100141}
142
Sadik Armagan1625efc2021-06-10 18:24:34 +0100143TEST_CASE("TimelineRelationshipPacketZeroBufferSizeTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100144{
145 std::vector<unsigned char> buffer(512, 0);
146
147 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
148 const uint64_t relationshipGuid = 123456u;
149 const uint64_t headGuid = 234567u;
150 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100151 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100152 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000153 TimelinePacketStatus result = WriteTimelineRelationshipBinary(relationshipType,
154 relationshipGuid,
155 headGuid,
156 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100157 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000158 buffer.data(),
159 0,
160 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100161 CHECK(result == TimelinePacketStatus::BufferExhaustion);
162 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100163}
164
Sadik Armagan1625efc2021-06-10 18:24:34 +0100165TEST_CASE("TimelineRelationshipPacketSmallBufferSizeTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100166{
167 std::vector<unsigned char> buffer(10, 0);
168
169 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
170 const uint64_t relationshipGuid = 123456u;
171 const uint64_t headGuid = 234567u;
172 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100173 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100174 unsigned int numberOfBytesWritten = 789u;
175 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000176 WriteTimelineRelationshipBinary(relationshipType,
177 relationshipGuid,
178 headGuid,
179 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100180 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000181 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100182 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000183 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100184 CHECK(result == TimelinePacketStatus::BufferExhaustion);
185 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100186}
187
Sadik Armagan1625efc2021-06-10 18:24:34 +0100188TEST_CASE("TimelineRelationshipPacketInvalidRelationTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100189{
190 std::vector<unsigned char> buffer(512, 0);
191 ProfilingRelationshipType relationshipType = static_cast<ProfilingRelationshipType>(5);
192 const uint64_t relationshipGuid = 123456u;
193 const uint64_t headGuid = 234567u;
194 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100195 const uint64_t attributeGuid = 876345u;
196
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100197 unsigned int numberOfBytesWritten = 789u;
198
Sadik Armagan1625efc2021-06-10 18:24:34 +0100199 CHECK_THROWS_AS(WriteTimelineRelationshipBinary(relationshipType,
Keith Davis97da5e22020-03-05 16:25:28 +0000200 relationshipGuid,
201 headGuid,
202 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100203 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000204 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100205 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000206 numberOfBytesWritten),
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000207 arm::pipe::InvalidArgumentException);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100208
Sadik Armagan1625efc2021-06-10 18:24:34 +0100209 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100210}
211
Sadik Armagan1625efc2021-06-10 18:24:34 +0100212TEST_CASE("TimelineRelationshipPacketTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100213{
214 std::vector<unsigned char> buffer(512, 0);
215
216 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::RetentionLink;
217 const uint64_t relationshipGuid = 123456u;
218 const uint64_t headGuid = 234567u;
219 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100220 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100221 unsigned int numberOfBytesWritten = 789u;
222 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000223 WriteTimelineRelationshipBinary(relationshipType,
224 relationshipGuid,
225 headGuid,
226 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100227 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000228 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100229 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000230 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100231 CHECK(result == TimelinePacketStatus::Ok);
232 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100233
234 unsigned int uint32_t_size = sizeof(uint32_t);
235 unsigned int uint64_t_size = sizeof(uint64_t);
236
237 // Check the packet header
238 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100239 // Check the decl_id
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100240 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100241 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100242
243 // Check the relationship type
244 offset += uint32_t_size;
245 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100246 CHECK(readRelationshipType == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100247
248 // Check the relationship GUID
249 offset += uint32_t_size;
250 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100251 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100252
253 // Check the head GUID
254 offset += uint64_t_size;
255 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100256 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100257
258 // Check the tail GUID
259 offset += uint64_t_size;
260 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100261 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100262
263 // Check the attribute GUID
264 offset += uint64_t_size;
265 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100266 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100267}
268
Sadik Armagan1625efc2021-06-10 18:24:34 +0100269TEST_CASE("TimelineRelationshipPacketExecutionLinkTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100270{
271 std::vector<unsigned char> buffer(512, 0);
272
273 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::ExecutionLink;
274 const uint64_t relationshipGuid = 123456u;
275 const uint64_t headGuid = 234567u;
276 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100277 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100278 unsigned int numberOfBytesWritten = 789u;
279 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000280 WriteTimelineRelationshipBinary(relationshipType,
281 relationshipGuid,
282 headGuid,
283 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100284 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000285 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100286 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000287 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100288 CHECK(result == TimelinePacketStatus::Ok);
289 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100290
291 unsigned int uint32_t_size = sizeof(uint32_t);
292 unsigned int uint64_t_size = sizeof(uint64_t);
293
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100294 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100295 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100296 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100297
298 // Check the relationship type
299 offset += uint32_t_size;
300 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100301 CHECK(readRelationshipType == 1);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100302
303 // Check the relationship GUID
304 offset += uint32_t_size;
305 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100306 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100307
308 // Check the head GUID
309 offset += uint64_t_size;
310 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100311 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100312
313 // Check the tail GUID
314 offset += uint64_t_size;
315 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100316 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100317
318 // Check the attribute GUID
319 offset += uint64_t_size;
320 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100321 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100322}
323
324
Sadik Armagan1625efc2021-06-10 18:24:34 +0100325TEST_CASE("TimelineRelationshipPacketDataLinkTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100326{
327 std::vector<unsigned char> buffer(512, 0);
328
329 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
330 const uint64_t relationshipGuid = 123456u;
331 const uint64_t headGuid = 234567u;
332 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100333 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100334 unsigned int numberOfBytesWritten = 789u;
335 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000336 WriteTimelineRelationshipBinary(relationshipType,
337 relationshipGuid,
338 headGuid,
339 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100340 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000341 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100342 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000343 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100344 CHECK(result == TimelinePacketStatus::Ok);
345 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100346
347 unsigned int uint32_t_size = sizeof(uint32_t);
348 unsigned int uint64_t_size = sizeof(uint64_t);
349
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100350 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100351 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100352 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100353
354 // Check the relationship type
355 offset += uint32_t_size;
356 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100357 CHECK(readRelationshipType == 2);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100358
359 // Check the relationship GUID
360 offset += uint32_t_size;
361 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100362 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100363
364 // Check the head GUID
365 offset += uint64_t_size;
366 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100367 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100368
369 // Check the tail GUID
370 offset += uint64_t_size;
371 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100372 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100373
374 // Check the attribute GUID
375 offset += uint64_t_size;
376 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100377 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100378}
379
380
Sadik Armagan1625efc2021-06-10 18:24:34 +0100381TEST_CASE("TimelineRelationshipPacketLabelLinkTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100382{
383 std::vector<unsigned char> buffer(512, 0);
384
385 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::LabelLink;
386 const uint64_t relationshipGuid = 123456u;
387 const uint64_t headGuid = 234567u;
388 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100389 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100390 unsigned int numberOfBytesWritten = 789u;
391 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000392 WriteTimelineRelationshipBinary(relationshipType,
393 relationshipGuid,
394 headGuid,
395 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100396 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000397 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100398 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000399 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100400 CHECK(result == TimelinePacketStatus::Ok);
401 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100402
403 unsigned int uint32_t_size = sizeof(uint32_t);
404 unsigned int uint64_t_size = sizeof(uint64_t);
405
406 // Check the packet header
407 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100408 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100409 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100410
411 // Check the relationship type
412 offset += uint32_t_size;
413 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100414 CHECK(readRelationshipType == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100415
416 // Check the relationship GUID
417 offset += uint32_t_size;
418 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100419 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100420
421 // Check the head GUID
422 offset += uint64_t_size;
423 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100424 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100425
426 // Check the tail GUID
427 offset += uint64_t_size;
428 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100429 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100430
431 // Check the attribute GUID
432 offset += uint64_t_size;
433 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100434 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100435}
436
Sadik Armagan1625efc2021-06-10 18:24:34 +0100437TEST_CASE("TimelineMessageDirectoryPacketTestNoBuffer")
Sadik Armagan784db772019-10-08 15:05:38 +0100438{
439 unsigned int numberOfBytesWritten = 789u;
440 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(nullptr,
441 512u,
442 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100443 CHECK(result == TimelinePacketStatus::BufferExhaustion);
444 CHECK(numberOfBytesWritten == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100445}
446
Sadik Armagan1625efc2021-06-10 18:24:34 +0100447TEST_CASE("TimelineMessageDirectoryPacketTestBufferExhausted")
Sadik Armagan784db772019-10-08 15:05:38 +0100448{
449 std::vector<unsigned char> buffer(512, 0);
450
451 unsigned int numberOfBytesWritten = 789u;
452 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(buffer.data(),
453 0,
454 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100455 CHECK(result == TimelinePacketStatus::BufferExhaustion);
456 CHECK(numberOfBytesWritten == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100457}
458
Sadik Armagan1625efc2021-06-10 18:24:34 +0100459TEST_CASE("TimelineMessageDirectoryPacketTestFullConstruction")
Sadik Armagan784db772019-10-08 15:05:38 +0100460{
461 std::vector<unsigned char> buffer(512, 0);
462 unsigned int numberOfBytesWritten = 789u;
463 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100464 armnn::numeric_cast<unsigned int>(buffer.size()),
Sadik Armagan784db772019-10-08 15:05:38 +0100465 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100466 CHECK(result == TimelinePacketStatus::Ok);
Sadik Armagan784db772019-10-08 15:05:38 +0100467
Sadik Armagan1625efc2021-06-10 18:24:34 +0100468 CHECK(numberOfBytesWritten == 451);
Sadik Armagan784db772019-10-08 15:05:38 +0100469
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000470 unsigned int uint8_t_size = sizeof(uint8_t);
Sadik Armagan784db772019-10-08 15:05:38 +0100471 unsigned int uint32_t_size = sizeof(uint32_t);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000472 unsigned int uint64_t_size = sizeof(uint64_t);
Sadik Armagan784db772019-10-08 15:05:38 +0100473
474 // Check the packet header
475 unsigned int offset = 0;
476 uint32_t packetHeaderWord0 = ReadUint32(buffer.data(), offset);
477 uint32_t packetFamily = (packetHeaderWord0 >> 26) & 0x0000003F;
478 uint32_t packetClass = (packetHeaderWord0 >> 19) & 0x0000007F;
479 uint32_t packetType = (packetHeaderWord0 >> 16) & 0x00000007;
480 uint32_t streamId = (packetHeaderWord0 >> 0) & 0x00000007;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100481 CHECK(packetFamily == 1);
482 CHECK(packetClass == 0);
483 CHECK(packetType == 0);
484 CHECK(streamId == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100485
486 offset += uint32_t_size;
487 uint32_t packetHeaderWord1 = ReadUint32(buffer.data(), offset);
488 uint32_t sequenceNumbered = (packetHeaderWord1 >> 24) & 0x00000001;
489 uint32_t dataLength = (packetHeaderWord1 >> 0) & 0x00FFFFFF;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100490 CHECK(sequenceNumbered == 0);
491 CHECK(dataLength == 443);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000492
493 // Check the stream header
494 offset += uint32_t_size;
495 uint8_t readStreamVersion = ReadUint8(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100496 CHECK(readStreamVersion == 4);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000497 offset += uint8_t_size;
498 uint8_t readPointerBytes = ReadUint8(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100499 CHECK(readPointerBytes == uint64_t_size);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000500 offset += uint8_t_size;
501 uint8_t readThreadIdBytes = ReadUint8(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100502 CHECK(readThreadIdBytes == ThreadIdSize);
Sadik Armagan784db772019-10-08 15:05:38 +0100503
Finn Williamse63a0262019-10-22 10:30:49 +0100504 // Check the number of declarations
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000505 offset += uint8_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +0100506 uint32_t declCount = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100507 CHECK(declCount == 5);
Finn Williamse63a0262019-10-22 10:30:49 +0100508
Sadik Armagan784db772019-10-08 15:05:38 +0100509 // Check the decl_id
510 offset += uint32_t_size;
511 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100512 CHECK(readDeclId == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100513
514 // SWTrace "namestring" format
515 // length of the string (first 4 bytes) + string + null terminator
516
517 // Check the decl_name
518 offset += uint32_t_size;
519 uint32_t swTraceDeclNameLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100520 CHECK(swTraceDeclNameLength == 13); // decl_name length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100521
522 std::string label = "declareLabel";
523 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100524 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000525 label.data(), // The original label
Sadik Armagan784db772019-10-08 15:05:38 +0100526 swTraceDeclNameLength - 1) == 0); // The length of the label
527
528 // Check the ui_name
529 std::vector<uint32_t> swTraceString;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000530 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100531 offset += (armnn::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100532 uint32_t swTraceUINameLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100533 CHECK(swTraceUINameLength == 14); // ui_name length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100534
535 label = "declare label";
536 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100537 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100538 label.data(), // The original label
539 swTraceUINameLength - 1) == 0); // The length of the label
540
541 // Check arg_types
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000542 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100543 offset += (armnn::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100544 uint32_t swTraceArgTypesLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100545 CHECK(swTraceArgTypesLength == 3); // arg_types length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100546
547 label = "ps";
548 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100549 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100550 label.data(), // The original label
551 swTraceArgTypesLength - 1) == 0); // The length of the label
552
553 // Check arg_names
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000554 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100555 offset += (armnn::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100556 uint32_t swTraceArgNamesLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100557 CHECK(swTraceArgNamesLength == 11); // arg_names length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100558
559 label = "guid,value";
560 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100561 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100562 label.data(), // The original label
563 swTraceArgNamesLength - 1) == 0); // The length of the label
564
565 // Check second message decl_id
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000566 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100567 offset += (armnn::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100568 readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100569 CHECK(readDeclId == 1);
Sadik Armagan784db772019-10-08 15:05:38 +0100570
571 // Check second decl_name
572 offset += uint32_t_size;
573 swTraceDeclNameLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100574 CHECK(swTraceDeclNameLength == 14); // decl_name length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100575
576 label = "declareEntity";
577 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100578 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100579 label.data(), // The original label
580 swTraceDeclNameLength - 1) == 0); // The length of the label
581}
582
Sadik Armagan1625efc2021-06-10 18:24:34 +0100583TEST_CASE("TimelineEntityPacketTestNoBuffer")
David Monahanf21f6062019-10-07 15:11:15 +0100584{
585 const uint64_t profilingGuid = 123456u;
586 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000587 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
588 nullptr,
589 512u,
590 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100591 CHECK(result == TimelinePacketStatus::BufferExhaustion);
592 CHECK(numberOfBytesWritten == 0);
David Monahanf21f6062019-10-07 15:11:15 +0100593}
594
Sadik Armagan1625efc2021-06-10 18:24:34 +0100595TEST_CASE("TimelineEntityPacketTestBufferExhaustedWithZeroBufferSize")
David Monahanf21f6062019-10-07 15:11:15 +0100596{
597 std::vector<unsigned char> buffer(512, 0);
598
599 const uint64_t profilingGuid = 123456u;
600 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000601 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
602 buffer.data(),
603 0,
604 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100605 CHECK(result == TimelinePacketStatus::BufferExhaustion);
606 CHECK(numberOfBytesWritten == 0);
David Monahanf21f6062019-10-07 15:11:15 +0100607}
608
Sadik Armagan1625efc2021-06-10 18:24:34 +0100609TEST_CASE("TimelineEntityPacketTestBufferExhaustedWithFixedBufferSize")
David Monahanf21f6062019-10-07 15:11:15 +0100610{
611 std::vector<unsigned char> buffer(10, 0);
612
613 const uint64_t profilingGuid = 123456u;
614 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000615 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
616 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100617 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000618 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100619 CHECK(result == TimelinePacketStatus::BufferExhaustion);
620 CHECK(numberOfBytesWritten == 0);
David Monahanf21f6062019-10-07 15:11:15 +0100621}
622
Sadik Armagan1625efc2021-06-10 18:24:34 +0100623TEST_CASE("TimelineEntityPacketTestFullConstructionOfData")
David Monahanf21f6062019-10-07 15:11:15 +0100624{
625 std::vector<unsigned char> buffer(512, 0);
626
627 const uint64_t profilingGuid = 123456u;
628 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000629 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
630 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100631 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000632 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100633 CHECK(result == TimelinePacketStatus::Ok);
634 CHECK(numberOfBytesWritten == 12);
David Monahanf21f6062019-10-07 15:11:15 +0100635
636 unsigned int uint32_t_size = sizeof(uint32_t);
637
David Monahanf21f6062019-10-07 15:11:15 +0100638 unsigned int offset = 0;
Jan Eilersb884ea42019-10-16 09:54:15 +0100639 // Check decl_Id
Jan Eilersb884ea42019-10-16 09:54:15 +0100640 uint32_t decl_Id = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100641 CHECK(decl_Id == uint32_t(1));
Jan Eilersb884ea42019-10-16 09:54:15 +0100642
David Monahanf21f6062019-10-07 15:11:15 +0100643 // Check the profiling GUID
644 offset += uint32_t_size;
645 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100646 CHECK(readProfilingGuid == profilingGuid);
David Monahanf21f6062019-10-07 15:11:15 +0100647}
648
Sadik Armagan1625efc2021-06-10 18:24:34 +0100649TEST_CASE("TimelineEventClassTestNoBuffer")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100650{
651 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100652 const uint64_t profilingNameGuid = 3345u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100653 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000654 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100655 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000656 nullptr,
657 512u,
658 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100659 CHECK(result == TimelinePacketStatus::BufferExhaustion);
660 CHECK(numberOfBytesWritten == 0);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100661}
662
Sadik Armagan1625efc2021-06-10 18:24:34 +0100663TEST_CASE("TimelineEventClassTestBufferExhaustionZeroValue")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100664{
665 std::vector<unsigned char> buffer(512, 0);
666
667 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100668 const uint64_t profilingNameGuid = 3345u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100669 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000670 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100671 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000672 buffer.data(),
673 0,
674 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100675 CHECK(result == TimelinePacketStatus::BufferExhaustion);
676 CHECK(numberOfBytesWritten == 0);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100677}
678
Sadik Armagan1625efc2021-06-10 18:24:34 +0100679TEST_CASE("TimelineEventClassTestBufferExhaustionFixedValue")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100680{
681 std::vector<unsigned char> buffer(10, 0);
682
683 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100684 const uint64_t profilingNameGuid = 5564u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100685 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000686 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100687 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000688 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100689 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000690 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100691 CHECK(result == TimelinePacketStatus::BufferExhaustion);
692 CHECK(numberOfBytesWritten == 0);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100693}
694
Sadik Armagan1625efc2021-06-10 18:24:34 +0100695TEST_CASE("TimelineEventClassTestFullConstructionOfData")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100696{
697 std::vector<unsigned char> buffer(512, 0);
698
699 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100700 const uint64_t profilingNameGuid = 654321u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100701 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000702 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100703 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000704 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100705 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000706 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100707 CHECK(result == TimelinePacketStatus::Ok);
708 CHECK(numberOfBytesWritten == 20);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100709
710 unsigned int uint32_t_size = sizeof(uint32_t);
Jim Flynn1892d212020-05-26 21:10:49 +0100711 unsigned int uint64_t_size = sizeof(uint64_t);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100712
Jan Eilers92fa15b2019-10-15 15:23:25 +0100713 unsigned int offset = 0;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100714 // Check the decl_id
Jan Eilers92fa15b2019-10-15 15:23:25 +0100715 uint32_t declId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100716 CHECK(declId == uint32_t(2));
Jan Eilers92fa15b2019-10-15 15:23:25 +0100717
718 // Check the profiling GUID
719 offset += uint32_t_size;
720 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100721 CHECK(readProfilingGuid == profilingGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100722
723 offset += uint64_t_size;
724 uint64_t readProfilingNameGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100725 CHECK(readProfilingNameGuid == profilingNameGuid);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100726}
727
Sadik Armagan1625efc2021-06-10 18:24:34 +0100728TEST_CASE("TimelineEventPacketTestNoBuffer")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100729{
730 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100731 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100732 const uint64_t profilingGuid = 123456u;
733 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000734 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
735 threadId,
736 profilingGuid,
737 nullptr,
738 512u,
739 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100740 CHECK(result == TimelinePacketStatus::BufferExhaustion);
741 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100742}
743
Sadik Armagan1625efc2021-06-10 18:24:34 +0100744TEST_CASE("TimelineEventPacketTestBufferExhaustionZeroValue")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100745{
746 std::vector<unsigned char> buffer(512, 0);
747
748 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100749 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100750 const uint64_t profilingGuid = 123456u;
751 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000752 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
753 threadId,
754 profilingGuid,
755 buffer.data(),
756 0,
757 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100758 CHECK(result == TimelinePacketStatus::BufferExhaustion);
759 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100760}
761
Sadik Armagan1625efc2021-06-10 18:24:34 +0100762TEST_CASE("TimelineEventPacketTestBufferExhaustionFixedValue")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100763{
764 std::vector<unsigned char> buffer(10, 0);
765
766 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100767 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100768 const uint64_t profilingGuid = 123456u;
769 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000770 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
771 threadId,
772 profilingGuid,
773 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100774 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000775 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100776 CHECK(result == TimelinePacketStatus::BufferExhaustion);
777 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100778}
779
Sadik Armagan1625efc2021-06-10 18:24:34 +0100780TEST_CASE("TimelineEventPacketTestFullConstructionOfData")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100781{
782 std::vector<unsigned char> buffer(512, 0);
783
784 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100785 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100786 const uint64_t profilingGuid = 123456u;
787 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000788 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
789 threadId,
790 profilingGuid,
791 buffer.data(),
Matthew Sloyan371b70e2020-09-11 10:14:57 +0100792 armnn::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000793 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100794 CHECK(result == TimelinePacketStatus::Ok);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100795
796 unsigned int uint32_t_size = sizeof(uint32_t);
797 unsigned int uint64_t_size = sizeof(uint64_t);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100798 CHECK(numberOfBytesWritten == 20 + ThreadIdSize);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100799
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100800 unsigned int offset = 0;
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100801 // Check the decl_id
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100802 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100803 CHECK(readDeclId == 4);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100804
805 // Check the timestamp
806 offset += uint32_t_size;
807 uint64_t readTimestamp = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100808 CHECK(readTimestamp == timestamp);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100809
810 // Check the thread id
811 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100812 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
813 ReadBytes(buffer.data(), offset, ThreadIdSize, readThreadId.data());
Sadik Armagan1625efc2021-06-10 18:24:34 +0100814 CHECK(readThreadId == threadId);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100815
816 // Check the profiling GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100817 offset += ThreadIdSize;
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100818 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100819 CHECK(readProfilingGuid == profilingGuid);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100820}
821
Sadik Armagan1625efc2021-06-10 18:24:34 +0100822}