blob: 5deef8a65daf5ea189199a58b77e9d1e7306a63c [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
Jim Flynn3e9bc192022-03-23 23:01:26 +00006#include <client/src/ProfilingUtils.hpp>
Matteo Martincigh0aed4f92019-10-01 14:25:34 +01007
Jim Flynn75c14f42022-03-10 22:05:42 +00008#include <common/include/NumericCast.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +01009#include <common/include/SwTrace.hpp>
Jim Flynn9c85b412022-03-16 00:27:43 +000010#include <common/include/Threads.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010011
Sadik Armagan1625efc2021-06-10 18:24:34 +010012#include <doctest/doctest.h>
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010013
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000014using namespace arm::pipe;
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010015
Sadik Armagan1625efc2021-06-10 18:24:34 +010016TEST_SUITE("TimelinePacketTests")
17{
18TEST_CASE("TimelineLabelPacketTestNoBuffer")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010019{
20 const uint64_t profilingGuid = 123456u;
21 const std::string label = "some label";
22 unsigned int numberOfBytesWritten = 789u;
23 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
24 label,
25 nullptr,
26 512u,
27 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010028 CHECK(result == TimelinePacketStatus::BufferExhaustion);
29 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010030}
31
Sadik Armagan1625efc2021-06-10 18:24:34 +010032TEST_CASE("TimelineLabelPacketTestBufferExhaustionZeroValue")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010033{
34 std::vector<unsigned char> buffer(512, 0);
35
36 const uint64_t profilingGuid = 123456u;
37 const std::string label = "some label";
38 unsigned int numberOfBytesWritten = 789u;
39 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
40 label,
41 buffer.data(),
42 0,
43 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010044 CHECK(result == TimelinePacketStatus::BufferExhaustion);
45 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010046}
47
Sadik Armagan1625efc2021-06-10 18:24:34 +010048TEST_CASE("TimelineLabelPacketTestBufferExhaustionFixedValue")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010049{
50 std::vector<unsigned char> buffer(10, 0);
51
52 const uint64_t profilingGuid = 123456u;
53 const std::string label = "some label";
54 unsigned int numberOfBytesWritten = 789u;
55 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
56 label,
57 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +000058 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010059 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010060 CHECK(result == TimelinePacketStatus::BufferExhaustion);
61 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010062}
63
Sadik Armagan1625efc2021-06-10 18:24:34 +010064TEST_CASE("TimelineLabelPacketTestInvalidLabel")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010065{
66 std::vector<unsigned char> buffer(512, 0);
67
68 const uint64_t profilingGuid = 123456u;
69 const std::string label = "s0m€ l@b€l";
70 unsigned int numberOfBytesWritten = 789u;
71 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
72 label,
73 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +000074 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010075 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 CHECK(result == TimelinePacketStatus::Error);
77 CHECK(numberOfBytesWritten == 0);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010078}
79
Sadik Armagan1625efc2021-06-10 18:24:34 +010080TEST_CASE("TimelineLabelPacketTestSingleConstructionOfData")
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010081{
82 std::vector<unsigned char> buffer(512, 0);
83
84 const uint64_t profilingGuid = 123456u;
85 const std::string label = "some label";
86 unsigned int numberOfBytesWritten = 789u;
87 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
88 label,
89 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +000090 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010091 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +010092 CHECK(result == TimelinePacketStatus::Ok);
93 CHECK(numberOfBytesWritten == 28);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010094
95 unsigned int uint32_t_size = sizeof(uint32_t);
96 unsigned int uint64_t_size = sizeof(uint64_t);
97
98 // Check the packet header
99 unsigned int offset = 0;
Jan Eilersb884ea42019-10-16 09:54:15 +0100100 uint32_t decl_Id = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100101 CHECK(decl_Id == uint32_t(0));
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100102
103 // Check the profiling GUID
104 offset += uint32_t_size;
105 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100106 CHECK(readProfilingGuid == profilingGuid);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100107
108 // Check the SWTrace label
109 offset += uint64_t_size;
110 uint32_t swTraceLabelLength = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100111 CHECK(swTraceLabelLength == 11); // Label length including the null-terminator
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100112
113 offset += uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100114 CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100115 label.data(), // The original label
116 swTraceLabelLength - 1) == 0); // The length of the label
117
118 offset += swTraceLabelLength * uint32_t_size;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100119 CHECK(buffer[offset] == '\0'); // The null-terminator at the end of the SWTrace label
Matteo Martincigh0aed4f92019-10-01 14:25:34 +0100120}
121
Sadik Armagan1625efc2021-06-10 18:24:34 +0100122TEST_CASE("TimelineRelationshipPacketNullBufferTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100123{
124 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
125 const uint64_t relationshipGuid = 123456u;
126 const uint64_t headGuid = 234567u;
127 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100128 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100129 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000130 TimelinePacketStatus result = WriteTimelineRelationshipBinary(relationshipType,
131 relationshipGuid,
132 headGuid,
133 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100134 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000135 nullptr,
136 512u,
137 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100138 CHECK(result == TimelinePacketStatus::BufferExhaustion);
139 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100140}
141
Sadik Armagan1625efc2021-06-10 18:24:34 +0100142TEST_CASE("TimelineRelationshipPacketZeroBufferSizeTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100143{
144 std::vector<unsigned char> buffer(512, 0);
145
146 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
147 const uint64_t relationshipGuid = 123456u;
148 const uint64_t headGuid = 234567u;
149 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100150 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100151 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000152 TimelinePacketStatus result = WriteTimelineRelationshipBinary(relationshipType,
153 relationshipGuid,
154 headGuid,
155 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100156 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000157 buffer.data(),
158 0,
159 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100160 CHECK(result == TimelinePacketStatus::BufferExhaustion);
161 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100162}
163
Sadik Armagan1625efc2021-06-10 18:24:34 +0100164TEST_CASE("TimelineRelationshipPacketSmallBufferSizeTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100165{
166 std::vector<unsigned char> buffer(10, 0);
167
168 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
169 const uint64_t relationshipGuid = 123456u;
170 const uint64_t headGuid = 234567u;
171 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100172 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100173 unsigned int numberOfBytesWritten = 789u;
174 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000175 WriteTimelineRelationshipBinary(relationshipType,
176 relationshipGuid,
177 headGuid,
178 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100179 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000180 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000181 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000182 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100183 CHECK(result == TimelinePacketStatus::BufferExhaustion);
184 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100185}
186
Sadik Armagan1625efc2021-06-10 18:24:34 +0100187TEST_CASE("TimelineRelationshipPacketInvalidRelationTest")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100188{
189 std::vector<unsigned char> buffer(512, 0);
190 ProfilingRelationshipType relationshipType = static_cast<ProfilingRelationshipType>(5);
191 const uint64_t relationshipGuid = 123456u;
192 const uint64_t headGuid = 234567u;
193 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100194 const uint64_t attributeGuid = 876345u;
195
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100196 unsigned int numberOfBytesWritten = 789u;
197
Sadik Armagan1625efc2021-06-10 18:24:34 +0100198 CHECK_THROWS_AS(WriteTimelineRelationshipBinary(relationshipType,
Keith Davis97da5e22020-03-05 16:25:28 +0000199 relationshipGuid,
200 headGuid,
201 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100202 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000203 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000204 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000205 numberOfBytesWritten),
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000206 arm::pipe::InvalidArgumentException);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100207
Sadik Armagan1625efc2021-06-10 18:24:34 +0100208 CHECK(numberOfBytesWritten == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100209}
210
Sadik Armagan1625efc2021-06-10 18:24:34 +0100211TEST_CASE("TimelineRelationshipPacketTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100212{
213 std::vector<unsigned char> buffer(512, 0);
214
215 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::RetentionLink;
216 const uint64_t relationshipGuid = 123456u;
217 const uint64_t headGuid = 234567u;
218 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100219 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100220 unsigned int numberOfBytesWritten = 789u;
221 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000222 WriteTimelineRelationshipBinary(relationshipType,
223 relationshipGuid,
224 headGuid,
225 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100226 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000227 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000228 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000229 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100230 CHECK(result == TimelinePacketStatus::Ok);
231 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100232
233 unsigned int uint32_t_size = sizeof(uint32_t);
234 unsigned int uint64_t_size = sizeof(uint64_t);
235
236 // Check the packet header
237 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100238 // Check the decl_id
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100239 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100240 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100241
242 // Check the relationship type
243 offset += uint32_t_size;
244 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100245 CHECK(readRelationshipType == 0);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100246
247 // Check the relationship GUID
248 offset += uint32_t_size;
249 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100250 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100251
252 // Check the head GUID
253 offset += uint64_t_size;
254 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100255 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100256
257 // Check the tail GUID
258 offset += uint64_t_size;
259 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100260 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100261
262 // Check the attribute GUID
263 offset += uint64_t_size;
264 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100265 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100266}
267
Sadik Armagan1625efc2021-06-10 18:24:34 +0100268TEST_CASE("TimelineRelationshipPacketExecutionLinkTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100269{
270 std::vector<unsigned char> buffer(512, 0);
271
272 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::ExecutionLink;
273 const uint64_t relationshipGuid = 123456u;
274 const uint64_t headGuid = 234567u;
275 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100276 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100277 unsigned int numberOfBytesWritten = 789u;
278 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000279 WriteTimelineRelationshipBinary(relationshipType,
280 relationshipGuid,
281 headGuid,
282 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100283 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000284 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000285 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000286 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100287 CHECK(result == TimelinePacketStatus::Ok);
288 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100289
290 unsigned int uint32_t_size = sizeof(uint32_t);
291 unsigned int uint64_t_size = sizeof(uint64_t);
292
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100293 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100294 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100295 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100296
297 // Check the relationship type
298 offset += uint32_t_size;
299 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100300 CHECK(readRelationshipType == 1);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100301
302 // Check the relationship GUID
303 offset += uint32_t_size;
304 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100305 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100306
307 // Check the head GUID
308 offset += uint64_t_size;
309 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100310 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100311
312 // Check the tail GUID
313 offset += uint64_t_size;
314 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100315 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100316
317 // Check the attribute GUID
318 offset += uint64_t_size;
319 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100320 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100321}
322
323
Sadik Armagan1625efc2021-06-10 18:24:34 +0100324TEST_CASE("TimelineRelationshipPacketDataLinkTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100325{
326 std::vector<unsigned char> buffer(512, 0);
327
328 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
329 const uint64_t relationshipGuid = 123456u;
330 const uint64_t headGuid = 234567u;
331 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100332 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100333 unsigned int numberOfBytesWritten = 789u;
334 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000335 WriteTimelineRelationshipBinary(relationshipType,
336 relationshipGuid,
337 headGuid,
338 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100339 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000340 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000341 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000342 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100343 CHECK(result == TimelinePacketStatus::Ok);
344 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100345
346 unsigned int uint32_t_size = sizeof(uint32_t);
347 unsigned int uint64_t_size = sizeof(uint64_t);
348
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100349 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100350 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100351 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100352
353 // Check the relationship type
354 offset += uint32_t_size;
355 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100356 CHECK(readRelationshipType == 2);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100357
358 // Check the relationship GUID
359 offset += uint32_t_size;
360 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100361 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100362
363 // Check the head GUID
364 offset += uint64_t_size;
365 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100366 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100367
368 // Check the tail GUID
369 offset += uint64_t_size;
370 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100371 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100372
373 // Check the attribute GUID
374 offset += uint64_t_size;
375 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100376 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100377}
378
379
Sadik Armagan1625efc2021-06-10 18:24:34 +0100380TEST_CASE("TimelineRelationshipPacketLabelLinkTestDataConstruction")
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100381{
382 std::vector<unsigned char> buffer(512, 0);
383
384 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::LabelLink;
385 const uint64_t relationshipGuid = 123456u;
386 const uint64_t headGuid = 234567u;
387 const uint64_t tailGuid = 345678u;
Finn Williams0a336dc2020-05-11 15:39:58 +0100388 const uint64_t attributeGuid = 876345u;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100389 unsigned int numberOfBytesWritten = 789u;
390 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000391 WriteTimelineRelationshipBinary(relationshipType,
392 relationshipGuid,
393 headGuid,
394 tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100395 attributeGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000396 buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000397 arm::pipe::numeric_cast<unsigned int>(buffer.size()),
Keith Davis97da5e22020-03-05 16:25:28 +0000398 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100399 CHECK(result == TimelinePacketStatus::Ok);
400 CHECK(numberOfBytesWritten == 40);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100401
402 unsigned int uint32_t_size = sizeof(uint32_t);
403 unsigned int uint64_t_size = sizeof(uint64_t);
404
405 // Check the packet header
406 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100407 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100408 CHECK(readDeclId == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100409
410 // Check the relationship type
411 offset += uint32_t_size;
412 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100413 CHECK(readRelationshipType == 3);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100414
415 // Check the relationship GUID
416 offset += uint32_t_size;
417 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100418 CHECK(readRelationshipGuid == relationshipGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100419
420 // Check the head GUID
421 offset += uint64_t_size;
422 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100423 CHECK(readHeadGuid == headGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100424
425 // Check the tail GUID
426 offset += uint64_t_size;
427 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100428 CHECK(readTailGuid == tailGuid);
Finn Williams0a336dc2020-05-11 15:39:58 +0100429
430 // Check the attribute GUID
431 offset += uint64_t_size;
432 uint64_t readAttributeGuid = ReadUint64(buffer.data(), offset);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100433 CHECK(readAttributeGuid == attributeGuid);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100434}
435
Sadik Armagan1625efc2021-06-10 18:24:34 +0100436TEST_CASE("TimelineMessageDirectoryPacketTestNoBuffer")
Sadik Armagan784db772019-10-08 15:05:38 +0100437{
438 unsigned int numberOfBytesWritten = 789u;
439 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(nullptr,
440 512u,
441 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100442 CHECK(result == TimelinePacketStatus::BufferExhaustion);
443 CHECK(numberOfBytesWritten == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100444}
445
Sadik Armagan1625efc2021-06-10 18:24:34 +0100446TEST_CASE("TimelineMessageDirectoryPacketTestBufferExhausted")
Sadik Armagan784db772019-10-08 15:05:38 +0100447{
448 std::vector<unsigned char> buffer(512, 0);
449
450 unsigned int numberOfBytesWritten = 789u;
451 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(buffer.data(),
452 0,
453 numberOfBytesWritten);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100454 CHECK(result == TimelinePacketStatus::BufferExhaustion);
455 CHECK(numberOfBytesWritten == 0);
Sadik Armagan784db772019-10-08 15:05:38 +0100456}
457
Sadik Armagan1625efc2021-06-10 18:24:34 +0100458TEST_CASE("TimelineMessageDirectoryPacketTestFullConstruction")
Sadik Armagan784db772019-10-08 15:05:38 +0100459{
460 std::vector<unsigned char> buffer(512, 0);
461 unsigned int numberOfBytesWritten = 789u;
462 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(buffer.data(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000463 arm::pipe::numeric_cast<unsigned int>(
464 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);
Jim Flynn75c14f42022-03-10 22:05:42 +0000531 offset += (arm::pipe::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);
Jim Flynn75c14f42022-03-10 22:05:42 +0000543 offset += (arm::pipe::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);
Jim Flynn75c14f42022-03-10 22:05:42 +0000555 offset += (arm::pipe::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);
Jim Flynn75c14f42022-03-10 22:05:42 +0000567 offset += (arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000617 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000631 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000689 arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000705 arm::pipe::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 Flynn9c85b412022-03-16 00:27:43 +0000731 const int threadId = arm::pipe::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 Flynn9c85b412022-03-16 00:27:43 +0000749 const int threadId = arm::pipe::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 Flynn9c85b412022-03-16 00:27:43 +0000767 const int threadId = arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000774 arm::pipe::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 Flynn9c85b412022-03-16 00:27:43 +0000785 const int threadId = arm::pipe::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(),
Jim Flynn75c14f42022-03-10 22:05:42 +0000792 arm::pipe::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}