blob: 5c738b670f4a48e6a33804a35072b0017759f88d [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);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000083 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +000084 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000085
86 BOOST_CHECK_NO_THROW(timelineUtilityMethods.SendWellKnownLabelsAndEventClasses());
87
88 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000089 timelineUtilityMethods.Commit();
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000090
91 // Get the readable buffer
92 auto readableBuffer = mockBufferManager.GetReadableBuffer();
93 BOOST_CHECK(readableBuffer != nullptr);
94 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +000095 BOOST_TEST(size == 300);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000096 const unsigned char* readableData = readableBuffer->GetReadableData();
97 BOOST_CHECK(readableData != nullptr);
98
99 // Utils
100 unsigned int offset = 0;
101
Keith Davis97da5e22020-03-05 16:25:28 +0000102 // Verify Header
103 VerifyTimelineHeaderBinary(readableData, offset, 292);
104
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000105 // First "well-known" label: NAME
Keith Davis97da5e22020-03-05 16:25:28 +0000106 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NAME_GUID,
107 LabelsAndEventClasses::NAME_LABEL,
108 readableData,
109 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000110
111 // Second "well-known" label: TYPE
Keith Davis97da5e22020-03-05 16:25:28 +0000112 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::TYPE_GUID,
113 LabelsAndEventClasses::TYPE_LABEL,
114 readableData,
115 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000116
117 // Third "well-known" label: INDEX
Keith Davis97da5e22020-03-05 16:25:28 +0000118 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INDEX_GUID,
119 LabelsAndEventClasses::INDEX_LABEL,
120 readableData,
121 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000122
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000123 // Forth "well-known" label: BACKENDID
Keith Davis97da5e22020-03-05 16:25:28 +0000124 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::BACKENDID_GUID,
125 LabelsAndEventClasses::BACKENDID_LABEL,
126 readableData,
127 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000128
129 // Well-known types
130 // Layer
Keith Davis97da5e22020-03-05 16:25:28 +0000131 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID,
132 LabelsAndEventClasses::LAYER,
133 readableData,
134 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000135
136 // Workload
Keith Davis97da5e22020-03-05 16:25:28 +0000137 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID,
138 LabelsAndEventClasses::WORKLOAD,
139 readableData,
140 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000141
142 // Network
Keith Davis97da5e22020-03-05 16:25:28 +0000143 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID,
144 LabelsAndEventClasses::NETWORK,
145 readableData,
146 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000147
148 // Connection
Keith Davis97da5e22020-03-05 16:25:28 +0000149 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID,
150 LabelsAndEventClasses::CONNECTION,
151 readableData,
152 offset);
153
David Monahan6198fe02019-12-02 08:35:43 +0000154 // Inference
Keith Davis97da5e22020-03-05 16:25:28 +0000155 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID,
156 LabelsAndEventClasses::INFERENCE,
157 readableData,
158 offset);
159
David Monahan6198fe02019-12-02 08:35:43 +0000160 // Workload Execution
Keith Davis97da5e22020-03-05 16:25:28 +0000161 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
162 LabelsAndEventClasses::WORKLOAD_EXECUTION,
163 readableData,
164 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000165
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000166 // First "well-known" event class: START OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000167 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
168 readableData,
169 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000170
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000171 // Second "well-known" event class: END OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000172 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
173 readableData,
174 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000175
176 // Mark the buffer as read
177 mockBufferManager.MarkRead(readableBuffer);
178}
179
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000180BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest)
181{
182 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000183 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000184 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000185 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000186
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000187 ProfilingDynamicGuid childEntityGuid(0);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000188 ProfilingGuid parentEntityGuid(123);
189 const std::string entityName = "some entity";
190 const std::string entityType = "some type";
191
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000192 // 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 +0000193 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000194
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000195 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, "", entityType),
196 InvalidArgumentException);
197 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, entityName, ""),
198 InvalidArgumentException);
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000199 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
200 childEntityGuid, parentEntityGuid, "", entityType), InvalidArgumentException);
201 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
202 childEntityGuid, parentEntityGuid, entityName, ""), InvalidArgumentException);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000203
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000204 BOOST_CHECK_NO_THROW(childEntityGuid = timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid,
205 entityName,
206 entityType));
207 BOOST_CHECK(childEntityGuid != ProfilingGuid(0));
208
209 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000210 timelineUtilityMethods.Commit();
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000211
212 // Get the readable buffer
213 auto readableBuffer = mockBufferManager.GetReadableBuffer();
214 BOOST_CHECK(readableBuffer != nullptr);
215 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000216 BOOST_CHECK(size == 236);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000217 const unsigned char* readableData = readableBuffer->GetReadableData();
218 BOOST_CHECK(readableData != nullptr);
219
220 // Utils
221 unsigned int offset = 0;
222
Keith Davis97da5e22020-03-05 16:25:28 +0000223 // Verify Header
224 VerifyTimelineHeaderBinary(readableData, offset, 228);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000225
Keith Davis97da5e22020-03-05 16:25:28 +0000226 // First dataset sent: TimelineEntityBinaryPacket
227 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000228
Keith Davis97da5e22020-03-05 16:25:28 +0000229 // Second dataset sent: TimelineLabelBinaryPacket
230 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000231
Keith Davis97da5e22020-03-05 16:25:28 +0000232 // Third dataset sent: TimelineRelationshipBinaryPacket
233 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
234 EmptyOptional(),
235 EmptyOptional(),
236 EmptyOptional(),
237 readableData,
238 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000239
Keith Davis97da5e22020-03-05 16:25:28 +0000240 // Fourth dataset sent: TimelineRelationshipBinaryPacket
241 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
242 EmptyOptional(),
243 EmptyOptional(),
244 LabelsAndEventClasses::NAME_GUID,
245 readableData,
246 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000247
Keith Davis97da5e22020-03-05 16:25:28 +0000248 // Fifth dataset sent: TimelineLabelBinaryPacket
249 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000250
Keith Davis97da5e22020-03-05 16:25:28 +0000251 // Sixth dataset sent: TimelineRelationshipBinaryPacket
252 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
253 EmptyOptional(),
254 EmptyOptional(),
255 EmptyOptional(),
256 readableData,
257 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000258
Keith Davis97da5e22020-03-05 16:25:28 +0000259 // Seventh dataset sent: TimelineRelationshipBinaryPacket
260 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
261 EmptyOptional(),
262 EmptyOptional(),
263 LabelsAndEventClasses::TYPE_GUID,
264 readableData,
265 offset);
266
267 // Eighth dataset sent: TimelineRelationshipBinaryPacket
268 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
269 EmptyOptional(),
270 parentEntityGuid,
271 EmptyOptional(),
272 readableData,
273 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000274
275 // Mark the buffer as read
276 mockBufferManager.MarkRead(readableBuffer);
277}
278
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000279BOOST_AUTO_TEST_CASE(DeclareLabelTest)
Matteo Martincigh830101c2019-10-22 11:07:45 +0100280{
281 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000282 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000283 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000284 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100285
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000286 // 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 +0000287 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000288
Matteo Martincigh830101c2019-10-22 11:07:45 +0100289 // Try declaring an invalid (empty) label
290 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel(""), InvalidArgumentException);
291
292 // Try declaring an invalid (wrong SWTrace format) label
293 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), RuntimeException);
294
295 // Declare a valid label
296 const std::string labelName = "valid label";
297 ProfilingGuid labelGuid = 0;
298 BOOST_CHECK_NO_THROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000299 BOOST_CHECK(labelGuid != ProfilingGuid(0));
Matteo Martincigh830101c2019-10-22 11:07:45 +0100300
Matteo Martincigh830101c2019-10-22 11:07:45 +0100301 // Try adding the same label as before
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000302 ProfilingGuid newLabelGuid = 0;
303 BOOST_CHECK_NO_THROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName));
304 BOOST_CHECK(newLabelGuid != ProfilingGuid(0));
305 BOOST_CHECK(newLabelGuid == labelGuid);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100306}
307
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000308BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest)
309{
310 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000311 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000312 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000313 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000314
315 // Invalid name
316 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), InvalidArgumentException);
317
318 // Invalid type
319 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), InvalidArgumentException);
320
Sadik Armagan3184c902020-03-18 10:57:30 +0000321 ProfilingDynamicGuid guid = profilingService.NextGuid();
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000322
323 // CreatedNamedTypedEntity with Guid - Invalid name
324 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"),
325 InvalidArgumentException);
326
327 // CreatedNamedTypedEntity with Guid - Invalid type
328 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""),
329 InvalidArgumentException);
330
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000331}
332
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000333BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest)
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000334{
335 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000336 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000337 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000338 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000339
340 const std::string entityName = "Entity0";
341 const std::string entityType = "Type0";
342
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000343 // 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 +0000344 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000345
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000346 ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType);
347 BOOST_CHECK(guid != ProfilingGuid(0));
348
349 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000350 timelineUtilityMethods.Commit();
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000351
352 // Get the readable buffer
353 auto readableBuffer = mockBufferManager.GetReadableBuffer();
354 BOOST_CHECK(readableBuffer != nullptr);
355 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000356 BOOST_CHECK(size == 196);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000357 const unsigned char* readableData = readableBuffer->GetReadableData();
358 BOOST_CHECK(readableData != nullptr);
359
360 // Utils
361 unsigned int offset = 0;
362
Keith Davis97da5e22020-03-05 16:25:28 +0000363 // Verify Header
364 VerifyTimelineHeaderBinary(readableData, offset, 188);
365
366 // First dataset sent: TimelineEntityBinaryPacket
367 VerifyTimelineEntityBinaryPacketData(guid, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000368
369 // Packets for Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000370 // First dataset sent: TimelineLabelBinaryPacket
371 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000372
Keith Davis97da5e22020-03-05 16:25:28 +0000373 // Second dataset sent: TimelineRelationshipBinaryPacket
374 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
375 EmptyOptional(),
376 EmptyOptional(),
377 EmptyOptional(),
378 readableData,
379 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000380
Keith Davis97da5e22020-03-05 16:25:28 +0000381 // Third dataset sent: TimelineRelationshipBinaryPacket
382 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
383 EmptyOptional(),
384 EmptyOptional(),
385 LabelsAndEventClasses::NAME_GUID,
386 readableData,
387 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000388
389 // Packets for Type Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000390 // First dataset sent: TimelineLabelBinaryPacket
391 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000392
Keith Davis97da5e22020-03-05 16:25:28 +0000393 // Second dataset sent: TimelineRelationshipBinaryPacket
394 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
395 EmptyOptional(),
396 EmptyOptional(),
397 EmptyOptional(),
398 readableData,
399 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000400
Keith Davis97da5e22020-03-05 16:25:28 +0000401 // Third dataset sent: TimelineRelationshipBinaryPacket
402 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
403 EmptyOptional(),
404 EmptyOptional(),
405 LabelsAndEventClasses::TYPE_GUID,
406 readableData,
407 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000408
409 // Mark the buffer as read
410 mockBufferManager.MarkRead(readableBuffer);
411}
412
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000413BOOST_AUTO_TEST_CASE(RecordEventTest)
414{
415 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000416 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000417 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000418 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000419 // 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 +0000420 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000421
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000422 ProfilingGuid entityGuid(123);
423 ProfilingStaticGuid eventClassGuid(456);
424 ProfilingDynamicGuid eventGuid(0);
425 BOOST_CHECK_NO_THROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid));
426 BOOST_CHECK(eventGuid != ProfilingGuid(0));
427
428 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000429 timelineUtilityMethods.Commit();
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000430
431 // Get the readable buffer
432 auto readableBuffer = mockBufferManager.GetReadableBuffer();
433 BOOST_CHECK(readableBuffer != nullptr);
434 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000435 BOOST_CHECK(size == 100);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000436 const unsigned char* readableData = readableBuffer->GetReadableData();
437 BOOST_CHECK(readableData != nullptr);
438
439 // Utils
440 unsigned int offset = 0;
441
Keith Davis97da5e22020-03-05 16:25:28 +0000442 // Verify Header
443 VerifyTimelineHeaderBinary(readableData, offset, 92);
444
445 // First dataset sent: TimelineEntityBinaryPacket
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000446 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
447
Keith Davis97da5e22020-03-05 16:25:28 +0000448 // Second dataset sent: TimelineRelationshipBinaryPacket
449 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
450 EmptyOptional(),
451 entityGuid,
452 EmptyOptional(),
453 readableData,
454 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000455
Keith Davis97da5e22020-03-05 16:25:28 +0000456 // Third dataset sent: TimelineRelationshipBinaryPacket
457 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
458 EmptyOptional(),
459 eventGuid,
460 eventClassGuid,
461 readableData,
462 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000463
464 // Mark the buffer as read
465 mockBufferManager.MarkRead(readableBuffer);
466}
467
Matteo Martincigh830101c2019-10-22 11:07:45 +0100468BOOST_AUTO_TEST_SUITE_END()