blob: 720b8b4f02e58297ed1fc0e3522712dea37ff548 [file] [log] [blame]
Matteo Martincigh830101c2019-10-22 11:07:45 +01001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Matteo Martincigh830101c2019-10-22 11:07:45 +01003// 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();
Jim Flynn6398a982020-05-27 17:05:21 +010085 BOOST_TEST(size == 432);
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
Jim Flynn6398a982020-05-27 17:05:21 +010093 VerifyTimelineHeaderBinary(readableData, offset, 424);
Keith Davis97da5e22020-03-05 16:25:28 +000094
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
Jim Flynn6398a982020-05-27 17:05:21 +0100119 // Fifth "well-known" label: CHILD
120 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CHILD_GUID,
121 LabelsAndEventClasses::CHILD_LABEL,
122 readableData,
123 offset);
124
125 // Sixth "well-known" label: EXECUTION_OF
126 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::EXECUTION_OF_GUID,
127 LabelsAndEventClasses::EXECUTION_OF_LABEL,
128 readableData,
129 offset);
130
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000131 // Well-known types
132 // Layer
Keith Davis97da5e22020-03-05 16:25:28 +0000133 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID,
134 LabelsAndEventClasses::LAYER,
135 readableData,
136 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000137
138 // Workload
Keith Davis97da5e22020-03-05 16:25:28 +0000139 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID,
140 LabelsAndEventClasses::WORKLOAD,
141 readableData,
142 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000143
144 // Network
Keith Davis97da5e22020-03-05 16:25:28 +0000145 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID,
146 LabelsAndEventClasses::NETWORK,
147 readableData,
148 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000149
150 // Connection
Keith Davis97da5e22020-03-05 16:25:28 +0000151 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID,
152 LabelsAndEventClasses::CONNECTION,
153 readableData,
154 offset);
155
David Monahan6198fe02019-12-02 08:35:43 +0000156 // Inference
Keith Davis97da5e22020-03-05 16:25:28 +0000157 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID,
158 LabelsAndEventClasses::INFERENCE,
159 readableData,
160 offset);
161
David Monahan6198fe02019-12-02 08:35:43 +0000162 // Workload Execution
Keith Davis97da5e22020-03-05 16:25:28 +0000163 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
164 LabelsAndEventClasses::WORKLOAD_EXECUTION,
165 readableData,
166 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000167
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000168 // First "well-known" event class: START OF LIFE
Jim Flynn1892d212020-05-26 21:10:49 +0100169 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUID,
170 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME,
171 readableData,
172 offset);
173
Keith Davis97da5e22020-03-05 16:25:28 +0000174 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
Jim Flynn1892d212020-05-26 21:10:49 +0100175 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000176 readableData,
177 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000178
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000179 // Second "well-known" event class: END OF LIFE
Jim Flynn1892d212020-05-26 21:10:49 +0100180 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUID,
181 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME,
182 readableData,
183 offset);
184
Keith Davis97da5e22020-03-05 16:25:28 +0000185 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
Jim Flynn1892d212020-05-26 21:10:49 +0100186 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000187 readableData,
188 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000189
190 // Mark the buffer as read
191 mockBufferManager.MarkRead(readableBuffer);
192}
193
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000194BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest)
195{
196 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000197 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000198 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000199 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000200
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000201 ProfilingDynamicGuid childEntityGuid(0);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000202 ProfilingGuid parentEntityGuid(123);
203 const std::string entityName = "some entity";
204 const std::string entityType = "some type";
205
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000206 // 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 +0000207 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000208
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000209 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, "", entityType),
210 InvalidArgumentException);
211 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, entityName, ""),
212 InvalidArgumentException);
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000213 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
214 childEntityGuid, parentEntityGuid, "", entityType), InvalidArgumentException);
215 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedChildEntity(
216 childEntityGuid, parentEntityGuid, entityName, ""), InvalidArgumentException);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000217
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000218 BOOST_CHECK_NO_THROW(childEntityGuid = timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid,
219 entityName,
220 entityType));
221 BOOST_CHECK(childEntityGuid != ProfilingGuid(0));
222
223 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000224 timelineUtilityMethods.Commit();
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000225
226 // Get the readable buffer
227 auto readableBuffer = mockBufferManager.GetReadableBuffer();
228 BOOST_CHECK(readableBuffer != nullptr);
229 unsigned int size = readableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100230 BOOST_CHECK(size == 196);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000231 const unsigned char* readableData = readableBuffer->GetReadableData();
232 BOOST_CHECK(readableData != nullptr);
233
234 // Utils
235 unsigned int offset = 0;
236
Keith Davis97da5e22020-03-05 16:25:28 +0000237 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100238 VerifyTimelineHeaderBinary(readableData, offset, 188);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000239
Keith Davis97da5e22020-03-05 16:25:28 +0000240 // First dataset sent: TimelineEntityBinaryPacket
241 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000242
Keith Davis97da5e22020-03-05 16:25:28 +0000243 // Second dataset sent: TimelineLabelBinaryPacket
244 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000245
Keith Davis97da5e22020-03-05 16:25:28 +0000246 // Third dataset sent: TimelineRelationshipBinaryPacket
247 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
248 EmptyOptional(),
249 EmptyOptional(),
250 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000251 LabelsAndEventClasses::NAME_GUID,
252 readableData,
253 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000254
Keith Davis97da5e22020-03-05 16:25:28 +0000255 // Fifth dataset sent: TimelineLabelBinaryPacket
256 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000257
Keith Davis97da5e22020-03-05 16:25:28 +0000258 // Sixth dataset sent: TimelineRelationshipBinaryPacket
259 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
260 EmptyOptional(),
261 EmptyOptional(),
262 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000263 LabelsAndEventClasses::TYPE_GUID,
264 readableData,
265 offset);
266
Finn Williams0a336dc2020-05-11 15:39:58 +0100267
Keith Davis97da5e22020-03-05 16:25:28 +0000268 // Eighth dataset sent: TimelineRelationshipBinaryPacket
269 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
270 EmptyOptional(),
271 parentEntityGuid,
272 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100273 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000274 readableData,
275 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000276
277 // Mark the buffer as read
278 mockBufferManager.MarkRead(readableBuffer);
279}
280
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000281BOOST_AUTO_TEST_CASE(DeclareLabelTest)
Matteo Martincigh830101c2019-10-22 11:07:45 +0100282{
283 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000284 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000285 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000286 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100287
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000288 // 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 +0000289 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000290
Matteo Martincigh830101c2019-10-22 11:07:45 +0100291 // Try declaring an invalid (empty) label
292 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel(""), InvalidArgumentException);
293
294 // Try declaring an invalid (wrong SWTrace format) label
295 BOOST_CHECK_THROW(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), RuntimeException);
296
297 // Declare a valid label
298 const std::string labelName = "valid label";
299 ProfilingGuid labelGuid = 0;
300 BOOST_CHECK_NO_THROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName));
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000301 BOOST_CHECK(labelGuid != ProfilingGuid(0));
Matteo Martincigh830101c2019-10-22 11:07:45 +0100302
Matteo Martincigh830101c2019-10-22 11:07:45 +0100303 // Try adding the same label as before
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000304 ProfilingGuid newLabelGuid = 0;
305 BOOST_CHECK_NO_THROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName));
306 BOOST_CHECK(newLabelGuid != ProfilingGuid(0));
307 BOOST_CHECK(newLabelGuid == labelGuid);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100308}
309
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000310BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest)
311{
312 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000313 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000314 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000315 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000316
317 // Invalid name
318 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), InvalidArgumentException);
319
320 // Invalid type
321 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), InvalidArgumentException);
322
Sadik Armagan3184c902020-03-18 10:57:30 +0000323 ProfilingDynamicGuid guid = profilingService.NextGuid();
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000324
325 // CreatedNamedTypedEntity with Guid - Invalid name
326 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"),
327 InvalidArgumentException);
328
329 // CreatedNamedTypedEntity with Guid - Invalid type
330 BOOST_CHECK_THROW(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""),
331 InvalidArgumentException);
332
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000333}
334
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000335BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest)
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000336{
337 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000338 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000339 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000340 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000341
342 const std::string entityName = "Entity0";
343 const std::string entityType = "Type0";
344
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000345 // 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 +0000346 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000347
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000348 ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType);
349 BOOST_CHECK(guid != ProfilingGuid(0));
350
351 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000352 timelineUtilityMethods.Commit();
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000353
354 // Get the readable buffer
355 auto readableBuffer = mockBufferManager.GetReadableBuffer();
356 BOOST_CHECK(readableBuffer != nullptr);
357 unsigned int size = readableBuffer->GetSize();
Finn Williams0a336dc2020-05-11 15:39:58 +0100358 BOOST_CHECK(size == 148);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000359 const unsigned char* readableData = readableBuffer->GetReadableData();
360 BOOST_CHECK(readableData != nullptr);
361
362 // Utils
363 unsigned int offset = 0;
364
Keith Davis97da5e22020-03-05 16:25:28 +0000365 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100366 VerifyTimelineHeaderBinary(readableData, offset, 140);
Keith Davis97da5e22020-03-05 16:25:28 +0000367
368 // First dataset sent: TimelineEntityBinaryPacket
369 VerifyTimelineEntityBinaryPacketData(guid, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000370
371 // Packets for Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000372 // First dataset sent: TimelineLabelBinaryPacket
373 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000374
Keith Davis97da5e22020-03-05 16:25:28 +0000375 // Second dataset sent: TimelineRelationshipBinaryPacket
376 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
377 EmptyOptional(),
378 EmptyOptional(),
379 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000380 LabelsAndEventClasses::NAME_GUID,
381 readableData,
382 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000383
384 // Packets for Type Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000385 // First dataset sent: TimelineLabelBinaryPacket
386 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000387
Keith Davis97da5e22020-03-05 16:25:28 +0000388 // Second dataset sent: TimelineRelationshipBinaryPacket
389 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
390 EmptyOptional(),
391 EmptyOptional(),
392 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000393 LabelsAndEventClasses::TYPE_GUID,
394 readableData,
395 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000396
Finn Williams0a336dc2020-05-11 15:39:58 +0100397
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000398 // Mark the buffer as read
399 mockBufferManager.MarkRead(readableBuffer);
400}
401
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000402BOOST_AUTO_TEST_CASE(RecordEventTest)
403{
404 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000405 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000406 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000407 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000408 // 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 +0000409 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000410
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000411 ProfilingGuid entityGuid(123);
412 ProfilingStaticGuid eventClassGuid(456);
413 ProfilingDynamicGuid eventGuid(0);
414 BOOST_CHECK_NO_THROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid));
415 BOOST_CHECK(eventGuid != ProfilingGuid(0));
416
417 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000418 timelineUtilityMethods.Commit();
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000419
420 // Get the readable buffer
421 auto readableBuffer = mockBufferManager.GetReadableBuffer();
422 BOOST_CHECK(readableBuffer != nullptr);
423 unsigned int size = readableBuffer->GetSize();
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100424
Finn Williams0a336dc2020-05-11 15:39:58 +0100425 BOOST_CHECK(size == 68 + ThreadIdSize);
Jan Eilersa10e2a22020-03-26 12:04:54 +0000426
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000427 const unsigned char* readableData = readableBuffer->GetReadableData();
428 BOOST_CHECK(readableData != nullptr);
429
430 // Utils
431 unsigned int offset = 0;
432
Keith Davis97da5e22020-03-05 16:25:28 +0000433 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100434 VerifyTimelineHeaderBinary(readableData, offset, 60 + ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000435
436 // First dataset sent: TimelineEntityBinaryPacket
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000437 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
438
Keith Davis97da5e22020-03-05 16:25:28 +0000439 // Second dataset sent: TimelineRelationshipBinaryPacket
440 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
441 EmptyOptional(),
442 entityGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000443 eventGuid,
444 eventClassGuid,
445 readableData,
446 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000447
448 // Mark the buffer as read
449 mockBufferManager.MarkRead(readableBuffer);
450}
451
Matteo Martincigh830101c2019-10-22 11:07:45 +0100452BOOST_AUTO_TEST_SUITE_END()