| // | |
| // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. | |
| // SPDX-License-Identifier: MIT | |
| // | |
| #include <server/include/basePipeServer/ConnectionHandler.hpp> | |
| #include <SocketProfilingConnection.hpp> | |
| #include <Processes.hpp> | |
| #include <doctest/doctest.h> | |
| TEST_SUITE("BasePipeServerTests") | |
| { | |
| using namespace armnn; | |
| using namespace arm::pipe; | |
| TEST_CASE("BasePipeServerTest") | |
| { | |
| // Setup the mock service to bind to the UDS. | |
| std::string udsNamespace = "gatord_namespace"; | |
| // Try to initialize a listening socket through the ConnectionHandler | |
| CHECK_NOTHROW(ConnectionHandler connectionHandler(udsNamespace, true)); | |
| // The socket should close once we leave the scope of CHECK_NOTHROW | |
| // and socketProfilingConnection should fail to connect | |
| CHECK_THROWS_AS(profiling::SocketProfilingConnection socketProfilingConnection, | |
| arm::pipe::SocketConnectionException); | |
| // Try to initialize a listening socket through the ConnectionHandler again | |
| ConnectionHandler connectionHandler(udsNamespace, true); | |
| // socketProfilingConnection should connect now | |
| profiling::SocketProfilingConnection socketProfilingConnection; | |
| CHECK(socketProfilingConnection.IsOpen()); | |
| auto basePipeServer = connectionHandler.GetNewBasePipeServer(false); | |
| // GetNewBasePipeServer will return null if it fails to create a socket | |
| CHECK(basePipeServer.get()); | |
| profiling::BufferManager bufferManager; | |
| profiling::SendCounterPacket sendCounterPacket(bufferManager); | |
| // Check that we can receive a StreamMetaDataPacket | |
| sendCounterPacket.SendStreamMetaDataPacket(); | |
| auto packetBuffer = bufferManager.GetReadableBuffer(); | |
| const unsigned char* readBuffer = packetBuffer->GetReadableData(); | |
| unsigned int readBufferSize = packetBuffer->GetSize(); | |
| CHECK(readBuffer); | |
| CHECK(readBufferSize > 0u); | |
| socketProfilingConnection.WritePacket(readBuffer,readBufferSize); | |
| bufferManager.MarkRead(packetBuffer); | |
| CHECK(basePipeServer.get()->WaitForStreamMetaData()); | |
| CHECK(basePipeServer.get()->GetStreamMetadataPid() == armnnUtils::Processes::GetCurrentId()); | |
| CHECK(basePipeServer.get()->GetStreamMetadataMaxDataLen() == MAX_METADATA_PACKET_LENGTH); | |
| // Now try a simple PeriodicCounterSelectionPacket | |
| sendCounterPacket.SendPeriodicCounterSelectionPacket(50, {1,2,3,4,5}); | |
| packetBuffer = bufferManager.GetReadableBuffer(); | |
| readBuffer = packetBuffer->GetReadableData(); | |
| readBufferSize = packetBuffer->GetSize(); | |
| CHECK(readBuffer); | |
| CHECK(readBufferSize > 0u); | |
| socketProfilingConnection.WritePacket(readBuffer,readBufferSize); | |
| bufferManager.MarkRead(packetBuffer); | |
| auto packet1 = basePipeServer.get()->WaitForPacket(500); | |
| CHECK(!packet1.IsEmpty()); | |
| CHECK(packet1.GetPacketFamily() == 0); | |
| CHECK(packet1.GetPacketId() == 4); | |
| CHECK(packet1.GetLength() == 14); | |
| // Try and send the packet back to the client | |
| basePipeServer.get()->SendPacket(packet1.GetPacketFamily(), | |
| packet1.GetPacketId(), | |
| packet1.GetData(), | |
| packet1.GetLength()); | |
| auto packet2 = socketProfilingConnection.ReadPacket(500); | |
| CHECK(!packet2.IsEmpty()); | |
| CHECK(packet2.GetPacketFamily() == 0); | |
| CHECK(packet2.GetPacketId() == 4); | |
| CHECK(packet2.GetLength() == 14); | |
| socketProfilingConnection.Close(); | |
| } | |
| } |