From cdfb9417ddce28a5cbd33f8049a147168a26aa9b Mon Sep 17 00:00:00 2001 From: Matteo Martincigh Date: Fri, 8 Nov 2019 11:23:06 +0000 Subject: IVGCVSW-4073 Send stream info in the ConnectionAcknowledgedCommandHandler * Added call to ISendTimelinePacket::SendStreamMetaDataPacket * Added call to ISendTimelinePacket::SendTimelineMessageDirectoryPackage * Added new StreamMetadataCommandHandler class to the mock Gatord service * Updated code and unit tests * Added include paths to the gatord mock target Signed-off-by: Matteo Martincigh Change-Id: Ic6d200b513175884607b7c0563cbfa4942ff2fc6 --- .../gatordmock/StreamMetadataCommandHandler.cpp | 127 +++++++++++++++++++++ .../gatordmock/StreamMetadataCommandHandler.hpp | 71 ++++++++++++ .../profiling/gatordmock/tests/GatordMockTests.cpp | 15 ++- 3 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 tests/profiling/gatordmock/StreamMetadataCommandHandler.cpp create mode 100644 tests/profiling/gatordmock/StreamMetadataCommandHandler.hpp (limited to 'tests') diff --git a/tests/profiling/gatordmock/StreamMetadataCommandHandler.cpp b/tests/profiling/gatordmock/StreamMetadataCommandHandler.cpp new file mode 100644 index 0000000000..09255a57a1 --- /dev/null +++ b/tests/profiling/gatordmock/StreamMetadataCommandHandler.cpp @@ -0,0 +1,127 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "StreamMetadataCommandHandler.hpp" + +#include + +#include + +#include +#include + +using namespace armnn::profiling; + +namespace armnn +{ + +namespace gatordmock +{ + +void StreamMetadataCommandHandler::operator()(const Packet& packet) +{ + ParseData(packet); + + if (m_QuietOperation) + { + return; + } + + std::stringstream ss; + + ss << "Stream metadata packet received" << std::endl << std::endl; + + ss << "Pipe magic: " << m_PipeMagic << std::endl; + ss << "Stream metadata version: " << m_StreamMetadataVersion << std::endl; + ss << "Max data len: " << m_MaxDataLen << std::endl; + ss << "Pid: " << m_Pid << std::endl; + ss << "Software info: " << m_SoftwareInfo << std::endl; + ss << "Hardware version: " << m_HardwareVersion << std::endl; + ss << "Software version: " << m_SoftwareVersion << std::endl; + ss << "Process name: " << m_ProcessName << std::endl; + ss << "Packet versions: " << m_PacketVersionTable.size() << std::endl; + + for (const auto& packetVersion : m_PacketVersionTable) + { + ss << "-----------------------" << std::endl; + ss << "Packet family: " << packetVersion.m_PacketFamily << std::endl; + ss << "Packet id: " << packetVersion.m_PacketId << std::endl; + ss << "Packet version: " << packetVersion.m_PacketVersion << std::endl; + } + + std::cout << ss.str() << std::endl; +} + +std::string ReadString(const unsigned char* buffer, unsigned int &offset) +{ + const char* stringPtr = reinterpret_cast(&buffer[offset]); + return stringPtr != nullptr ? std::string(stringPtr) : ""; +} + +void StreamMetadataCommandHandler::ParseData(const Packet &packet) +{ + // Check that at least the packet contains the fixed-length fields + if (packet.GetLength() < 80) + { + return; + } + + // Utils + unsigned int uint16_t_size = sizeof(uint16_t); + unsigned int uint32_t_size = sizeof(uint32_t); + + const unsigned char* buffer = packet.GetData(); + unsigned int offset = 0; + + // Get the fixed-length fields + m_PipeMagic = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_StreamMetadataVersion = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_MaxDataLen = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_Pid = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_OffsetInfo = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_OffsetHwVersion = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_OffsetSwVersion = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_OffsetProcessName = ReadUint32(buffer, offset); + offset += uint32_t_size; + m_OffsetPacketVersionTable = ReadUint32(buffer, offset); + offset += uint32_t_size * 2; // Also skipping the reserved word (all zeros) + + // Get the string fields + m_SoftwareInfo = m_OffsetInfo > 0 ? ReadString(buffer, m_OffsetInfo) : ""; + m_HardwareVersion = m_OffsetHwVersion > 0 ? ReadString(buffer, m_OffsetHwVersion) : ""; + m_SoftwareVersion = m_OffsetSwVersion > 0 ? ReadString(buffer, m_OffsetSwVersion) : ""; + m_ProcessName = m_OffsetProcessName > 0 ? ReadString(buffer, m_OffsetProcessName) : ""; + + // Get the packet versions + m_PacketVersionTable.clear(); + if (m_OffsetPacketVersionTable > 0) + { + offset = m_OffsetPacketVersionTable; + uint16_t packetEntries = ReadUint16(buffer, offset + uint16_t_size); + offset += uint32_t_size; // Also skipping the reserved bytes (all zeros) + for (uint16_t i = 0; i < packetEntries; i++) + { + uint16_t packetFamilyAndId = ReadUint16(buffer, offset + uint16_t_size); + uint16_t packetFamily = (packetFamilyAndId >> 10) & 0x003F; + uint16_t packetId = (packetFamilyAndId >> 0) & 0x03FF; + offset += uint32_t_size; // Also skipping the reserved bytes (all zeros) + uint32_t packetVersion = ReadUint32(buffer, offset); + offset += uint32_t_size; + + m_PacketVersionTable.push_back({ packetFamily, packetId, packetVersion }); + } + } +} + +} // namespace gatordmock + +} // namespace armnn diff --git a/tests/profiling/gatordmock/StreamMetadataCommandHandler.hpp b/tests/profiling/gatordmock/StreamMetadataCommandHandler.hpp new file mode 100644 index 0000000000..4558345e67 --- /dev/null +++ b/tests/profiling/gatordmock/StreamMetadataCommandHandler.hpp @@ -0,0 +1,71 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +#include + +namespace armnn +{ + +namespace gatordmock +{ + +struct PacketVersion +{ + uint16_t m_PacketFamily; + uint16_t m_PacketId; + uint32_t m_PacketVersion; +}; + +class StreamMetadataCommandHandler : public profiling::CommandHandlerFunctor +{ + +public: + /** + * @param familyId The family of the packets this handler will service + * @param packetId The id of packets this handler will process + * @param version The version of that id + * @param quietOperation Optional parameter to turn off printouts. This is useful for unit tests + */ + StreamMetadataCommandHandler(uint32_t familyId, + uint32_t packetId, + uint32_t version, + bool quietOperation = false) + : CommandHandlerFunctor(familyId, packetId, version) + , m_QuietOperation(quietOperation) + {} + + void operator()(const armnn::profiling::Packet& packet) override; + +private: + void ParseData(const armnn::profiling::Packet& packet); + + uint32_t m_PipeMagic; + uint32_t m_StreamMetadataVersion; + uint32_t m_MaxDataLen; + uint32_t m_Pid; + uint32_t m_OffsetInfo; + uint32_t m_OffsetHwVersion; + uint32_t m_OffsetSwVersion; + uint32_t m_OffsetProcessName; + uint32_t m_OffsetPacketVersionTable; + + std::string m_SoftwareInfo; + std::string m_HardwareVersion; + std::string m_SoftwareVersion; + std::string m_ProcessName; + + std::vector m_PacketVersionTable; + + bool m_QuietOperation; +}; + +} // namespace gatordmock + +} // namespace armnn diff --git a/tests/profiling/gatordmock/tests/GatordMockTests.cpp b/tests/profiling/gatordmock/tests/GatordMockTests.cpp index 53f580deaf..26c0361200 100644 --- a/tests/profiling/gatordmock/tests/GatordMockTests.cpp +++ b/tests/profiling/gatordmock/tests/GatordMockTests.cpp @@ -3,12 +3,13 @@ // SPDX-License-Identifier: MIT // -#include "../GatordMockService.hpp" -#include "../PeriodicCounterCaptureCommandHandler.hpp" - #include #include #include +#include +#include +#include +#include #include @@ -117,15 +118,23 @@ BOOST_AUTO_TEST_CASE(GatorDMockEndToEnd) profiling::CommandHandlerRegistry registry; // Update with derived functors + gatordmock::StreamMetadataCommandHandler streamMetadataCommandHandler( + 0, 0, packetVersionResolver.ResolvePacketVersion(0, 0).GetEncodedValue(), true); + gatordmock::PeriodicCounterCaptureCommandHandler counterCaptureCommandHandler( 0, 4, packetVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue(), true); profiling::DirectoryCaptureCommandHandler directoryCaptureCommandHandler( 0, 2, packetVersionResolver.ResolvePacketVersion(0, 2).GetEncodedValue(), true); + gatordmock::TimelineDirectoryCaptureCommandHandler timelineDirectoryCaptureCommandHandler( + 1, 0, packetVersionResolver.ResolvePacketVersion(1, 0).GetEncodedValue(), true); + // Register different derived functors + registry.RegisterFunctor(&streamMetadataCommandHandler); registry.RegisterFunctor(&counterCaptureCommandHandler); registry.RegisterFunctor(&directoryCaptureCommandHandler); + registry.RegisterFunctor(&timelineDirectoryCaptureCommandHandler); // Setup the mock service to bind to the UDS. std::string udsNamespace = "gatord_namespace"; gatordmock::GatordMockService mockService(registry, false); -- cgit v1.2.1