blob: 8374102033c7a4a80cc461cc91fb3f0cbf849307 [file] [log] [blame]
Finn Williams2ed809c2020-04-20 21:21:07 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
Finn Williams2ed809c2020-04-20 21:21:07 +01003// SPDX-License-Identifier: MIT
4//
5
Jim Flynnbbfe6032020-07-20 16:57:44 +01006#include <server/include/basePipeServer/ConnectionHandler.hpp>
Finn Williams2ed809c2020-04-20 21:21:07 +01007
Jim Flynn3e9bc192022-03-23 23:01:26 +00008#include <client/src/BufferManager.hpp>
9#include <client/src/SendCounterPacket.hpp>
10#include <client/src/SocketProfilingConnection.hpp>
11
Jim Flynn77b284e2022-03-13 20:53:35 +000012#include <common/include/Processes.hpp>
Finn Williams2ed809c2020-04-20 21:21:07 +010013
Sadik Armagan1625efc2021-06-10 18:24:34 +010014#include <doctest/doctest.h>
Finn Williams2ed809c2020-04-20 21:21:07 +010015
Sadik Armagan1625efc2021-06-10 18:24:34 +010016TEST_SUITE("BasePipeServerTests")
17{
Jim Flynnbbfe6032020-07-20 16:57:44 +010018using namespace arm::pipe;
Finn Williams2ed809c2020-04-20 21:21:07 +010019
Sadik Armagan1625efc2021-06-10 18:24:34 +010020TEST_CASE("BasePipeServerTest")
Finn Williams2ed809c2020-04-20 21:21:07 +010021{
22 // Setup the mock service to bind to the UDS.
23 std::string udsNamespace = "gatord_namespace";
24
25 // Try to initialize a listening socket through the ConnectionHandler
Sadik Armagan1625efc2021-06-10 18:24:34 +010026 CHECK_NOTHROW(ConnectionHandler connectionHandler(udsNamespace, true));
Finn Williams2ed809c2020-04-20 21:21:07 +010027
Sadik Armagan1625efc2021-06-10 18:24:34 +010028 // The socket should close once we leave the scope of CHECK_NOTHROW
Finn Williams2ed809c2020-04-20 21:21:07 +010029 // and socketProfilingConnection should fail to connect
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000030 CHECK_THROWS_AS(arm::pipe::SocketProfilingConnection socketProfilingConnection,
Jim Flynnbbfe6032020-07-20 16:57:44 +010031 arm::pipe::SocketConnectionException);
Finn Williams2ed809c2020-04-20 21:21:07 +010032
33 // Try to initialize a listening socket through the ConnectionHandler again
34 ConnectionHandler connectionHandler(udsNamespace, true);
35 // socketProfilingConnection should connect now
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000036 arm::pipe::SocketProfilingConnection socketProfilingConnection;
Sadik Armagan1625efc2021-06-10 18:24:34 +010037 CHECK(socketProfilingConnection.IsOpen());
Finn Williams2ed809c2020-04-20 21:21:07 +010038
39 auto basePipeServer = connectionHandler.GetNewBasePipeServer(false);
40 // GetNewBasePipeServer will return null if it fails to create a socket
Sadik Armagan1625efc2021-06-10 18:24:34 +010041 CHECK(basePipeServer.get());
Finn Williams2ed809c2020-04-20 21:21:07 +010042
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000043 arm::pipe::BufferManager bufferManager;
Jim Flynn9c85b412022-03-16 00:27:43 +000044 arm::pipe::SendCounterPacket sendCounterPacket(bufferManager, "ArmNN", "Armnn 25.0", "");
Finn Williams2ed809c2020-04-20 21:21:07 +010045
46 // Check that we can receive a StreamMetaDataPacket
47 sendCounterPacket.SendStreamMetaDataPacket();
48
49 auto packetBuffer = bufferManager.GetReadableBuffer();
50 const unsigned char* readBuffer = packetBuffer->GetReadableData();
51 unsigned int readBufferSize = packetBuffer->GetSize();
52
Sadik Armagan1625efc2021-06-10 18:24:34 +010053 CHECK(readBuffer);
54 CHECK(readBufferSize > 0u);
Finn Williams2ed809c2020-04-20 21:21:07 +010055
56 socketProfilingConnection.WritePacket(readBuffer,readBufferSize);
57 bufferManager.MarkRead(packetBuffer);
58
Sadik Armagan1625efc2021-06-10 18:24:34 +010059 CHECK(basePipeServer.get()->WaitForStreamMetaData());
Jim Flynn9c85b412022-03-16 00:27:43 +000060 CHECK(basePipeServer.get()->GetStreamMetadataPid() == arm::pipe::GetCurrentProcessId());
Sadik Armagan1625efc2021-06-10 18:24:34 +010061 CHECK(basePipeServer.get()->GetStreamMetadataMaxDataLen() == MAX_METADATA_PACKET_LENGTH);
Finn Williams2ed809c2020-04-20 21:21:07 +010062
63 // Now try a simple PeriodicCounterSelectionPacket
64 sendCounterPacket.SendPeriodicCounterSelectionPacket(50, {1,2,3,4,5});
65
66 packetBuffer = bufferManager.GetReadableBuffer();
67 readBuffer = packetBuffer->GetReadableData();
68 readBufferSize = packetBuffer->GetSize();
69
Sadik Armagan1625efc2021-06-10 18:24:34 +010070 CHECK(readBuffer);
71 CHECK(readBufferSize > 0u);
Finn Williams2ed809c2020-04-20 21:21:07 +010072
73 socketProfilingConnection.WritePacket(readBuffer,readBufferSize);
74 bufferManager.MarkRead(packetBuffer);
75
76 auto packet1 = basePipeServer.get()->WaitForPacket(500);
77
Sadik Armagan1625efc2021-06-10 18:24:34 +010078 CHECK(!packet1.IsEmpty());
79 CHECK(packet1.GetPacketFamily() == 0);
80 CHECK(packet1.GetPacketId() == 4);
81 CHECK(packet1.GetLength() == 14);
Finn Williams2ed809c2020-04-20 21:21:07 +010082
83 // Try and send the packet back to the client
84 basePipeServer.get()->SendPacket(packet1.GetPacketFamily(),
85 packet1.GetPacketId(),
86 packet1.GetData(),
87 packet1.GetLength());
88
89 auto packet2 = socketProfilingConnection.ReadPacket(500);
90
Sadik Armagan1625efc2021-06-10 18:24:34 +010091 CHECK(!packet2.IsEmpty());
92 CHECK(packet2.GetPacketFamily() == 0);
93 CHECK(packet2.GetPacketId() == 4);
94 CHECK(packet2.GetLength() == 14);
Finn Williams2ed809c2020-04-20 21:21:07 +010095
96 socketProfilingConnection.Close();
97}
98
Jim Flynnaf947722022-03-02 11:04:47 +000099}