blob: 8fd8c369f4e51a467031cac1b2a386c63a09da67 [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();
Finn Williams0a336dc2020-05-11 15:39:58 +010047 BOOST_CHECK(size == 76);
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
Finn Williams0a336dc2020-05-11 15:39:58 +010055 VerifyTimelineHeaderBinary(readableData, offset, 68);
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(),
Keith Davis97da5e22020-03-05 16:25:28 +000065 labelTypeGuid,
66 readableData,
67 offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000068
69 // Mark the buffer as read
70 mockBufferManager.MarkRead(readableBuffer);
71}
72
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000073BOOST_AUTO_TEST_CASE(SendWellKnownLabelsAndEventClassesTest)
74{
75 MockBufferManager mockBufferManager(1024);
Finn Williamscf2ad552020-03-20 15:10:59 +000076 ProfilingService profilingService;
77 SendTimelinePacket sendTimelinePacket(mockBufferManager);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000078
Finn Williamscf2ad552020-03-20 15:10:59 +000079 BOOST_CHECK_NO_THROW(TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses(sendTimelinePacket));
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000080
81 // Get the readable buffer
82 auto readableBuffer = mockBufferManager.GetReadableBuffer();
83 BOOST_CHECK(readableBuffer != nullptr);
84 unsigned int size = readableBuffer->GetSize();
Keith Davis97da5e22020-03-05 16:25:28 +000085 BOOST_TEST(size == 300);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000086 const unsigned char* readableData = readableBuffer->GetReadableData();
87 BOOST_CHECK(readableData != nullptr);
88
89 // Utils
90 unsigned int offset = 0;
91
Keith Davis97da5e22020-03-05 16:25:28 +000092 // Verify Header
93 VerifyTimelineHeaderBinary(readableData, offset, 292);
94
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000095 // First "well-known" label: NAME
Keith Davis97da5e22020-03-05 16:25:28 +000096 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NAME_GUID,
97 LabelsAndEventClasses::NAME_LABEL,
98 readableData,
99 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000100
101 // Second "well-known" label: TYPE
Keith Davis97da5e22020-03-05 16:25:28 +0000102 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::TYPE_GUID,
103 LabelsAndEventClasses::TYPE_LABEL,
104 readableData,
105 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000106
107 // Third "well-known" label: INDEX
Keith Davis97da5e22020-03-05 16:25:28 +0000108 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INDEX_GUID,
109 LabelsAndEventClasses::INDEX_LABEL,
110 readableData,
111 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000112
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000113 // Forth "well-known" label: BACKENDID
Keith Davis97da5e22020-03-05 16:25:28 +0000114 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::BACKENDID_GUID,
115 LabelsAndEventClasses::BACKENDID_LABEL,
116 readableData,
117 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000118
119 // Well-known types
120 // Layer
Keith Davis97da5e22020-03-05 16:25:28 +0000121 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID,
122 LabelsAndEventClasses::LAYER,
123 readableData,
124 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000125
126 // Workload
Keith Davis97da5e22020-03-05 16:25:28 +0000127 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID,
128 LabelsAndEventClasses::WORKLOAD,
129 readableData,
130 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000131
132 // Network
Keith Davis97da5e22020-03-05 16:25:28 +0000133 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID,
134 LabelsAndEventClasses::NETWORK,
135 readableData,
136 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000137
138 // Connection
Keith Davis97da5e22020-03-05 16:25:28 +0000139 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID,
140 LabelsAndEventClasses::CONNECTION,
141 readableData,
142 offset);
143
David Monahan6198fe02019-12-02 08:35:43 +0000144 // Inference
Keith Davis97da5e22020-03-05 16:25:28 +0000145 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID,
146 LabelsAndEventClasses::INFERENCE,
147 readableData,
148 offset);
149
David Monahan6198fe02019-12-02 08:35:43 +0000150 // Workload Execution
Keith Davis97da5e22020-03-05 16:25:28 +0000151 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
152 LabelsAndEventClasses::WORKLOAD_EXECUTION,
153 readableData,
154 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000155
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000156 // First "well-known" event class: START OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000157 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
158 readableData,
159 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000160
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000161 // Second "well-known" event class: END OF LIFE
Keith Davis97da5e22020-03-05 16:25:28 +0000162 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
163 readableData,
164 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000165
166 // Mark the buffer as read
167 mockBufferManager.MarkRead(readableBuffer);
168}
169
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000170BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest)
171{
172 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000173 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000174 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000175 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000176
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000177 ProfilingDynamicGuid childEntityGuid(0);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000178 ProfilingGuid parentEntityGuid(123);
179 const std::string entityName = "some entity";
180 const std::string entityType = "some type";
181
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000182 // 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 +0000183 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000184
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000185 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, "", entityType),
186 InvalidArgumentException);
187 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, entityName, ""),
188 InvalidArgumentException);
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000189 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
190 childEntityGuid, parentEntityGuid, "", entityType), InvalidArgumentException);
191 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
192 childEntityGuid, parentEntityGuid, entityName, ""), InvalidArgumentException);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000193
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000194 BOOST_CHECK_NO_THROW(childEntityGuid = timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid,
195 entityName,
196 entityType));
197 BOOST_CHECK(childEntityGuid != ProfilingGuid(0));
198
199 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000200 timelineUtilityMethods.Commit();
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000201
202 // Get the readable buffer
203 auto readableBuffer = mockBufferManager.GetReadableBuffer();
204 BOOST_CHECK(readableBuffer != nullptr);
205 unsigned int size = readableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100206 BOOST_CHECK(size == 196);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000207 const unsigned char* readableData = readableBuffer->GetReadableData();
208 BOOST_CHECK(readableData != nullptr);
209
210 // Utils
211 unsigned int offset = 0;
212
Keith Davis97da5e22020-03-05 16:25:28 +0000213 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100214 VerifyTimelineHeaderBinary(readableData, offset, 188);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000215
Keith Davis97da5e22020-03-05 16:25:28 +0000216 // First dataset sent: TimelineEntityBinaryPacket
217 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000218
Keith Davis97da5e22020-03-05 16:25:28 +0000219 // Second dataset sent: TimelineLabelBinaryPacket
220 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000221
Keith Davis97da5e22020-03-05 16:25:28 +0000222 // Third dataset sent: TimelineRelationshipBinaryPacket
223 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
224 EmptyOptional(),
225 EmptyOptional(),
226 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000227 LabelsAndEventClasses::NAME_GUID,
228 readableData,
229 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000230
Keith Davis97da5e22020-03-05 16:25:28 +0000231 // Fifth dataset sent: TimelineLabelBinaryPacket
232 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000233
Keith Davis97da5e22020-03-05 16:25:28 +0000234 // Sixth dataset sent: TimelineRelationshipBinaryPacket
235 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
236 EmptyOptional(),
237 EmptyOptional(),
238 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000239 LabelsAndEventClasses::TYPE_GUID,
240 readableData,
241 offset);
242
Finn Williams0a336dc2020-05-11 15:39:58 +0100243
Keith Davis97da5e22020-03-05 16:25:28 +0000244 // Eighth dataset sent: TimelineRelationshipBinaryPacket
245 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
246 EmptyOptional(),
247 parentEntityGuid,
248 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100249 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000250 readableData,
251 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000252
253 // Mark the buffer as read
254 mockBufferManager.MarkRead(readableBuffer);
255}
256
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000257BOOST_AUTO_TEST_CASE(DeclareLabelTest)
Matteo Martincigh830101c2019-10-22 11:07:45 +0100258{
259 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000260 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000261 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000262 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100263
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000264 // 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 +0000265 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000266
Matteo Martincigh830101c2019-10-22 11:07:45 +0100267 // Try declaring an invalid (empty) label
268 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel(""), InvalidArgumentException);
269
270 // Try declaring an invalid (wrong SWTrace format) label
271 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), RuntimeException);
272
273 // Declare a valid label
274 const std::string labelName = "valid label";
275 ProfilingGuid labelGuid = 0;
276 BOOST_CHECK_NO_THROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000277 BOOST_CHECK(labelGuid != ProfilingGuid(0));
Matteo Martincigh830101c2019-10-22 11:07:45 +0100278
Matteo Martincigh830101c2019-10-22 11:07:45 +0100279 // Try adding the same label as before
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000280 ProfilingGuid newLabelGuid = 0;
281 BOOST_CHECK_NO_THROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName));
282 BOOST_CHECK(newLabelGuid != ProfilingGuid(0));
283 BOOST_CHECK(newLabelGuid == labelGuid);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100284}
285
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000286BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest)
287{
288 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000289 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000290 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000291 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000292
293 // Invalid name
294 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), InvalidArgumentException);
295
296 // Invalid type
297 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), InvalidArgumentException);
298
Sadik Armagan3184c902020-03-18 10:57:30 +0000299 ProfilingDynamicGuid guid = profilingService.NextGuid();
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000300
301 // CreatedNamedTypedEntity with Guid - Invalid name
302 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"),
303 InvalidArgumentException);
304
305 // CreatedNamedTypedEntity with Guid - Invalid type
306 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""),
307 InvalidArgumentException);
308
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000309}
310
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000311BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest)
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000312{
313 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000314 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000315 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000316 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000317
318 const std::string entityName = "Entity0";
319 const std::string entityType = "Type0";
320
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000321 // 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 +0000322 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000323
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000324 ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType);
325 BOOST_CHECK(guid != ProfilingGuid(0));
326
327 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000328 timelineUtilityMethods.Commit();
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000329
330 // Get the readable buffer
331 auto readableBuffer = mockBufferManager.GetReadableBuffer();
332 BOOST_CHECK(readableBuffer != nullptr);
333 unsigned int size = readableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100334 BOOST_CHECK(size == 148);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000335 const unsigned char* readableData = readableBuffer->GetReadableData();
336 BOOST_CHECK(readableData != nullptr);
337
338 // Utils
339 unsigned int offset = 0;
340
Keith Davis97da5e22020-03-05 16:25:28 +0000341 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100342 VerifyTimelineHeaderBinary(readableData, offset, 140);
Keith Davis97da5e22020-03-05 16:25:28 +0000343
344 // First dataset sent: TimelineEntityBinaryPacket
345 VerifyTimelineEntityBinaryPacketData(guid, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000346
347 // Packets for Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000348 // First dataset sent: TimelineLabelBinaryPacket
349 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000350
Keith Davis97da5e22020-03-05 16:25:28 +0000351 // Second dataset sent: TimelineRelationshipBinaryPacket
352 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
353 EmptyOptional(),
354 EmptyOptional(),
355 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000356 LabelsAndEventClasses::NAME_GUID,
357 readableData,
358 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000359
360 // Packets for Type Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000361 // First dataset sent: TimelineLabelBinaryPacket
362 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000363
Keith Davis97da5e22020-03-05 16:25:28 +0000364 // Second dataset sent: TimelineRelationshipBinaryPacket
365 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
366 EmptyOptional(),
367 EmptyOptional(),
368 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000369 LabelsAndEventClasses::TYPE_GUID,
370 readableData,
371 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000372
Finn Williams0a336dc2020-05-11 15:39:58 +0100373
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000374 // Mark the buffer as read
375 mockBufferManager.MarkRead(readableBuffer);
376}
377
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000378BOOST_AUTO_TEST_CASE(RecordEventTest)
379{
380 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000381 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000382 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000383 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000384 // 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 +0000385 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000386
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000387 ProfilingGuid entityGuid(123);
388 ProfilingStaticGuid eventClassGuid(456);
389 ProfilingDynamicGuid eventGuid(0);
390 BOOST_CHECK_NO_THROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid));
391 BOOST_CHECK(eventGuid != ProfilingGuid(0));
392
393 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000394 timelineUtilityMethods.Commit();
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000395
396 // Get the readable buffer
397 auto readableBuffer = mockBufferManager.GetReadableBuffer();
398 BOOST_CHECK(readableBuffer != nullptr);
399 unsigned int size = readableBuffer->GetSize();
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100400
Finn Williams0a336dc2020-05-11 15:39:58 +0100401 BOOST_CHECK(size == 68 + ThreadIdSize);
Jan Eilersa10e2a22020-03-26 12:04:54 +0000402
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000403 const unsigned char* readableData = readableBuffer->GetReadableData();
404 BOOST_CHECK(readableData != nullptr);
405
406 // Utils
407 unsigned int offset = 0;
408
Keith Davis97da5e22020-03-05 16:25:28 +0000409 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100410 VerifyTimelineHeaderBinary(readableData, offset, 60 + ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000411
412 // First dataset sent: TimelineEntityBinaryPacket
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000413 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
414
Keith Davis97da5e22020-03-05 16:25:28 +0000415 // Second dataset sent: TimelineRelationshipBinaryPacket
416 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
417 EmptyOptional(),
418 entityGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000419 eventGuid,
420 eventClassGuid,
421 readableData,
422 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000423
424 // Mark the buffer as read
425 mockBufferManager.MarkRead(readableBuffer);
426}
427
Matteo Martincigh830101c2019-10-22 11:07:45 +0100428BOOST_AUTO_TEST_SUITE_END()