Load plugins info from multiple lists 95/163995/8
authorSangyoon Jang <jeremy.jang@samsung.com>
Thu, 14 Dec 2017 11:41:40 +0000 (20:41 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Wed, 31 Jan 2018 04:33:55 +0000 (04:33 +0000)
Installer will load plugins info from multiple lists which are located at
'/usr/share/parser-plugins'. Who want add their own plugin can add
plugin info file with valid format.

Change-Id: Ib7b9164eee73383856a9aeb7738052afcbbc33e6
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
packaging/app-installers.spec
src/common/CMakeLists.txt
src/common/plugins/plugin_list_parser.cc
src/common/step/pkgmgr/step_run_parser_plugins.cc
src/unit_tests/plugins_unittest.cc
src/unit_tests/test_samples/plugins/invalid-parser-plugins/invalid_plugin_list.txt [moved from src/unit_tests/test_samples/plugins/invalid_plugin_list.txt with 100% similarity]
src/unit_tests/test_samples/plugins/valid-parser-plugins/test_plugin_list1.txt [new file with mode: 0644]
src/unit_tests/test_samples/plugins/valid-parser-plugins/test_plugin_list2.txt [moved from src/unit_tests/test_samples/plugins/test_plugin_list.txt with 60% similarity]

index 1bb2cf9..109c4a6 100644 (file)
@@ -96,7 +96,7 @@ chsmack -a System %{unpackdir}
 
 %files
 %defattr(-,root,root)
-%{_datarootdir}/app-installers/plugins_list.txt
+%{_datarootdir}/parser-plugins/plugins_list.txt
 %manifest app-installers.manifest
 %{_libdir}/libapp-installers.so.*
 %{_bindir}/pkgdir-tool
index f71d5dc..d37a183 100644 (file)
@@ -67,10 +67,9 @@ INSTALL(TARGETS ${TARGET_LIBNAME_COMMON} DESTINATION ${LIB_INSTALL_DIR})
 SET(PLUGINS_LIST_FILE_NAME plugins_list.txt)
 SET(PLUGINS_LIST_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/plugins/${PLUGINS_LIST_FILE_NAME})
 
-SET(PLUGINS_LIST_INSTALL_PATH ${SHAREDIR}/app-installers)
-SET(PLUGINS_LIST_INSTALL_FILE_PATH ${PLUGINS_LIST_INSTALL_PATH}/${PLUGINS_LIST_FILE_NAME})
+SET(PLUGINS_LIST_INSTALL_PATH ${SHAREDIR}/parser-plugins)
 
-ADD_DEFINITIONS("-DPLUGINS_LIST_INSTALL_FILE_PATH=\"${PLUGINS_LIST_INSTALL_FILE_PATH}\"")
+ADD_DEFINITIONS("-DPLUGINS_LIST_INSTALL_PATH=\"${PLUGINS_LIST_INSTALL_PATH}\"")
 IF(NOT DEFINED TIZEN_FULL_VERSION)
   MESSAGE(FATAL_ERROR "TIZEN_FULL_VERSION MUST BE defined")
 ELSE(NOT DEFINED TIZEN_FULL_VERSION)
index f162ce9..83c5f88 100644 (file)
@@ -6,6 +6,12 @@
 
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/split.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/system/error_code.hpp>
+
+namespace bf = boost::filesystem;
+namespace bs = boost::system;
 
 namespace common_installer {
 
@@ -112,26 +118,31 @@ const PluginsListParser::PluginList& PluginsListParser::PluginInfoList() const {
 }
 
 bool PluginsListParser::ReadLinesFromFile(std::vector<std::string>* lines) {
-  std::ifstream plugins_file;
-
-  plugins_file.open(path_.string());
+  for (bf::directory_iterator file(path_); file != bf::directory_iterator();
+      ++file) {
+    bs::error_code error;
+    bool is_file = bf::is_regular_file(file->path(), error);
+    if (!is_file || error)
+      continue;
+
+    std::ifstream plugins_file;
+    plugins_file.open(file->path().string());
+    if (!plugins_file.is_open()) {
+      LOG(ERROR) << "File " << file->path() << " not opened";
+      continue;
+    }
 
-  if (!plugins_file.is_open()) {
-    LOG(ERROR) << "File " << path_ << " no open";
-    return false;
-  }
+    LOG(INFO) << "Plugin list path: " << file->path();
 
-  LOG(INFO) << "Plugin list path: " << path_;
+    std::string line;
+    while (plugins_file >> line)
+      lines->push_back(line);
 
-  std::string line;
-  while (plugins_file >> line) {
-    lines->push_back(line);
+    plugins_file.close();
   }
 
-  plugins_file.close();
-
   if (lines->empty()) {
-    LOG(ERROR) << "No data in file " << path_;
+    LOG(ERROR) << "No data in files from " << path_;
     return false;
   }
 
index 7213803..4dedb0c 100644 (file)
@@ -19,8 +19,8 @@ StepRunParserPlugin::StepRunParserPlugin(
 Step::Status StepRunParserPlugin::ProcessPlugins(
     const boost::filesystem::path& xml_path, manifest_x* manifest,
     Plugin::ActionType action_type) {
-  // PLUGINS_LIST_FILE_PATH path generated from cmake
-  const std::string listPath(PLUGINS_LIST_INSTALL_FILE_PATH);
+  // PLUGINS_LIST_INSTALL_PATH path generated from cmake
+  const std::string listPath(PLUGINS_LIST_INSTALL_PATH);
 
   PluginManager plugin_manager(xml_path.string(), listPath, manifest);
   if (!plugin_manager.LoadPlugins()) {
index b02b641..2bdae80 100644 (file)
@@ -31,6 +31,10 @@ const bf::path kTestCategoryPlugin =
     bf::path(kPluginsTestFiles) / "libtest-category-plugin.so";
 const bf::path kTestMetadataPlugin =
     bf::path(kPluginsTestFiles) / "libtest-metadata-plugin.so";
+const bf::path kTestValidPluginsListDir =
+    bf::path(kPluginsTestFiles) / "valid-parser-plugins";
+const bf::path kTestInvalidPluginsListDir =
+    bf::path(kPluginsTestFiles) / "invalid-parser-plugins";
 
 void CheckCall(
     const ci::TestAssessor::ResultStore& store,
@@ -107,8 +111,7 @@ TEST_F(PluginTest, PluginsXmlParser_Invalid) {
 }
 
 TEST_F(PluginTest, PluginsListParser_Valid) {
-  bf::path list_file = bf::path(kPluginsTestFiles) / "test_plugin_list.txt";
-  PluginsListParser parser(list_file);
+  PluginsListParser parser(kTestValidPluginsListDir);
   ASSERT_TRUE(parser.Parse());
   auto list = parser.PluginInfoList();
   ASSERT_EQ(list.size(), 3);
@@ -125,8 +128,7 @@ TEST_F(PluginTest, PluginsListParser_Valid) {
 }
 
 TEST_F(PluginTest, PluginsListParser_Invalid) {
-  bf::path list_file = bf::path(kPluginsTestFiles) / "invalid_plugin_list.txt";
-  PluginsListParser parser(list_file);
+  PluginsListParser parser(kTestInvalidPluginsListDir);
   ASSERT_FALSE(parser.Parse());
 }
 
@@ -152,7 +154,7 @@ TEST_F(PluginTest, PluginFactory_CreatingPlugins) {
       TestAssessor::Instance().ClearResults();                                 \
                                                                                \
       bf::path manifest = bf::path(kPluginsTestFiles) / "tizen-manifest.xml";  \
-      bf::path list = bf::path(kPluginsTestFiles) / "test_plugin_list.txt";    \
+      bf::path list = kTestValidPluginsListDir;                                \
                                                                                \
       InstallerContext context;                                                \
       context.unpacked_dir_path.set(manifest.parent_path());                   \
diff --git a/src/unit_tests/test_samples/plugins/valid-parser-plugins/test_plugin_list1.txt b/src/unit_tests/test_samples/plugins/valid-parser-plugins/test_plugin_list1.txt
new file mode 100644 (file)
index 0000000..d5ff09d
--- /dev/null
@@ -0,0 +1 @@
+type="metadata";name="http://developer.samsung.com/tizen/metadata/test_metadata";path="/usr/share/app-installers-ut/test_samples/plugins/libtest-metadata-plugin.so"
@@ -1,3 +1,2 @@
 type="tag";name="test";path="/usr/share/app-installers-ut/test_samples/plugins/libtest-tag-plugin.so"
 type="category";name="http://tizen.org/category/test_category";path="/usr/share/app-installers-ut/test_samples/plugins/libtest-category-plugin.so"
-type="metadata";name="http://developer.samsung.com/tizen/metadata/test_metadata";path="/usr/share/app-installers-ut/test_samples/plugins/libtest-metadata-plugin.so"