aboutsummaryrefslogtreecommitdiff
path: root/tests/profiling/timelineDecoder/tests/TimelineTests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/profiling/timelineDecoder/tests/TimelineTests.cpp')
-rw-r--r--tests/profiling/timelineDecoder/tests/TimelineTests.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/tests/profiling/timelineDecoder/tests/TimelineTests.cpp b/tests/profiling/timelineDecoder/tests/TimelineTests.cpp
new file mode 100644
index 0000000000..a9c352b5fa
--- /dev/null
+++ b/tests/profiling/timelineDecoder/tests/TimelineTests.cpp
@@ -0,0 +1,206 @@
+//
+// Copyright © 2019 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "../TimelineCaptureCommandHandler.hpp"
+#include "../TimelineDirectoryCaptureCommandHandler.hpp"
+#include "../ITimelineDecoder.h"
+#include "../TimelineModel.h"
+#include "TimelineTestFunctions.hpp"
+
+#include <CommandHandlerFunctor.hpp>
+#include <ProfilingService.hpp>
+#include <PacketBuffer.hpp>
+#include <TimelinePacketWriterFactory.hpp>
+
+#include <boost/test/test_tools.hpp>
+#include <boost/test/unit_test_suite.hpp>
+
+BOOST_AUTO_TEST_SUITE(TimelineDecoderTests)
+
+using namespace armnn;
+
+void SendTimelinePacketToCommandHandler(const unsigned char* packetBuffer,
+ profiling::CommandHandlerFunctor &CommandHandler)
+{
+ uint32_t uint32_t_size = sizeof(uint32_t);
+ unsigned int offset = 0;
+
+ uint32_t header[2];
+ header[0] = profiling::ReadUint32(packetBuffer, offset);
+ offset += uint32_t_size;
+ header[1] = profiling::ReadUint32(packetBuffer, offset);
+ offset += uint32_t_size;
+
+ uint32_t PacketDataLength = header[1] & 0x00FFFFFF;
+
+ std::unique_ptr<unsigned char[]> uniquePacketData = std::make_unique<unsigned char[]>(PacketDataLength);
+
+ std::memcpy(uniquePacketData.get(), packetBuffer + offset, PacketDataLength);
+
+ armnn::profiling::Packet packet = armnn::profiling::Packet(header[0], PacketDataLength, uniquePacketData);
+
+ CommandHandler(packet);
+}
+
+BOOST_AUTO_TEST_CASE(TimelineDirecotryTest)
+{
+ uint32_t uint32_t_size = sizeof(uint32_t);
+
+ profiling::BufferManager bufferManager(5);
+ profiling::TimelinePacketWriterFactory timelinePacketWriterFactory(bufferManager);
+
+ std::unique_ptr<profiling::ISendTimelinePacket> sendTimelinePacket =
+ timelinePacketWriterFactory.GetSendTimelinePacket();
+
+ profiling::PacketVersionResolver packetVersionResolver;
+
+ gatordmock::TimelineDirectoryCaptureCommandHandler timelineDirectoryCaptureCommandHandler(
+ 1, 0, packetVersionResolver.ResolvePacketVersion(1, 0).GetEncodedValue(), true);
+
+ sendTimelinePacket->SendTimelineMessageDirectoryPackage();
+ sendTimelinePacket->Commit();
+
+ std::vector<profiling::SwTraceMessage> swTraceBufferMessages;
+
+ unsigned int offset = uint32_t_size * 2;
+
+ std::unique_ptr<profiling::IPacketBuffer> packetBuffer = bufferManager.GetReadableBuffer();
+
+ uint32_t declarationSize = profiling::ReadUint32(packetBuffer, offset);
+ offset += uint32_t_size;
+ for(uint32_t i = 0; i < declarationSize; ++i)
+ {
+ swTraceBufferMessages.push_back(profiling::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset));
+ }
+
+ SendTimelinePacketToCommandHandler(packetBuffer->GetReadableData(), timelineDirectoryCaptureCommandHandler);
+
+ for(uint32_t index = 0; index < declarationSize; ++index)
+ {
+ profiling::SwTraceMessage& bufferMessage = swTraceBufferMessages[index];
+ profiling::SwTraceMessage& handlerMessage = timelineDirectoryCaptureCommandHandler.m_SwTraceMessages[index];
+
+ BOOST_CHECK(bufferMessage.name == handlerMessage.name);
+ BOOST_CHECK(bufferMessage.uiName == handlerMessage.uiName);
+ BOOST_CHECK(bufferMessage.id == handlerMessage.id);
+
+ BOOST_CHECK(bufferMessage.argTypes.size() == handlerMessage.argTypes.size());
+ for(uint32_t i = 0; i < bufferMessage.argTypes.size(); ++i)
+ {
+ BOOST_CHECK(bufferMessage.argTypes[i] == handlerMessage.argTypes[i]);
+ }
+
+ BOOST_CHECK(bufferMessage.argNames.size() == handlerMessage.argNames.size());
+ for(uint32_t i = 0; i < bufferMessage.argNames.size(); ++i)
+ {
+ BOOST_CHECK(bufferMessage.argNames[i] == handlerMessage.argNames[i]);
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(TimelineCaptureTest)
+{
+ uint32_t threadId_size = sizeof(std::thread::id);
+
+ profiling::BufferManager bufferManager(50);
+ profiling::TimelinePacketWriterFactory timelinePacketWriterFactory(bufferManager);
+
+ std::unique_ptr<profiling::ISendTimelinePacket> sendTimelinePacket =
+ timelinePacketWriterFactory.GetSendTimelinePacket();
+
+ profiling::PacketVersionResolver packetVersionResolver;
+
+ Model* modelPtr;
+ CreateModel(&modelPtr);
+
+ gatordmock::TimelineCaptureCommandHandler timelineCaptureCommandHandler(
+ 1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), modelPtr, true);
+
+ BOOST_CHECK(SetEntityCallback(PushEntity, modelPtr) == ErrorCode_Success);
+ BOOST_CHECK(SetEventClassCallback(PushEventClass, modelPtr) == ErrorCode_Success);
+ BOOST_CHECK(SetEventCallback(PushEvent, modelPtr) == ErrorCode_Success);
+ BOOST_CHECK(SetLabelCallback(PushLabel, modelPtr) == ErrorCode_Success);
+ BOOST_CHECK(SetRelationshipCallback(PushRelationship, modelPtr) == ErrorCode_Success);
+
+ const uint64_t entityGuid = 22222u;
+
+ const uint64_t eventClassGuid = 33333u;
+
+ const uint64_t timestamp = 111111u;
+ const uint64_t eventGuid = 55555u;
+
+ const std::thread::id threadId = std::this_thread::get_id();;
+
+ const uint64_t labelGuid = 11111u;
+ std::string labelName = "test_label";
+
+ const uint64_t relationshipGuid = 44444u;
+ const uint64_t headGuid = 111111u;
+ const uint64_t tailGuid = 222222u;
+
+ for (int i = 0; i < 10; ++i)
+ {
+ // Send entity
+ sendTimelinePacket->SendTimelineEntityBinaryPacket(entityGuid);
+ sendTimelinePacket->Commit();
+ SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
+ timelineCaptureCommandHandler);
+
+ // Send event class
+ sendTimelinePacket->SendTimelineEventClassBinaryPacket(eventClassGuid);
+ sendTimelinePacket->Commit();
+ SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
+ timelineCaptureCommandHandler);
+
+ // Send event
+ sendTimelinePacket->SendTimelineEventBinaryPacket(timestamp, threadId, eventGuid);
+ sendTimelinePacket->Commit();
+ SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
+ timelineCaptureCommandHandler);
+
+ // Send label
+ sendTimelinePacket->SendTimelineLabelBinaryPacket(labelGuid, labelName);
+ sendTimelinePacket->Commit();
+ SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
+ timelineCaptureCommandHandler);
+
+ // Send relationship
+ profiling::ProfilingRelationshipType relationshipType = profiling::ProfilingRelationshipType::DataLink;
+ sendTimelinePacket->SendTimelineRelationshipBinaryPacket(relationshipType,
+ relationshipGuid,
+ headGuid,
+ tailGuid);
+ sendTimelinePacket->Commit();
+ SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
+ timelineCaptureCommandHandler);
+ }
+
+ for (int i = 0; i < 10; ++i)
+ {
+ BOOST_CHECK(modelPtr->m_Entities[i]->m_Guid == entityGuid);
+
+ BOOST_CHECK(modelPtr->m_EventClasses[i]->m_Guid == eventClassGuid);
+
+ BOOST_CHECK(modelPtr->m_Events[i]->m_TimeStamp == timestamp);
+
+ std::vector<uint8_t> readThreadId(threadId_size, 0);
+ profiling::ReadBytes(modelPtr->m_Events[i]->m_ThreadId, 0, threadId_size, readThreadId.data());
+ BOOST_CHECK(readThreadId == threadId);
+
+ BOOST_CHECK(modelPtr->m_Events[i]->m_Guid == eventGuid);
+
+ BOOST_CHECK(modelPtr->m_Labels[i]->m_Guid == labelGuid);
+ BOOST_CHECK(std::string(modelPtr->m_Labels[i]->m_Name) == labelName);
+
+ BOOST_CHECK(modelPtr->m_Relationships[i]->m_RelationshipType == RelationshipType::DataLink);
+ BOOST_CHECK(modelPtr->m_Relationships[i]->m_Guid == relationshipGuid);
+ BOOST_CHECK(modelPtr->m_Relationships[i]->m_HeadGuid == headGuid);
+ BOOST_CHECK(modelPtr->m_Relationships[i]->m_TailGuid == tailGuid);
+ }
+
+ DestroyModel(&modelPtr);
+}
+
+BOOST_AUTO_TEST_SUITE_END()