1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingMocks.hpp" 7*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingTestUtils.hpp" 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <ArmNNProfilingServiceInitialiser.hpp> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/profiling/ArmNNProfiling.hpp> 12*89c4ff92SAndroid Build Coastguard Worker 13*89c4ff92SAndroid Build Coastguard Worker #include <client/include/TimelineUtilityMethods.hpp> 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker #include <client/src/SendTimelinePacket.hpp> 16*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingService.hpp> 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker #include <common/include/LabelsAndEventClasses.hpp> 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker #include <memory> 21*89c4ff92SAndroid Build Coastguard Worker 22*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h> 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker using namespace armnn; 25*89c4ff92SAndroid Build Coastguard Worker using namespace arm::pipe; 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TimelineUtilityMethodsTests") 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateTypedLabelTest") 30*89c4ff92SAndroid Build Coastguard Worker { 31*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 32*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 33*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 34*89c4ff92SAndroid Build Coastguard Worker initialiser, 35*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 36*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 37*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); 40*89c4ff92SAndroid Build Coastguard Worker TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. 43*89c4ff92SAndroid Build Coastguard Worker profilingService.NextGuid(); 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid entityGuid(123); 46*89c4ff92SAndroid Build Coastguard Worker const std::string entityName = "some entity"; 47*89c4ff92SAndroid Build Coastguard Worker ProfilingStaticGuid labelTypeGuid(456); 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(timelineUtilityMethods.MarkEntityWithLabel(entityGuid, entityName, labelTypeGuid)); 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard Worker // Commit all packets at once 52*89c4ff92SAndroid Build Coastguard Worker timelineUtilityMethods.Commit(); 53*89c4ff92SAndroid Build Coastguard Worker 54*89c4ff92SAndroid Build Coastguard Worker // Get the readable buffer 55*89c4ff92SAndroid Build Coastguard Worker auto readableBuffer = mockBufferManager.GetReadableBuffer(); 56*89c4ff92SAndroid Build Coastguard Worker CHECK(readableBuffer != nullptr); 57*89c4ff92SAndroid Build Coastguard Worker unsigned int size = readableBuffer->GetSize(); 58*89c4ff92SAndroid Build Coastguard Worker CHECK(size == 76); 59*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readableData = readableBuffer->GetReadableData(); 60*89c4ff92SAndroid Build Coastguard Worker CHECK(readableData != nullptr); 61*89c4ff92SAndroid Build Coastguard Worker 62*89c4ff92SAndroid Build Coastguard Worker // Utils 63*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = 0; 64*89c4ff92SAndroid Build Coastguard Worker 65*89c4ff92SAndroid Build Coastguard Worker // Verify Header 66*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineHeaderBinary(readableData, offset, 68); 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard Worker // First dataset sent: TimelineLabelBinaryPacket 69*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), entityName, readableData, offset); 70*89c4ff92SAndroid Build Coastguard Worker 71*89c4ff92SAndroid Build Coastguard Worker // Second dataset sent: TimelineRelationshipBinaryPacket 72*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink, 73*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 74*89c4ff92SAndroid Build Coastguard Worker entityGuid, 75*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 76*89c4ff92SAndroid Build Coastguard Worker labelTypeGuid, 77*89c4ff92SAndroid Build Coastguard Worker readableData, 78*89c4ff92SAndroid Build Coastguard Worker offset); 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker // Mark the buffer as read 81*89c4ff92SAndroid Build Coastguard Worker mockBufferManager.MarkRead(readableBuffer); 82*89c4ff92SAndroid Build Coastguard Worker } 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendWellKnownLabelsAndEventClassesTest") 85*89c4ff92SAndroid Build Coastguard Worker { 86*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 87*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 88*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 89*89c4ff92SAndroid Build Coastguard Worker initialiser, 90*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 91*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 92*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 93*89c4ff92SAndroid Build Coastguard Worker SendTimelinePacket sendTimelinePacket(mockBufferManager); 94*89c4ff92SAndroid Build Coastguard Worker 95*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses(sendTimelinePacket)); 96*89c4ff92SAndroid Build Coastguard Worker 97*89c4ff92SAndroid Build Coastguard Worker // Get the readable buffer 98*89c4ff92SAndroid Build Coastguard Worker auto readableBuffer = mockBufferManager.GetReadableBuffer(); 99*89c4ff92SAndroid Build Coastguard Worker CHECK(readableBuffer != nullptr); 100*89c4ff92SAndroid Build Coastguard Worker unsigned int size = readableBuffer->GetSize(); 101*89c4ff92SAndroid Build Coastguard Worker CHECK(size == 460); 102*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readableData = readableBuffer->GetReadableData(); 103*89c4ff92SAndroid Build Coastguard Worker CHECK(readableData != nullptr); 104*89c4ff92SAndroid Build Coastguard Worker 105*89c4ff92SAndroid Build Coastguard Worker // Utils 106*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = 0; 107*89c4ff92SAndroid Build Coastguard Worker 108*89c4ff92SAndroid Build Coastguard Worker // Verify Header 109*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineHeaderBinary(readableData, offset, 452); 110*89c4ff92SAndroid Build Coastguard Worker 111*89c4ff92SAndroid Build Coastguard Worker // First "well-known" label: NAME 112*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NAME_GUID, 113*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::NAME_LABEL, 114*89c4ff92SAndroid Build Coastguard Worker readableData, 115*89c4ff92SAndroid Build Coastguard Worker offset); 116*89c4ff92SAndroid Build Coastguard Worker 117*89c4ff92SAndroid Build Coastguard Worker // Second "well-known" label: TYPE 118*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::TYPE_GUID, 119*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::TYPE_LABEL, 120*89c4ff92SAndroid Build Coastguard Worker readableData, 121*89c4ff92SAndroid Build Coastguard Worker offset); 122*89c4ff92SAndroid Build Coastguard Worker 123*89c4ff92SAndroid Build Coastguard Worker // Third "well-known" label: INDEX 124*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INDEX_GUID, 125*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::INDEX_LABEL, 126*89c4ff92SAndroid Build Coastguard Worker readableData, 127*89c4ff92SAndroid Build Coastguard Worker offset); 128*89c4ff92SAndroid Build Coastguard Worker 129*89c4ff92SAndroid Build Coastguard Worker // Forth "well-known" label: BACKENDID 130*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::BACKENDID_GUID, 131*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::BACKENDID_LABEL, 132*89c4ff92SAndroid Build Coastguard Worker readableData, 133*89c4ff92SAndroid Build Coastguard Worker offset); 134*89c4ff92SAndroid Build Coastguard Worker 135*89c4ff92SAndroid Build Coastguard Worker // Fifth "well-known" label: CHILD 136*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CHILD_GUID, 137*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::CHILD_LABEL, 138*89c4ff92SAndroid Build Coastguard Worker readableData, 139*89c4ff92SAndroid Build Coastguard Worker offset); 140*89c4ff92SAndroid Build Coastguard Worker 141*89c4ff92SAndroid Build Coastguard Worker // Sixth "well-known" label: EXECUTION_OF 142*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::EXECUTION_OF_GUID, 143*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::EXECUTION_OF_LABEL, 144*89c4ff92SAndroid Build Coastguard Worker readableData, 145*89c4ff92SAndroid Build Coastguard Worker offset); 146*89c4ff92SAndroid Build Coastguard Worker 147*89c4ff92SAndroid Build Coastguard Worker // Seventh "well-known" label: PROCESS_ID_LABEL 148*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::PROCESS_ID_GUID, 149*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::PROCESS_ID_LABEL, 150*89c4ff92SAndroid Build Coastguard Worker readableData, 151*89c4ff92SAndroid Build Coastguard Worker offset); 152*89c4ff92SAndroid Build Coastguard Worker 153*89c4ff92SAndroid Build Coastguard Worker // Well-known types 154*89c4ff92SAndroid Build Coastguard Worker // Layer 155*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::LAYER_GUID, 156*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::LAYER, 157*89c4ff92SAndroid Build Coastguard Worker readableData, 158*89c4ff92SAndroid Build Coastguard Worker offset); 159*89c4ff92SAndroid Build Coastguard Worker 160*89c4ff92SAndroid Build Coastguard Worker // Workload 161*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_GUID, 162*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::WORKLOAD, 163*89c4ff92SAndroid Build Coastguard Worker readableData, 164*89c4ff92SAndroid Build Coastguard Worker offset); 165*89c4ff92SAndroid Build Coastguard Worker 166*89c4ff92SAndroid Build Coastguard Worker // Network 167*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::NETWORK_GUID, 168*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::NETWORK, 169*89c4ff92SAndroid Build Coastguard Worker readableData, 170*89c4ff92SAndroid Build Coastguard Worker offset); 171*89c4ff92SAndroid Build Coastguard Worker 172*89c4ff92SAndroid Build Coastguard Worker // Connection 173*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::CONNECTION_GUID, 174*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::CONNECTION, 175*89c4ff92SAndroid Build Coastguard Worker readableData, 176*89c4ff92SAndroid Build Coastguard Worker offset); 177*89c4ff92SAndroid Build Coastguard Worker 178*89c4ff92SAndroid Build Coastguard Worker // Inference 179*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::INFERENCE_GUID, 180*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::INFERENCE, 181*89c4ff92SAndroid Build Coastguard Worker readableData, 182*89c4ff92SAndroid Build Coastguard Worker offset); 183*89c4ff92SAndroid Build Coastguard Worker 184*89c4ff92SAndroid Build Coastguard Worker // Workload Execution 185*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::WORKLOAD_EXECUTION_GUID, 186*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::WORKLOAD_EXECUTION, 187*89c4ff92SAndroid Build Coastguard Worker readableData, 188*89c4ff92SAndroid Build Coastguard Worker offset); 189*89c4ff92SAndroid Build Coastguard Worker 190*89c4ff92SAndroid Build Coastguard Worker // First "well-known" event class: START OF LIFE 191*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUID, 192*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME, 193*89c4ff92SAndroid Build Coastguard Worker readableData, 194*89c4ff92SAndroid Build Coastguard Worker offset); 195*89c4ff92SAndroid Build Coastguard Worker 196*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS, 197*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS_NAME_GUID, 198*89c4ff92SAndroid Build Coastguard Worker readableData, 199*89c4ff92SAndroid Build Coastguard Worker offset); 200*89c4ff92SAndroid Build Coastguard Worker 201*89c4ff92SAndroid Build Coastguard Worker // Second "well-known" event class: END OF LIFE 202*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUID, 203*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME, 204*89c4ff92SAndroid Build Coastguard Worker readableData, 205*89c4ff92SAndroid Build Coastguard Worker offset); 206*89c4ff92SAndroid Build Coastguard Worker 207*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineEventClassBinaryPacketData(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS, 208*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS_NAME_GUID, 209*89c4ff92SAndroid Build Coastguard Worker readableData, 210*89c4ff92SAndroid Build Coastguard Worker offset); 211*89c4ff92SAndroid Build Coastguard Worker 212*89c4ff92SAndroid Build Coastguard Worker // Mark the buffer as read 213*89c4ff92SAndroid Build Coastguard Worker mockBufferManager.MarkRead(readableBuffer); 214*89c4ff92SAndroid Build Coastguard Worker } 215*89c4ff92SAndroid Build Coastguard Worker 216*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateNamedTypedChildEntityTest") 217*89c4ff92SAndroid Build Coastguard Worker { 218*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 219*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 220*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 221*89c4ff92SAndroid Build Coastguard Worker initialiser, 222*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 223*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 224*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 225*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); 226*89c4ff92SAndroid Build Coastguard Worker TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); 227*89c4ff92SAndroid Build Coastguard Worker 228*89c4ff92SAndroid Build Coastguard Worker ProfilingDynamicGuid childEntityGuid(0); 229*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid parentEntityGuid(123); 230*89c4ff92SAndroid Build Coastguard Worker const std::string entityName = "some entity"; 231*89c4ff92SAndroid Build Coastguard Worker const std::string entityType = "some type"; 232*89c4ff92SAndroid Build Coastguard Worker 233*89c4ff92SAndroid Build Coastguard Worker // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. 234*89c4ff92SAndroid Build Coastguard Worker profilingService.NextGuid(); 235*89c4ff92SAndroid Build Coastguard Worker 236*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, "", entityType), 237*89c4ff92SAndroid Build Coastguard Worker arm::pipe::InvalidArgumentException); 238*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, entityName, ""), 239*89c4ff92SAndroid Build Coastguard Worker arm::pipe::InvalidArgumentException); 240*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity( 241*89c4ff92SAndroid Build Coastguard Worker childEntityGuid, parentEntityGuid, "", entityType), arm::pipe::InvalidArgumentException); 242*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedChildEntity( 243*89c4ff92SAndroid Build Coastguard Worker childEntityGuid, parentEntityGuid, entityName, ""), arm::pipe::InvalidArgumentException); 244*89c4ff92SAndroid Build Coastguard Worker 245*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(childEntityGuid = timelineUtilityMethods.CreateNamedTypedChildEntity(parentEntityGuid, 246*89c4ff92SAndroid Build Coastguard Worker entityName, 247*89c4ff92SAndroid Build Coastguard Worker entityType)); 248*89c4ff92SAndroid Build Coastguard Worker CHECK(childEntityGuid != ProfilingGuid(0)); 249*89c4ff92SAndroid Build Coastguard Worker 250*89c4ff92SAndroid Build Coastguard Worker // Commit all packets at onceTimelineUtilityMethodsTests.cpp 251*89c4ff92SAndroid Build Coastguard Worker timelineUtilityMethods.Commit(); 252*89c4ff92SAndroid Build Coastguard Worker 253*89c4ff92SAndroid Build Coastguard Worker // Get the readable buffer 254*89c4ff92SAndroid Build Coastguard Worker auto readableBuffer = mockBufferManager.GetReadableBuffer(); 255*89c4ff92SAndroid Build Coastguard Worker CHECK(readableBuffer != nullptr); 256*89c4ff92SAndroid Build Coastguard Worker unsigned int size = readableBuffer->GetSize(); 257*89c4ff92SAndroid Build Coastguard Worker CHECK(size == 196); 258*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readableData = readableBuffer->GetReadableData(); 259*89c4ff92SAndroid Build Coastguard Worker CHECK(readableData != nullptr); 260*89c4ff92SAndroid Build Coastguard Worker 261*89c4ff92SAndroid Build Coastguard Worker // Utils 262*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = 0; 263*89c4ff92SAndroid Build Coastguard Worker 264*89c4ff92SAndroid Build Coastguard Worker // Verify Header 265*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineHeaderBinary(readableData, offset, 188); 266*89c4ff92SAndroid Build Coastguard Worker 267*89c4ff92SAndroid Build Coastguard Worker // First dataset sent: TimelineEntityBinaryPacket 268*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineEntityBinaryPacketData(arm::pipe::EmptyOptional(), readableData, offset); 269*89c4ff92SAndroid Build Coastguard Worker 270*89c4ff92SAndroid Build Coastguard Worker // Second dataset sent: TimelineLabelBinaryPacket 271*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), entityName, readableData, offset); 272*89c4ff92SAndroid Build Coastguard Worker 273*89c4ff92SAndroid Build Coastguard Worker // Third dataset sent: TimelineRelationshipBinaryPacket 274*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink, 275*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 276*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 277*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 278*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::NAME_GUID, 279*89c4ff92SAndroid Build Coastguard Worker readableData, 280*89c4ff92SAndroid Build Coastguard Worker offset); 281*89c4ff92SAndroid Build Coastguard Worker 282*89c4ff92SAndroid Build Coastguard Worker // Fifth dataset sent: TimelineLabelBinaryPacket 283*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), entityType, readableData, offset); 284*89c4ff92SAndroid Build Coastguard Worker 285*89c4ff92SAndroid Build Coastguard Worker // Sixth dataset sent: TimelineRelationshipBinaryPacket 286*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink, 287*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 288*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 289*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 290*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::TYPE_GUID, 291*89c4ff92SAndroid Build Coastguard Worker readableData, 292*89c4ff92SAndroid Build Coastguard Worker offset); 293*89c4ff92SAndroid Build Coastguard Worker 294*89c4ff92SAndroid Build Coastguard Worker 295*89c4ff92SAndroid Build Coastguard Worker // Eighth dataset sent: TimelineRelationshipBinaryPacket 296*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::RetentionLink, 297*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 298*89c4ff92SAndroid Build Coastguard Worker parentEntityGuid, 299*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 300*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 301*89c4ff92SAndroid Build Coastguard Worker readableData, 302*89c4ff92SAndroid Build Coastguard Worker offset); 303*89c4ff92SAndroid Build Coastguard Worker 304*89c4ff92SAndroid Build Coastguard Worker // Mark the buffer as read 305*89c4ff92SAndroid Build Coastguard Worker mockBufferManager.MarkRead(readableBuffer); 306*89c4ff92SAndroid Build Coastguard Worker } 307*89c4ff92SAndroid Build Coastguard Worker 308*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("DeclareLabelTest") 309*89c4ff92SAndroid Build Coastguard Worker { 310*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 311*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 312*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 313*89c4ff92SAndroid Build Coastguard Worker initialiser, 314*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 315*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 316*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 317*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); 318*89c4ff92SAndroid Build Coastguard Worker TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); 319*89c4ff92SAndroid Build Coastguard Worker 320*89c4ff92SAndroid Build Coastguard Worker // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. 321*89c4ff92SAndroid Build Coastguard Worker profilingService.NextGuid(); 322*89c4ff92SAndroid Build Coastguard Worker 323*89c4ff92SAndroid Build Coastguard Worker // Try declaring an invalid (empty) label 324*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.DeclareLabel(""), arm::pipe::InvalidArgumentException); 325*89c4ff92SAndroid Build Coastguard Worker 326*89c4ff92SAndroid Build Coastguard Worker // Try declaring an invalid (wrong SWTrace format) label 327*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.DeclareLabel("inv@lid lab€l"), arm::pipe::ProfilingException); 328*89c4ff92SAndroid Build Coastguard Worker 329*89c4ff92SAndroid Build Coastguard Worker // Declare a valid label 330*89c4ff92SAndroid Build Coastguard Worker const std::string labelName = "valid label"; 331*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid labelGuid = 0; 332*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(labelGuid = timelineUtilityMethods.DeclareLabel(labelName)); 333*89c4ff92SAndroid Build Coastguard Worker CHECK(labelGuid != ProfilingGuid(0)); 334*89c4ff92SAndroid Build Coastguard Worker 335*89c4ff92SAndroid Build Coastguard Worker // Try adding the same label as before 336*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid newLabelGuid = 0; 337*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(newLabelGuid = timelineUtilityMethods.DeclareLabel(labelName)); 338*89c4ff92SAndroid Build Coastguard Worker CHECK(newLabelGuid != ProfilingGuid(0)); 339*89c4ff92SAndroid Build Coastguard Worker CHECK(newLabelGuid == labelGuid); 340*89c4ff92SAndroid Build Coastguard Worker } 341*89c4ff92SAndroid Build Coastguard Worker 342*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateNameTypeEntityInvalidTest") 343*89c4ff92SAndroid Build Coastguard Worker { 344*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 345*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 346*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 347*89c4ff92SAndroid Build Coastguard Worker initialiser, 348*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 349*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 350*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 351*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); 352*89c4ff92SAndroid Build Coastguard Worker TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); 353*89c4ff92SAndroid Build Coastguard Worker 354*89c4ff92SAndroid Build Coastguard Worker // Invalid name 355*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity("", "Type"), arm::pipe::InvalidArgumentException); 356*89c4ff92SAndroid Build Coastguard Worker 357*89c4ff92SAndroid Build Coastguard Worker // Invalid type 358*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity("Name", ""), arm::pipe::InvalidArgumentException); 359*89c4ff92SAndroid Build Coastguard Worker 360*89c4ff92SAndroid Build Coastguard Worker ProfilingDynamicGuid guid = profilingService.NextGuid(); 361*89c4ff92SAndroid Build Coastguard Worker 362*89c4ff92SAndroid Build Coastguard Worker // CreatedNamedTypedEntity with Guid - Invalid name 363*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity(guid, "", "Type"), 364*89c4ff92SAndroid Build Coastguard Worker arm::pipe::InvalidArgumentException); 365*89c4ff92SAndroid Build Coastguard Worker 366*89c4ff92SAndroid Build Coastguard Worker // CreatedNamedTypedEntity with Guid - Invalid type 367*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(timelineUtilityMethods.CreateNamedTypedEntity(guid, "Name", ""), 368*89c4ff92SAndroid Build Coastguard Worker arm::pipe::InvalidArgumentException); 369*89c4ff92SAndroid Build Coastguard Worker 370*89c4ff92SAndroid Build Coastguard Worker } 371*89c4ff92SAndroid Build Coastguard Worker 372*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateNameTypeEntityTest") 373*89c4ff92SAndroid Build Coastguard Worker { 374*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 375*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 376*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 377*89c4ff92SAndroid Build Coastguard Worker initialiser, 378*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 379*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 380*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 381*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); 382*89c4ff92SAndroid Build Coastguard Worker TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); 383*89c4ff92SAndroid Build Coastguard Worker 384*89c4ff92SAndroid Build Coastguard Worker const std::string entityName = "Entity0"; 385*89c4ff92SAndroid Build Coastguard Worker const std::string entityType = "Type0"; 386*89c4ff92SAndroid Build Coastguard Worker 387*89c4ff92SAndroid Build Coastguard Worker // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. 388*89c4ff92SAndroid Build Coastguard Worker profilingService.NextGuid(); 389*89c4ff92SAndroid Build Coastguard Worker 390*89c4ff92SAndroid Build Coastguard Worker ProfilingDynamicGuid guid = timelineUtilityMethods.CreateNamedTypedEntity(entityName, entityType); 391*89c4ff92SAndroid Build Coastguard Worker CHECK(guid != ProfilingGuid(0)); 392*89c4ff92SAndroid Build Coastguard Worker 393*89c4ff92SAndroid Build Coastguard Worker // Commit all packets at once 394*89c4ff92SAndroid Build Coastguard Worker timelineUtilityMethods.Commit(); 395*89c4ff92SAndroid Build Coastguard Worker 396*89c4ff92SAndroid Build Coastguard Worker // Get the readable buffer 397*89c4ff92SAndroid Build Coastguard Worker auto readableBuffer = mockBufferManager.GetReadableBuffer(); 398*89c4ff92SAndroid Build Coastguard Worker CHECK(readableBuffer != nullptr); 399*89c4ff92SAndroid Build Coastguard Worker unsigned int size = readableBuffer->GetSize(); 400*89c4ff92SAndroid Build Coastguard Worker CHECK(size == 148); 401*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readableData = readableBuffer->GetReadableData(); 402*89c4ff92SAndroid Build Coastguard Worker CHECK(readableData != nullptr); 403*89c4ff92SAndroid Build Coastguard Worker 404*89c4ff92SAndroid Build Coastguard Worker // Utils 405*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = 0; 406*89c4ff92SAndroid Build Coastguard Worker 407*89c4ff92SAndroid Build Coastguard Worker // Verify Header 408*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineHeaderBinary(readableData, offset, 140); 409*89c4ff92SAndroid Build Coastguard Worker 410*89c4ff92SAndroid Build Coastguard Worker // First dataset sent: TimelineEntityBinaryPacket 411*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineEntityBinaryPacketData(guid, readableData, offset); 412*89c4ff92SAndroid Build Coastguard Worker 413*89c4ff92SAndroid Build Coastguard Worker // Packets for Name Entity 414*89c4ff92SAndroid Build Coastguard Worker // First dataset sent: TimelineLabelBinaryPacket 415*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), entityName, readableData, offset); 416*89c4ff92SAndroid Build Coastguard Worker 417*89c4ff92SAndroid Build Coastguard Worker // Second dataset sent: TimelineRelationshipBinaryPacket 418*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink, 419*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 420*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 421*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 422*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::NAME_GUID, 423*89c4ff92SAndroid Build Coastguard Worker readableData, 424*89c4ff92SAndroid Build Coastguard Worker offset); 425*89c4ff92SAndroid Build Coastguard Worker 426*89c4ff92SAndroid Build Coastguard Worker // Packets for Type Entity 427*89c4ff92SAndroid Build Coastguard Worker // First dataset sent: TimelineLabelBinaryPacket 428*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineLabelBinaryPacketData(arm::pipe::EmptyOptional(), entityType, readableData, offset); 429*89c4ff92SAndroid Build Coastguard Worker 430*89c4ff92SAndroid Build Coastguard Worker // Second dataset sent: TimelineRelationshipBinaryPacket 431*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::LabelLink, 432*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 433*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 434*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 435*89c4ff92SAndroid Build Coastguard Worker LabelsAndEventClasses::TYPE_GUID, 436*89c4ff92SAndroid Build Coastguard Worker readableData, 437*89c4ff92SAndroid Build Coastguard Worker offset); 438*89c4ff92SAndroid Build Coastguard Worker 439*89c4ff92SAndroid Build Coastguard Worker 440*89c4ff92SAndroid Build Coastguard Worker // Mark the buffer as read 441*89c4ff92SAndroid Build Coastguard Worker mockBufferManager.MarkRead(readableBuffer); 442*89c4ff92SAndroid Build Coastguard Worker } 443*89c4ff92SAndroid Build Coastguard Worker 444*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("RecordEventTest") 445*89c4ff92SAndroid Build Coastguard Worker { 446*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBufferManager(1024); 447*89c4ff92SAndroid Build Coastguard Worker armnn::ArmNNProfilingServiceInitialiser initialiser; 448*89c4ff92SAndroid Build Coastguard Worker ProfilingService profilingService(arm::pipe::MAX_ARMNN_COUNTER, 449*89c4ff92SAndroid Build Coastguard Worker initialiser, 450*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO, 451*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION, 452*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION); 453*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); 454*89c4ff92SAndroid Build Coastguard Worker TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); 455*89c4ff92SAndroid Build Coastguard Worker // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. 456*89c4ff92SAndroid Build Coastguard Worker profilingService.NextGuid(); 457*89c4ff92SAndroid Build Coastguard Worker 458*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid entityGuid(123); 459*89c4ff92SAndroid Build Coastguard Worker ProfilingStaticGuid eventClassGuid(456); 460*89c4ff92SAndroid Build Coastguard Worker ProfilingDynamicGuid eventGuid(0); 461*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(eventGuid = timelineUtilityMethods.RecordEvent(entityGuid, eventClassGuid)); 462*89c4ff92SAndroid Build Coastguard Worker CHECK(eventGuid != ProfilingGuid(0)); 463*89c4ff92SAndroid Build Coastguard Worker 464*89c4ff92SAndroid Build Coastguard Worker // Commit all packets at once 465*89c4ff92SAndroid Build Coastguard Worker timelineUtilityMethods.Commit(); 466*89c4ff92SAndroid Build Coastguard Worker 467*89c4ff92SAndroid Build Coastguard Worker // Get the readable buffer 468*89c4ff92SAndroid Build Coastguard Worker auto readableBuffer = mockBufferManager.GetReadableBuffer(); 469*89c4ff92SAndroid Build Coastguard Worker CHECK(readableBuffer != nullptr); 470*89c4ff92SAndroid Build Coastguard Worker unsigned int size = readableBuffer->GetSize(); 471*89c4ff92SAndroid Build Coastguard Worker 472*89c4ff92SAndroid Build Coastguard Worker CHECK(size == 68 + ThreadIdSize); 473*89c4ff92SAndroid Build Coastguard Worker 474*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readableData = readableBuffer->GetReadableData(); 475*89c4ff92SAndroid Build Coastguard Worker CHECK(readableData != nullptr); 476*89c4ff92SAndroid Build Coastguard Worker 477*89c4ff92SAndroid Build Coastguard Worker // Utils 478*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = 0; 479*89c4ff92SAndroid Build Coastguard Worker 480*89c4ff92SAndroid Build Coastguard Worker // Verify Header 481*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineHeaderBinary(readableData, offset, 60 + ThreadIdSize); 482*89c4ff92SAndroid Build Coastguard Worker 483*89c4ff92SAndroid Build Coastguard Worker // First dataset sent: TimelineEntityBinaryPacket 484*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineEventBinaryPacket( 485*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), arm::pipe::EmptyOptional(), readableData, offset); 486*89c4ff92SAndroid Build Coastguard Worker 487*89c4ff92SAndroid Build Coastguard Worker // Second dataset sent: TimelineRelationshipBinaryPacket 488*89c4ff92SAndroid Build Coastguard Worker VerifyTimelineRelationshipBinaryPacketData(ProfilingRelationshipType::ExecutionLink, 489*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(), 490*89c4ff92SAndroid Build Coastguard Worker entityGuid, 491*89c4ff92SAndroid Build Coastguard Worker eventGuid, 492*89c4ff92SAndroid Build Coastguard Worker eventClassGuid, 493*89c4ff92SAndroid Build Coastguard Worker readableData, 494*89c4ff92SAndroid Build Coastguard Worker offset); 495*89c4ff92SAndroid Build Coastguard Worker 496*89c4ff92SAndroid Build Coastguard Worker // Mark the buffer as read 497*89c4ff92SAndroid Build Coastguard Worker mockBufferManager.MarkRead(readableBuffer); 498*89c4ff92SAndroid Build Coastguard Worker } 499*89c4ff92SAndroid Build Coastguard Worker 500*89c4ff92SAndroid Build Coastguard Worker } 501