blob: e57ed2a652bbede7b47826178350120f7821fe61 [file] [log] [blame]
Matteo Martincigh0aed4f92019-10-01 14:25:34 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <ProfilingUtils.hpp>
7
8#include <boost/test/unit_test.hpp>
9#include <boost/numeric/conversion/cast.hpp>
10
11using namespace armnn::profiling;
12
13BOOST_AUTO_TEST_SUITE(TimelinePacketTests)
14
Keith Davis97da5e22020-03-05 16:25:28 +000015BOOST_AUTO_TEST_CASE(TimelineLabelPacketTestNoBuffer)
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010016{
17 const uint64_t profilingGuid = 123456u;
18 const std::string label = "some label";
19 unsigned int numberOfBytesWritten = 789u;
20 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
21 label,
22 nullptr,
23 512u,
24 numberOfBytesWritten);
25 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
26 BOOST_CHECK(numberOfBytesWritten == 0);
27}
28
Keith Davis97da5e22020-03-05 16:25:28 +000029BOOST_AUTO_TEST_CASE(TimelineLabelPacketTestBufferExhaustionZeroValue)
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010030{
31 std::vector<unsigned char> buffer(512, 0);
32
33 const uint64_t profilingGuid = 123456u;
34 const std::string label = "some label";
35 unsigned int numberOfBytesWritten = 789u;
36 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
37 label,
38 buffer.data(),
39 0,
40 numberOfBytesWritten);
41 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
42 BOOST_CHECK(numberOfBytesWritten == 0);
43}
44
Keith Davis97da5e22020-03-05 16:25:28 +000045BOOST_AUTO_TEST_CASE(TimelineLabelPacketTestBufferExhaustionFixedValue)
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010046{
47 std::vector<unsigned char> buffer(10, 0);
48
49 const uint64_t profilingGuid = 123456u;
50 const std::string label = "some label";
51 unsigned int numberOfBytesWritten = 789u;
52 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
53 label,
54 buffer.data(),
55 boost::numeric_cast<unsigned int>(buffer.size()),
56 numberOfBytesWritten);
57 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
58 BOOST_CHECK(numberOfBytesWritten == 0);
59}
60
Keith Davis97da5e22020-03-05 16:25:28 +000061BOOST_AUTO_TEST_CASE(TimelineLabelPacketTestInvalidLabel)
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010062{
63 std::vector<unsigned char> buffer(512, 0);
64
65 const uint64_t profilingGuid = 123456u;
66 const std::string label = "s0m€ l@b€l";
67 unsigned int numberOfBytesWritten = 789u;
68 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
69 label,
70 buffer.data(),
71 boost::numeric_cast<unsigned int>(buffer.size()),
72 numberOfBytesWritten);
73 BOOST_CHECK(result == TimelinePacketStatus::Error);
74 BOOST_CHECK(numberOfBytesWritten == 0);
75}
76
Keith Davis97da5e22020-03-05 16:25:28 +000077BOOST_AUTO_TEST_CASE(TimelineLabelPacketTestSingleConstructionOfData)
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010078{
79 std::vector<unsigned char> buffer(512, 0);
80
81 const uint64_t profilingGuid = 123456u;
82 const std::string label = "some label";
83 unsigned int numberOfBytesWritten = 789u;
84 TimelinePacketStatus result = WriteTimelineLabelBinaryPacket(profilingGuid,
85 label,
86 buffer.data(),
87 boost::numeric_cast<unsigned int>(buffer.size()),
88 numberOfBytesWritten);
89 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +000090 BOOST_CHECK(numberOfBytesWritten == 28);
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010091
92 unsigned int uint32_t_size = sizeof(uint32_t);
93 unsigned int uint64_t_size = sizeof(uint64_t);
94
95 // Check the packet header
96 unsigned int offset = 0;
Jan Eilersb884ea42019-10-16 09:54:15 +010097 uint32_t decl_Id = ReadUint32(buffer.data(), offset);
98 BOOST_CHECK(decl_Id == uint32_t(0));
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010099
100 // Check the profiling GUID
101 offset += uint32_t_size;
102 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
103 BOOST_CHECK(readProfilingGuid == profilingGuid);
104
105 // Check the SWTrace label
106 offset += uint64_t_size;
107 uint32_t swTraceLabelLength = ReadUint32(buffer.data(), offset);
108 BOOST_CHECK(swTraceLabelLength == 11); // Label length including the null-terminator
109
110 offset += uint32_t_size;
111 BOOST_CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
112 label.data(), // The original label
113 swTraceLabelLength - 1) == 0); // The length of the label
114
115 offset += swTraceLabelLength * uint32_t_size;
116 BOOST_CHECK(buffer[offset] == '\0'); // The null-terminator at the end of the SWTrace label
117}
118
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100119BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketNullBufferTest)
120{
121 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
122 const uint64_t relationshipGuid = 123456u;
123 const uint64_t headGuid = 234567u;
124 const uint64_t tailGuid = 345678u;
125 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000126 TimelinePacketStatus result = WriteTimelineRelationshipBinary(relationshipType,
127 relationshipGuid,
128 headGuid,
129 tailGuid,
130 nullptr,
131 512u,
132 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100133 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
134 BOOST_CHECK(numberOfBytesWritten == 0);
135}
136
137BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketZeroBufferSizeTest)
138{
139 std::vector<unsigned char> buffer(512, 0);
140
141 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
142 const uint64_t relationshipGuid = 123456u;
143 const uint64_t headGuid = 234567u;
144 const uint64_t tailGuid = 345678u;
145 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000146 TimelinePacketStatus result = WriteTimelineRelationshipBinary(relationshipType,
147 relationshipGuid,
148 headGuid,
149 tailGuid,
150 buffer.data(),
151 0,
152 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100153 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
154 BOOST_CHECK(numberOfBytesWritten == 0);
155}
156
157BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketSmallBufferSizeTest)
158{
159 std::vector<unsigned char> buffer(10, 0);
160
161 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
162 const uint64_t relationshipGuid = 123456u;
163 const uint64_t headGuid = 234567u;
164 const uint64_t tailGuid = 345678u;
165 unsigned int numberOfBytesWritten = 789u;
166 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000167 WriteTimelineRelationshipBinary(relationshipType,
168 relationshipGuid,
169 headGuid,
170 tailGuid,
171 buffer.data(),
172 boost::numeric_cast<unsigned int>(buffer.size()),
173 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100174 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
175 BOOST_CHECK(numberOfBytesWritten == 0);
176}
177
178BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketInvalidRelationTest)
179{
180 std::vector<unsigned char> buffer(512, 0);
181 ProfilingRelationshipType relationshipType = static_cast<ProfilingRelationshipType>(5);
182 const uint64_t relationshipGuid = 123456u;
183 const uint64_t headGuid = 234567u;
184 const uint64_t tailGuid = 345678u;
185 unsigned int numberOfBytesWritten = 789u;
186
Keith Davis97da5e22020-03-05 16:25:28 +0000187 BOOST_CHECK_THROW(WriteTimelineRelationshipBinary(relationshipType,
188 relationshipGuid,
189 headGuid,
190 tailGuid,
191 buffer.data(),
192 boost::numeric_cast<unsigned int>(buffer.size()),
193 numberOfBytesWritten),
194 armnn::InvalidArgumentException);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100195
196 BOOST_CHECK(numberOfBytesWritten == 0);
197}
198
Keith Davis97da5e22020-03-05 16:25:28 +0000199BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketTestDataConstruction)
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100200{
201 std::vector<unsigned char> buffer(512, 0);
202
203 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::RetentionLink;
204 const uint64_t relationshipGuid = 123456u;
205 const uint64_t headGuid = 234567u;
206 const uint64_t tailGuid = 345678u;
207 unsigned int numberOfBytesWritten = 789u;
208 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000209 WriteTimelineRelationshipBinary(relationshipType,
210 relationshipGuid,
211 headGuid,
212 tailGuid,
213 buffer.data(),
214 boost::numeric_cast<unsigned int>(buffer.size()),
215 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100216 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +0000217 BOOST_CHECK(numberOfBytesWritten == 32);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100218
219 unsigned int uint32_t_size = sizeof(uint32_t);
220 unsigned int uint64_t_size = sizeof(uint64_t);
221
222 // Check the packet header
223 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100224 // Check the decl_id
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100225 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
226 BOOST_CHECK(readDeclId == 3);
227
228 // Check the relationship type
229 offset += uint32_t_size;
230 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
231 BOOST_CHECK(readRelationshipType == 0);
232
233 // Check the relationship GUID
234 offset += uint32_t_size;
235 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
236 BOOST_CHECK(readRelationshipGuid == relationshipGuid);
237
238 // Check the head GUID
239 offset += uint64_t_size;
240 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
241 BOOST_CHECK(readHeadGuid == headGuid);
242
243 // Check the tail GUID
244 offset += uint64_t_size;
245 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
246 BOOST_CHECK(readTailGuid == tailGuid);
247}
248
Keith Davis97da5e22020-03-05 16:25:28 +0000249BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketExecutionLinkTestDataConstruction)
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100250{
251 std::vector<unsigned char> buffer(512, 0);
252
253 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::ExecutionLink;
254 const uint64_t relationshipGuid = 123456u;
255 const uint64_t headGuid = 234567u;
256 const uint64_t tailGuid = 345678u;
257 unsigned int numberOfBytesWritten = 789u;
258 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000259 WriteTimelineRelationshipBinary(relationshipType,
260 relationshipGuid,
261 headGuid,
262 tailGuid,
263 buffer.data(),
264 boost::numeric_cast<unsigned int>(buffer.size()),
265 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100266 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +0000267 BOOST_CHECK(numberOfBytesWritten == 32);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100268
269 unsigned int uint32_t_size = sizeof(uint32_t);
270 unsigned int uint64_t_size = sizeof(uint64_t);
271
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100272 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100273 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
274 BOOST_CHECK(readDeclId == 3);
275
276 // Check the relationship type
277 offset += uint32_t_size;
278 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
279 BOOST_CHECK(readRelationshipType == 1);
280
281 // Check the relationship GUID
282 offset += uint32_t_size;
283 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
284 BOOST_CHECK(readRelationshipGuid == relationshipGuid);
285
286 // Check the head GUID
287 offset += uint64_t_size;
288 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
289 BOOST_CHECK(readHeadGuid == headGuid);
290
291 // Check the tail GUID
292 offset += uint64_t_size;
293 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
294 BOOST_CHECK(readTailGuid == tailGuid);
295}
296
297
Keith Davis97da5e22020-03-05 16:25:28 +0000298BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketDataLinkTestDataConstruction)
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100299{
300 std::vector<unsigned char> buffer(512, 0);
301
302 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::DataLink;
303 const uint64_t relationshipGuid = 123456u;
304 const uint64_t headGuid = 234567u;
305 const uint64_t tailGuid = 345678u;
306 unsigned int numberOfBytesWritten = 789u;
307 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000308 WriteTimelineRelationshipBinary(relationshipType,
309 relationshipGuid,
310 headGuid,
311 tailGuid,
312 buffer.data(),
313 boost::numeric_cast<unsigned int>(buffer.size()),
314 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100315 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +0000316 BOOST_CHECK(numberOfBytesWritten == 32);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100317
318 unsigned int uint32_t_size = sizeof(uint32_t);
319 unsigned int uint64_t_size = sizeof(uint64_t);
320
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100321 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100322 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
323 BOOST_CHECK(readDeclId == 3);
324
325 // Check the relationship type
326 offset += uint32_t_size;
327 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
328 BOOST_CHECK(readRelationshipType == 2);
329
330 // Check the relationship GUID
331 offset += uint32_t_size;
332 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
333 BOOST_CHECK(readRelationshipGuid == relationshipGuid);
334
335 // Check the head GUID
336 offset += uint64_t_size;
337 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
338 BOOST_CHECK(readHeadGuid == headGuid);
339
340 // Check the tail GUID
341 offset += uint64_t_size;
342 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
343 BOOST_CHECK(readTailGuid == tailGuid);
344}
345
346
Keith Davis97da5e22020-03-05 16:25:28 +0000347BOOST_AUTO_TEST_CASE(TimelineRelationshipPacketLabelLinkTestDataConstruction)
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100348{
349 std::vector<unsigned char> buffer(512, 0);
350
351 ProfilingRelationshipType relationshipType = ProfilingRelationshipType::LabelLink;
352 const uint64_t relationshipGuid = 123456u;
353 const uint64_t headGuid = 234567u;
354 const uint64_t tailGuid = 345678u;
355 unsigned int numberOfBytesWritten = 789u;
356 TimelinePacketStatus result =
Keith Davis97da5e22020-03-05 16:25:28 +0000357 WriteTimelineRelationshipBinary(relationshipType,
358 relationshipGuid,
359 headGuid,
360 tailGuid,
361 buffer.data(),
362 boost::numeric_cast<unsigned int>(buffer.size()),
363 numberOfBytesWritten);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100364 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +0000365 BOOST_CHECK(numberOfBytesWritten == 32);
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100366
367 unsigned int uint32_t_size = sizeof(uint32_t);
368 unsigned int uint64_t_size = sizeof(uint64_t);
369
370 // Check the packet header
371 unsigned int offset = 0;
Narumol Prangnawarat7e5eec72019-10-16 12:16:26 +0100372 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
373 BOOST_CHECK(readDeclId == 3);
374
375 // Check the relationship type
376 offset += uint32_t_size;
377 uint32_t readRelationshipType = ReadUint32(buffer.data(), offset);
378 BOOST_CHECK(readRelationshipType == 3);
379
380 // Check the relationship GUID
381 offset += uint32_t_size;
382 uint64_t readRelationshipGuid = ReadUint64(buffer.data(), offset);
383 BOOST_CHECK(readRelationshipGuid == relationshipGuid);
384
385 // Check the head GUID
386 offset += uint64_t_size;
387 uint64_t readHeadGuid = ReadUint64(buffer.data(), offset);
388 BOOST_CHECK(readHeadGuid == headGuid);
389
390 // Check the tail GUID
391 offset += uint64_t_size;
392 uint64_t readTailGuid = ReadUint64(buffer.data(), offset);
393 BOOST_CHECK(readTailGuid == tailGuid);
394}
395
Keith Davis97da5e22020-03-05 16:25:28 +0000396BOOST_AUTO_TEST_CASE(TimelineMessageDirectoryPacketTestNoBuffer)
Sadik Armagan784db772019-10-08 15:05:38 +0100397{
398 unsigned int numberOfBytesWritten = 789u;
399 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(nullptr,
400 512u,
401 numberOfBytesWritten);
402 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
403 BOOST_CHECK(numberOfBytesWritten == 0);
404}
405
Keith Davis97da5e22020-03-05 16:25:28 +0000406BOOST_AUTO_TEST_CASE(TimelineMessageDirectoryPacketTestBufferExhausted)
Sadik Armagan784db772019-10-08 15:05:38 +0100407{
408 std::vector<unsigned char> buffer(512, 0);
409
410 unsigned int numberOfBytesWritten = 789u;
411 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(buffer.data(),
412 0,
413 numberOfBytesWritten);
414 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
415 BOOST_CHECK(numberOfBytesWritten == 0);
416}
417
Keith Davis97da5e22020-03-05 16:25:28 +0000418BOOST_AUTO_TEST_CASE(TimelineMessageDirectoryPacketTestFullConstruction)
Sadik Armagan784db772019-10-08 15:05:38 +0100419{
420 std::vector<unsigned char> buffer(512, 0);
421 unsigned int numberOfBytesWritten = 789u;
422 TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(buffer.data(),
423 boost::numeric_cast<unsigned int>(buffer.size()),
424 numberOfBytesWritten);
425 BOOST_CHECK(result == TimelinePacketStatus::Ok);
426
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000427 BOOST_CHECK(numberOfBytesWritten == 427);
Sadik Armagan784db772019-10-08 15:05:38 +0100428
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000429 unsigned int uint8_t_size = sizeof(uint8_t);
Sadik Armagan784db772019-10-08 15:05:38 +0100430 unsigned int uint32_t_size = sizeof(uint32_t);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000431 unsigned int uint64_t_size = sizeof(uint64_t);
Sadik Armagan784db772019-10-08 15:05:38 +0100432
433 // Check the packet header
434 unsigned int offset = 0;
435 uint32_t packetHeaderWord0 = ReadUint32(buffer.data(), offset);
436 uint32_t packetFamily = (packetHeaderWord0 >> 26) & 0x0000003F;
437 uint32_t packetClass = (packetHeaderWord0 >> 19) & 0x0000007F;
438 uint32_t packetType = (packetHeaderWord0 >> 16) & 0x00000007;
439 uint32_t streamId = (packetHeaderWord0 >> 0) & 0x00000007;
440 BOOST_CHECK(packetFamily == 1);
441 BOOST_CHECK(packetClass == 0);
442 BOOST_CHECK(packetType == 0);
443 BOOST_CHECK(streamId == 0);
444
445 offset += uint32_t_size;
446 uint32_t packetHeaderWord1 = ReadUint32(buffer.data(), offset);
447 uint32_t sequenceNumbered = (packetHeaderWord1 >> 24) & 0x00000001;
448 uint32_t dataLength = (packetHeaderWord1 >> 0) & 0x00FFFFFF;
449 BOOST_CHECK(sequenceNumbered == 0);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000450 BOOST_CHECK(dataLength == 419);
451
452 // Check the stream header
453 offset += uint32_t_size;
454 uint8_t readStreamVersion = ReadUint8(buffer.data(), offset);
455 BOOST_CHECK(readStreamVersion == 4);
456 offset += uint8_t_size;
457 uint8_t readPointerBytes = ReadUint8(buffer.data(), offset);
458 BOOST_CHECK(readPointerBytes == uint64_t_size);
459 offset += uint8_t_size;
460 uint8_t readThreadIdBytes = ReadUint8(buffer.data(), offset);
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100461 BOOST_CHECK(readThreadIdBytes == ThreadIdSize);
Sadik Armagan784db772019-10-08 15:05:38 +0100462
Finn Williamse63a0262019-10-22 10:30:49 +0100463 // Check the number of declarations
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000464 offset += uint8_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +0100465 uint32_t declCount = ReadUint32(buffer.data(), offset);
466 BOOST_CHECK(declCount == 5);
467
Sadik Armagan784db772019-10-08 15:05:38 +0100468 // Check the decl_id
469 offset += uint32_t_size;
470 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
471 BOOST_CHECK(readDeclId == 0);
472
473 // SWTrace "namestring" format
474 // length of the string (first 4 bytes) + string + null terminator
475
476 // Check the decl_name
477 offset += uint32_t_size;
478 uint32_t swTraceDeclNameLength = ReadUint32(buffer.data(), offset);
479 BOOST_CHECK(swTraceDeclNameLength == 13); // decl_name length including the null-terminator
480
481 std::string label = "declareLabel";
482 offset += uint32_t_size;
483 BOOST_CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000484 label.data(), // The original label
Sadik Armagan784db772019-10-08 15:05:38 +0100485 swTraceDeclNameLength - 1) == 0); // The length of the label
486
487 // Check the ui_name
488 std::vector<uint32_t> swTraceString;
489 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
490 offset += (boost::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
491 uint32_t swTraceUINameLength = ReadUint32(buffer.data(), offset);
492 BOOST_CHECK(swTraceUINameLength == 14); // ui_name length including the null-terminator
493
494 label = "declare label";
495 offset += uint32_t_size;
496 BOOST_CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
497 label.data(), // The original label
498 swTraceUINameLength - 1) == 0); // The length of the label
499
500 // Check arg_types
501 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
502 offset += (boost::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
503 uint32_t swTraceArgTypesLength = ReadUint32(buffer.data(), offset);
504 BOOST_CHECK(swTraceArgTypesLength == 3); // arg_types length including the null-terminator
505
506 label = "ps";
507 offset += uint32_t_size;
508 BOOST_CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
509 label.data(), // The original label
510 swTraceArgTypesLength - 1) == 0); // The length of the label
511
512 // Check arg_names
513 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
514 offset += (boost::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
515 uint32_t swTraceArgNamesLength = ReadUint32(buffer.data(), offset);
516 BOOST_CHECK(swTraceArgNamesLength == 11); // arg_names length including the null-terminator
517
518 label = "guid,value";
519 offset += uint32_t_size;
520 BOOST_CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
521 label.data(), // The original label
522 swTraceArgNamesLength - 1) == 0); // The length of the label
523
524 // Check second message decl_id
525 StringToSwTraceString<SwTraceCharPolicy>(label, swTraceString);
526 offset += (boost::numeric_cast<unsigned int>(swTraceString.size()) - 1) * uint32_t_size;
527 readDeclId = ReadUint32(buffer.data(), offset);
528 BOOST_CHECK(readDeclId == 1);
529
530 // Check second decl_name
531 offset += uint32_t_size;
532 swTraceDeclNameLength = ReadUint32(buffer.data(), offset);
533 BOOST_CHECK(swTraceDeclNameLength == 14); // decl_name length including the null-terminator
534
535 label = "declareEntity";
536 offset += uint32_t_size;
537 BOOST_CHECK(std::memcmp(buffer.data() + offset, // Offset to the label in the buffer
538 label.data(), // The original label
539 swTraceDeclNameLength - 1) == 0); // The length of the label
540}
541
Keith Davis97da5e22020-03-05 16:25:28 +0000542BOOST_AUTO_TEST_CASE(TimelineEntityPacketTestNoBuffer)
David Monahanf21f6062019-10-07 15:11:15 +0100543{
544 const uint64_t profilingGuid = 123456u;
545 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000546 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
547 nullptr,
548 512u,
549 numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100550 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
551 BOOST_CHECK(numberOfBytesWritten == 0);
552}
553
Keith Davis97da5e22020-03-05 16:25:28 +0000554BOOST_AUTO_TEST_CASE(TimelineEntityPacketTestBufferExhaustedWithZeroBufferSize)
David Monahanf21f6062019-10-07 15:11:15 +0100555{
556 std::vector<unsigned char> buffer(512, 0);
557
558 const uint64_t profilingGuid = 123456u;
559 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000560 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
561 buffer.data(),
562 0,
563 numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100564 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
565 BOOST_CHECK(numberOfBytesWritten == 0);
566}
567
Keith Davis97da5e22020-03-05 16:25:28 +0000568BOOST_AUTO_TEST_CASE(TimelineEntityPacketTestBufferExhaustedWithFixedBufferSize)
David Monahanf21f6062019-10-07 15:11:15 +0100569{
570 std::vector<unsigned char> buffer(10, 0);
571
572 const uint64_t profilingGuid = 123456u;
573 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000574 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
575 buffer.data(),
576 boost::numeric_cast<unsigned int>(buffer.size()),
577 numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100578 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
579 BOOST_CHECK(numberOfBytesWritten == 0);
580}
581
Keith Davis97da5e22020-03-05 16:25:28 +0000582BOOST_AUTO_TEST_CASE(TimelineEntityPacketTestFullConstructionOfData)
David Monahanf21f6062019-10-07 15:11:15 +0100583{
584 std::vector<unsigned char> buffer(512, 0);
585
586 const uint64_t profilingGuid = 123456u;
587 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000588 TimelinePacketStatus result = WriteTimelineEntityBinary(profilingGuid,
589 buffer.data(),
590 boost::numeric_cast<unsigned int>(buffer.size()),
591 numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100592 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +0000593 BOOST_CHECK(numberOfBytesWritten == 12);
David Monahanf21f6062019-10-07 15:11:15 +0100594
595 unsigned int uint32_t_size = sizeof(uint32_t);
596
David Monahanf21f6062019-10-07 15:11:15 +0100597 unsigned int offset = 0;
Jan Eilersb884ea42019-10-16 09:54:15 +0100598 // Check decl_Id
Jan Eilersb884ea42019-10-16 09:54:15 +0100599 uint32_t decl_Id = ReadUint32(buffer.data(), offset);
600 BOOST_CHECK(decl_Id == uint32_t(1));
601
David Monahanf21f6062019-10-07 15:11:15 +0100602 // Check the profiling GUID
603 offset += uint32_t_size;
604 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
605 BOOST_CHECK(readProfilingGuid == profilingGuid);
606}
607
Keith Davis97da5e22020-03-05 16:25:28 +0000608BOOST_AUTO_TEST_CASE(TimelineEventClassTestNoBuffer)
Jan Eilers92fa15b2019-10-15 15:23:25 +0100609{
610 const uint64_t profilingGuid = 123456u;
611 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000612 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
613 nullptr,
614 512u,
615 numberOfBytesWritten);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100616 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
617 BOOST_CHECK(numberOfBytesWritten == 0);
618}
619
Keith Davis97da5e22020-03-05 16:25:28 +0000620BOOST_AUTO_TEST_CASE(TimelineEventClassTestBufferExhaustionZeroValue)
Jan Eilers92fa15b2019-10-15 15:23:25 +0100621{
622 std::vector<unsigned char> buffer(512, 0);
623
624 const uint64_t profilingGuid = 123456u;
625 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000626 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
627 buffer.data(),
628 0,
629 numberOfBytesWritten);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100630 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
631 BOOST_CHECK(numberOfBytesWritten == 0);
632}
633
Keith Davis97da5e22020-03-05 16:25:28 +0000634BOOST_AUTO_TEST_CASE(TimelineEventClassTestBufferExhaustionFixedValue)
Jan Eilers92fa15b2019-10-15 15:23:25 +0100635{
636 std::vector<unsigned char> buffer(10, 0);
637
638 const uint64_t profilingGuid = 123456u;
639 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000640 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
641 buffer.data(),
642 boost::numeric_cast<unsigned int>(buffer.size()),
643 numberOfBytesWritten);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100644 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
645 BOOST_CHECK(numberOfBytesWritten == 0);
646}
647
Keith Davis97da5e22020-03-05 16:25:28 +0000648BOOST_AUTO_TEST_CASE(TimelineEventClassTestFullConstructionOfData)
Jan Eilers92fa15b2019-10-15 15:23:25 +0100649{
650 std::vector<unsigned char> buffer(512, 0);
651
652 const uint64_t profilingGuid = 123456u;
653 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000654 TimelinePacketStatus result = WriteTimelineEventClassBinary(profilingGuid,
655 buffer.data(),
656 boost::numeric_cast<unsigned int>(buffer.size()),
657 numberOfBytesWritten);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100658 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Keith Davis97da5e22020-03-05 16:25:28 +0000659 BOOST_CHECK(numberOfBytesWritten == 12);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100660
661 unsigned int uint32_t_size = sizeof(uint32_t);
662
Jan Eilers92fa15b2019-10-15 15:23:25 +0100663 unsigned int offset = 0;
Jan Eilers92fa15b2019-10-15 15:23:25 +0100664 // Check the decl_id
Jan Eilers92fa15b2019-10-15 15:23:25 +0100665 uint32_t declId = ReadUint32(buffer.data(), offset);
666 BOOST_CHECK(declId == uint32_t(2));
667
668 // Check the profiling GUID
669 offset += uint32_t_size;
670 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
671 BOOST_CHECK(readProfilingGuid == profilingGuid);
672}
673
Keith Davis97da5e22020-03-05 16:25:28 +0000674BOOST_AUTO_TEST_CASE(TimelineEventPacketTestNoBuffer)
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100675{
676 const uint64_t timestamp = 456789u;
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000677 const std::thread::id threadId = std::this_thread::get_id();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100678 const uint64_t profilingGuid = 123456u;
679 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000680 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
681 threadId,
682 profilingGuid,
683 nullptr,
684 512u,
685 numberOfBytesWritten);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100686 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
687 BOOST_CHECK(numberOfBytesWritten == 0);
688}
689
Keith Davis97da5e22020-03-05 16:25:28 +0000690BOOST_AUTO_TEST_CASE(TimelineEventPacketTestBufferExhaustionZeroValue)
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100691{
692 std::vector<unsigned char> buffer(512, 0);
693
694 const uint64_t timestamp = 456789u;
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000695 const std::thread::id threadId = std::this_thread::get_id();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100696 const uint64_t profilingGuid = 123456u;
697 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000698 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
699 threadId,
700 profilingGuid,
701 buffer.data(),
702 0,
703 numberOfBytesWritten);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100704 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
705 BOOST_CHECK(numberOfBytesWritten == 0);
706}
707
Keith Davis97da5e22020-03-05 16:25:28 +0000708BOOST_AUTO_TEST_CASE(TimelineEventPacketTestBufferExhaustionFixedValue)
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100709{
710 std::vector<unsigned char> buffer(10, 0);
711
712 const uint64_t timestamp = 456789u;
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000713 const std::thread::id threadId = std::this_thread::get_id();
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100714 const uint64_t profilingGuid = 123456u;
715 unsigned int numberOfBytesWritten = 789u;
Keith Davis97da5e22020-03-05 16:25:28 +0000716 TimelinePacketStatus result = WriteTimelineEventBinary(timestamp,
717 threadId,
718 profilingGuid,
719 buffer.data(),
720 boost::numeric_cast<unsigned int>(buffer.size()),
721 numberOfBytesWritten);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100722 BOOST_CHECK(result == TimelinePacketStatus::BufferExhaustion);
723 BOOST_CHECK(numberOfBytesWritten == 0);
724}
725
Keith Davis97da5e22020-03-05 16:25:28 +0000726BOOST_AUTO_TEST_CASE(TimelineEventPacketTestFullConstructionOfData)
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100727{
728 std::vector<unsigned char> buffer(512, 0);
729
730 const uint64_t timestamp = 456789u;
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000731 const std::thread::id threadId = std::this_thread::get_id();
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 buffer.data(),
738 boost::numeric_cast<unsigned int>(buffer.size()),
739 numberOfBytesWritten);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100740 BOOST_CHECK(result == TimelinePacketStatus::Ok);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100741
742 unsigned int uint32_t_size = sizeof(uint32_t);
743 unsigned int uint64_t_size = sizeof(uint64_t);
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100744 BOOST_CHECK(numberOfBytesWritten == 20 + ThreadIdSize);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100745
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100746 unsigned int offset = 0;
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100747 // Check the decl_id
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100748 uint32_t readDeclId = ReadUint32(buffer.data(), offset);
749 BOOST_CHECK(readDeclId == 4);
750
751 // Check the timestamp
752 offset += uint32_t_size;
753 uint64_t readTimestamp = ReadUint64(buffer.data(), offset);
754 BOOST_CHECK(readTimestamp == timestamp);
755
756 // Check the thread id
757 offset += uint64_t_size;
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100758 std::vector<uint8_t> readThreadId(ThreadIdSize, 0);
759 ReadBytes(buffer.data(), offset, ThreadIdSize, readThreadId.data());
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100760 BOOST_CHECK(readThreadId == threadId);
761
762 // Check the profiling GUID
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100763 offset += ThreadIdSize;
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100764 uint64_t readProfilingGuid = ReadUint64(buffer.data(), offset);
765 BOOST_CHECK(readProfilingGuid == profilingGuid);
766}
767
768BOOST_AUTO_TEST_SUITE_END()