Add server-client feature
authorSangwan Kwon <sangwan.kwon@samsung.com>
Tue, 15 Oct 2019 08:13:40 +0000 (17:13 +0900)
committer권상완/Security 2Lab(SR)/Engineer/삼성전자 <sangwan.kwon@samsung.com>
Mon, 21 Oct 2019 05:41:24 +0000 (14:41 +0900)
Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
src/apix/CMakeLists.txt
src/apix/ipc/CMakeLists.txt [new file with mode: 0644]
src/apix/ipc/client.h [new file with mode: 0644]
src/apix/ipc/server.h [new file with mode: 0644]
src/apix/ipc/tests/ipc_tests.cpp [new file with mode: 0644]
src/apix/manager/tests/policy_tests.cpp

index b5c12fb..ddde13c 100644 (file)
@@ -18,9 +18,10 @@ SET(${TARGET_APIX_LIB}_SRCS "")
 SET(${TARGET_APIX_LIB}_DEPS "")
 SET(${TARGET_APIX_LIB}_TESTS "")
 
-ADD_SUBDIRECTORY(property)
+ADD_SUBDIRECTORY(ipc)
 ADD_SUBDIRECTORY(manager)
 ADD_SUBDIRECTORY(notification)
+ADD_SUBDIRECTORY(property)
 
 ADD_LIBRARY(${TARGET_APIX_LIB} STATIC ${${TARGET_APIX_LIB}_SRCS})
 TARGET_LINK_LIBRARIES(${TARGET_APIX_LIB} ${${TARGET_APIX_LIB}_DEPS}
diff --git a/src/apix/ipc/CMakeLists.txt b/src/apix/ipc/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7fb5a77
--- /dev/null
@@ -0,0 +1,16 @@
+#  Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License
+
+FILE(GLOB SERVER_TESTS "tests/*.cpp")
+ADD_APIX_TEST(${SERVER_TESTS})
diff --git a/src/apix/ipc/client.h b/src/apix/ipc/client.h
new file mode 100644 (file)
index 0000000..ddf7a5c
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ *  Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+#pragma once
+
+#include <string>
+#include <memory>
+
+#include <klay/rmi/client.h>
+
+namespace ipc {
+
+class Client final {
+public:
+       Client(const Client&) = delete;
+       Client& operator=(const Client&) = delete;
+
+       Client(Client&&) = delete;
+       Client& operator=(Client&&) = delete;
+
+       static std::unique_ptr<klay::rmi::Client>& Instance(const std::string& sock)
+       {
+               static Client client(sock);
+               return client.instance;
+       }
+
+private:
+       explicit Client(const std::string& sock) :
+               instance(std::make_unique<klay::rmi::Client>(sock))
+       {
+               instance->connect();
+       }
+       ~Client() = default;
+
+       std::unique_ptr<klay::rmi::Client> instance;
+};
+
+} // namespace ipc
diff --git a/src/apix/ipc/server.h b/src/apix/ipc/server.h
new file mode 100644 (file)
index 0000000..5bbcc49
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ *  Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+#pragma once
+
+#include <string>
+#include <memory>
+
+#include <klay/rmi/service.h>
+
+namespace ipc {
+
+class Server final {
+public:
+       Server(const Server&) = delete;
+       Server& operator=(const Server&) = delete;
+
+       Server(Server&&) = delete;
+       Server& operator=(Server&&) = delete;
+
+       static std::unique_ptr<klay::rmi::Service>& Instance(const std::string& sock)
+       {
+               static Server server(sock);
+               return server.instance;
+       }
+
+private:
+       explicit Server(const std::string& sock) :
+               instance(std::make_unique<klay::rmi::Service>(sock)) {}
+       ~Server() = default;
+
+       std::unique_ptr<klay::rmi::Service> instance;
+};
+
+} // namespace ipc
diff --git a/src/apix/ipc/tests/ipc_tests.cpp b/src/apix/ipc/tests/ipc_tests.cpp
new file mode 100644 (file)
index 0000000..40b7451
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ *  Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+#include <gtest/gtest.h>
+
+#include "../server.h"
+#include "../client.h"
+
+#include <chrono>
+#include <thread>
+
+#include <sys/types.h>
+#include <unistd.h>
+
+using namespace ipc;
+
+namespace {
+       std::string g_socket = "/tmp/vist-test";
+
+       void init()
+       {
+       }
+
+} // anonymous namespace
+
+class TestServer {
+public:
+       void init()
+       {
+               auto& server = ipc::Server::Instance(g_socket);
+               server->expose(this, "", (std::string)(TestServer::testMethod)());
+               server->start();
+       }
+
+       std::string testMethod()
+       {
+               return "test";
+       }
+};
+
+class IpcTests : public testing::Test {
+public:
+       void SetUp() override
+       {
+               ::unlink(g_socket.c_str());
+
+               this->pid = fork();
+               if (pid < 0) {
+                       return;
+               } else if (pid == 0) {
+                       TestServer server;
+                       server.init();
+                       
+               }
+
+               std::this_thread::sleep_for(std::chrono::seconds(1));
+       }
+
+       void TearDown() override
+       {
+               if (::kill(pid, SIGTERM) == -1)
+                       return;
+
+               std::this_thread::sleep_for(std::chrono::seconds(1));
+       }
+
+private:
+       pid_t pid = -1;
+};
+
+TEST_F(IpcTests, method_call) {
+       auto& client = ipc::Client::Instance(g_socket);
+
+       std::string ret = client->methodCall<std::string>("TestServer::testMethod");
+       EXPECT_EQ(ret, "test");
+}
index e3a5a57..18ab5f6 100644 (file)
@@ -64,7 +64,6 @@ TEST_F(PolicydTests, update) {
 
        query = "SELECT * FROM policy WHERE name = 'bluetooth'";
        rows = OsqueryManager::execute(query);
-       /// Initial policy value
        EXPECT_EQ(rows[0]["value"], std::to_string(3));
 
        manager.disenroll("admin", 0);