6 #include <client/src/ProfilingConnectionDumpToFileDecorator.hpp> 12 #include <common/include/IgnoreUnused.hpp> 13 #include <common/include/NumericCast.hpp> 19 #include <doctest/doctest.h> 26 const std::vector<char> g_Data = {
'd',
'u',
'm',
'm',
'y' };
28 const unsigned char* g_DataPtr =
reinterpret_cast<const unsigned char*
>(g_Data.data());
30 class DummyProfilingConnection :
public IProfilingConnection
33 DummyProfilingConnection()
35 , m_PacketData(
std::make_unique<unsigned char[]>(g_DataLength))
38 std::memcpy(m_PacketData.get(), g_DataPtr, g_DataLength);
39 m_Packet = std::make_unique<Packet>(0u, g_DataLength, m_PacketData);
42 ~DummyProfilingConnection() =
default;
44 bool IsOpen()
const override 54 bool WritePacket(
const unsigned char* buffer, uint32_t length)
override 61 Packet ReadPacket(uint32_t timeout)
override 64 return std::move(*m_Packet);
69 std::unique_ptr<unsigned char[]> m_PacketData;
70 std::unique_ptr<Packet> m_Packet;
73 std::vector<char> ReadDumpFile(
const std::string& dumpFileName)
75 std::ifstream input(dumpFileName, std::ios::binary);
76 return std::vector<char>(std::istreambuf_iterator<char>(input), {});
81 TEST_SUITE(
"ProfilingConnectionDumpToFileDecoratorTests")
83 TEST_CASE(
"DumpIncomingInvalidFile")
85 ProfilingOptions options;
86 options.m_IncomingCaptureFile =
"/";
87 options.m_OutgoingCaptureFile =
"";
88 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options,
false);
89 CHECK_THROWS_AS(decorator.ReadPacket(0), arm::pipe::ProfilingException);
92 TEST_CASE(
"DumpIncomingInvalidFileIgnoreErrors")
94 ProfilingOptions options;
95 options.m_IncomingCaptureFile =
"/";
96 options.m_OutgoingCaptureFile =
"";
97 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options,
true);
98 CHECK_NOTHROW(decorator.ReadPacket(0));
101 TEST_CASE(
"DumpIncomingValidFile")
105 ProfilingOptions options;
106 options.m_IncomingCaptureFile = fileName.string();
107 options.m_OutgoingCaptureFile =
"";
109 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options,
false);
112 std::unique_ptr<Packet> packet;
113 CHECK_NOTHROW(packet = std::make_unique<Packet>(decorator.ReadPacket(0)));
117 std::vector<char> data = ReadDumpFile(options.m_IncomingCaptureFile);
118 const char* packetData =
reinterpret_cast<const char*
>(packet->GetData());
121 constexpr
unsigned int bytesToSkip = 2u *
sizeof(uint32_t);
122 int diff = std::strncmp(data.data() + bytesToSkip, packetData, g_DataLength);
124 fs::remove(fileName);
127 TEST_CASE(
"DumpOutgoingInvalidFile")
129 ProfilingOptions options;
130 options.m_IncomingCaptureFile =
"";
131 options.m_OutgoingCaptureFile =
"/";
132 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options,
false);
133 CHECK_THROWS_AS(decorator.WritePacket(g_DataPtr, g_DataLength), arm::pipe::ProfilingException);
136 TEST_CASE(
"DumpOutgoingInvalidFileIgnoreErrors")
138 ProfilingOptions options;
139 options.m_IncomingCaptureFile =
"";
140 options.m_OutgoingCaptureFile =
"/";
142 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options,
true);
143 CHECK_NOTHROW(decorator.WritePacket(g_DataPtr, g_DataLength));
145 bool success = decorator.WritePacket(g_DataPtr, g_DataLength);
149 TEST_CASE(
"DumpOutgoingValidFile")
153 ProfilingOptions options;
154 options.m_IncomingCaptureFile =
"";
155 options.m_OutgoingCaptureFile = fileName.string();
157 ProfilingConnectionDumpToFileDecorator decorator(std::make_unique<DummyProfilingConnection>(), options,
false);
159 bool success =
false;
160 CHECK_NOTHROW(success = decorator.WritePacket(g_DataPtr, g_DataLength));
165 std::vector<char> data = ReadDumpFile(options.m_OutgoingCaptureFile);
168 int diff = std::strncmp(data.data(), g_Data.data(), g_DataLength);
170 fs::remove(fileName);
TEST_SUITE("ProfilingConnectionDumpToFileDecoratorTests")
void IgnoreUnused(Ts &&...)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
fs::path NamedTempFile(const char *fileName)
Returns a path to a file in the system temporary folder. If the file existed it will be deleted...