blob: fed31c3defa47a219a008779ff219a3890ab1a50 [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);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000026 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Matteo Martincighc0401992019-10-28 15:24:34 +000027 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
28
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000029 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
30 ProfilingService::Instance().NextGuid();
31
Matteo Martincighc0401992019-10-28 15:24:34 +000032 ProfilingGuid entityGuid(123);
33 const std::string entityName = "some entity";
34 ProfilingStaticGuid labelTypeGuid(456);
35
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000036 BOOST_CHECK_NO_THROW(timelineUtilityMethods.MarkEntityWithLabel(entityGuid, entityName, labelTypeGuid));
Matteo Martincighc0401992019-10-28 15:24:34 +000037
38 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000039 timelineUtilityMethods.Commit();
Matteo Martincighc0401992019-10-28 15:24:34 +000040
41 // Get the readable buffer
42 auto readableBuffer = mockBufferManager.GetReadableBuffer();
43 BOOST_CHECK(readableBuffer != nullptr);
44 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +000045 BOOST_CHECK(size == 100);
Matteo Martincighc0401992019-10-28 15:24:34 +000046 const unsigned char* readableData = readableBuffer->GetReadableData();
47 BOOST_CHECK(readableData != nullptr);
48
49 // Utils
50 unsigned int offset = 0;
51
Keith Davis97da5e22020-03-05 16:25:28 +000052 // Verify Header
53 VerifyTimelineHeaderBinary(readableData, offset, 92);
Matteo Martincighc0401992019-10-28 15:24:34 +000054
Keith Davis97da5e22020-03-05 16:25:28 +000055 // First dataset sent: TimelineLabelBinaryPacket
56 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000057
Keith Davis97da5e22020-03-05 16:25:28 +000058 // Second dataset sent: TimelineRelationshipBinaryPacket
59 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
60 EmptyOptional(),
61 entityGuid,
62 EmptyOptional(),
63 readableData,
64 offset);
65
66 // Third dataset sent: TimelineRelationshipBinaryPacket
67 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
68 EmptyOptional(),
69 EmptyOptional(),
70 labelTypeGuid,
71 readableData,
72 offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000073
74 // Mark the buffer as read
75 mockBufferManager.MarkRead(readableBuffer);
76}
77
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000078BOOST_AUTO_TEST_CASE(SendWellKnownLabelsAndEventClassesTest)
79{
80 MockBufferManager mockBufferManager(1024);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000081 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000082 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
83
84 BOOST_CHECK_NO_THROW(timelineUtilityMethods.SendWellKnownLabelsAndEventClasses());
85
86 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000087 timelineUtilityMethods.Commit();
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000088
89 // Get the readable buffer
90 auto readableBuffer = mockBufferManager.GetReadableBuffer();
91 BOOST_CHECK(readableBuffer != nullptr);
92 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +000093 BOOST_TEST(size == 300);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000094 const unsigned char* readableData = readableBuffer->GetReadableData();
95 BOOST_CHECK(readableData != nullptr);
96
97 // Utils
98 unsigned int offset = 0;
99
Keith Davis97da5e22020-03-05 16:25:28 +0000100 // Verify Header
101 VerifyTimelineHeaderBinary(readableData, offset, 292);
102
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000103 // First "well-known" label: NAME
Keith Davis97da5e22020-03-05 16:25:28 +0000104 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NAME_GUID,
105 LabelsAndEventClasses::NAME_LABEL,
106 readableData,
107 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000108
109 // Second "well-known" label: TYPE
Keith Davis97da5e22020-03-05 16:25:28 +0000110 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::TYPE_GUID,
111 LabelsAndEventClasses::TYPE_LABEL,
112 readableData,
113 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000114
115 // Third "well-known" label: INDEX
Keith Davis97da5e22020-03-05 16:25:28 +0000116 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INDEX_GUID,
117 LabelsAndEventClasses::INDEX_LABEL,
118 readableData,
119 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000120
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000121 // Forth "well-known" label: BACKENDID
Keith Davis97da5e22020-03-05 16:25:28 +0000122 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::BACKENDID_GUID,
123 LabelsAndEventClasses::BACKENDID_LABEL,
124 readableData,
125 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000126
127 // Well-known types
128 // Layer
Keith Davis97da5e22020-03-05 16:25:28 +0000129 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID,
130 LabelsAndEventClasses::LAYER,
131 readableData,
132 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000133
134 // Workload
Keith Davis97da5e22020-03-05 16:25:28 +0000135 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID,
136 LabelsAndEventClasses::WORKLOAD,
137 readableData,
138 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000139
140 // Network
Keith Davis97da5e22020-03-05 16:25:28 +0000141 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID,
142 LabelsAndEventClasses::NETWORK,
143 readableData,
144 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000145
146 // Connection
Keith Davis97da5e22020-03-05 16:25:28 +0000147 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID,
148 LabelsAndEventClasses::CONNECTION,
149 readableData,
150 offset);
151
David Monahan6198fe02019-12-02 08:35:43 +0000152 // Inference
Keith Davis97da5e22020-03-05 16:25:28 +0000153 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID,
154 LabelsAndEventClasses::INFERENCE,
155 readableData,
156 offset);
157
David Monahan6198fe02019-12-02 08:35:43 +0000158 // Workload Execution
Keith Davis97da5e22020-03-05 16:25:28 +0000159 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
160 LabelsAndEventClasses::WORKLOAD_EXECUTION,
161 readableData,
162 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000163
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000164 // First "well-known" event class: START OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000165 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
166 readableData,
167 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000168
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000169 // Second "well-known" event class: END OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000170 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
171 readableData,
172 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000173
174 // Mark the buffer as read
175 mockBufferManager.MarkRead(readableBuffer);
176}
177
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000178BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest)
179{
180 MockBufferManager mockBufferManager(1024);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000181 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000182 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
183
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.
190 ProfilingService::Instance().NextGuid();
191
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);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000279 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100280 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
281
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000282 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
283 ProfilingService::Instance().NextGuid();
284
Matteo Martincigh830101c2019-10-22 11:07:45 +0100285 // Try declaring an invalid (empty) label
286 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel(""), InvalidArgumentException);
287
288 // Try declaring an invalid (wrong SWTrace format) label
289 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), RuntimeException);
290
291 // Declare a valid label
292 const std::string labelName = "valid label";
293 ProfilingGuid labelGuid = 0;
294 BOOST_CHECK_NO_THROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000295 BOOST_CHECK(labelGuid != ProfilingGuid(0));
Matteo Martincigh830101c2019-10-22 11:07:45 +0100296
Matteo Martincigh830101c2019-10-22 11:07:45 +0100297 // Try adding the same label as before
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000298 ProfilingGuid newLabelGuid = 0;
299 BOOST_CHECK_NO_THROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName));
300 BOOST_CHECK(newLabelGuid != ProfilingGuid(0));
301 BOOST_CHECK(newLabelGuid == labelGuid);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100302}
303
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000304BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest)
305{
306 MockBufferManager mockBufferManager(1024);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000307 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000308 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
309
310 // Invalid name
311 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), InvalidArgumentException);
312
313 // Invalid type
314 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), InvalidArgumentException);
315
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000316 ProfilingDynamicGuid guid = ProfilingService::Instance().NextGuid();
317
318 // CreatedNamedTypedEntity with Guid - Invalid name
319 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"),
320 InvalidArgumentException);
321
322 // CreatedNamedTypedEntity with Guid - Invalid type
323 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""),
324 InvalidArgumentException);
325
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000326}
327
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000328BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest)
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000329{
330 MockBufferManager mockBufferManager(1024);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000331 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000332 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
333
334 const std::string entityName = "Entity0";
335 const std::string entityType = "Type0";
336
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000337 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
338 ProfilingService::Instance().NextGuid();
339
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000340 ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType);
341 BOOST_CHECK(guid != ProfilingGuid(0));
342
343 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000344 timelineUtilityMethods.Commit();
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000345
346 // Get the readable buffer
347 auto readableBuffer = mockBufferManager.GetReadableBuffer();
348 BOOST_CHECK(readableBuffer != nullptr);
349 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000350 BOOST_CHECK(size == 196);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000351 const unsigned char* readableData = readableBuffer->GetReadableData();
352 BOOST_CHECK(readableData != nullptr);
353
354 // Utils
355 unsigned int offset = 0;
356
Keith Davis97da5e22020-03-05 16:25:28 +0000357 // Verify Header
358 VerifyTimelineHeaderBinary(readableData, offset, 188);
359
360 // First dataset sent: TimelineEntityBinaryPacket
361 VerifyTimelineEntityBinaryPacketData(guid, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000362
363 // Packets for Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000364 // First dataset sent: TimelineLabelBinaryPacket
365 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000366
Keith Davis97da5e22020-03-05 16:25:28 +0000367 // Second dataset sent: TimelineRelationshipBinaryPacket
368 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
369 EmptyOptional(),
370 EmptyOptional(),
371 EmptyOptional(),
372 readableData,
373 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000374
Keith Davis97da5e22020-03-05 16:25:28 +0000375 // Third dataset sent: TimelineRelationshipBinaryPacket
376 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
377 EmptyOptional(),
378 EmptyOptional(),
379 LabelsAndEventClasses::NAME_GUID,
380 readableData,
381 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000382
383 // Packets for Type Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000384 // First dataset sent: TimelineLabelBinaryPacket
385 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000386
Keith Davis97da5e22020-03-05 16:25:28 +0000387 // Second dataset sent: TimelineRelationshipBinaryPacket
388 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
389 EmptyOptional(),
390 EmptyOptional(),
391 EmptyOptional(),
392 readableData,
393 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000394
Keith Davis97da5e22020-03-05 16:25:28 +0000395 // Third dataset sent: TimelineRelationshipBinaryPacket
396 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
397 EmptyOptional(),
398 EmptyOptional(),
399 LabelsAndEventClasses::TYPE_GUID,
400 readableData,
401 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000402
403 // Mark the buffer as read
404 mockBufferManager.MarkRead(readableBuffer);
405}
406
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000407BOOST_AUTO_TEST_CASE(RecordEventTest)
408{
409 MockBufferManager mockBufferManager(1024);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000410 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000411 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000412 // Generate first guid to ensure that the named typed entity guid is not 0 on local single test.
413 ProfilingService::Instance().NextGuid();
414
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000415 ProfilingGuid entityGuid(123);
416 ProfilingStaticGuid eventClassGuid(456);
417 ProfilingDynamicGuid eventGuid(0);
418 BOOST_CHECK_NO_THROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid));
419 BOOST_CHECK(eventGuid != ProfilingGuid(0));
420
421 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000422 timelineUtilityMethods.Commit();
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000423
424 // Get the readable buffer
425 auto readableBuffer = mockBufferManager.GetReadableBuffer();
426 BOOST_CHECK(readableBuffer != nullptr);
427 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +0000428 BOOST_CHECK(size == 100);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000429 const unsigned char* readableData = readableBuffer->GetReadableData();
430 BOOST_CHECK(readableData != nullptr);
431
432 // Utils
433 unsigned int offset = 0;
434
Keith Davis97da5e22020-03-05 16:25:28 +0000435 // Verify Header
436 VerifyTimelineHeaderBinary(readableData, offset, 92);
437
438 // First dataset sent: TimelineEntityBinaryPacket
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000439 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
440
Keith Davis97da5e22020-03-05 16:25:28 +0000441 // Second dataset sent: TimelineRelationshipBinaryPacket
442 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
443 EmptyOptional(),
444 entityGuid,
445 EmptyOptional(),
446 readableData,
447 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000448
Keith Davis97da5e22020-03-05 16:25:28 +0000449 // Third dataset sent: TimelineRelationshipBinaryPacket
450 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::DataLink,
451 EmptyOptional(),
452 eventGuid,
453 eventClassGuid,
454 readableData,
455 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000456
457 // Mark the buffer as read
458 mockBufferManager.MarkRead(readableBuffer);
459}
460
Matteo Martincigh830101c2019-10-22 11:07:45 +0100461BOOST_AUTO_TEST_SUITE_END()