Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 1 | // |
Jim Flynn | bbfe603 | 2020-07-20 16:57:44 +0100 | [diff] [blame] | 2 | // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 3 | // SPDX-License-Identifier: MIT |
| 4 | // |
| 5 | |
Jim Flynn | 3e9bc19 | 2022-03-23 23:01:26 +0000 | [diff] [blame] | 6 | #include <client/src/ProfilingConnectionDumpToFileDecorator.hpp> |
Jim Flynn | 75c14f4 | 2022-03-10 22:05:42 +0000 | [diff] [blame] | 7 | |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 8 | #include <Runtime.hpp> |
Jim Flynn | 75c14f4 | 2022-03-10 22:05:42 +0000 | [diff] [blame] | 9 | |
| 10 | #include <armnnUtils/Filesystem.hpp> |
| 11 | |
Jim Flynn | 9265a88 | 2022-03-10 23:35:26 +0000 | [diff] [blame] | 12 | #include <common/include/IgnoreUnused.hpp> |
Jim Flynn | 75c14f4 | 2022-03-10 22:05:42 +0000 | [diff] [blame] | 13 | #include <common/include/NumericCast.hpp> |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 14 | |
Jim Flynn | 9265a88 | 2022-03-10 23:35:26 +0000 | [diff] [blame] | 15 | |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 16 | #include <fstream> |
| 17 | #include <sstream> |
| 18 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 19 | #include <doctest/doctest.h> |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 20 | |
Cathal Corbett | 5aa9fd7 | 2022-02-25 15:33:28 +0000 | [diff] [blame] | 21 | using namespace arm::pipe; |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 22 | |
| 23 | namespace |
| 24 | { |
| 25 | |
| 26 | const std::vector<char> g_Data = { 'd', 'u', 'm', 'm', 'y' }; |
Jim Flynn | 75c14f4 | 2022-03-10 22:05:42 +0000 | [diff] [blame] | 27 | const uint32_t g_DataLength = arm::pipe::numeric_cast<uint32_t>(g_Data.size()); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 28 | const unsigned char* g_DataPtr = reinterpret_cast<const unsigned char*>(g_Data.data()); |
| 29 | |
| 30 | class DummyProfilingConnection : public IProfilingConnection |
| 31 | { |
| 32 | public: |
| 33 | DummyProfilingConnection() |
| 34 | : m_Open(true) |
Matteo Martincigh | 67ef2a5 | 2019-10-10 13:29:02 +0100 | [diff] [blame] | 35 | , m_PacketData(std::make_unique<unsigned char[]>(g_DataLength)) |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 36 | { |
| 37 | // populate packet data and construct packet |
| 38 | std::memcpy(m_PacketData.get(), g_DataPtr, g_DataLength); |
Cathal Corbett | 5aa9fd7 | 2022-02-25 15:33:28 +0000 | [diff] [blame] | 39 | m_Packet = std::make_unique<Packet>(0u, g_DataLength, m_PacketData); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 40 | } |
| 41 | |
| 42 | ~DummyProfilingConnection() = default; |
| 43 | |
Matteo Martincigh | 54fb957 | 2019-10-02 12:50:57 +0100 | [diff] [blame] | 44 | bool IsOpen() const override |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 45 | { |
| 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 Flynn | 9265a88 | 2022-03-10 23:35:26 +0000 | [diff] [blame] | 56 | arm::pipe::IgnoreUnused(buffer); |
| 57 | arm::pipe::IgnoreUnused(length); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 58 | return true; |
| 59 | } |
| 60 | |
Cathal Corbett | 5aa9fd7 | 2022-02-25 15:33:28 +0000 | [diff] [blame] | 61 | Packet ReadPacket(uint32_t timeout) override |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 62 | { |
Jim Flynn | 9265a88 | 2022-03-10 23:35:26 +0000 | [diff] [blame] | 63 | arm::pipe::IgnoreUnused(timeout); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 64 | return std::move(*m_Packet); |
| 65 | } |
| 66 | |
| 67 | private: |
Matteo Martincigh | 67ef2a5 | 2019-10-10 13:29:02 +0100 | [diff] [blame] | 68 | bool m_Open; |
| 69 | std::unique_ptr<unsigned char[]> m_PacketData; |
Cathal Corbett | 5aa9fd7 | 2022-02-25 15:33:28 +0000 | [diff] [blame] | 70 | std::unique_ptr<Packet> m_Packet; |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 71 | }; |
| 72 | |
| 73 | std::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 Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 81 | TEST_SUITE("ProfilingConnectionDumpToFileDecoratorTests") |
| 82 | { |
| 83 | TEST_CASE("DumpIncomingInvalidFile") |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 84 | { |
Jim Flynn | 4c9ed1d | 2022-01-23 23:57:20 +0000 | [diff] [blame] | 85 | ProfilingOptions options; |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 86 | options.m_IncomingCaptureFile = "/"; |
| 87 | options.m_OutgoingCaptureFile = ""; |
| 88 | ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false); |
Jim Flynn | f9db3ef | 2022-03-08 21:23:44 +0000 | [diff] [blame] | 89 | CHECK_THROWS_AS(decorator.ReadPacket(0), arm::pipe::ProfilingException); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 90 | } |
| 91 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 92 | TEST_CASE("DumpIncomingInvalidFileIgnoreErrors") |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 93 | { |
Jim Flynn | 4c9ed1d | 2022-01-23 23:57:20 +0000 | [diff] [blame] | 94 | ProfilingOptions options; |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 95 | options.m_IncomingCaptureFile = "/"; |
| 96 | options.m_OutgoingCaptureFile = ""; |
| 97 | ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, true); |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 98 | CHECK_NOTHROW(decorator.ReadPacket(0)); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 99 | } |
| 100 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 101 | TEST_CASE("DumpIncomingValidFile") |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 102 | { |
Francis Murtagh | 532a29d | 2020-06-29 11:50:01 +0100 | [diff] [blame] | 103 | fs::path fileName = armnnUtils::Filesystem::NamedTempFile("Armnn-DumpIncomingValidFileTest-TempFile"); |
Aron Virginas-Tar | 8bf442e | 2019-11-07 18:41:40 +0000 | [diff] [blame] | 104 | |
Jim Flynn | 4c9ed1d | 2022-01-23 23:57:20 +0000 | [diff] [blame] | 105 | ProfilingOptions options; |
Rob Hughes | 270233f | 2019-11-13 11:53:48 +0000 | [diff] [blame] | 106 | options.m_IncomingCaptureFile = fileName.string(); |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 107 | options.m_OutgoingCaptureFile = ""; |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 108 | |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 109 | ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 110 | |
| 111 | // NOTE: unique_ptr is needed here because operator=() is deleted for Packet |
Cathal Corbett | 5aa9fd7 | 2022-02-25 15:33:28 +0000 | [diff] [blame] | 112 | std::unique_ptr<Packet> packet; |
| 113 | CHECK_NOTHROW(packet = std::make_unique<Packet>(decorator.ReadPacket(0))); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 114 | |
| 115 | decorator.Close(); |
| 116 | |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 117 | std::vector<char> data = ReadDumpFile(options.m_IncomingCaptureFile); |
Matteo Martincigh | 67ef2a5 | 2019-10-10 13:29:02 +0100 | [diff] [blame] | 118 | const char* packetData = reinterpret_cast<const char*>(packet->GetData()); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 119 | |
| 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 Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 123 | CHECK(diff == 0); |
Francis Murtagh | 532a29d | 2020-06-29 11:50:01 +0100 | [diff] [blame] | 124 | fs::remove(fileName); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 125 | } |
| 126 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 127 | TEST_CASE("DumpOutgoingInvalidFile") |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 128 | { |
Jim Flynn | 4c9ed1d | 2022-01-23 23:57:20 +0000 | [diff] [blame] | 129 | ProfilingOptions options; |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 130 | options.m_IncomingCaptureFile = ""; |
| 131 | options.m_OutgoingCaptureFile = "/"; |
| 132 | ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false); |
Jim Flynn | f9db3ef | 2022-03-08 21:23:44 +0000 | [diff] [blame] | 133 | CHECK_THROWS_AS(decorator.WritePacket(g_DataPtr, g_DataLength), arm::pipe::ProfilingException); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 134 | } |
| 135 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 136 | TEST_CASE("DumpOutgoingInvalidFileIgnoreErrors") |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 137 | { |
Jim Flynn | 4c9ed1d | 2022-01-23 23:57:20 +0000 | [diff] [blame] | 138 | ProfilingOptions options; |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 139 | options.m_IncomingCaptureFile = ""; |
| 140 | options.m_OutgoingCaptureFile = "/"; |
| 141 | |
| 142 | ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, true); |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 143 | CHECK_NOTHROW(decorator.WritePacket(g_DataPtr, g_DataLength)); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 144 | |
| 145 | bool success = decorator.WritePacket(g_DataPtr, g_DataLength); |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 146 | CHECK(!success); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 147 | } |
| 148 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 149 | TEST_CASE("DumpOutgoingValidFile") |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 150 | { |
Francis Murtagh | 532a29d | 2020-06-29 11:50:01 +0100 | [diff] [blame] | 151 | fs::path fileName = armnnUtils::Filesystem::NamedTempFile("Armnn-DumpOutgoingValidFileTest-TempFile"); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 152 | |
Jim Flynn | 4c9ed1d | 2022-01-23 23:57:20 +0000 | [diff] [blame] | 153 | ProfilingOptions options; |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 154 | options.m_IncomingCaptureFile = ""; |
Rob Hughes | 270233f | 2019-11-13 11:53:48 +0000 | [diff] [blame] | 155 | options.m_OutgoingCaptureFile = fileName.string(); |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 156 | |
| 157 | ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options, false); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 158 | |
| 159 | bool success = false; |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 160 | CHECK_NOTHROW(success = decorator.WritePacket(g_DataPtr, g_DataLength)); |
| 161 | CHECK(success); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 162 | |
| 163 | decorator.Close(); |
| 164 | |
Keith Davis | b10e081 | 2019-10-17 09:52:50 +0100 | [diff] [blame] | 165 | std::vector<char> data = ReadDumpFile(options.m_OutgoingCaptureFile); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 166 | |
| 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 Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 169 | CHECK(diff == 0); |
Francis Murtagh | 532a29d | 2020-06-29 11:50:01 +0100 | [diff] [blame] | 170 | fs::remove(fileName); |
Aron Virginas-Tar | dfa1477 | 2019-09-24 18:24:47 +0100 | [diff] [blame] | 171 | } |
| 172 | |
Sadik Armagan | 1625efc | 2021-06-10 18:24:34 +0100 | [diff] [blame] | 173 | } |