blob: f1a038555c1e37e954daa0caabbc69ef3acdd3d4 [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
6#include <ProfilingUtils.hpp>
7
Jim Flynn75c14f42022-03-10 22:05:42 +00008#include <armnnUtils/Threads.hpp>
Matthew Sloyan371b70e2020-09-11 10:14:57 +01009
Jim Flynn75c14f42022-03-10 22:05:42 +000010#include <common/include/NumericCast.hpp>
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(),
Jim Flynn75c14f42022-03-10 22:05:42 +000059 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +000075 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +000091 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000182 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000205 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000229 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000286 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000342 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000398 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000464 arm::pipe::numeric_cast<unsigned int>(
465 buffer.size()),
Sadik Armagan784db772019-10-08 15:05:38 +0100466 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100467 CHECK(result == TimelinePacketStatus::Ok);
Sadik Armagan784db772019-10-08 15:05:38 +0100468
Sadik Armagan1625efc2021-06-10 18:24:34 +0100469 CHECK(numberOfBytesWritten == 451);
Sadik Armagan784db772019-10-08 15:05:38 +0100470
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000471 unsigned int uint8_t_size = sizeof(uint8_t);
Sadik Armagan784db772019-10-08 15:05:38 +0100472 unsigned int uint32_t_size = sizeof(uint32_t);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000473 unsigned int uint64_t_size = sizeof(uint64_t);
Sadik Armagan784db772019-10-08 15:05:38 +0100474
475 // Check the packet header
476 unsigned int offset = 0;
477 uint32_t packetHeaderWord0 = ReadUint32(buffer.data(), offset);
478 uint32_t packetFamily = (packetHeaderWord0 >> 26) & 0x0000003F;
479 uint32_t packetClass = (packetHeaderWord0 >> 19) & 0x0000007F;
480 uint32_t packetType = (packetHeaderWord0 >> 16) & 0x00000007;
481 uint32_t streamId = (packetHeaderWord0 >> 0) & 0x00000007;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100482 CHECK(packetFamily == 1);
483 CHECK(packetClass == 0);
484 CHECK(packetType == 0);
485 CHECK(streamId == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100486
487 offset += uint32_t_size;
488 uint32_t packetHeaderWord1 = ReadUint32(buffer.data(), offset);
489 uint32_t sequenceNumbered = (packetHeaderWord1 >> 24) & 0x00000001;
490 uint32_t dataLength = (packetHeaderWord1 >> 0) & 0x00FFFFFF;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100491 CHECK(sequenceNumbered == 0);
492 CHECK(dataLength == 443);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000493
494 // Check the stream header
495 offset += uint32_t_size;
496 uint8_t readStreamVersion = ReadUint8(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100497 CHECK(readStreamVersion == 4);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000498 offset += uint8_t_size;
499 uint8_t readPointerBytes = ReadUint8(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100500 CHECK(readPointerBytes == uint64_t_size);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000501 offset += uint8_t_size;
502 uint8_t readThreadIdBytes = ReadUint8(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100503 CHECK(readThreadIdBytes == ThreadIdSize);
Sadik Armagan784db772019-10-08 15:05:38 +0100504
Finn Williamse63a0262019-10-22 10:30:49 +0100505 // Check the number of declarations
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000506 offset += uint8_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +0100507 uint32_t declCount = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100508 CHECK(declCount == 5);
Finn Williamse63a0262019-10-22 10:30:49 +0100509
Sadik Armagan784db772019-10-08 15:05:38 +0100510 // Check the decl_id
511 offset += uint32_t_size;
512 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100513 CHECK(readDeclId == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100514
515 // SWTrace "namestring" format
516 // length of the string (first 4 bytes) + string + null terminator
517
518 // Check the decl_name
519 offset += uint32_t_size;
520 uint32_t swTraceDeclNameLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100521 CHECK(swTraceDeclNameLength == 13); // decl_name length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100522
523 std::string label = "declareLabel";
524 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100525 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000526 label.data(), // The original label
Sadik Armagan784db772019-10-08 15:05:38 +0100527 swTraceDeclNameLength - 1) == 0); // The length of the label
528
529 // Check the ui_name
530 std::vector<uint32_t> swTraceString;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000531 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Jim Flynn75c14f42022-03-10 22:05:42 +0000532 offset += (arm::pipe::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100533 uint32_t swTraceUINameLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100534 CHECK(swTraceUINameLength == 14); // ui_name length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100535
536 label = "declare label";
537 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100538 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100539 label.data(), // The original label
540 swTraceUINameLength - 1) == 0); // The length of the label
541
542 // Check arg_types
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000543 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Jim Flynn75c14f42022-03-10 22:05:42 +0000544 offset += (arm::pipe::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100545 uint32_t swTraceArgTypesLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100546 CHECK(swTraceArgTypesLength == 3); // arg_types length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100547
548 label = "ps";
549 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100550 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100551 label.data(), // The original label
552 swTraceArgTypesLength - 1) == 0); // The length of the label
553
554 // Check arg_names
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000555 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Jim Flynn75c14f42022-03-10 22:05:42 +0000556 offset += (arm::pipe::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100557 uint32_t swTraceArgNamesLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100558 CHECK(swTraceArgNamesLength == 11); // arg_names length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100559
560 label = "guid,value";
561 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100562 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100563 label.data(), // The original label
564 swTraceArgNamesLength - 1) == 0); // The length of the label
565
566 // Check second message decl_id
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000567 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
Jim Flynn75c14f42022-03-10 22:05:42 +0000568 offset += (arm::pipe::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
Sadik Armagan784db772019-10-08 15:05:38 +0100569 readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100570 CHECK(readDeclId == 1);
Sadik Armagan784db772019-10-08 15:05:38 +0100571
572 // Check second decl_name
573 offset += uint32_t_size;
574 swTraceDeclNameLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100575 CHECK(swTraceDeclNameLength == 14); // decl_name length including the null-terminator
Sadik Armagan784db772019-10-08 15:05:38 +0100576
577 label = "declareEntity";
578 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100579 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Sadik Armagan784db772019-10-08 15:05:38 +0100580 label.data(), // The original label
581 swTraceDeclNameLength - 1) == 0); // The length of the label
582}
583
Sadik Armagan1625efc2021-06-10 18:24:34 +0100584TEST_CASE("TimelineEntityPacketTestNoBuffer")
David Monahanf21f6062019-10-07 15:11:15 +0100585{
586 const uint64_t profilingGuid = 123456u;
587 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000588 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
589 nullptr,
590 512u,
591 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100592 CHECK(result == TimelinePacketStatus::BufferExhaustion);
593 CHECK(numberOfBytesWritten == 0);
David Monahanf21f6062019-10-07 15:11:15 +0100594}
595
Sadik Armagan1625efc2021-06-10 18:24:34 +0100596TEST_CASE("TimelineEntityPacketTestBufferExhaustedWithZeroBufferSize")
David Monahanf21f6062019-10-07 15:11:15 +0100597{
598 std::vector<unsigned char> buffer(512, 0);
599
600 const uint64_t profilingGuid = 123456u;
601 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000602 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
603 buffer.data(),
604 0,
605 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100606 CHECK(result == TimelinePacketStatus::BufferExhaustion);
607 CHECK(numberOfBytesWritten == 0);
David Monahanf21f6062019-10-07 15:11:15 +0100608}
609
Sadik Armagan1625efc2021-06-10 18:24:34 +0100610TEST_CASE("TimelineEntityPacketTestBufferExhaustedWithFixedBufferSize")
David Monahanf21f6062019-10-07 15:11:15 +0100611{
612 std::vector<unsigned char> buffer(10, 0);
613
614 const uint64_t profilingGuid = 123456u;
615 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000616 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
617 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000618 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000619 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100620 CHECK(result == TimelinePacketStatus::BufferExhaustion);
621 CHECK(numberOfBytesWritten == 0);
David Monahanf21f6062019-10-07 15:11:15 +0100622}
623
Sadik Armagan1625efc2021-06-10 18:24:34 +0100624TEST_CASE("TimelineEntityPacketTestFullConstructionOfData")
David Monahanf21f6062019-10-07 15:11:15 +0100625{
626 std::vector<unsigned char> buffer(512, 0);
627
628 const uint64_t profilingGuid = 123456u;
629 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000630 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
631 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000632 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000633 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100634 CHECK(result == TimelinePacketStatus::Ok);
635 CHECK(numberOfBytesWritten == 12);
David Monahanf21f6062019-10-07 15:11:15 +0100636
637 unsigned int uint32_t_size = sizeof(uint32_t);
638
David Monahanf21f6062019-10-07 15:11:15 +0100639 unsigned int offset = 0;
Jan Eilersb884ea42019-10-16 09:54:15 +0100640 // Check decl_Id
Jan Eilersb884ea42019-10-16 09:54:15 +0100641 uint32_t decl_Id = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100642 CHECK(decl_Id == uint32_t(1));
Jan Eilersb884ea42019-10-16 09:54:15 +0100643
David Monahanf21f6062019-10-07 15:11:15 +0100644 // Check the profiling GUID
645 offset += uint32_t_size;
646 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100647 CHECK(readProfilingGuid == profilingGuid);
David Monahanf21f6062019-10-07 15:11:15 +0100648}
649
Sadik Armagan1625efc2021-06-10 18:24:34 +0100650TEST_CASE("TimelineEventClassTestNoBuffer")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100651{
652 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100653 const uint64_t profilingNameGuid = 3345u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100654 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000655 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100656 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000657 nullptr,
658 512u,
659 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100660 CHECK(result == TimelinePacketStatus::BufferExhaustion);
661 CHECK(numberOfBytesWritten == 0);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100662}
663
Sadik Armagan1625efc2021-06-10 18:24:34 +0100664TEST_CASE("TimelineEventClassTestBufferExhaustionZeroValue")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100665{
666 std::vector<unsigned char> buffer(512, 0);
667
668 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100669 const uint64_t profilingNameGuid = 3345u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100670 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000671 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100672 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000673 buffer.data(),
674 0,
675 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100676 CHECK(result == TimelinePacketStatus::BufferExhaustion);
677 CHECK(numberOfBytesWritten == 0);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100678}
679
Sadik Armagan1625efc2021-06-10 18:24:34 +0100680TEST_CASE("TimelineEventClassTestBufferExhaustionFixedValue")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100681{
682 std::vector<unsigned char> buffer(10, 0);
683
684 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100685 const uint64_t profilingNameGuid = 5564u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100686 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000687 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100688 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000689 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000690 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000691 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100692 CHECK(result == TimelinePacketStatus::BufferExhaustion);
693 CHECK(numberOfBytesWritten == 0);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100694}
695
Sadik Armagan1625efc2021-06-10 18:24:34 +0100696TEST_CASE("TimelineEventClassTestFullConstructionOfData")
Jan Eilers92fa15b2019-10-15 15:23:25 +0100697{
698 std::vector<unsigned char> buffer(512, 0);
699
700 const uint64_t profilingGuid = 123456u;
Jim Flynn1892d212020-05-26 21:10:49 +0100701 const uint64_t profilingNameGuid = 654321u;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100702 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000703 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100704 profilingNameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000705 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000706 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000707 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100708 CHECK(result == TimelinePacketStatus::Ok);
709 CHECK(numberOfBytesWritten == 20);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100710
711 unsigned int uint32_t_size = sizeof(uint32_t);
Jim Flynn1892d212020-05-26 21:10:49 +0100712 unsigned int uint64_t_size = sizeof(uint64_t);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100713
Jan Eilers92fa15b2019-10-15 15:23:25 +0100714 unsigned int offset = 0;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100715 // Check the decl_id
Jan Eilers92fa15b2019-10-15 15:23:25 +0100716 uint32_t declId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100717 CHECK(declId == uint32_t(2));
Jan Eilers92fa15b2019-10-15 15:23:25 +0100718
719 // Check the profiling GUID
720 offset += uint32_t_size;
721 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100722 CHECK(readProfilingGuid == profilingGuid);
Jim Flynn1892d212020-05-26 21:10:49 +0100723
724 offset += uint64_t_size;
725 uint64_t readProfilingNameGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100726 CHECK(readProfilingNameGuid == profilingNameGuid);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100727}
728
Sadik Armagan1625efc2021-06-10 18:24:34 +0100729TEST_CASE("TimelineEventPacketTestNoBuffer")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100730{
731 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100732 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100733 const uint64_t profilingGuid = 123456u;
734 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000735 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
736 threadId,
737 profilingGuid,
738 nullptr,
739 512u,
740 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100741 CHECK(result == TimelinePacketStatus::BufferExhaustion);
742 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100743}
744
Sadik Armagan1625efc2021-06-10 18:24:34 +0100745TEST_CASE("TimelineEventPacketTestBufferExhaustionZeroValue")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100746{
747 std::vector<unsigned char> buffer(512, 0);
748
749 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100750 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100751 const uint64_t profilingGuid = 123456u;
752 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000753 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
754 threadId,
755 profilingGuid,
756 buffer.data(),
757 0,
758 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100759 CHECK(result == TimelinePacketStatus::BufferExhaustion);
760 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100761}
762
Sadik Armagan1625efc2021-06-10 18:24:34 +0100763TEST_CASE("TimelineEventPacketTestBufferExhaustionFixedValue")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100764{
765 std::vector<unsigned char> buffer(10, 0);
766
767 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100768 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100769 const uint64_t profilingGuid = 123456u;
770 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000771 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
772 threadId,
773 profilingGuid,
774 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000775 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000776 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100777 CHECK(result == TimelinePacketStatus::BufferExhaustion);
778 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100779}
780
Sadik Armagan1625efc2021-06-10 18:24:34 +0100781TEST_CASE("TimelineEventPacketTestFullConstructionOfData")
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100782{
783 std::vector<unsigned char> buffer(512, 0);
784
785 const uint64_t timestamp = 456789u;
Jim Flynn1fdeb992020-07-09 07:28:37 +0100786 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100787 const uint64_t profilingGuid = 123456u;
788 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000789 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
790 threadId,
791 profilingGuid,
792 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000793 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000794 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100795 CHECK(result == TimelinePacketStatus::Ok);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100796
797 unsigned int uint32_t_size = sizeof(uint32_t);
798 unsigned int uint64_t_size = sizeof(uint64_t);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100799 CHECK(numberOfBytesWritten == 20 + ThreadIdSize);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100800
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100801 unsigned int offset = 0;
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100802 // Check the decl_id
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100803 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100804 CHECK(readDeclId == 4);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100805
806 // Check the timestamp
807 offset += uint32_t_size;
808 uint64_t readTimestamp = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100809 CHECK(readTimestamp == timestamp);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100810
811 // Check the thread id
812 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100813 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
814 ReadBytes(buffer.data(), offset, ThreadIdSize, readThreadId.data());
Sadik Armagan1625efc2021-06-10 18:24:34 +0100815 CHECK(readThreadId == threadId);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100816
817 // Check the profiling GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100818 offset += ThreadIdSize;
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100819 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100820 CHECK(readProfilingGuid == profilingGuid);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100821}
822
Sadik Armagan1625efc2021-06-10 18:24:34 +0100823}