blob: ebf408ef7f47a93417096e801c7b4c732ede444e [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 Flynnaf947722022-03-02 11:04:47 +00008#include <BufferManager.hpp>
9#include <SendCounterPacket.hpp>
Finn Williams2ed809c2020-04-20 21:21:07 +010010#include <SocketProfilingConnection.hpp>
Jim Flynn77b284e2022-03-13 20:53:35 +000011#include <common/include/Processes.hpp>
Finn Williams2ed809c2020-04-20 21:21:07 +010012
Sadik Armagan1625efc2021-06-10 18:24:34 +010013#include <doctest/doctest.h>
Finn Williams2ed809c2020-04-20 21:21:07 +010014
Sadik Armagan1625efc2021-06-10 18:24:34 +010015TEST_SUITE("BasePipeServerTests")
16{
Jim Flynnbbfe6032020-07-20 16:57:44 +010017using namespace arm::pipe;
Finn Williams2ed809c2020-04-20 21:21:07 +010018
Sadik Armagan1625efc2021-06-10 18:24:34 +010019TEST_CASE("BasePipeServerTest")
Finn Williams2ed809c2020-04-20 21:21:07 +010020{
21 // Setup the mock service to bind to the UDS.
22 std::string udsNamespace = "gatord_namespace";
23
24 // Try to initialize a listening socket through the ConnectionHandler
Sadik Armagan1625efc2021-06-10 18:24:34 +010025 CHECK_NOTHROW(ConnectionHandler connectionHandler(udsNamespace, true));
Finn Williams2ed809c2020-04-20 21:21:07 +010026
Sadik Armagan1625efc2021-06-10 18:24:34 +010027 // The socket should close once we leave the scope of CHECK_NOTHROW
Finn Williams2ed809c2020-04-20 21:21:07 +010028 // and socketProfilingConnection should fail to connect
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000029 CHECK_THROWS_AS(arm::pipe::SocketProfilingConnection socketProfilingConnection,
Jim Flynnbbfe6032020-07-20 16:57:44 +010030 arm::pipe::SocketConnectionException);
Finn Williams2ed809c2020-04-20 21:21:07 +010031
32 // Try to initialize a listening socket through the ConnectionHandler again
33 ConnectionHandler connectionHandler(udsNamespace, true);
34 // socketProfilingConnection should connect now
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000035 arm::pipe::SocketProfilingConnection socketProfilingConnection;
Sadik Armagan1625efc2021-06-10 18:24:34 +010036 CHECK(socketProfilingConnection.IsOpen());
Finn Williams2ed809c2020-04-20 21:21:07 +010037
38 auto basePipeServer = connectionHandler.GetNewBasePipeServer(false);
39 // GetNewBasePipeServer will return null if it fails to create a socket
Sadik Armagan1625efc2021-06-10 18:24:34 +010040 CHECK(basePipeServer.get());
Finn Williams2ed809c2020-04-20 21:21:07 +010041
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000042 arm::pipe::BufferManager bufferManager;
Jim Flynn9c85b412022-03-16 00:27:43 +000043 arm::pipe::SendCounterPacket sendCounterPacket(bufferManager, "ArmNN", "Armnn 25.0", "");
Finn Williams2ed809c2020-04-20 21:21:07 +010044
45 // Check that we can receive a StreamMetaDataPacket
46 sendCounterPacket.SendStreamMetaDataPacket();
47
48 auto packetBuffer = bufferManager.GetReadableBuffer();
49 const unsigned char* readBuffer = packetBuffer->GetReadableData();
50 unsigned int readBufferSize = packetBuffer->GetSize();
51
Sadik Armagan1625efc2021-06-10 18:24:34 +010052 CHECK(readBuffer);
53 CHECK(readBufferSize > 0u);
Finn Williams2ed809c2020-04-20 21:21:07 +010054
55 socketProfilingConnection.WritePacket(readBuffer,readBufferSize);
56 bufferManager.MarkRead(packetBuffer);
57
Sadik Armagan1625efc2021-06-10 18:24:34 +010058 CHECK(basePipeServer.get()->WaitForStreamMetaData());
Jim Flynn9c85b412022-03-16 00:27:43 +000059 CHECK(basePipeServer.get()->GetStreamMetadataPid() == arm::pipe::GetCurrentProcessId());
Sadik Armagan1625efc2021-06-10 18:24:34 +010060 CHECK(basePipeServer.get()->GetStreamMetadataMaxDataLen() == MAX_METADATA_PACKET_LENGTH);
Finn Williams2ed809c2020-04-20 21:21:07 +010061
62 // Now try a simple PeriodicCounterSelectionPacket
63 sendCounterPacket.SendPeriodicCounterSelectionPacket(50, {1,2,3,4,5});
64
65 packetBuffer = bufferManager.GetReadableBuffer();
66 readBuffer = packetBuffer->GetReadableData();
67 readBufferSize = packetBuffer->GetSize();
68
Sadik Armagan1625efc2021-06-10 18:24:34 +010069 CHECK(readBuffer);
70 CHECK(readBufferSize > 0u);
Finn Williams2ed809c2020-04-20 21:21:07 +010071
72 socketProfilingConnection.WritePacket(readBuffer,readBufferSize);
73 bufferManager.MarkRead(packetBuffer);
74
75 auto packet1 = basePipeServer.get()->WaitForPacket(500);
76
Sadik Armagan1625efc2021-06-10 18:24:34 +010077 CHECK(!packet1.IsEmpty());
78 CHECK(packet1.GetPacketFamily() == 0);
79 CHECK(packet1.GetPacketId() == 4);
80 CHECK(packet1.GetLength() == 14);
Finn Williams2ed809c2020-04-20 21:21:07 +010081
82 // Try and send the packet back to the client
83 basePipeServer.get()->SendPacket(packet1.GetPacketFamily(),
84 packet1.GetPacketId(),
85 packet1.GetData(),
86 packet1.GetLength());
87
88 auto packet2 = socketProfilingConnection.ReadPacket(500);
89
Sadik Armagan1625efc2021-06-10 18:24:34 +010090 CHECK(!packet2.IsEmpty());
91 CHECK(packet2.GetPacketFamily() == 0);
92 CHECK(packet2.GetPacketId() == 4);
93 CHECK(packet2.GetLength() == 14);
Finn Williams2ed809c2020-04-20 21:21:07 +010094
95 socketProfilingConnection.Close();
96}
97
Jim Flynnaf947722022-03-02 11:04:47 +000098}