blob: 47e1182a3d878cdc7685ad74a86b0be3ee9c555a [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 Martincighc0401992019-10-28 15:24:34 +000011#include <ProfilingService.hpp>
Matteo Martincigh830101c2019-10-22 11:07:45 +010012
Nikhil Raj77fe76b2021-06-09 14:55:32 +010013#include <common/include/LabelsAndEventClasses.hpp>
14
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000015#include <memory>
16
Sadik Armagan1625efc2021-06-10 18:24:34 +010017#include <doctest/doctest.h>
Matteo Martincigh830101c2019-10-22 11:07:45 +010018
19using namespace armnn;
20using namespace armnn::profiling;
21
Sadik Armagan1625efc2021-06-10 18:24:34 +010022TEST_SUITE("TimelineUtilityMethodsTests")
23{
24TEST_CASE("CreateTypedLabelTest")
Matteo Martincighc0401992019-10-28 15:24:34 +000025{
26 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +000027 ProfilingService profilingService;
28
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000029 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +000030 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincighc0401992019-10-28 15:24:34 +000031
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000032 // 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 +000033 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +000034
Matteo Martincighc0401992019-10-28 15:24:34 +000035 ProfilingGuid entityGuid(123);
36 const std::string entityName = "some entity";
37 ProfilingStaticGuid labelTypeGuid(456);
38
Sadik Armagan1625efc2021-06-10 18:24:34 +010039 CHECK_NOTHROW(timelineUtilityMethods.MarkEntityWithLabel(entityGuid, entityName, labelTypeGuid));
Matteo Martincighc0401992019-10-28 15:24:34 +000040
41 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +000042 timelineUtilityMethods.Commit();
Matteo Martincighc0401992019-10-28 15:24:34 +000043
44 // Get the readable buffer
45 auto readableBuffer = mockBufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +010046 CHECK(readableBuffer != nullptr);
Matteo Martincighc0401992019-10-28 15:24:34 +000047 unsigned int size = readableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +010048 CHECK(size == 76);
Matteo Martincighc0401992019-10-28 15:24:34 +000049 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +010050 CHECK(readableData != nullptr);
Matteo Martincighc0401992019-10-28 15:24:34 +000051
52 // Utils
53 unsigned int offset = 0;
54
Keith Davis97da5e22020-03-05 16:25:28 +000055 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +010056 VerifyTimelineHeaderBinary(readableData, offset, 68);
Matteo Martincighc0401992019-10-28 15:24:34 +000057
Keith Davis97da5e22020-03-05 16:25:28 +000058 // First dataset sent: TimelineLabelBinaryPacket
59 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000060
Keith Davis97da5e22020-03-05 16:25:28 +000061 // Second dataset sent: TimelineRelationshipBinaryPacket
62 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
63 EmptyOptional(),
64 entityGuid,
65 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +000066 labelTypeGuid,
67 readableData,
68 offset);
Matteo Martincighc0401992019-10-28 15:24:34 +000069
70 // Mark the buffer as read
71 mockBufferManager.MarkRead(readableBuffer);
72}
73
Sadik Armagan1625efc2021-06-10 18:24:34 +010074TEST_CASE("SendWellKnownLabelsAndEventClassesTest")
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000075{
76 MockBufferManager mockBufferManager(1024);
Finn Williamscf2ad552020-03-20 15:10:59 +000077 ProfilingService profilingService;
78 SendTimelinePacket sendTimelinePacket(mockBufferManager);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000079
Sadik Armagan1625efc2021-06-10 18:24:34 +010080 CHECK_NOTHROW(TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses(sendTimelinePacket));
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000081
82 // Get the readable buffer
83 auto readableBuffer = mockBufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +010084 CHECK(readableBuffer != nullptr);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000085 unsigned int size = readableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +010086 CHECK(size == 460);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000087 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +010088 CHECK(readableData != nullptr);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000089
90 // Utils
91 unsigned int offset = 0;
92
Keith Davis97da5e22020-03-05 16:25:28 +000093 // Verify Header
Jim Flynnf7713212020-07-14 09:50:59 +010094 VerifyTimelineHeaderBinary(readableData, offset, 452);
Keith Davis97da5e22020-03-05 16:25:28 +000095
Matteo Martincigh102cdbd2019-10-28 11:42:50 +000096 // First "well-known" label: NAME
Keith Davis97da5e22020-03-05 16:25:28 +000097 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NAME_GUID,
98 LabelsAndEventClasses::NAME_LABEL,
99 readableData,
100 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000101
102 // Second "well-known" label: TYPE
Keith Davis97da5e22020-03-05 16:25:28 +0000103 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::TYPE_GUID,
104 LabelsAndEventClasses::TYPE_LABEL,
105 readableData,
106 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000107
108 // Third "well-known" label: INDEX
Keith Davis97da5e22020-03-05 16:25:28 +0000109 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INDEX_GUID,
110 LabelsAndEventClasses::INDEX_LABEL,
111 readableData,
112 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000113
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000114 // Forth "well-known" label: BACKENDID
Keith Davis97da5e22020-03-05 16:25:28 +0000115 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::BACKENDID_GUID,
116 LabelsAndEventClasses::BACKENDID_LABEL,
117 readableData,
118 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000119
Jim Flynn6398a982020-05-27 17:05:21 +0100120 // Fifth "well-known" label: CHILD
121 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CHILD_GUID,
122 LabelsAndEventClasses::CHILD_LABEL,
123 readableData,
124 offset);
125
126 // Sixth "well-known" label: EXECUTION_OF
127 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::EXECUTION_OF_GUID,
128 LabelsAndEventClasses::EXECUTION_OF_LABEL,
129 readableData,
130 offset);
131
Jim Flynnf7713212020-07-14 09:50:59 +0100132 // Seventh "well-known" label: PROCESS_ID_LABEL
133 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::PROCESS_ID_GUID,
134 LabelsAndEventClasses::PROCESS_ID_LABEL,
135 readableData,
136 offset);
137
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000138 // Well-known types
139 // Layer
Keith Davis97da5e22020-03-05 16:25:28 +0000140 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID,
141 LabelsAndEventClasses::LAYER,
142 readableData,
143 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000144
145 // Workload
Keith Davis97da5e22020-03-05 16:25:28 +0000146 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID,
147 LabelsAndEventClasses::WORKLOAD,
148 readableData,
149 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000150
151 // Network
Keith Davis97da5e22020-03-05 16:25:28 +0000152 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID,
153 LabelsAndEventClasses::NETWORK,
154 readableData,
155 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000156
157 // Connection
Keith Davis97da5e22020-03-05 16:25:28 +0000158 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID,
159 LabelsAndEventClasses::CONNECTION,
160 readableData,
161 offset);
162
David Monahan6198fe02019-12-02 08:35:43 +0000163 // Inference
Keith Davis97da5e22020-03-05 16:25:28 +0000164 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID,
165 LabelsAndEventClasses::INFERENCE,
166 readableData,
167 offset);
168
David Monahan6198fe02019-12-02 08:35:43 +0000169 // Workload Execution
Keith Davis97da5e22020-03-05 16:25:28 +0000170 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID,
171 LabelsAndEventClasses::WORKLOAD_EXECUTION,
172 readableData,
173 offset);
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000174
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000175 // First "well-known" event class: START OF LIFE
Jim Flynn1892d212020-05-26 21:10:49 +0100176 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUID,
177 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME,
178 readableData,
179 offset);
180
Keith Davis97da5e22020-03-05 16:25:28 +0000181 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS,
Jim Flynn1892d212020-05-26 21:10:49 +0100182 LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000183 readableData,
184 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000185
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000186 // Second "well-known" event class: END OF LIFE
Jim Flynn1892d212020-05-26 21:10:49 +0100187 VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUID,
188 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME,
189 readableData,
190 offset);
191
Keith Davis97da5e22020-03-05 16:25:28 +0000192 VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS,
Jim Flynn1892d212020-05-26 21:10:49 +0100193 LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUID,
Keith Davis97da5e22020-03-05 16:25:28 +0000194 readableData,
195 offset);
Matteo Martincigh102cdbd2019-10-28 11:42:50 +0000196
197 // Mark the buffer as read
198 mockBufferManager.MarkRead(readableBuffer);
199}
200
Sadik Armagan1625efc2021-06-10 18:24:34 +0100201TEST_CASE("CreateNamedTypedChildEntityTest")
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000202{
203 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000204 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000205 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000206 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000207
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000208 ProfilingDynamicGuid childEntityGuid(0);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000209 ProfilingGuid parentEntityGuid(123);
210 const std::string entityName = "some entity";
211 const std::string entityType = "some type";
212
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000213 // 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 +0000214 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000215
Sadik Armagan1625efc2021-06-10 18:24:34 +0100216 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, "", entityType),
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000217 InvalidArgumentException);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100218 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, entityName, ""),
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000219 InvalidArgumentException);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100220 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity(
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000221 childEntityGuid, parentEntityGuid, "", entityType), InvalidArgumentException);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100222 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity(
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000223 childEntityGuid, parentEntityGuid, entityName, ""), InvalidArgumentException);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000224
Sadik Armagan1625efc2021-06-10 18:24:34 +0100225 CHECK_NOTHROW(childEntityGuid = timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid,
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000226 entityName,
227 entityType));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100228 CHECK(childEntityGuid != ProfilingGuid(0));
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000229
230 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000231 timelineUtilityMethods.Commit();
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000232
233 // Get the readable buffer
234 auto readableBuffer = mockBufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100235 CHECK(readableBuffer != nullptr);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000236 unsigned int size = readableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100237 CHECK(size == 196);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000238 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100239 CHECK(readableData != nullptr);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000240
241 // Utils
242 unsigned int offset = 0;
243
Keith Davis97da5e22020-03-05 16:25:28 +0000244 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100245 VerifyTimelineHeaderBinary(readableData, offset, 188);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000246
Keith Davis97da5e22020-03-05 16:25:28 +0000247 // First dataset sent: TimelineEntityBinaryPacket
248 VerifyTimelineEntityBinaryPacketData(EmptyOptional(), readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000249
Keith Davis97da5e22020-03-05 16:25:28 +0000250 // Second dataset sent: TimelineLabelBinaryPacket
251 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000252
Keith Davis97da5e22020-03-05 16:25:28 +0000253 // Third dataset sent: TimelineRelationshipBinaryPacket
254 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
255 EmptyOptional(),
256 EmptyOptional(),
257 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000258 LabelsAndEventClasses::NAME_GUID,
259 readableData,
260 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000261
Keith Davis97da5e22020-03-05 16:25:28 +0000262 // Fifth dataset sent: TimelineLabelBinaryPacket
263 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000264
Keith Davis97da5e22020-03-05 16:25:28 +0000265 // Sixth dataset sent: TimelineRelationshipBinaryPacket
266 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
267 EmptyOptional(),
268 EmptyOptional(),
269 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000270 LabelsAndEventClasses::TYPE_GUID,
271 readableData,
272 offset);
273
Finn Williams0a336dc2020-05-11 15:39:58 +0100274
Keith Davis97da5e22020-03-05 16:25:28 +0000275 // Eighth dataset sent: TimelineRelationshipBinaryPacket
276 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink,
277 EmptyOptional(),
278 parentEntityGuid,
279 EmptyOptional(),
Finn Williams0a336dc2020-05-11 15:39:58 +0100280 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000281 readableData,
282 offset);
Narumol Prangnawarat94a30882019-10-30 12:48:31 +0000283
284 // Mark the buffer as read
285 mockBufferManager.MarkRead(readableBuffer);
286}
287
Sadik Armagan1625efc2021-06-10 18:24:34 +0100288TEST_CASE("DeclareLabelTest")
Matteo Martincigh830101c2019-10-22 11:07:45 +0100289{
290 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000291 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000292 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000293 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100294
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000295 // 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 +0000296 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000297
Matteo Martincigh830101c2019-10-22 11:07:45 +0100298 // Try declaring an invalid (empty) label
Sadik Armagan1625efc2021-06-10 18:24:34 +0100299 CHECK_THROWS_AS(timelineUtilityMethods.DeclareLabel(""), InvalidArgumentException);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100300
301 // Try declaring an invalid (wrong SWTrace format) label
Sadik Armagan1625efc2021-06-10 18:24:34 +0100302 CHECK_THROWS_AS(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), RuntimeException);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100303
304 // Declare a valid label
305 const std::string labelName = "valid label";
306 ProfilingGuid labelGuid = 0;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100307 CHECK_NOTHROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName));
308 CHECK(labelGuid != ProfilingGuid(0));
Matteo Martincigh830101c2019-10-22 11:07:45 +0100309
Matteo Martincigh830101c2019-10-22 11:07:45 +0100310 // Try adding the same label as before
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000311 ProfilingGuid newLabelGuid = 0;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100312 CHECK_NOTHROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName));
313 CHECK(newLabelGuid != ProfilingGuid(0));
314 CHECK(newLabelGuid == labelGuid);
Matteo Martincigh830101c2019-10-22 11:07:45 +0100315}
316
Sadik Armagan1625efc2021-06-10 18:24:34 +0100317TEST_CASE("CreateNameTypeEntityInvalidTest")
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000318{
319 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000320 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000321 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000322 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000323
324 // Invalid name
Sadik Armagan1625efc2021-06-10 18:24:34 +0100325 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), InvalidArgumentException);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000326
327 // Invalid type
Sadik Armagan1625efc2021-06-10 18:24:34 +0100328 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), InvalidArgumentException);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000329
Sadik Armagan3184c902020-03-18 10:57:30 +0000330 ProfilingDynamicGuid guid = profilingService.NextGuid();
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000331
332 // CreatedNamedTypedEntity with Guid - Invalid name
Sadik Armagan1625efc2021-06-10 18:24:34 +0100333 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"),
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000334 InvalidArgumentException);
335
336 // CreatedNamedTypedEntity with Guid - Invalid type
Sadik Armagan1625efc2021-06-10 18:24:34 +0100337 CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""),
Narumol Prangnawarat234d5252019-11-19 15:49:18 +0000338 InvalidArgumentException);
339
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000340}
341
Sadik Armagan1625efc2021-06-10 18:24:34 +0100342TEST_CASE("CreateNameTypeEntityTest")
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000343{
344 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000345 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000346 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000347 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000348
349 const std::string entityName = "Entity0";
350 const std::string entityType = "Type0";
351
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000352 // 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 +0000353 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000354
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000355 ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100356 CHECK(guid != ProfilingGuid(0));
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000357
358 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000359 timelineUtilityMethods.Commit();
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000360
361 // Get the readable buffer
362 auto readableBuffer = mockBufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100363 CHECK(readableBuffer != nullptr);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000364 unsigned int size = readableBuffer->GetSize();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100365 CHECK(size == 148);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000366 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100367 CHECK(readableData != nullptr);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000368
369 // Utils
370 unsigned int offset = 0;
371
Keith Davis97da5e22020-03-05 16:25:28 +0000372 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100373 VerifyTimelineHeaderBinary(readableData, offset, 140);
Keith Davis97da5e22020-03-05 16:25:28 +0000374
375 // First dataset sent: TimelineEntityBinaryPacket
376 VerifyTimelineEntityBinaryPacketData(guid, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000377
378 // Packets for Name Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000379 // First dataset sent: TimelineLabelBinaryPacket
380 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityName, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000381
Keith Davis97da5e22020-03-05 16:25:28 +0000382 // Second dataset sent: TimelineRelationshipBinaryPacket
383 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
384 EmptyOptional(),
385 EmptyOptional(),
386 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000387 LabelsAndEventClasses::NAME_GUID,
388 readableData,
389 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000390
391 // Packets for Type Entity
Keith Davis97da5e22020-03-05 16:25:28 +0000392 // First dataset sent: TimelineLabelBinaryPacket
393 VerifyTimelineLabelBinaryPacketData(EmptyOptional(), entityType, readableData, offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000394
Keith Davis97da5e22020-03-05 16:25:28 +0000395 // Second dataset sent: TimelineRelationshipBinaryPacket
396 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink,
397 EmptyOptional(),
398 EmptyOptional(),
399 EmptyOptional(),
Keith Davis97da5e22020-03-05 16:25:28 +0000400 LabelsAndEventClasses::TYPE_GUID,
401 readableData,
402 offset);
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000403
Finn Williams0a336dc2020-05-11 15:39:58 +0100404
Narumol Prangnawaratd034e082019-10-30 12:48:31 +0000405 // Mark the buffer as read
406 mockBufferManager.MarkRead(readableBuffer);
407}
408
Sadik Armagan1625efc2021-06-10 18:24:34 +0100409TEST_CASE("RecordEventTest")
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000410{
411 MockBufferManager mockBufferManager(1024);
Sadik Armagan3184c902020-03-18 10:57:30 +0000412 ProfilingService profilingService;
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000413 std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager);
Sadik Armagan0a356672020-03-20 11:11:01 +0000414 TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket);
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000415 // 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 +0000416 profilingService.NextGuid();
Narumol Prangnawaratdbdd1b42019-11-15 17:38:44 +0000417
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000418 ProfilingGuid entityGuid(123);
419 ProfilingStaticGuid eventClassGuid(456);
420 ProfilingDynamicGuid eventGuid(0);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100421 CHECK_NOTHROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid));
422 CHECK(eventGuid != ProfilingGuid(0));
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000423
424 // Commit all packets at once
Narumol Prangnawaratdf31cfe2019-11-22 11:26:06 +0000425 timelineUtilityMethods.Commit();
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000426
427 // Get the readable buffer
428 auto readableBuffer = mockBufferManager.GetReadableBuffer();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100429 CHECK(readableBuffer != nullptr);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000430 unsigned int size = readableBuffer->GetSize();
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100431
Sadik Armagan1625efc2021-06-10 18:24:34 +0100432 CHECK(size == 68 + ThreadIdSize);
Jan Eilersa10e2a22020-03-26 12:04:54 +0000433
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000434 const unsigned char* readableData = readableBuffer->GetReadableData();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100435 CHECK(readableData != nullptr);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000436
437 // Utils
438 unsigned int offset = 0;
439
Keith Davis97da5e22020-03-05 16:25:28 +0000440 // Verify Header
Finn Williams0a336dc2020-05-11 15:39:58 +0100441 VerifyTimelineHeaderBinary(readableData, offset, 60 + ThreadIdSize);
Keith Davis97da5e22020-03-05 16:25:28 +0000442
443 // First dataset sent: TimelineEntityBinaryPacket
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000444 VerifyTimelineEventBinaryPacket(EmptyOptional(), EmptyOptional(), EmptyOptional(), readableData, offset);
445
Keith Davis97da5e22020-03-05 16:25:28 +0000446 // Second dataset sent: TimelineRelationshipBinaryPacket
447 VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink,
448 EmptyOptional(),
449 entityGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000450 eventGuid,
451 eventClassGuid,
452 readableData,
453 offset);
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000454
455 // Mark the buffer as read
456 mockBufferManager.MarkRead(readableBuffer);
457}
458
Sadik Armagan1625efc2021-06-10 18:24:34 +0100459}