From 5f78a43b0c7064ca1352906ce72bff6f1fe80775 Mon Sep 17 00:00:00 2001 From: "SukHyung, Kang" Date: Mon, 24 Aug 2020 10:15:03 +0900 Subject: [PATCH] Add new unittest for shortcut Change-Id: Ie191c0c0cab8a42f60be11498cf82af6e4e34b99 Signed-off-by: SukHyung, Kang --- CMakeLists.txt | 8 + packaging/libshortcut.spec | 6 +- tests/CMakeLists.txt | 7 - tests/mock/gio_mock.cc | 94 +++++++++ tests/mock/gio_mock.h | 58 ++++++ tests/unit_tests/CMakeLists.txt | 11 +- tests/unit_tests/src/test_shortcut_manager.cc | 288 +++++++++++++++++++++++++- 7 files changed, 454 insertions(+), 18 deletions(-) create mode 100644 tests/mock/gio_mock.cc create mode 100644 tests/mock/gio_mock.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f8dd624..00ae55a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,3 +5,11 @@ set(CMAKE_SKIP_BUILD_RPATH true) ADD_SUBDIRECTORY(pkgmgr_shortcut) ADD_SUBDIRECTORY(lib) ADD_SUBDIRECTORY(tests) + +IF(NOT DEFINED MINIMUM_BUILD) +ENABLE_TESTING() +SET(SHORTCUT_UNIT_TESTS shortcut_unittests) +ADD_TEST(NAME ${SHORTCUT_UNIT_TESTS} COMMAND ${SHORTCUT_UNIT_TESTS}) + +ADD_DEPENDENCIES(${SHORTCUT_UNIT_TESTS} shortcut) +ENDIF(NOT DEFINED MINIMUM_BUILD) diff --git a/packaging/libshortcut.spec b/packaging/libshortcut.spec index 856b94d..02afd17 100644 --- a/packaging/libshortcut.spec +++ b/packaging/libshortcut.spec @@ -40,7 +40,7 @@ Requires: %{name} = %{version}-%{release} [Shortcut] AddToHome feature supporting library for menu/home screen developers(dev). ################################################# -# capi-appfw-app-common-unittests +# shortcut_unittests ################################################# %package -n shortcut_unittests Summary: GTest for shortcut API @@ -88,12 +88,12 @@ find . -name '*.gcno' -exec cp '{}' gcov-obj ';' %endif %check -ctest --output-on-failure %{?_smp_mflags} +ctest -V %if 0%{?gcov:1} lcov -c --ignore-errors graph --no-external -q -d . -o shortcut.info genhtml shortcut.info -o shortcut.out zip -r shortcut.zip shortcut.out -install -m 0644 shortcut.zip %{buildroot}%{_datadir}/gcov/badge.zip +install -m 0644 shortcut.zip %{buildroot}%{_datadir}/gcov/shortcut.zip %endif %install diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 449cb2a..c90fac8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,8 +1 @@ -IF(NOT DEFINED MINIMUM_BUILD) -ENABLE_TESTING() -SET(SHORTCUT_UNIT_TESTS shortcut_unittests) -ADD_TEST(NAME ${SHORTCUT_UNIT_TESTS} COMMAND ${SHORTCUT_UNIT_TESTS}) - ADD_SUBDIRECTORY(unit_tests) -ADD_DEPENDENCIES(${SHORTCUT_UNIT_TESTS} shortcut) -ENDIF(NOT DEFINED MINIMUM_BUILD) diff --git a/tests/mock/gio_mock.cc b/tests/mock/gio_mock.cc new file mode 100644 index 0000000..5d8ed01 --- /dev/null +++ b/tests/mock/gio_mock.cc @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * 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 + +#include "gio_mock.h" +#include "mock_hook.h" +#include "test_fixture.h" + +extern "C" GDBusConnection* g_bus_get_sync(GBusType type, + GCancellable* cancellable, GError** error) { + return MOCK_HOOK_P3(GioMock, g_bus_get_sync, type, cancellable, error); +} + +extern "C" GDBusMessage* g_dbus_connection_send_message_with_reply_sync( + GDBusConnection* conn, GDBusMessage* msg, GDBusSendMessageFlags flags, + gint timeout, volatile guint32* out_serial, GCancellable* cancellable, + GError** error) { + return MOCK_HOOK_P7(GioMock, g_dbus_connection_send_message_with_reply_sync, + conn, msg, flags, timeout, out_serial, cancellable, error); +} + +extern "C" GDBusMessage* g_dbus_message_new_method_call(const gchar* arg0, + const gchar* arg1, const gchar* arg2, const gchar* arg3) { + return MOCK_HOOK_P4(GioMock, g_dbus_message_new_method_call, arg0, arg1, arg2, + arg3); +} + +extern "C" void g_dbus_message_set_body(GDBusMessage* arg0, GVariant* arg1) { + return MOCK_HOOK_P2(GioMock, g_dbus_message_set_body, arg0, arg1); +} + +extern "C" GVariant* g_dbus_message_get_body(GDBusMessage* arg0) { + return MOCK_HOOK_P1(GioMock, g_dbus_message_get_body, arg0); +} + +extern "C" guint g_dbus_connection_signal_subscribe(GDBusConnection* arg0, + const gchar* arg1, const gchar* arg2, const gchar* arg3, const gchar* arg4, + const gchar* arg5, GDBusSignalFlags arg6, GDBusSignalCallback arg7, + gpointer arg8, GDestroyNotify arg9) { + return MOCK_HOOK_P10(GioMock, g_dbus_connection_signal_subscribe, + arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); +} + +extern "C" void g_dbus_connection_send_message_with_reply(GDBusConnection* arg0, + GDBusMessage* arg1, GDBusSendMessageFlags arg2, gint arg3, + volatile guint32* arg4, GCancellable* arg5, GAsyncReadyCallback arg6, + gpointer arg7) { + return MOCK_HOOK_P8(GioMock, g_dbus_connection_send_message_with_reply, + arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); +} + +extern "C" GDBusMessage* g_dbus_connection_send_message_with_reply_finish( + GDBusConnection* arg0, GAsyncResult* arg1, GError** arg2) { + return MOCK_HOOK_P3(GioMock, g_dbus_connection_send_message_with_reply_finish, + arg0, arg1, arg2); +} + +extern "C" gboolean g_dbus_message_to_gerror( + GDBusMessage* arg0, GError** arg1) { + return MOCK_HOOK_P2(GioMock, g_dbus_message_to_gerror, + arg0, arg1); +} + +extern "C" guint g_bus_watch_name_on_connection( + GDBusConnection* arg0, const gchar* arg1, GBusNameWatcherFlags arg2, + GBusNameAppearedCallback arg3, GBusNameVanishedCallback arg4, + gpointer arg5, GDestroyNotify arg6) { + return MOCK_HOOK_P7(GioMock, g_bus_watch_name_on_connection, + arg0, arg1, arg2, arg3, arg4, arg5, arg6); +} + +extern "C" void g_bus_unwatch_name(guint arg0) { + return MOCK_HOOK_P1(GioMock, g_bus_unwatch_name, arg0); +} + +extern "C" void g_dbus_connection_signal_unsubscribe( + GDBusConnection* arg0, guint arg1) { + return MOCK_HOOK_P2(GioMock, g_dbus_connection_signal_unsubscribe, + arg0, arg1); +} diff --git a/tests/mock/gio_mock.h b/tests/mock/gio_mock.h new file mode 100644 index 0000000..c4bfa32 --- /dev/null +++ b/tests/mock/gio_mock.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef MOCK_GIO_MOCK_H_ +#define MOCK_GIO_MOCK_H_ + +#include +#include + +#include "module_mock.h" + +class GioMock : public virtual ModuleMock { + public: + virtual ~GioMock() {} + + MOCK_METHOD3(g_bus_get_sync, + GDBusConnection*(GBusType, GCancellable*, GError**)); + MOCK_METHOD4(g_dbus_message_new_method_call, + GDBusMessage*(const gchar*, const gchar*, const gchar*, const gchar*)); + MOCK_METHOD2(g_dbus_message_set_body, void(GDBusMessage*, GVariant*)); + MOCK_METHOD1(g_dbus_message_get_body, GVariant*(GDBusMessage*)); + MOCK_METHOD7(g_dbus_connection_send_message_with_reply_sync, + GDBusMessage*(GDBusConnection*, GDBusMessage*, GDBusSendMessageFlags, + gint, volatile guint32*, GCancellable*, GError**)); + MOCK_METHOD10(g_dbus_connection_signal_subscribe, + guint(GDBusConnection*, const gchar*, const gchar*, const gchar*, + const gchar*, const gchar*, GDBusSignalFlags, GDBusSignalCallback, + gpointer, GDestroyNotify)); + MOCK_METHOD8(g_dbus_connection_send_message_with_reply, + void(GDBusConnection*, GDBusMessage*, GDBusSendMessageFlags, gint, + volatile guint32*, GCancellable*, GAsyncReadyCallback, gpointer)); + MOCK_METHOD3(g_dbus_connection_send_message_with_reply_finish, + GDBusMessage*(GDBusConnection*, GAsyncResult*, GError**)); + MOCK_METHOD2(g_dbus_message_to_gerror, + gboolean(GDBusMessage*, GError**)); + MOCK_METHOD7(g_bus_watch_name_on_connection, + guint(GDBusConnection*, const gchar*, GBusNameWatcherFlags, + GBusNameAppearedCallback, GBusNameVanishedCallback, gpointer, + GDestroyNotify)); + MOCK_METHOD1(g_bus_unwatch_name, void(guint)); + MOCK_METHOD2(g_dbus_connection_signal_unsubscribe, + void(GDBusConnection*, guint)); +}; + +#endif // MOCK_GIO_MOCK_H_ diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt index 325a58d..11ca98b 100644 --- a/tests/unit_tests/CMakeLists.txt +++ b/tests/unit_tests/CMakeLists.txt @@ -5,15 +5,11 @@ INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(shortcut_unittests REQUIRED gmock dlog - sqlite3 - libxml-2.0 glib-2.0 + gio-2.0 db-util - vconf - capi-base-common aul capi-system-info - libtzplatform-config ) FOREACH(flag ${shortcut_unittests_CFLAGS}) @@ -25,6 +21,8 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -std=c++14") SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") SET(CMAKE_CXX_FLAGS_RELEASE "-O2") +ADD_DEFINITIONS("-DDB_PATH=\"${DB_PATH}\"") + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/src) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../mock) @@ -36,9 +34,10 @@ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../mock MOCK_SOURCES) ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES} ${MOCK_SOURCES} - #${LIB_SOURCES} + ${LIB_SOURCES} ) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS}") TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${shortcut_unittests_LDFLAGS} ) diff --git a/tests/unit_tests/src/test_shortcut_manager.cc b/tests/unit_tests/src/test_shortcut_manager.cc index 8b3e1f6..95a32f1 100644 --- a/tests/unit_tests/src/test_shortcut_manager.cc +++ b/tests/unit_tests/src/test_shortcut_manager.cc @@ -17,19 +17,21 @@ #include #include #include +#include #include #include "system_info_mock.h" +#include "gio_mock.h" #include "test_fixture.h" using ::testing::_; using ::testing::DoAll; using ::testing::Return; using ::testing::SetArgPointee; -using ::testing::Invoke; -class Mocks : public ::testing::NiceMock {}; +class Mocks : public ::testing::NiceMock, + public ::testing::NiceMock {}; class ShortcutTest : public TestFixture { public: @@ -42,3 +44,285 @@ class ShortcutTest : public TestFixture { virtual void TearDown() { } }; + +TEST_F(ShortcutTest, shortcut_add_to_home) { + int ret; + bool is_supported = true; + GDBusConnection* _conn = (GDBusConnection*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg3 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_bus_get_sync(_, _, _)). + WillOnce(Return(_conn)); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg3)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply( + _, _, _, _, _, _, _, _)). + Times(1); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + ret = shortcut_add_to_home("test_name", LAUNCH_BY_URI, "test_uri", "test_icon", + 0, NULL, NULL); + + EXPECT_EQ(ret, SHORTCUT_ERROR_NONE); +} + +TEST_F(ShortcutTest, shortcut_remove_from_home) { + int ret; + bool is_supported = true; + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg3 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg3)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply( + _, _, _, _, _, _, _, _)). + Times(1); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + ret = shortcut_remove_from_home("test_name", + [](int ret, void* user_data) -> int { + return 0; + } ,NULL); + + EXPECT_EQ(ret, SHORTCUT_ERROR_NONE); +} + +TEST_F(ShortcutTest, shortcut_get_list) { + int ret; + bool is_supported = true; + GVariantBuilder *builder; + GVariant* body; + GVariant* reply_body; + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + body = g_variant_new("(sssss)", + "test_pkg", "test_icon", "test_name", "test_extra", ""); + + builder = g_variant_builder_new(G_VARIANT_TYPE("a(v)")); + g_variant_builder_add(builder, "(v)", body); + + reply_body = g_variant_new("(ia(v))", 1, builder); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_dbus_message_get_body(_)). + WillOnce(Return(reply_body)); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + ret = shortcut_get_list("test_pkgid", + [](const char* package_name, const char* icon, + const char* name, const char* extra_key, + const char* extra_data, void* user_data) -> int { + return 0; + }, NULL); + + g_variant_builder_unref(builder); + g_variant_unref(body); + + EXPECT_EQ(ret, 1); +} + +TEST_F(ShortcutTest, shortcut_set_request_cb) { + int ret; + bool is_supported = true; + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_dbus_connection_signal_subscribe( + _, _, _, _, _, _, _, _, _, _)). + WillOnce(Return(99)); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_bus_watch_name_on_connection( + _, _, _, _, _, _, _)). + WillOnce(Return(88)); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + ret = shortcut_set_request_cb( + [](const char* package_name, const char* name, + int type, const char* content_info, const char* icon, + int pid, double period, int allow_duplicate, + void* user_data) -> int { + return 0; + } ,NULL); + + EXPECT_EQ(ret, SHORTCUT_ERROR_NONE); +} + +TEST_F(ShortcutTest, shortcut_unset_request_cb) { + bool is_supported = true; + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + shortcut_unset_request_cb(); + + EXPECT_EQ(get_last_result(), SHORTCUT_ERROR_NONE); +} + +TEST_F(ShortcutTest, shortcut_set_remove_cb) { + int ret; + bool is_supported = true; + GDBusConnection* _conn = (GDBusConnection*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_bus_get_sync(_, _, _)). + WillOnce(Return(_conn)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_signal_subscribe( + _, _, _, _, _, _, _, _, _, _)). + WillOnce(Return(99)); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_bus_watch_name_on_connection( + _, _, _, _, _, _, _)). + WillOnce(Return(88)); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + ret = shortcut_set_remove_cb( + [](const char* package_name, const char* name, + int sender_pid, void* user_data) -> int { + return 0; + } ,NULL); + + EXPECT_EQ(ret, SHORTCUT_ERROR_NONE); +} + +TEST_F(ShortcutTest, shortcut_unset_remove_cb) { + bool is_supported = true; + GDBusMessage* _msg = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + GDBusMessage* _msg2 = (GDBusMessage*)g_object_new(G_TYPE_OBJECT, NULL); + + EXPECT_CALL(GetMock(), + system_info_get_platform_bool(_, _)). + WillOnce(DoAll(SetArgPointee<1>(is_supported), + Return(0))); + + EXPECT_CALL(GetMock(), + g_dbus_message_new_method_call(_, _, _, _)). + WillOnce(Return(_msg)); + + EXPECT_CALL(GetMock(), + g_dbus_connection_send_message_with_reply_sync( + _, _, _, _, _, _, _)). + WillOnce(Return(_msg2)); + + EXPECT_CALL(GetMock(), + g_dbus_message_to_gerror(_, _)). + WillOnce(Return(FALSE)); + + shortcut_unset_remove_cb(); + + EXPECT_EQ(get_last_result(), SHORTCUT_ERROR_NONE); +} -- 2.7.4