IVGCVSW-3720 Start a UDS server that accepts connections.
* Add a CLI paramter to the Gatord mock client to specify a namespace.
* Open a listening socket on that namespace.
* Wait for one connection on the socket.
Signed-off-by: Colm Donelan <Colm.Donelan@arm.com>
Change-Id: Ic85b4defd5ad2010bb255472c030a91a23cec1d9
diff --git a/tests/profiling/GatordMockService.cpp b/tests/profiling/GatordMockService.cpp
new file mode 100644
index 0000000..c774ab0
--- /dev/null
+++ b/tests/profiling/GatordMockService.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright © 2019 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "GatordMockService.hpp"
+
+#include <cerrno>
+#include <fcntl.h>
+#include <iostream>
+#include <string>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+namespace armnn
+{
+
+namespace gatordmock
+{
+
+
+bool GatordMockService::OpenListeningSocket(std::string udsNamespace)
+{
+ m_ListeningSocket = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
+ if (-1 == m_ListeningSocket)
+ {
+ std::cerr << ": Socket construction failed: " << strerror(errno) << std::endl;
+ return false;
+ }
+
+ sockaddr_un udsAddress;
+ memset(&udsAddress, 0, sizeof(sockaddr_un));
+ // We've set the first element of sun_path to be 0, skip over it and copy the namespace after it.
+ memcpy(udsAddress.sun_path + 1, udsNamespace.c_str(), strlen(udsNamespace.c_str()));
+ udsAddress.sun_family = AF_UNIX;
+
+ // Bind the socket to the UDS namespace.
+ if (-1 == bind(m_ListeningSocket, reinterpret_cast<const sockaddr *>(&udsAddress), sizeof(sockaddr_un)))
+ {
+ std::cerr << ": Binding on socket failed: " << strerror(errno) << std::endl;
+ return false;
+ }
+ // Listen for 1 connection.
+ if (-1 == listen(m_ListeningSocket, 1))
+ {
+ std::cerr << ": Listen call on socket failed: " << strerror(errno) << std::endl;
+ return false;
+ }
+ std::cout << "Bound to UDS namespace: \\0" << udsNamespace << std::endl;
+ return true;
+}
+
+int GatordMockService::BlockForOneClient()
+{
+ std::cout << "Waiting for client connection." << std::endl;
+
+ int accepted = accept4(m_ListeningSocket, nullptr, nullptr, SOCK_CLOEXEC);
+ if (-1 == accepted)
+ {
+ std::cerr << ": Failure when waiting for a client connection: " << strerror(errno) << std::endl;
+ return -1;
+ }
+
+ std::cout << "Client connection established." << std::endl;
+ return accepted;
+}
+
+
+} // namespace gatordmock
+
+} // namespace armnn