diff options
Diffstat (limited to 'src/profiling/test/TimelineUtilityMethodsTests.cpp')
-rw-r--r-- | src/profiling/test/TimelineUtilityMethodsTests.cpp | 410 |
1 files changed, 49 insertions, 361 deletions
diff --git a/src/profiling/test/TimelineUtilityMethodsTests.cpp b/src/profiling/test/TimelineUtilityMethodsTests.cpp index 7d1a7c1a87..ae1ee558bf 100644 --- a/src/profiling/test/TimelineUtilityMethodsTests.cpp +++ b/src/profiling/test/TimelineUtilityMethodsTests.cpp @@ -4,368 +4,26 @@ // #include "SendCounterPacketTests.hpp" +#include "ProfilingTestUtils.hpp" #include <SendTimelinePacket.hpp> #include <TimelineUtilityMethods.hpp> #include <LabelsAndEventClasses.hpp> #include <ProfilingService.hpp> +#include <memory> + #include <boost/test/unit_test.hpp> using namespace armnn; using namespace armnn::profiling; -namespace -{ - -inline unsigned int OffsetToNextWord(unsigned int numberOfBytes) -{ - unsigned int uint32_t_size = sizeof(uint32_t); - - unsigned int remainder = numberOfBytes % uint32_t_size; - if (remainder == 0) - { - return numberOfBytes; - } - - return numberOfBytes + uint32_t_size - remainder; -} - -void VerifyTimelineLabelBinaryPacket(Optional<ProfilingGuid> guid, - const std::string& label, - const unsigned char* readableData, - unsigned int& offset) -{ - BOOST_ASSERT(readableData); - - // Utils - unsigned int uint32_t_size = sizeof(uint32_t); - unsigned int uint64_t_size = sizeof(uint64_t); - unsigned int label_size = boost::numeric_cast<unsigned int>(label.size()); - - // Check the TimelineLabelBinaryPacket header - uint32_t entityBinaryPacketHeaderWord0 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketFamily = (entityBinaryPacketHeaderWord0 >> 26) & 0x0000003F; - uint32_t entityBinaryPacketClass = (entityBinaryPacketHeaderWord0 >> 19) & 0x0000007F; - uint32_t entityBinaryPacketType = (entityBinaryPacketHeaderWord0 >> 16) & 0x00000007; - uint32_t entityBinaryPacketStreamId = (entityBinaryPacketHeaderWord0 >> 0) & 0x00000007; - BOOST_CHECK(entityBinaryPacketFamily == 1); - BOOST_CHECK(entityBinaryPacketClass == 0); - BOOST_CHECK(entityBinaryPacketType == 1); - BOOST_CHECK(entityBinaryPacketStreamId == 0); - offset += uint32_t_size; - uint32_t entityBinaryPacketHeaderWord1 = ReadUint32(readableData, offset); - uint32_t eventBinaryPacketSequenceNumber = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; - uint32_t eventBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; - BOOST_CHECK(eventBinaryPacketSequenceNumber == 0); - BOOST_CHECK(eventBinaryPacketDataLength == 16 + OffsetToNextWord(label_size + 1)); - - // Check the decl id - offset += uint32_t_size; - uint32_t eventClassDeclId = ReadUint32(readableData, offset); - BOOST_CHECK(eventClassDeclId == 0); - - // Check the profiling GUID - offset += uint32_t_size; - uint64_t readProfilingGuid = ReadUint64(readableData, offset); - if (guid.has_value()) - { - BOOST_CHECK(readProfilingGuid == guid.value()); - } - else - { - BOOST_CHECK(readProfilingGuid == ProfilingService::Instance().GenerateStaticId(label)); - } - - // Check the SWTrace label - offset += uint64_t_size; - uint32_t swTraceLabelLength = ReadUint32(readableData, offset); - BOOST_CHECK(swTraceLabelLength == label_size + 1); // Label length including the null-terminator - offset += uint32_t_size; - BOOST_CHECK(std::memcmp(readableData + offset, // Offset to the label in the buffer - label.data(), // The original label - swTraceLabelLength - 1) == 0); // The length of the label - BOOST_CHECK(readableData[offset + swTraceLabelLength] == '\0'); // The null-terminator - - // SWTrace strings are written in blocks of words, so the offset has to be updated to the next whole word - offset += OffsetToNextWord(swTraceLabelLength); -} - -void VerifyTimelineEventClassBinaryPacket(ProfilingGuid guid, - const unsigned char* readableData, - unsigned int& offset) -{ - BOOST_ASSERT(readableData); - - // Utils - unsigned int uint32_t_size = sizeof(uint32_t); - unsigned int uint64_t_size = sizeof(uint64_t); - - // Check the TimelineEventClassBinaryPacket header - uint32_t entityBinaryPacketHeaderWord0 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketFamily = (entityBinaryPacketHeaderWord0 >> 26) & 0x0000003F; - uint32_t entityBinaryPacketClass = (entityBinaryPacketHeaderWord0 >> 19) & 0x0000007F; - uint32_t entityBinaryPacketType = (entityBinaryPacketHeaderWord0 >> 16) & 0x00000007; - uint32_t entityBinaryPacketStreamId = (entityBinaryPacketHeaderWord0 >> 0) & 0x00000007; - BOOST_CHECK(entityBinaryPacketFamily == 1); - BOOST_CHECK(entityBinaryPacketClass == 0); - BOOST_CHECK(entityBinaryPacketType == 1); - BOOST_CHECK(entityBinaryPacketStreamId == 0); - offset += uint32_t_size; - uint32_t entityBinaryPacketHeaderWord1 = ReadUint32(readableData, offset); - uint32_t eventBinaryPacketSequenceNumber = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; - uint32_t eventBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; - BOOST_CHECK(eventBinaryPacketSequenceNumber == 0); - BOOST_CHECK(eventBinaryPacketDataLength == 12); - - // Check the decl id - offset += uint32_t_size; - uint32_t eventClassDeclId = ReadUint32(readableData, offset); - BOOST_CHECK(eventClassDeclId == 2); - - // Check the profiling GUID - offset += uint32_t_size; - uint64_t readProfilingGuid = ReadUint64(readableData, offset); - BOOST_CHECK(readProfilingGuid == guid); - - // Update the offset to allow parsing to be continued after this function returns - offset += uint64_t_size; -} - -void VerifyTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType, - Optional<ProfilingGuid> relationshipGuid, - Optional<ProfilingGuid> headGuid, - Optional<ProfilingGuid> tailGuid, - const unsigned char* readableData, - unsigned int& offset) -{ - BOOST_ASSERT(readableData); - - uint32_t relationshipTypeUint = 0; - switch (relationshipType) - { - case ProfilingRelationshipType::RetentionLink: - relationshipTypeUint = 0; - break; - case ProfilingRelationshipType::ExecutionLink: - relationshipTypeUint = 1; - break; - case ProfilingRelationshipType::DataLink: - relationshipTypeUint = 2; - break; - case ProfilingRelationshipType::LabelLink: - relationshipTypeUint = 3; - break; - default: - BOOST_ERROR("Unknown relationship type"); - } - - // Utils - unsigned int uint32_t_size = sizeof(uint32_t); - unsigned int uint64_t_size = sizeof(uint64_t); - - // Check the TimelineLabelBinaryPacket header - uint32_t entityBinaryPacketHeaderWord0 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketFamily = (entityBinaryPacketHeaderWord0 >> 26) & 0x0000003F; - uint32_t entityBinaryPacketClass = (entityBinaryPacketHeaderWord0 >> 19) & 0x0000007F; - uint32_t entityBinaryPacketType = (entityBinaryPacketHeaderWord0 >> 16) & 0x00000007; - uint32_t entityBinaryPacketStreamId = (entityBinaryPacketHeaderWord0 >> 0) & 0x00000007; - BOOST_CHECK(entityBinaryPacketFamily == 1); - BOOST_CHECK(entityBinaryPacketClass == 0); - BOOST_CHECK(entityBinaryPacketType == 1); - BOOST_CHECK(entityBinaryPacketStreamId == 0); - offset += uint32_t_size; - uint32_t entityBinaryPacketHeaderWord1 = ReadUint32(readableData, offset); - uint32_t eventBinaryPacketSequenceNumber = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; - uint32_t eventBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; - BOOST_CHECK(eventBinaryPacketSequenceNumber == 0); - BOOST_CHECK(eventBinaryPacketDataLength == 32); - - // Check the decl id - offset += uint32_t_size; - uint32_t eventClassDeclId = ReadUint32(readableData, offset); - BOOST_CHECK(eventClassDeclId == 3); - - // Check the relationship type - offset += uint32_t_size; - uint32_t readRelationshipTypeUint = ReadUint32(readableData, offset); - BOOST_CHECK(readRelationshipTypeUint == relationshipTypeUint); - - // Check the relationship GUID - offset += uint32_t_size; - uint64_t readRelationshipGuid = ReadUint64(readableData, offset); - if (relationshipGuid.has_value()) - { - BOOST_CHECK(readRelationshipGuid == relationshipGuid.value()); - } - else - { - BOOST_CHECK(readRelationshipGuid != ProfilingGuid(0)); - } - - // Check the head of relationship GUID - offset += uint64_t_size; - uint64_t readHeadRelationshipGuid = ReadUint64(readableData, offset); - if (headGuid.has_value()) - { - BOOST_CHECK(readHeadRelationshipGuid == headGuid.value()); - } - else - { - BOOST_CHECK(readHeadRelationshipGuid != ProfilingGuid(0)); - } - - // Check the tail of relationship GUID - offset += uint64_t_size; - uint64_t readTailRelationshipGuid = ReadUint64(readableData, offset); - if (tailGuid.has_value()) - { - BOOST_CHECK(readTailRelationshipGuid == tailGuid.value()); - } - else - { - BOOST_CHECK(readTailRelationshipGuid != ProfilingGuid(0)); - } - - // Update the offset to allow parsing to be continued after this function returns - offset += uint64_t_size; -} - -void VerifyTimelineEntityBinaryPacket(Optional<ProfilingGuid> guid, - const unsigned char* readableData, - unsigned int& offset) -{ - BOOST_ASSERT(readableData); - - // Utils - unsigned int uint32_t_size = sizeof(uint32_t); - unsigned int uint64_t_size = sizeof(uint64_t); - - // Reading TimelineEntityClassBinaryPacket - uint32_t entityBinaryPacketHeaderWord0 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketFamily = (entityBinaryPacketHeaderWord0 >> 26) & 0x0000003F; - uint32_t entityBinaryPacketClass = (entityBinaryPacketHeaderWord0 >> 19) & 0x0000007F; - uint32_t entityBinaryPacketType = (entityBinaryPacketHeaderWord0 >> 16) & 0x00000007; - uint32_t entityBinaryPacketStreamId = (entityBinaryPacketHeaderWord0 >> 0) & 0x00000007; - - BOOST_CHECK(entityBinaryPacketFamily == 1); - BOOST_CHECK(entityBinaryPacketClass == 0); - BOOST_CHECK(entityBinaryPacketType == 1); - BOOST_CHECK(entityBinaryPacketStreamId == 0); - - offset += uint32_t_size; - uint32_t entityBinaryPacketHeaderWord1 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketSequenceNumbered = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; - uint32_t entityBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; - BOOST_CHECK(entityBinaryPacketSequenceNumbered == 0); - BOOST_CHECK(entityBinaryPacketDataLength == 12); - - // Check the decl_id - offset += uint32_t_size; - uint32_t entityDeclId = ReadUint32(readableData, offset); - BOOST_CHECK(entityDeclId == 1); - - // Check the profiling GUID - offset += uint32_t_size; - uint64_t readProfilingGuid = ReadUint64(readableData, offset); - - if (guid.has_value()) - { - BOOST_CHECK(readProfilingGuid == guid.value()); - } - else - { - BOOST_CHECK(readProfilingGuid != ProfilingGuid(0)); - } - - offset += uint64_t_size; -} - -void VerifyTimelineEventBinaryPacket(Optional<uint64_t> timestamp, - Optional<std::thread::id> threadId, - Optional<ProfilingGuid> eventGuid, - const unsigned char* readableData, - unsigned int& offset) -{ - BOOST_ASSERT(readableData); - - // Utils - unsigned int uint32_t_size = sizeof(uint32_t); - unsigned int uint64_t_size = sizeof(uint64_t); - unsigned int threadId_size = sizeof(std::thread::id); - - // Reading TimelineEventBinaryPacket - uint32_t entityBinaryPacketHeaderWord0 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketFamily = (entityBinaryPacketHeaderWord0 >> 26) & 0x0000003F; - uint32_t entityBinaryPacketClass = (entityBinaryPacketHeaderWord0 >> 19) & 0x0000007F; - uint32_t entityBinaryPacketType = (entityBinaryPacketHeaderWord0 >> 16) & 0x00000007; - uint32_t entityBinaryPacketStreamId = (entityBinaryPacketHeaderWord0 >> 0) & 0x00000007; - - BOOST_CHECK(entityBinaryPacketFamily == 1); - BOOST_CHECK(entityBinaryPacketClass == 0); - BOOST_CHECK(entityBinaryPacketType == 1); - BOOST_CHECK(entityBinaryPacketStreamId == 0); - - offset += uint32_t_size; - uint32_t entityBinaryPacketHeaderWord1 = ReadUint32(readableData, offset); - uint32_t entityBinaryPacketSequenceNumbered = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; - uint32_t entityBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; - BOOST_CHECK(entityBinaryPacketSequenceNumbered == 0); - BOOST_CHECK(entityBinaryPacketDataLength == 20 + threadId_size); - - // Check the decl_id - offset += uint32_t_size; - uint32_t entityDeclId = ReadUint32(readableData, offset); - BOOST_CHECK(entityDeclId == 4); - - // Check the timestamp - offset += uint32_t_size; - uint64_t readTimestamp = ReadUint64(readableData, offset); - if (timestamp.has_value()) - { - BOOST_CHECK(readTimestamp == timestamp.value()); - } - else - { - BOOST_CHECK(readTimestamp != 0); - } - - // Check the thread id - offset += uint64_t_size; - std::vector<uint8_t> readThreadId(threadId_size, 0); - ReadBytes(readableData, offset, threadId_size, readThreadId.data()); - if (threadId.has_value()) - { - BOOST_CHECK(readThreadId == threadId.value()); - } - else - { - BOOST_CHECK(readThreadId == std::this_thread::get_id()); - } - - // Check the event GUID - offset += threadId_size; - uint64_t readEventGuid = ReadUint64(readableData, offset); - if (eventGuid.has_value()) - { - BOOST_CHECK(readEventGuid == eventGuid.value()); - } - else - { - BOOST_CHECK(readEventGuid != ProfilingGuid(0)); - } - - offset += uint64_t_size; -} - -} // Anonymous namespace - BOOST_AUTO_TEST_SUITE(TimelineUtilityMethodsTests) BOOST_AUTO_TEST_CASE(CreateTypedLabelTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. @@ -375,10 +33,10 @@ BOOST_AUTO_TEST_CASE(CreateTypedLabelTest) const std::string entityName = "some entity"; ProfilingStaticGuid labelTypeGuid(456); - BOOST_CHECK_NO_THROW(timelineUtilityMethods.CreateTypedLabel(entityGuid, entityName, labelTypeGuid)); + BOOST_CHECK_NO_THROW(timelineUtilityMethods.MarkEntityWithLabel(entityGuid, entityName, labelTypeGuid)); // Commit all packets at once - sendTimelinePacket.Commit(); + timelineUtilityMethods.Commit(); // Get the readable buffer auto readableBuffer = mockBufferManager.GetReadableBuffer(); @@ -417,19 +75,19 @@ BOOST_AUTO_TEST_CASE(CreateTypedLabelTest) BOOST_AUTO_TEST_CASE(SendWellKnownLabelsAndEventClassesTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); BOOST_CHECK_NO_THROW(timelineUtilityMethods.SendWellKnownLabelsAndEventClasses()); // Commit all packets at once - sendTimelinePacket.Commit(); + timelineUtilityMethods.Commit(); // Get the readable buffer auto readableBuffer = mockBufferManager.GetReadableBuffer(); BOOST_CHECK(readableBuffer != nullptr); unsigned int size = readableBuffer->GetSize(); - BOOST_CHECK(size == 136); + BOOST_TEST(size == 308); const unsigned char* readableData = readableBuffer->GetReadableData(); BOOST_CHECK(readableData != nullptr); @@ -454,6 +112,37 @@ BOOST_AUTO_TEST_CASE(SendWellKnownLabelsAndEventClassesTest) readableData, offset); + // Forth "well-known" label: BACKENDID + VerifyTimelineLabelBinaryPacket(LabelsAndEventClasses::BACKENDID_GUID, + LabelsAndEventClasses::BACKENDID_LABEL, + readableData, + offset); + + // Well-known types + // Layer + VerifyTimelineLabelBinaryPacket(LabelsAndEventClasses::LAYER_GUID, + LabelsAndEventClasses::LAYER, + readableData, + offset); + + // Workload + VerifyTimelineLabelBinaryPacket(LabelsAndEventClasses::WORKLOAD_GUID, + LabelsAndEventClasses::WORKLOAD, + readableData, + offset); + + // Network + VerifyTimelineLabelBinaryPacket(LabelsAndEventClasses::NETWORK_GUID, + LabelsAndEventClasses::NETWORK, + readableData, + offset); + + // Connection + VerifyTimelineLabelBinaryPacket(LabelsAndEventClasses::CONNECTION_GUID, + LabelsAndEventClasses::CONNECTION, + readableData, + offset); + // First "well-known" event class: START OF LIFE VerifyTimelineEventClassBinaryPacket(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS, readableData, @@ -471,7 +160,7 @@ BOOST_AUTO_TEST_CASE(SendWellKnownLabelsAndEventClassesTest) BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); ProfilingDynamicGuid childEntityGuid(0); @@ -497,7 +186,7 @@ BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest) BOOST_CHECK(childEntityGuid != ProfilingGuid(0)); // Commit all packets at once - sendTimelinePacket.Commit(); + timelineUtilityMethods.Commit(); // Get the readable buffer auto readableBuffer = mockBufferManager.GetReadableBuffer(); @@ -566,7 +255,7 @@ BOOST_AUTO_TEST_CASE(CreateNamedTypedChildEntityTest) BOOST_AUTO_TEST_CASE(DeclareLabelTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. @@ -594,7 +283,7 @@ BOOST_AUTO_TEST_CASE(DeclareLabelTest) BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); // Invalid name @@ -618,7 +307,7 @@ BOOST_AUTO_TEST_CASE(CreateNameTypeEntityInvalidTest) BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); const std::string entityName = "Entity0"; @@ -631,7 +320,7 @@ BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest) BOOST_CHECK(guid != ProfilingGuid(0)); // Commit all packets at once - sendTimelinePacket.Commit(); + timelineUtilityMethods.Commit(); // Get the readable buffer auto readableBuffer = mockBufferManager.GetReadableBuffer(); @@ -694,9 +383,8 @@ BOOST_AUTO_TEST_CASE(CreateNameTypeEntityTest) BOOST_AUTO_TEST_CASE(RecordEventTest) { MockBufferManager mockBufferManager(1024); - SendTimelinePacket sendTimelinePacket(mockBufferManager); + std::unique_ptr<ISendTimelinePacket> sendTimelinePacket = std::make_unique<SendTimelinePacket>(mockBufferManager); TimelineUtilityMethods timelineUtilityMethods(sendTimelinePacket); - // Generate first guid to ensure that the named typed entity guid is not 0 on local single test. ProfilingService::Instance().NextGuid(); @@ -707,7 +395,7 @@ BOOST_AUTO_TEST_CASE(RecordEventTest) BOOST_CHECK(eventGuid != ProfilingGuid(0)); // Commit all packets at once - sendTimelinePacket.Commit(); + timelineUtilityMethods.Commit(); // Get the readable buffer auto readableBuffer = mockBufferManager.GetReadableBuffer(); @@ -734,7 +422,7 @@ BOOST_AUTO_TEST_CASE(RecordEventTest) // Third packet sent: TimelineRelationshipBinaryPacket VerifyTimelineRelationshipBinaryPacket(ProfilingRelationshipType::DataLink, EmptyOptional(), - entityGuid, + eventGuid, eventClassGuid, readableData, offset); |