blob: 147763f99cffc2801c9c76a8859cf19758ce4ac7 [file] [log] [blame]
Aron Virginas-Tardfa14772019-09-24 18:24:47 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tardfa14772019-09-24 18:24:47 +01003// SPDX-License-Identifier: MIT
4//
5
Jim Flynn3e9bc192022-03-23 23:01:26 +00006#include <client/src/ProfilingConnectionDumpToFileDecorator.hpp>
Jim Flynn75c14f42022-03-10 22:05:42 +00007
Keith Davisb10e0812019-10-17 09:52:50 +01008#include <Runtime.hpp>
Jim Flynn75c14f42022-03-10 22:05:42 +00009
10#include <armnnUtils/Filesystem.hpp>
11
Jim Flynn9265a882022-03-10 23:35:26 +000012#include <common/include/IgnoreUnused.hpp>
Jim Flynn75c14f42022-03-10 22:05:42 +000013#include <common/include/NumericCast.hpp>
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010014
Jim Flynn9265a882022-03-10 23:35:26 +000015
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010016#include <fstream>
17#include <sstream>
18
Sadik Armagan1625efc2021-06-10 18:24:34 +010019#include <doctest/doctest.h>
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010020
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000021using namespace arm::pipe;
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010022
23namespace
24{
25
26const std::vector<char> g_Data = { 'd', 'u', 'm', 'm', 'y' };
Jim Flynn75c14f42022-03-10 22:05:42 +000027const uint32_t g_DataLength = arm::pipe::numeric_cast<uint32_t>(g_Data.size());
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010028const unsigned char* g_DataPtr = reinterpret_cast<const unsigned char*>(g_Data.data());
29
30class DummyProfilingConnection : public IProfilingConnection
31{
32public:
33 DummyProfilingConnection()
34 : m_Open(true)
Matteo Martincigh67ef2a52019-10-10 13:29:02 +010035 , m_PacketData(std::make_unique<unsigned char[]>(g_DataLength))
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010036 {
37 // populate packet data and construct packet
38 std::memcpy(m_PacketData.get(), g_DataPtr, g_DataLength);
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000039 m_Packet = std::make_unique<Packet>(0u, g_DataLength, m_PacketData);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010040 }
41
42 ~DummyProfilingConnection() = default;
43
Matteo Martincigh54fb9572019-10-02 12:50:57 +010044 bool IsOpen() const override
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010045 {
46 return m_Open;
47 }
48
49 void Close() override
50 {
51 m_Open = false;
52 }
53
54 bool WritePacket(const unsigned char* buffer, uint32_t length) override
55 {
Jim Flynn9265a882022-03-10 23:35:26 +000056 arm::pipe::IgnoreUnused(buffer);
57 arm::pipe::IgnoreUnused(length);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010058 return true;
59 }
60
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000061 Packet ReadPacket(uint32_t timeout) override
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010062 {
Jim Flynn9265a882022-03-10 23:35:26 +000063 arm::pipe::IgnoreUnused(timeout);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010064 return std::move(*m_Packet);
65 }
66
67private:
Matteo Martincigh67ef2a52019-10-10 13:29:02 +010068 bool m_Open;
69 std::unique_ptr<unsigned char[]> m_PacketData;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000070 std::unique_ptr<Packet> m_Packet;
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010071};
72
73std::vector<char> ReadDumpFile(const std::string& dumpFileName)
74{
75 std::ifstream input(dumpFileName, std::ios::binary);
76 return std::vector<char>(std::istreambuf_iterator<char>(input), {});
77}
78
79} // anonymous namespace
80
Sadik Armagan1625efc2021-06-10 18:24:34 +010081TEST_SUITE("ProfilingConnectionDumpToFileDecoratorTests")
82{
83TEST_CASE("DumpIncomingInvalidFile")
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010084{
Jim Flynn4c9ed1d2022-01-23 23:57:20 +000085 ProfilingOptions options;
Keith Davisb10e0812019-10-17 09:52:50 +010086 options.m_IncomingCaptureFile = "/";
87 options.m_OutgoingCaptureFile = "";
88 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false);
Jim Flynnf9db3ef2022-03-08 21:23:44 +000089 CHECK_THROWS_AS(decorator.ReadPacket(0), arm::pipe::ProfilingException);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010090}
91
Sadik Armagan1625efc2021-06-10 18:24:34 +010092TEST_CASE("DumpIncomingInvalidFileIgnoreErrors")
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010093{
Jim Flynn4c9ed1d2022-01-23 23:57:20 +000094 ProfilingOptions options;
Keith Davisb10e0812019-10-17 09:52:50 +010095 options.m_IncomingCaptureFile = "/";
96 options.m_OutgoingCaptureFile = "";
97 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, true);
Sadik Armagan1625efc2021-06-10 18:24:34 +010098 CHECK_NOTHROW(decorator.ReadPacket(0));
Aron Virginas-Tardfa14772019-09-24 18:24:47 +010099}
100
Sadik Armagan1625efc2021-06-10 18:24:34 +0100101TEST_CASE("DumpIncomingValidFile")
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100102{
Francis Murtagh532a29d2020-06-29 11:50:01 +0100103 fs::path fileName = armnnUtils::Filesystem::NamedTempFile("Armnn-DumpIncomingValidFileTest-TempFile");
Aron Virginas-Tar8bf442e2019-11-07 18:41:40 +0000104
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000105 ProfilingOptions options;
Rob Hughes270233f2019-11-13 11:53:48 +0000106 options.m_IncomingCaptureFile = fileName.string();
Keith Davisb10e0812019-10-17 09:52:50 +0100107 options.m_OutgoingCaptureFile = "";
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100108
Keith Davisb10e0812019-10-17 09:52:50 +0100109 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100110
111 // NOTE: unique_ptr is needed here because operator=() is deleted for Packet
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000112 std::unique_ptr<Packet> packet;
113 CHECK_NOTHROW(packet = std::make_unique<Packet>(decorator.ReadPacket(0)));
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100114
115 decorator.Close();
116
Keith Davisb10e0812019-10-17 09:52:50 +0100117 std::vector<char> data = ReadDumpFile(options.m_IncomingCaptureFile);
Matteo Martincigh67ef2a52019-10-10 13:29:02 +0100118 const char* packetData = reinterpret_cast<const char*>(packet->GetData());
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100119
120 // check if the data read back from the dump file matches the original
121 constexpr unsigned int bytesToSkip = 2u * sizeof(uint32_t); // skip header and packet length
122 int diff = std::strncmp(data.data() + bytesToSkip, packetData, g_DataLength);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100123 CHECK(diff == 0);
Francis Murtagh532a29d2020-06-29 11:50:01 +0100124 fs::remove(fileName);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100125}
126
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127TEST_CASE("DumpOutgoingInvalidFile")
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100128{
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000129 ProfilingOptions options;
Keith Davisb10e0812019-10-17 09:52:50 +0100130 options.m_IncomingCaptureFile = "";
131 options.m_OutgoingCaptureFile = "/";
132 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false);
Jim Flynnf9db3ef2022-03-08 21:23:44 +0000133 CHECK_THROWS_AS(decorator.WritePacket(g_DataPtr, g_DataLength), arm::pipe::ProfilingException);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100134}
135
Sadik Armagan1625efc2021-06-10 18:24:34 +0100136TEST_CASE("DumpOutgoingInvalidFileIgnoreErrors")
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100137{
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000138 ProfilingOptions options;
Keith Davisb10e0812019-10-17 09:52:50 +0100139 options.m_IncomingCaptureFile = "";
140 options.m_OutgoingCaptureFile = "/";
141
142 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, true);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100143 CHECK_NOTHROW(decorator.WritePacket(g_DataPtr, g_DataLength));
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100144
145 bool success = decorator.WritePacket(g_DataPtr, g_DataLength);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100146 CHECK(!success);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100147}
148
Sadik Armagan1625efc2021-06-10 18:24:34 +0100149TEST_CASE("DumpOutgoingValidFile")
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100150{
Francis Murtagh532a29d2020-06-29 11:50:01 +0100151 fs::path fileName = armnnUtils::Filesystem::NamedTempFile("Armnn-DumpOutgoingValidFileTest-TempFile");
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100152
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000153 ProfilingOptions options;
Keith Davisb10e0812019-10-17 09:52:50 +0100154 options.m_IncomingCaptureFile = "";
Rob Hughes270233f2019-11-13 11:53:48 +0000155 options.m_OutgoingCaptureFile = fileName.string();
Keith Davisb10e0812019-10-17 09:52:50 +0100156
157 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100158
159 bool success = false;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100160 CHECK_NOTHROW(success = decorator.WritePacket(g_DataPtr, g_DataLength));
161 CHECK(success);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100162
163 decorator.Close();
164
Keith Davisb10e0812019-10-17 09:52:50 +0100165 std::vector<char> data = ReadDumpFile(options.m_OutgoingCaptureFile);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100166
167 // check if the data read back from the dump file matches the original
168 int diff = std::strncmp(data.data(), g_Data.data(), g_DataLength);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100169 CHECK(diff == 0);
Francis Murtagh532a29d2020-06-29 11:50:01 +0100170 fs::remove(fileName);
Aron Virginas-Tardfa14772019-09-24 18:24:47 +0100171}
172
Sadik Armagan1625efc2021-06-10 18:24:34 +0100173}