--- /dev/null
+// Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved\r
+// Use of this source code is governed by a apache 2.0 license that can be\r
+// found in the LICENSE file.\r
+\r
+#include <gmock/gmock.h>\r
+#include <glib.h>\r
+#include <glib/gstdio.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <fcntl.h>\r
+#include <bundle.h>\r
+\r
+#include <iostream>\r
+#include <fstream>\r
+\r
+#include "mock/gio.h"\r
+#include "mock/cynara-creds-gdbus.h"\r
+\r
+#include "common/dbus_service.h"\r
+\r
+namespace capmgr {\r
+void (*__method_handler)(GDBusConnection* connection, const gchar* sender,\r
+ const gchar* object_path, const gchar* interface_name,\r
+ const gchar* method_name, GVariant* parameters,\r
+ GDBusMethodInvocation* invocation, gpointer user_data);\r
+\r
+gpointer __method_handler_data;\r
+GDBusConnection* __method_handler_conn;\r
+\r
+guint __g_bus_own_name_fake(GBusType bus_type, const gchar* name,\r
+ GBusNameOwnerFlags flags, GBusAcquiredCallback bus_acquired_handler,\r
+ GBusNameAcquiredCallback name_acquired_handler,\r
+ GBusNameLostCallback name_lost_handler, gpointer user_data,\r
+ GDestroyNotify user_data_free_func) {\r
+\r
+ GDBusConnection* conn = reinterpret_cast<GDBusConnection*>(g_object_new(\r
+ G_TYPE_OBJECT, nullptr));\r
+\r
+ bus_acquired_handler(conn, "fakeconn", user_data);\r
+\r
+ return 999;\r
+}\r
+\r
+guint __g_dbus_connection_register_object_fake(GDBusConnection* connection,\r
+ const gchar* object_path, GDBusInterfaceInfo* interface_info,\r
+ const GDBusInterfaceVTable* vtable, gpointer user_data,\r
+ GDestroyNotify user_data_free_func, GError** error) {\r
+ __method_handler = vtable->method_call;\r
+ __method_handler_conn = connection;\r
+ __method_handler_data = user_data;\r
+ return 999;\r
+}\r
+\r
+class DBusServiceTest : public ::testing::Test {\r
+ protected:\r
+ void SetUp() override {\r
+ g_bus_own_name_fake.custom_fake = __g_bus_own_name_fake;\r
+ g_dbus_connection_register_object_fake.custom_fake =\r
+ __g_dbus_connection_register_object_fake;\r
+ }\r
+\r
+ void TearDown() override {\r
+ }\r
+\r
+ void PushMethodHandler(const gchar* method_name, GVariant* parameters) {\r
+ GDBusMethodInvocation* fake_invoc = reinterpret_cast<GDBusMethodInvocation*>\r
+ (g_object_new(G_TYPE_OBJECT, nullptr));\r
+ __method_handler(__method_handler_conn, "1.3", "/org/tizen/capmgr",\r
+ "org.tizen.capmgr", method_name, parameters, fake_invoc,\r
+ __method_handler_data);\r
+ }\r
+};\r
+\r
+TEST_F(DBusServiceTest, MethodTest) {\r
+ int call_count = 0;\r
+ DBusService service = DBusService();\r
+\r
+ service.RegisterMethodHandler("DiscoverUnownedDevices", [&call_count]() {\r
+ call_count++;\r
+ });\r
+ PushMethodHandler("DiscoverUnownedDevices", nullptr);\r
+\r
+ service.RegisterMethodHandler("ExchangeCapabilities", [&call_count]() {\r
+ call_count++;\r
+ });\r
+ PushMethodHandler("ExchangeCapabilities", nullptr);\r
+\r
+ ASSERT_EQ(call_count, 2);\r
+}\r
+\r
+void __bundle_to_gvar_arr(bundle* b, GVariantBuilder** arr, guint* arr_len) {\r
+ GVariantBuilder* array_builder;\r
+ bundle_raw* raw;\r
+ int len;\r
+ bundle_encode(b, &raw, &len);\r
+ *arr_len = len;\r
+ array_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));\r
+ for (int i = 0; i < len; i++)\r
+ g_variant_builder_add(array_builder, "y", raw[i]);\r
+\r
+ *arr = array_builder;\r
+ free(raw);\r
+}\r
+\r
+void __gvar_arr_to_cstr(GVariantIter* gvar_iter, guint len, char** str) {\r
+ guchar* arr = reinterpret_cast<guchar*>(g_try_malloc(len));\r
+ for (unsigned int i = 0; i < len; i++) {\r
+ g_variant_iter_loop(gvar_iter, "y", &arr[i]);\r
+ }\r
+\r
+ *str = reinterpret_cast<char*>(arr);\r
+}\r
+\r
+TEST_F(DBusServiceTest, SendAppControlTest) {\r
+ DBusService service = DBusService();\r
+ char *val;\r
+ std::string* dev_id;\r
+\r
+ service.RegisterSendAppcontrolHandler("SendRemoteAppControl",\r
+ [&val, &dev_id](const std::string& device_id, const unsigned char* data,\r
+ size_t len) {\r
+ bundle* b;\r
+ char *b_val;\r
+ dev_id = new std::string(device_id);\r
+ b = bundle_decode(data, len);\r
+ bundle_get_str(b, "test", &b_val);\r
+ val = strdup(b_val);\r
+ bundle_free(b);\r
+ return 777;\r
+ });\r
+\r
+ bundle* b = bundle_create();\r
+ bundle_add_str(b, "test", "1234");\r
+ GVariantBuilder* array_builder;\r
+ guint array_len;\r
+ __bundle_to_gvar_arr(b, &array_builder, &array_len);\r
+ bundle_free(b);\r
+\r
+ GVariant* appcontrol_var = g_variant_new("(&sayu)", "testdevice",\r
+ array_builder, array_len);\r
+ g_variant_builder_unref(array_builder);\r
+ PushMethodHandler("SendRemoteAppControl", appcontrol_var);\r
+ g_variant_unref(appcontrol_var);\r
+\r
+ ASSERT_THAT(*dev_id, testing::StrEq("testdevice"));\r
+ ASSERT_THAT(val, testing::StrEq("1234"));\r
+\r
+ const char* test_str = "test-string-1234";\r
+ RESET_FAKE(g_dbus_method_invocation_return_value);\r
+ service.SendAppControlReply(777,\r
+ reinterpret_cast<const unsigned char*>(test_str), strlen(test_str) + 1);\r
+\r
+ GVariant* reply = g_dbus_method_invocation_return_value_fake.arg1_history[0];\r
+ GVariantIter* reply_iter;\r
+ guint reply_len;\r
+ g_variant_get(reply, "(ayu)", &reply_iter, &reply_len);\r
+\r
+ char* reply_str;\r
+ __gvar_arr_to_cstr(reply_iter, reply_len, &reply_str);\r
+ g_variant_iter_free(reply_iter);\r
+\r
+ ASSERT_EQ(g_strcmp0(reply_str, test_str), 0);\r
+ g_free(reply_str);\r
+ free(val);\r
+ delete dev_id;\r
+}\r
+\r
+int __fake_creds_gdbus_get_client(GDBusConnection* conn,\r
+ const gchar* sender, enum cynara_client_creds type, gchar** client) {\r
+ *client = strdup("testclient");\r
+ return 0;\r
+}\r
+\r
+int __fake_creds_gdbus_get_user(GDBusConnection* conn,\r
+ const gchar* sender, enum cynara_user_creds type, gchar** user) {\r
+ *user = strdup("testuser");\r
+ return 0;\r
+}\r
+\r
+int __fake_creds_gdbus_get_pid(GDBusConnection* conn,\r
+ const gchar* sender, pid_t* pid) {\r
+ *pid = 999;\r
+ return 0;\r
+}\r
+\r
+TEST_F(DBusServiceTest, SendFileTest) {\r
+ cynara_creds_gdbus_get_client_fake.custom_fake =\r
+ __fake_creds_gdbus_get_client;\r
+ cynara_creds_gdbus_get_user_fake.custom_fake = __fake_creds_gdbus_get_user;\r
+ cynara_creds_gdbus_get_pid_fake.custom_fake = __fake_creds_gdbus_get_pid;\r
+\r
+ DBusService service = DBusService();\r
+ int call_count = 0;\r
+ service.RegisterSendFileHandler("SendFile", [&call_count] (\r
+ const std::string& device_id, const std::string& path) {\r
+ int rval = 777;\r
+ call_count++;\r
+ return rval;\r
+ });\r
+\r
+ std::ofstream outfile("../../.capmgr_test");\r
+ outfile << " " << std::endl;\r
+ outfile.close();\r
+ GVariant* req = g_variant_new("(ss)", "test_device_id", "../../.capmgr_test");\r
+ PushMethodHandler("SendFile", req);\r
+ g_variant_unref(req);\r
+ ASSERT_THAT(call_count, testing::Eq(1));\r
+\r
+ RESET_FAKE(g_dbus_connection_emit_signal);\r
+ for (int i = 0; i < 10; i++) {\r
+ long long stored_sent; // NOLINT\r
+ long long stored_total; // NOLINT\r
+ gchar* stored_path;\r
+ service.SendFileProgress("../../.capmgr_test", i + 1, 10);\r
+ ASSERT_EQ(g_strcmp0(g_dbus_connection_emit_signal_fake.arg4_history[i],\r
+ "SendFileProgressChanged"), 0);\r
+ g_variant_get(g_dbus_connection_emit_signal_fake.arg5_history[i], "(sxx)",\r
+ &stored_path, &stored_sent, &stored_total);\r
+ ASSERT_EQ(g_strcmp0(stored_path, "../../.capmgr_test"), 0);\r
+ ASSERT_THAT(stored_sent, testing::Eq(i + 1));\r
+ ASSERT_THAT(stored_total, testing::Eq(10));\r
+ }\r
+\r
+ RESET_FAKE(g_dbus_method_invocation_return_value);\r
+ service.SendFileResult("../../.capmgr_test", 0);\r
+ int result;\r
+ g_variant_get(g_dbus_method_invocation_return_value_fake.arg1_history[0],\r
+ "(i)", &result);\r
+ ASSERT_THAT(result, testing::Eq(0));\r
+}\r
+\r
+} // namespace capmgr\r
#include "aul.h" // NOLINT(build/include)
#include "aul_svc.h" // NOLINT(build/include)
#include "cynara-creds-gdbus.h" // NOLINT(build/include)
+#include "gio.h" // NOLINT(build/include)
#include "mdg.h" // NOLINT(build/include)
#include "mdg_internal.h" // NOLINT(build/include)
#include "mock.h" // NOLINT(build/include)
const gchar*, enum cynara_user_creds, gchar**);
DEFINE_FAKE_VALUE_FUNC(int, cynara_creds_gdbus_get_pid, GDBusConnection*,
const gchar*, pid_t*);
+
+/* gio.h */
+DEFINE_FAKE_VALUE_FUNC(guint, g_bus_own_name, GBusType, const gchar*,
+ GBusNameOwnerFlags, GBusAcquiredCallback, GBusNameAcquiredCallback,
+ GBusNameLostCallback, gpointer, GDestroyNotify);
+DEFINE_FAKE_VALUE_FUNC(guint, g_dbus_connection_register_object,
+ GDBusConnection*, const gchar*, GDBusInterfaceInfo*,
+ const GDBusInterfaceVTable*, gpointer, GDestroyNotify, GError**);
+DEFINE_FAKE_VOID_FUNC(g_dbus_method_invocation_return_value,
+ GDBusMethodInvocation*, GVariant*);
+DEFINE_FAKE_VOID_FUNC(g_bus_unown_name, guint);
+DEFINE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_emit_signal,
+ GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar*,
+ GVariant*, GError**);
+DEFINE_FAKE_VALUE_FUNC(gboolean, g_dbus_connection_flush_sync,
+ GDBusConnection*, GCancellable*, GError**);