blob: 43a5b0a4f5feb9c3e17a9ba9e015ca30429551d7 [file] [log] [blame]
Matteo Martincigh830101c2019-10-22 11:07:45 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Jim Flynn64063552020-02-14 10:18:08 +00006#include "ProfilingMocks.hpp"
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +00007#include "ProfilingTestUtils.hpp"
Matteo Martincigh830101c2019-10-22 11:07:45 +01008
9#include <SendTimelinePacket.hpp>
10#include <TimelineUtilityMethods.hpp>
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000011#include <LabelsAndEventClasses.hpp>
Matteo Martincighc0401992019-10-28 15:24:34 +000012#include <ProfilingService.hpp>
Matteo Martincigh830101c2019-10-22 11:07:45 +010013
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000014#include <memory>
15
Matteo Martincigh830101c2019-10-22 11:07:45 +010016#include <boost/test/unit_test.hpp>
17
18using namespace armnn;
19using namespace armnn::profiling;
20
21BOOST_AUTO_TEST_SUITE(TimelineUtilityMethodsTests)
22
Matteo Martincighc0401992019-10-28 15:24:34 +000023BOOST_AUTO_TEST_CASE(CreateTypedLabelTest)
24{
25 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +000026 ProfilingService profilingService;
27
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000028 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +000029 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincighc0401992019-10-28 15:24:34 +000030
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000031 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
Sadik Armagan3184c902020-03-18 10:57:30 +000032 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000033
Matteo Martincighc0401992019-10-28 15:24:34 +000034 ProfilingGuid entityGuid(123);
35 const std::string entityName = "some entity";
36 ProfilingStaticGuid labelTypeGuid(456);
37
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000038 BOOST_CHECK_NO_THROW(timelineUtilityMethods.MarkEntityWithLabel(entityGuid, entityName, labelTypeGuid));
Matteo Martincighc0401992019-10-28 15:24:34 +000039
40 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000041 timelineUtilityMethods.Commit();
Matteo Martincighc0401992019-10-28 15:24:34 +000042
43 // Get the readable buffer
44 auto readableBuffer = mockBufferManager.GetReadableBuffer();
45 BOOST_CHECK(readableBuffer != nullptr);
46 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +000047 BOOST_CHECK(size == 100);
Matteo Martincighc0401992019-10-28 15:24:34 +000048 const unsigned char* readableData = readableBuffer->GetReadableData();
49 BOOST_CHECK(readableData != nullptr);
50
51 // Utils
52 unsigned int offset = 0;
53
Keith Davis97da5e22020-03-05 16:25:28 +000054 // Verify Header
55 VerifyTimelineHeaderBinary(readableData, offset, 92);
Matteo Martincighc0401992019-10-28 15:24:34 +000056
Keith Davis97da5e22020-03-05 16:25:28 +000057 // First dataset sent: TimelineLabelBinaryPacket
58 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000059
Keith Davis97da5e22020-03-05 16:25:28 +000060 // Second dataset sent: TimelineRelationshipBinaryPacket
61 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
62 EmptyOptional(),
63 entityGuid,
64 EmptyOptional(),
65 readableData,
66 offset);
67
68 // Third dataset sent: TimelineRelationshipBinaryPacket
69 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
70 EmptyOptional(),
71 EmptyOptional(),
72 labelTypeGuid,
73 readableData,
74 offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000075
76 // Mark the buffer as read
77 mockBufferManager.MarkRead(readableBuffer);
78}
79
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000080BOOST_AUTO_TEST_CASE(SendWellKnownLabelsAndEventClassesTest)
81{
82 MockBufferManager mockBufferManager(1024);
Finn Williamscf2ad552020-03-20 15:10:59 +000083 ProfilingService profilingService;
84 SendTimelinePacket sendTimelinePacket(mockBufferManager);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000085
Finn Williamscf2ad552020-03-20 15:10:59 +000086 BOOST_CHECK_NO_THROW(TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses(sendTimelinePacket));
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000087
88 // Get the readable buffer
89 auto readableBuffer = mockBufferManager.GetReadableBuffer();
90 BOOST_CHECK(readableBuffer != nullptr);
91 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +000092 BOOST_TEST(size == 300);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000093 const unsigned char* readableData = readableBuffer->GetReadableData();
94 BOOST_CHECK(readableData != nullptr);
95
96 // Utils
97 unsigned int offset = 0;
98
Keith Davis97da5e22020-03-05 16:25:28 +000099 // Verify Header
100 VerifyTimelineHeaderBinary(readableData, offset, 292);
101
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000102 // First "well-known" label: NAME
Keith Davis97da5e22020-03-05 16:25:28 +0000103 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NAME_GUID,
104 LabelsAndEventClasses::NAME_LABEL,
105 readableData,
106 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000107
108 // Second "well-known" label: TYPE
Keith Davis97da5e22020-03-05 16:25:28 +0000109 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::TYPE_GUID,
110 LabelsAndEventClasses::TYPE_LABEL,
111 readableData,
112 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000113
114 // Third "well-known" label: INDEX
Keith Davis97da5e22020-03-05 16:25:28 +0000115 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INDEX_GUID,
116 LabelsAndEventClasses::INDEX_LABEL,
117 readableData,
118 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000119
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000120 // Forth "well-known" label: BACKENDID
Keith Davis97da5e22020-03-05 16:25:28 +0000121 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::BACKENDID_GUID,
122 LabelsAndEventClasses::BACKENDID_LABEL,
123 readableData,
124 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000125
126 // Well-known types
127 // Layer
Keith Davis97da5e22020-03-05 16:25:28 +0000128 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID,
129 LabelsAndEventClasses::LAYER,
130 readableData,
131 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000132
133 // Workload
Keith Davis97da5e22020-03-05 16:25:28 +0000134 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID,
135 LabelsAndEventClasses::WORKLOAD,
136 readableData,
137 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000138
139 // Network
Keith Davis97da5e22020-03-05 16:25:28 +0000140 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID,
141 LabelsAndEventClasses::NETWORK,
142 readableData,
143 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000144
145 // Connection
Keith Davis97da5e22020-03-05 16:25:28 +0000146 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID,
147 LabelsAndEventClasses::CONNECTION,
148 readableData,
149 offset);
150
David Monahan6198fe02019-12-02 08:35:43 +0000151 // Inference
Keith Davis97da5e22020-03-05 16:25:28 +0000152 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID,
153 LabelsAndEventClasses::INFERENCE,
154 readableData,
155 offset);
156
David Monahan6198fe02019-12-02 08:35:43 +0000157 // Workload Execution
Keith Davis97da5e22020-03-05 16:25:28 +0000158 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
159 LabelsAndEventClasses::WORKLOAD_EXECUTION,
160 readableData,
161 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000162
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000163 // First "well-known" event class: START OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000164 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
165 readableData,
166 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000167
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000168 // Second "well-known" event class: END OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000169 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
170 readableData,
171 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000172
173 // Mark the buffer as read
174 mockBufferManager.MarkRead(readableBuffer);
175}
176
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000177BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest)
178{
179 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000180 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000181 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000182 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000183
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000184 ProfilingDynamicGuid childEntityGuid(0);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000185 ProfilingGuid parentEntityGuid(123);
186 const std::string entityName = "some entity";
187 const std::string entityType = "some type";
188
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000189 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
Sadik Armagan3184c902020-03-18 10:57:30 +0000190 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000191
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000192 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, "", entityType),
193 InvalidArgumentException);
194 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, entityName, ""),
195 InvalidArgumentException);
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000196 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
197 childEntityGuid, parentEntityGuid, "", entityType), InvalidArgumentException);
198 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
199 childEntityGuid, parentEntityGuid, entityName, ""), InvalidArgumentException);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000200
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000201 BOOST_CHECK_NO_THROW(childEntityGuid = timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid,
202 entityName,
203 entityType));
204 BOOST_CHECK(childEntityGuid != ProfilingGuid(0));
205
206 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000207 timelineUtilityMethods.Commit();
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000208
209 // Get the readable buffer
210 auto readableBuffer = mockBufferManager.GetReadableBuffer();
211 BOOST_CHECK(readableBuffer != nullptr);
212 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000213 BOOST_CHECK(size == 236);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000214 const unsigned char* readableData = readableBuffer->GetReadableData();
215 BOOST_CHECK(readableData != nullptr);
216
217 // Utils
218 unsigned int offset = 0;
219
Keith Davis97da5e22020-03-05 16:25:28 +0000220 // Verify Header
221 VerifyTimelineHeaderBinary(readableData, offset, 228);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000222
Keith Davis97da5e22020-03-05 16:25:28 +0000223 // First dataset sent: TimelineEntityBinaryPacket
224 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000225
Keith Davis97da5e22020-03-05 16:25:28 +0000226 // Second dataset sent: TimelineLabelBinaryPacket
227 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000228
Keith Davis97da5e22020-03-05 16:25:28 +0000229 // Third dataset sent: TimelineRelationshipBinaryPacket
230 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
231 EmptyOptional(),
232 EmptyOptional(),
233 EmptyOptional(),
234 readableData,
235 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000236
Keith Davis97da5e22020-03-05 16:25:28 +0000237 // Fourth dataset sent: TimelineRelationshipBinaryPacket
238 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
239 EmptyOptional(),
240 EmptyOptional(),
241 LabelsAndEventClasses::NAME_GUID,
242 readableData,
243 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000244
Keith Davis97da5e22020-03-05 16:25:28 +0000245 // Fifth dataset sent: TimelineLabelBinaryPacket
246 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000247
Keith Davis97da5e22020-03-05 16:25:28 +0000248 // Sixth dataset sent: TimelineRelationshipBinaryPacket
249 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
250 EmptyOptional(),
251 EmptyOptional(),
252 EmptyOptional(),
253 readableData,
254 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000255
Keith Davis97da5e22020-03-05 16:25:28 +0000256 // Seventh dataset sent: TimelineRelationshipBinaryPacket
257 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
258 EmptyOptional(),
259 EmptyOptional(),
260 LabelsAndEventClasses::TYPE_GUID,
261 readableData,
262 offset);
263
264 // Eighth dataset sent: TimelineRelationshipBinaryPacket
265 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
266 EmptyOptional(),
267 parentEntityGuid,
268 EmptyOptional(),
269 readableData,
270 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000271
272 // Mark the buffer as read
273 mockBufferManager.MarkRead(readableBuffer);
274}
275
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000276BOOST_AUTO_TEST_CASE(DeclareLabelTest)
Matteo Martincigh830101c2019-10-22 11:07:45 +0100277{
278 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000279 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000280 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000281 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100282
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000283 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
Sadik Armagan3184c902020-03-18 10:57:30 +0000284 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000285
Matteo Martincigh830101c2019-10-22 11:07:45 +0100286 // Try declaring an invalid (empty) label
287 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel(""), InvalidArgumentException);
288
289 // Try declaring an invalid (wrong SWTrace format) label
290 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), RuntimeException);
291
292 // Declare a valid label
293 const std::string labelName = "valid label";
294 ProfilingGuid labelGuid = 0;
295 BOOST_CHECK_NO_THROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000296 BOOST_CHECK(labelGuid != ProfilingGuid(0));
Matteo Martincigh830101c2019-10-22 11:07:45 +0100297
Matteo Martincigh830101c2019-10-22 11:07:45 +0100298 // Try adding the same label as before
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000299 ProfilingGuid newLabelGuid = 0;
300 BOOST_CHECK_NO_THROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName));
301 BOOST_CHECK(newLabelGuid != ProfilingGuid(0));
302 BOOST_CHECK(newLabelGuid == labelGuid);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100303}
304
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000305BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest)
306{
307 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000308 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000309 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000310 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000311
312 // Invalid name
313 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), InvalidArgumentException);
314
315 // Invalid type
316 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), InvalidArgumentException);
317
Sadik Armagan3184c902020-03-18 10:57:30 +0000318 ProfilingDynamicGuid guid = profilingService.NextGuid();
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000319
320 // CreatedNamedTypedEntity with Guid - Invalid name
321 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"),
322 InvalidArgumentException);
323
324 // CreatedNamedTypedEntity with Guid - Invalid type
325 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""),
326 InvalidArgumentException);
327
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000328}
329
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000330BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest)
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000331{
332 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000333 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000334 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000335 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000336
337 const std::string entityName = "Entity0";
338 const std::string entityType = "Type0";
339
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000340 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
Sadik Armagan3184c902020-03-18 10:57:30 +0000341 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000342
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000343 ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType);
344 BOOST_CHECK(guid != ProfilingGuid(0));
345
346 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000347 timelineUtilityMethods.Commit();
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000348
349 // Get the readable buffer
350 auto readableBuffer = mockBufferManager.GetReadableBuffer();
351 BOOST_CHECK(readableBuffer != nullptr);
352 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000353 BOOST_CHECK(size == 196);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000354 const unsigned char* readableData = readableBuffer->GetReadableData();
355 BOOST_CHECK(readableData != nullptr);
356
357 // Utils
358 unsigned int offset = 0;
359
Keith Davis97da5e22020-03-05 16:25:28 +0000360 // Verify Header
361 VerifyTimelineHeaderBinary(readableData, offset, 188);
362
363 // First dataset sent: TimelineEntityBinaryPacket
364 VerifyTimelineEntityBinaryPacketData(guid, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000365
366 // Packets for Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000367 // First dataset sent: TimelineLabelBinaryPacket
368 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000369
Keith Davis97da5e22020-03-05 16:25:28 +0000370 // Second dataset sent: TimelineRelationshipBinaryPacket
371 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
372 EmptyOptional(),
373 EmptyOptional(),
374 EmptyOptional(),
375 readableData,
376 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000377
Keith Davis97da5e22020-03-05 16:25:28 +0000378 // Third dataset sent: TimelineRelationshipBinaryPacket
379 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
380 EmptyOptional(),
381 EmptyOptional(),
382 LabelsAndEventClasses::NAME_GUID,
383 readableData,
384 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000385
386 // Packets for Type Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000387 // First dataset sent: TimelineLabelBinaryPacket
388 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000389
Keith Davis97da5e22020-03-05 16:25:28 +0000390 // Second dataset sent: TimelineRelationshipBinaryPacket
391 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
392 EmptyOptional(),
393 EmptyOptional(),
394 EmptyOptional(),
395 readableData,
396 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000397
Keith Davis97da5e22020-03-05 16:25:28 +0000398 // Third dataset sent: TimelineRelationshipBinaryPacket
399 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
400 EmptyOptional(),
401 EmptyOptional(),
402 LabelsAndEventClasses::TYPE_GUID,
403 readableData,
404 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000405
406 // Mark the buffer as read
407 mockBufferManager.MarkRead(readableBuffer);
408}
409
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000410BOOST_AUTO_TEST_CASE(RecordEventTest)
411{
412 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000413 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000414 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000415 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000416 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
Sadik Armagan3184c902020-03-18 10:57:30 +0000417 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000418
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000419 ProfilingGuid entityGuid(123);
420 ProfilingStaticGuid eventClassGuid(456);
421 ProfilingDynamicGuid eventGuid(0);
422 BOOST_CHECK_NO_THROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid));
423 BOOST_CHECK(eventGuid != ProfilingGuid(0));
424
425 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000426 timelineUtilityMethods.Commit();
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000427
428 // Get the readable buffer
429 auto readableBuffer = mockBufferManager.GetReadableBuffer();
430 BOOST_CHECK(readableBuffer != nullptr);
431 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000432 BOOST_CHECK(size == 100);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000433 const unsigned char* readableData = readableBuffer->GetReadableData();
434 BOOST_CHECK(readableData != nullptr);
435
436 // Utils
437 unsigned int offset = 0;
438
Keith Davis97da5e22020-03-05 16:25:28 +0000439 // Verify Header
440 VerifyTimelineHeaderBinary(readableData, offset, 92);
441
442 // First dataset sent: TimelineEntityBinaryPacket
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000443 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
444
Keith Davis97da5e22020-03-05 16:25:28 +0000445 // Second dataset sent: TimelineRelationshipBinaryPacket
446 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
447 EmptyOptional(),
448 entityGuid,
449 EmptyOptional(),
450 readableData,
451 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000452
Keith Davis97da5e22020-03-05 16:25:28 +0000453 // Third dataset sent: TimelineRelationshipBinaryPacket
454 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
455 EmptyOptional(),
456 eventGuid,
457 eventClassGuid,
458 readableData,
459 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000460
461 // Mark the buffer as read
462 mockBufferManager.MarkRead(readableBuffer);
463}
464
Matteo Martincigh830101c2019-10-22 11:07:45 +0100465BOOST_AUTO_TEST_SUITE_END()