Add unit test for metadata plugin 28/243828/10
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 10 Sep 2020 09:04:22 +0000 (18:04 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Fri, 11 Sep 2020 06:28:33 +0000 (15:28 +0900)
Change-Id: I447a7d17d1f39fab7575bf50183b056feae71073
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
test/unit_tests/CMakeLists.txt
test/unit_tests/mock/pkgmgr_info_mock.cc
test/unit_tests/mock/pkgmgr_info_mock.h
test/unit_tests/test_samples/res/test_theme.json [new file with mode: 0644]
test/unit_tests/test_theme_metadata_plugin.cc [new file with mode: 0644]

index e81946f69786765db2110ac9e605cc8b8a6fdaa8..c394723e5562c84ae2dfba14d4702e90eaedf997 100644 (file)
@@ -16,7 +16,7 @@ APPLY_PKG_CONFIG(${TARGET_TIZEN_THEME_UNIT_TEST} PUBLIC
   GOBJECT_DEPS
 )
 
-TARGET_LINK_LIBRARIES(${TARGET_TIZEN_THEME_UNIT_TEST} PUBLIC ${TARGET_TIZEN_THEME} ${TARGET_TIZEN_THEME_API} ${TARGET_TIZEN_THEME_PROVIDER} ${TARGET_TIZEN_THEME_PLUGIN})
+TARGET_LINK_LIBRARIES(${TARGET_TIZEN_THEME_UNIT_TEST} PUBLIC ${TARGET_TIZEN_THEME} ${TARGET_TIZEN_THEME_API} ${TARGET_TIZEN_THEME_PROVIDER} ${TARGET_TIZEN_THEME_PLUGIN} "-ldl")
 SET_TARGET_PROPERTIES(${TARGET_TIZEN_THEME_UNIT_TEST} PROPERTIES COMPILE_FLAGS "-fPIE")
 SET_TARGET_PROPERTIES(${TARGET_TIZEN_THEME_UNIT_TEST} PROPERTIES LINK_FLAGS "-pie")
 
index 2867a7681cc44b2bc1c0cf1643b579779fed673b..887c943da64f15478277bf6906ab501b5e982ee4 100644 (file)
@@ -37,3 +37,15 @@ extern "C" int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle) {
   return MOCK_HOOK_P1(PkgmgrInfoMock, pkgmgrinfo_pkginfo_destroy_pkginfo,
       handle);
 }
+
+extern "C" int pkgmgrinfo_pkginfo_get_pkginfo(const char* pkgid,
+    pkgmgrinfo_pkginfo_h* handle) {
+  return MOCK_HOOK_P2(PkgmgrInfoMock, pkgmgrinfo_pkginfo_get_pkginfo, pkgid,
+      handle);
+}
+
+extern "C" int pkgmgr_installer_info_get_privilege_level(
+    pkgmgr_privilege_level* level) {
+  return MOCK_HOOK_P1(PkgmgrInfoMock, pkgmgr_installer_info_get_privilege_level,
+      level);
+}
index 93be8883a42e8ec2067928eedf7c2e830568b779..c4b972784337b70edbbf03f1b735b17205d5f15e 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <gmock/gmock.h>
 #include <pkgmgr-info.h>
+#include <pkgmgr_installer_info.h>
 
 #include "mock/module_mock.h"
 
@@ -31,6 +32,10 @@ class PkgmgrInfoMock : public virtual ModuleMock {
   MOCK_METHOD2(pkgmgrinfo_pkginfo_get_root_path,
       int(pkgmgrinfo_pkginfo_h, char**));
   MOCK_METHOD1(pkgmgrinfo_pkginfo_destroy_pkginfo, int(pkgmgrinfo_pkginfo_h));
+  MOCK_METHOD2(pkgmgrinfo_pkginfo_get_pkginfo,
+      int(const char*, pkgmgrinfo_pkginfo_h*));
+  MOCK_METHOD1(pkgmgr_installer_info_get_privilege_level,
+      int(pkgmgr_privilege_level*));
 };
 
 #endif  // TEST_UNIT_TESTS_MOCK_PKGMGR_INFO_MOCK_H_
diff --git a/test/unit_tests/test_samples/res/test_theme.json b/test/unit_tests/test_samples/res/test_theme.json
new file mode 100644 (file)
index 0000000..48d783a
--- /dev/null
@@ -0,0 +1,43 @@
+{
+        "version": "1.0.0",
+        "tool_version": "1.00.38.820793",
+        "title": "GOGO Theme",
+        "description": "Example for theme spec",
+        "resolution": "720x1280",
+        "preview": "GOGO_Preview.png",
+        "header": {
+                "profile": "wearable"
+        },
+        "theme": {
+                "watchface": {
+                        "id": "org.tizen.gogowatch",
+                        "url": "https://www.download.gogowatch/get"
+                },
+                "home": {
+                        "wallpaper": "home_wallpaper.png",
+                        "appicon": {
+                                "org.tizen.browser": "browser.png",
+                                "org.tizen.calculator": "calculator.png",
+                                "org.tizen.calendar": "calendar.png",
+                                "org.tizen.clock": "clock.png",
+                                "org.tizen.contact": "contact.png"
+                        },
+                        "app_tray": "tray.png",
+                        "size": "30"
+                },
+                "keyboard": {
+                        "keypad_bg_color": "#050a28"
+                }
+        },
+        "object_array" : [
+                {
+                        "key_A" : "A",
+                        "key_B" : "B"
+                },
+                {
+                        "key_A" : "AA",
+                        "key_B" : "BB"
+                },
+                null
+        ]
+}
diff --git a/test/unit_tests/test_theme_metadata_plugin.cc b/test/unit_tests/test_theme_metadata_plugin.cc
new file mode 100644 (file)
index 0000000..4310804
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * 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 <dlfcn.h>
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+#include <pkgmgr_parser.h>
+
+#include <memory>
+
+#include "theme/dbus/command.h"
+#include "theme/loader/theme_info.h"
+
+#include "unit_tests/mock/gio_mock.h"
+#include "unit_tests/mock/pkgmgr_info_mock.h"
+#include "unit_tests/mock/test_fixture.h"
+
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::Return;
+using ::testing::SetArgPointee;
+using ttm::loader::ThemeInfo;
+
+class Mocks : public ::testing::NiceMock<GioMock>,
+              public ::testing::NiceMock<PkgmgrInfoMock> {};
+
+const char kAutosetKey[] = "http://tizen.org/metadata/theme/auto_set";
+const char kAutoFileKeyKey[] = "http://tizen.org/metadata/theme/auto_file_key";
+const char kDefaultThemeKey[] = "http://tizen.org/metadata/theme/default";
+const char kThemeKey[] = "http://tizen.org/metadata/theme";
+
+namespace {
+
+void ClearMetadataDetail(gpointer data) {
+  __metadata_t* meta = reinterpret_cast<__metadata_t*>(data);
+  if (meta->key)
+    free(const_cast<char*>(meta->key));
+  if (meta->value)
+    free(const_cast<char*>(meta->value));
+  free(meta);
+}
+
+}  // namespace
+
+class ThemeMetadataPluginTest : public TestFixture {
+ public:
+  ThemeMetadataPluginTest() : TestFixture(std::make_unique<Mocks>()),
+      lib_handle_(nullptr) {}
+  virtual ~ThemeMetadataPluginTest() {}
+
+  virtual void SetUp() {
+    lib_handle_ =
+        dlopen("../../src/theme_plugin/libtizen-theme-plugin.so",
+            RTLD_LAZY | RTLD_LOCAL);
+    ASSERT_NE(lib_handle_, nullptr);
+  }
+
+  virtual void TearDown() {
+    if (lib_handle_ != nullptr)
+      dlclose(lib_handle_);
+  }
+
+  int ExecSym(const std::string func, const std::string pkgid,
+      const std::string appid, GList* metadata) {
+    int (*func_ptr)(const char*, const char*, GList*);
+    func_ptr = (int (*)(const char*, const char*, GList*))
+        dlsym(lib_handle_, func.c_str());
+    if (func_ptr == nullptr)
+      return -1;
+    return func_ptr(pkgid.c_str(), appid.c_str(), metadata);
+  }
+
+  void AddMetadata(GList** list,
+      const char* key, const char* value) {
+    __metadata_t* md = reinterpret_cast<__metadata_t*>(
+        calloc(1, sizeof(__metadata_t)));
+    ASSERT_NE(md, nullptr);
+    md->key = strdup(key);
+    md->value = strdup(value);
+    ASSERT_NE(md->key, nullptr);
+    ASSERT_NE(md->value, nullptr);
+    *list = g_list_append(*list, md);
+  }
+
+ private:
+  void* lib_handle_;
+};
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_INSTALL) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  AddMetadata(&md_list, kThemeKey, "test_theme.json");
+  AddMetadata(&md_list, kDefaultThemeKey, kDefaultThemeKey);
+  AddMetadata(&md_list, kAutoFileKeyKey, kAutoFileKeyKey);
+  AddMetadata(&md_list, kAutosetKey, kAutosetKey);
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillRepeatedly(Return(PMINFO_R_OK));
+  char root_path[] = "test_samples";
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_root_path(_, _)).
+          WillRepeatedly(DoAll(
+              SetArgPointee<1>(const_cast<char*>(root_path)),
+              Return(PMINFO_R_OK)));
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgr_installer_info_get_privilege_level(_)).
+          WillOnce(DoAll(
+              SetArgPointee<0>(PM_PRIVILEGE_PUBLIC),
+              Return(PMINFO_R_OK)));
+  GDBusMessage* msg =
+      reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_new_method_call(_, _, _, _)).WillOnce(Return(msg));
+  msg = reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_connection_send_message_with_reply_sync(_, _, _, _, _, _, _)).
+          WillOnce(Return(msg));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_get_message_type(_)).
+          WillOnce(Return(G_DBUS_MESSAGE_TYPE_METHOD_RETURN));
+  tizen_base::Bundle b;
+  ttm::loader::ThemeInfo ti;
+  b.Add(ttm::dbus::kCmdResultKey, "ok");
+  b.Add(ttm::dbus::kCmdDataKey,
+      reinterpret_cast<char*>(ti.Serialize().ToRaw().first.get()));
+  b.Add(ttm::dbus::kCmdDataKey, std::vector<std::string>());
+  GVariant* gv = g_variant_new("(s)", b.ToRaw().first.get());
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_get_body(_)).WillOnce(Return(gv));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_INSTALL", pkgid, appid, md_list), 0);
+
+  g_list_free_full(md_list, &ClearMetadataDetail);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_INSTALL_N1) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillOnce(Return(PMINFO_R_ERROR));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_INSTALL", pkgid, appid, md_list), -1);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_INSTALL_N2) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillOnce(Return(PMINFO_R_OK));
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_root_path(_, _)).
+          WillRepeatedly(Return(PMINFO_R_ERROR));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_INSTALL", pkgid, appid, md_list), -1);
+
+  g_list_free_full(md_list, &ClearMetadataDetail);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_UPGRADE) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  AddMetadata(&md_list, kThemeKey, "test_theme.json");
+  AddMetadata(&md_list, kDefaultThemeKey, kDefaultThemeKey);
+  AddMetadata(&md_list, kAutoFileKeyKey, kAutoFileKeyKey);
+  AddMetadata(&md_list, kAutosetKey, kAutosetKey);
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillRepeatedly(Return(PMINFO_R_OK));
+  char root_path[] = "test_samples";
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_root_path(_, _)).
+          WillRepeatedly(DoAll(
+              SetArgPointee<1>(const_cast<char*>(root_path)),
+              Return(PMINFO_R_OK)));
+  GDBusMessage* msg =
+      reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_new_method_call(_, _, _, _)).WillOnce(Return(msg));
+  msg = reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_connection_send_message_with_reply_sync(_, _, _, _, _, _, _)).
+          WillOnce(Return(msg));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_get_message_type(_)).
+          WillOnce(Return(G_DBUS_MESSAGE_TYPE_METHOD_RETURN));
+  tizen_base::Bundle b;
+  ttm::loader::ThemeInfo ti;
+  b.Add(ttm::dbus::kCmdResultKey, "ok");
+  b.Add(ttm::dbus::kCmdDataKey,
+      reinterpret_cast<char*>(ti.Serialize().ToRaw().first.get()));
+  b.Add(ttm::dbus::kCmdDataKey, std::vector<std::string>());
+  GVariant* gv = g_variant_new("(s)", b.ToRaw().first.get());
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_get_body(_)).WillOnce(Return(gv));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_UPGRADE", pkgid, appid, md_list), 0);
+
+  g_list_free_full(md_list, &ClearMetadataDetail);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_UNINSTALL) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  AddMetadata(&md_list, kThemeKey, "test_theme.json");
+  AddMetadata(&md_list, kDefaultThemeKey, kDefaultThemeKey);
+  AddMetadata(&md_list, kAutoFileKeyKey, kAutoFileKeyKey);
+  AddMetadata(&md_list, kAutosetKey, kAutosetKey);
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillRepeatedly(Return(PMINFO_R_OK));
+  char root_path[] = "test_samples";
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_root_path(_, _)).
+          WillRepeatedly(DoAll(
+              SetArgPointee<1>(const_cast<char*>(root_path)),
+              Return(PMINFO_R_OK)));
+  GDBusMessage* msg =
+      reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_new_method_call(_, _, _, _)).WillOnce(Return(msg));
+  msg = reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_connection_send_message_with_reply_sync(_, _, _, _, _, _, _)).
+          WillOnce(Return(msg));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_get_message_type(_)).
+          WillOnce(Return(G_DBUS_MESSAGE_TYPE_METHOD_RETURN));
+  tizen_base::Bundle b;
+  ttm::loader::ThemeInfo ti;
+  b.Add(ttm::dbus::kCmdResultKey, "ok");
+  b.Add(ttm::dbus::kCmdDataKey,
+      reinterpret_cast<char*>(ti.Serialize().ToRaw().first.get()));
+  b.Add(ttm::dbus::kCmdDataKey, std::vector<std::string>());
+  GVariant* gv = g_variant_new("(s)", b.ToRaw().first.get());
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_dbus_message_get_body(_)).WillOnce(Return(gv));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_UNINSTALL", pkgid, appid, md_list), 0);
+
+  g_list_free_full(md_list, &ClearMetadataDetail);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_CLEAN) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_CLEAN", pkgid, appid, md_list), 0);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_UNDO) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_UNDO", pkgid, appid, md_list), 0);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_REMOVED_N) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillOnce(Return(PMINFO_R_ERROR));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_REMOVED", pkgid, appid, md_list), -1);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_RECOVERINSTALL_N) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillOnce(Return(PMINFO_R_ERROR));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_RECOVERINSTALL",
+          pkgid, appid, md_list), -1);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_RECOVERUPGRADE_N) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillOnce(Return(PMINFO_R_ERROR));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_RECOVERUPGRADE",
+          pkgid, appid, md_list), -1);
+}
+
+TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_RECOVERUNINSTALL_N) {
+  std::string pkgid = "pkgid";
+  std::string appid = "appid";
+  GList* md_list = nullptr;
+
+  EXPECT_CALL(GetMock<PkgmgrInfoMock>(),
+      pkgmgrinfo_pkginfo_get_pkginfo(_, _)).
+          WillRepeatedly(Return(PMINFO_R_ERROR));
+
+  ASSERT_EQ(
+      ExecSym("PKGMGR_MDPARSER_PLUGIN_RECOVERUNINSTALL",
+          pkgid, appid, md_list), -1);
+}