1 // Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
2 // Use of this source code is governed by an apache 2.0 license that can be
3 // found in the LICENSE file.
5 #include <gtest/gtest.h>
11 #include "common/installer_context.h"
12 #include "common/step/configuration/step_parse_manifest.h"
13 #include "common/plugins/plugin_factory.h"
14 #include "common/plugins/plugin_list_parser.h"
15 #include "common/plugins/plugin_manager.h"
16 #include "common/plugins/plugin_xml_parser.h"
17 #include "smoke_tests/libs/test_assessor.h"
19 namespace ci = common_installer;
20 namespace fs = std::filesystem;
24 const char kPluginsTestFiles[] =
25 "/usr/share/app-installers-ut/test_samples/plugins";
27 const fs::path kTestTagPlugin =
28 fs::path(kPluginsTestFiles) / "libtest-tag-plugin.so";
29 const fs::path kTestCategoryPlugin =
30 fs::path(kPluginsTestFiles) / "libtest-category-plugin.so";
31 const fs::path kTestMetadataPlugin =
32 fs::path(kPluginsTestFiles) / "libtest-metadata-plugin.so";
33 const fs::path kTestValidPluginsListDir =
34 fs::path(kPluginsTestFiles) / "valid-parser-plugins";
35 const fs::path kTestValidFailPluginsListDir =
36 fs::path(kPluginsTestFiles) / "valid-fail-parser-plugins";
37 const fs::path kTestInvalidPluginsListDir =
38 fs::path(kPluginsTestFiles) / "invalid-parser-plugins";
41 const ci::TestAssessor::ResultStore& store,
42 const std::string& name,
43 ci::Plugin::ActionType action) {
44 auto iter_pre = store.find(
45 std::make_tuple(name, action, ci::Plugin::ProcessType::Pre));
46 auto iter_main = store.find(
47 std::make_tuple(name, action, ci::Plugin::ProcessType::Main));
48 auto iter_post = store.find(
49 std::make_tuple(name, action, ci::Plugin::ProcessType::Post));
50 ASSERT_NE(iter_pre, store.end());
51 ASSERT_NE(iter_main, store.end());
52 ASSERT_NE(iter_post, store.end());
55 ASSERT_TRUE(!iter_pre->second) << *iter_pre->second;
56 ASSERT_TRUE(!iter_main->second) << *iter_main->second;
57 ASSERT_TRUE(!iter_post->second) << *iter_post->second;
59 // Check order of calling
60 auto ts_pre = std::distance(store.begin(), iter_pre);
61 auto ts_main = std::distance(store.begin(), iter_main);
62 auto ts_post = std::distance(store.begin(), iter_post);
63 ASSERT_GT(ts_main, ts_pre);
64 ASSERT_GT(ts_post, ts_main);
68 const ci::TestAssessor::ResultStore& store,
69 const std::string& name,
70 ci::Plugin::ActionType action) {
71 auto iter_main = store.find(
72 std::make_tuple(name, action, ci::Plugin::ProcessType::Main));
73 ASSERT_NE(iter_main, store.end());
76 ASSERT_TRUE(!iter_main->second) << *iter_main->second;
81 namespace common_installer {
83 class PluginTest : public testing::Test {
86 TEST_F(PluginTest, PluginsXmlParser_Valid) {
87 fs::path manifest = fs::path(kPluginsTestFiles) / "tizen-manifest.xml";
88 PluginsXmlParser parser(manifest);
89 ASSERT_TRUE(parser.Parse());
90 ASSERT_NE(parser.doc_ptr(), nullptr);
91 auto tags = parser.tags_list();
92 ASSERT_NE(std::find(tags.begin(), tags.end(), "author"), tags.end());
93 ASSERT_NE(std::find(tags.begin(), tags.end(), "description"), tags.end());
94 ASSERT_NE(std::find(tags.begin(), tags.end(), "ui-application"), tags.end());
95 ASSERT_NE(std::find(tags.begin(), tags.end(), "test"), tags.end());
97 ASSERT_EQ(std::find(tags.begin(), tags.end(), "label"), tags.end());
98 ASSERT_EQ(std::find(tags.begin(), tags.end(), "app-control"), tags.end());
99 ASSERT_EQ(std::find(tags.begin(), tags.end(), "datacontrol"), tags.end());
100 ASSERT_EQ(std::find(tags.begin(), tags.end(), "mime"), tags.end());
101 ASSERT_EQ(std::find(tags.begin(), tags.end(), "operation"), tags.end());
102 ASSERT_EQ(std::find(tags.begin(), tags.end(), "uri"), tags.end());
103 ASSERT_EQ(std::find(tags.begin(), tags.end(), "key"), tags.end());
104 ASSERT_EQ(std::find(tags.begin(), tags.end(), "name"), tags.end());
105 ASSERT_EQ(std::find(tags.begin(), tags.end(), ""), tags.end());
108 TEST_F(PluginTest, PluginsXmlParser_Invalid) {
109 fs::path manifest = fs::path(kPluginsTestFiles) / "invalid_manifest.xml";
110 PluginsXmlParser parser(manifest);
111 ASSERT_FALSE(parser.Parse());
114 TEST_F(PluginTest, PluginsListParser_Valid) {
115 PluginsListParser parser(kTestValidPluginsListDir);
116 ASSERT_TRUE(parser.Parse());
117 auto list = parser.PluginInfoList();
118 ASSERT_EQ(list.size(), 3);
119 for (auto list_item : list) {
120 if (list_item->type() == "tag") {
121 ASSERT_EQ(list_item->name(), "test");
122 ASSERT_EQ(list_item->path(), kTestTagPlugin.string());
123 } else if (list_item->type() == "category") {
124 ASSERT_EQ(list_item->name(), "http://tizen.org/category/test_category");
125 ASSERT_EQ(list_item->path(), kTestCategoryPlugin.string());
126 } else if (list_item->type() == "metadata") {
127 ASSERT_EQ(list_item->name(),
128 "http://developer.samsung.com/tizen/metadata/test_metadata");
129 ASSERT_EQ(list_item->path(), kTestMetadataPlugin.string());
134 TEST_F(PluginTest, PluginsListParser_Invalid) {
135 PluginsListParser parser(kTestInvalidPluginsListDir);
136 ASSERT_FALSE(parser.Parse());
139 TEST_F(PluginTest, PluginFactory_CreatingPlugins) {
140 PluginFactory factory;
141 PluginInfo tag_info("tag", "test", kTestTagPlugin.string(), false);
142 ASSERT_TRUE(!!factory.CreatePluginByPluginInfo(tag_info));
143 PluginInfo category_info("category", "category",
144 kTestCategoryPlugin.string(), false);
145 ASSERT_TRUE(!!factory.CreatePluginByPluginInfo(category_info));
146 PluginInfo metadata_info("metadata", "metadata",
147 kTestMetadataPlugin.string(), false);
148 ASSERT_TRUE(!!factory.CreatePluginByPluginInfo(metadata_info));
149 PluginInfo tag_info2("tag", "test", kTestTagPlugin.string(), true);
150 ASSERT_TRUE(!!factory.CreatePluginByPluginInfo(tag_info2));
151 PluginInfo category_info2("category", "category",
152 kTestCategoryPlugin.string(), true);
153 ASSERT_TRUE(!!factory.CreatePluginByPluginInfo(category_info2));
154 PluginInfo metadata_info2("metadata", "metadata",
155 kTestMetadataPlugin.string(), true);
156 ASSERT_TRUE(!!factory.CreatePluginByPluginInfo(metadata_info2));
157 PluginInfo missing_info("tag", "test",
158 "/usr/lib/libmynonexistingplugin.so", false);
159 ASSERT_FALSE(!!factory.CreatePluginByPluginInfo(missing_info));
160 PluginInfo new_info("newtype", "test", kTestTagPlugin.string(), false);
161 ASSERT_FALSE(!!factory.CreatePluginByPluginInfo(new_info));
164 #define CALLING_PLUGIN_FOR_ACTION_TEST(NAME, ACTION) \
165 TEST_F(PluginTest, PluginManager_CallingPlugins ## NAME) { \
166 TestAssessor::Instance().ClearResults(); \
168 fs::path manifest = fs::path(kPluginsTestFiles) / "tizen-manifest.xml"; \
169 fs::path list = kTestValidPluginsListDir; \
171 InstallerContext context; \
172 context.unpacked_dir_path.set(manifest.parent_path()); \
173 configuration::StepParseManifest step(&context, \
174 configuration::StepParseManifest::ManifestLocation::PACKAGE, \
175 configuration::StepParseManifest::StoreLocation::NORMAL); \
176 ASSERT_EQ(step.process(), Step::Status::OK); \
177 PluginManager manager(manifest, list, context.pkgid.get(), \
178 context.manifest_data.get(), getuid()); \
179 ASSERT_TRUE(manager.LoadPlugins(ACTION)); \
180 manager.RunPlugins(ACTION); \
181 auto result = TestAssessor::Instance().GetResults(); \
182 ASSERT_EQ(result.size(), 5); \
183 CheckCall(result, kTagPluginName, ACTION); \
184 CheckCallMain(result, kMetadataPluginName, ACTION); \
185 CheckCallMain(result, kCategoryPluginName, ACTION); \
188 CALLING_PLUGIN_FOR_ACTION_TEST(Install, Plugin::ActionType::Install)
189 CALLING_PLUGIN_FOR_ACTION_TEST(Upgrade, Plugin::ActionType::Upgrade)
190 CALLING_PLUGIN_FOR_ACTION_TEST(Uninstall, Plugin::ActionType::Uninstall)
192 #define CALLING_PLUGIN_FOR_FAIL_ACTION_TEST(NAME, ACTION) \
193 TEST_F(PluginTest, PluginManager_CallingFailPlugins ## NAME) { \
194 std::string kind_of_plugins[3] = {"category", "metadata", "tag"}; \
195 for (auto name : kind_of_plugins) { \
196 std::string manifest_dir = name + "-manifest"; \
197 fs::path manifest = \
198 fs::path(kPluginsTestFiles) / manifest_dir / "tizen-manifest.xml"; \
199 fs::path list = kTestValidFailPluginsListDir; \
201 InstallerContext context; \
202 context.unpacked_dir_path.set(manifest.parent_path()); \
203 configuration::StepParseManifest step(&context, \
204 configuration::StepParseManifest::ManifestLocation::PACKAGE, \
205 configuration::StepParseManifest::StoreLocation::NORMAL); \
206 ASSERT_EQ(step.process(), Step::Status::OK); \
207 PluginManager manager(manifest, list, context.pkgid.get(), \
208 context.manifest_data.get(), getuid()); \
209 ASSERT_TRUE(manager.LoadPlugins(ACTION)); \
210 ASSERT_FALSE(manager.RunPlugins(ACTION)); \
214 CALLING_PLUGIN_FOR_FAIL_ACTION_TEST(Install, Plugin::ActionType::Install)
215 CALLING_PLUGIN_FOR_FAIL_ACTION_TEST(Upgrade, Plugin::ActionType::Upgrade)
216 CALLING_PLUGIN_FOR_FAIL_ACTION_TEST(Uninstall, Plugin::ActionType::Uninstall)
218 } // namespace common_installer
220 int main(int argc, char** argv) {
223 testing::InitGoogleTest(&argc, argv);
225 std::cout << "Exception occurred" << std::endl;
229 ret = RUN_ALL_TESTS();
230 } catch (const ::testing::internal::GoogleTestFailureException& e) {
232 std::cout << "GoogleTestFailureException was thrown:" << e.what()