--- /dev/null
+/*
+ * 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);
+}