Implement EventSignalSender 99/262899/8
authorIlho Kim <ilho159.kim@samsung.com>
Mon, 23 Aug 2021 01:29:02 +0000 (10:29 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Tue, 24 Aug 2021 06:27:02 +0000 (15:27 +0900)
Change-Id: Ie9caa2fa8d39272132a100cbcd0930da49d5c4f5
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
src/res-copy/CMakeLists.txt
src/res-copy/include/error_type.hh
src/res-copy/include/event_signal_sender.hh
src/res-copy/include/param_checker.hh
src/res-copy/include/request_handler_invoker.hh
src/res-copy/src/event_signal_sender.cc
src/res-copy/src/param_checker.cc
src/res-copy/src/request_handler_invoker.cc
src/res-copy/src/res_handler.cc
tests/unit_tests/CMakeLists.txt
tests/unit_tests/res-copy/src/test_request_handler_invoker.cc

index 1e960e1c680b96975f718d3d198cd02a64761d6d..172cabdf185d77c6d925c67b89e33e2f599a97c2 100644 (file)
@@ -11,7 +11,9 @@ APPLY_PKG_CONFIG(${TARGET_RES_COPY} PUBLIC
   GLIB_DEPS
   BUNDLE_DEPS
   Boost
+  PKGMGR_DEPS
   PKGMGR_INFO_DEPS
+  PKGMGR_INSTALLER_DEPS
   TZPLATFORM_DEPS
 )
 
index 3d25689906dbfc00f089ce90745012b2a1766f3c..c2309bdb36412cd08c4d653924ebd34b5deb72f2 100644 (file)
 #ifndef ERROR_TYPE_HH_
 #define ERROR_TYPE_HH_
 
+#include <pkgmgr_installer_error.h>
+
 namespace res_handler {
 
 enum ErrorType {
-  ERROR_NONE = 0,
-  ERROR_INVALID_PARAMETER,
-  ERROR_PKG_NOT_FOUND,
-  ERROR_PERMISSION_DENIED,
-  ERROR_SYSTEM_ERROR,
-  ERROR_RES_NOT_FOUND,
-  ERROR_OUT_OF_SPACE,
-  ERROR_OUT_OF_MEMORY
+  ERROR_NONE = PKGMGR_INSTALLER_ERRCODE_OK,
+  ERROR_INVALID_PARAMETER = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE,
+  ERROR_PKG_NOT_FOUND = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND,
+  ERROR_PERMISSION_DENIED = PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR,
+  ERROR_SYSTEM_ERROR = PKGMGR_INSTALLER_ERRCODE_ERROR,
+  ERROR_RES_NOT_FOUND = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND,
+  ERROR_OUT_OF_SPACE = PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE,
+  ERROR_OUT_OF_MEMORY = PKGMGR_INSTALLER_ERRCODE_ERROR
 };
 
 }  // namespace res_handler
index 9bb5fb3ba89e1e0ca29443c5d558b6a012429937..3f0c52de3d0caf3f62c54585af5154abb88f3f3e 100644 (file)
 #ifndef EVENT_SIGNAL_SENDER_HH_
 #define EVENT_SIGNAL_SENDER_HH_
 
+#include <memory>
 #include <string>
 
+#include <pkgmgr_installer.h>
+
 #include "include/error_type.hh"
 #include "include/request_type.hh"
 
@@ -26,16 +29,24 @@ namespace res_handler {
 
 class EventSignalSender {
  public:
-  EventSignalSender() : pkgid_(""), req_type_(ReqType::REQ_TYPE_UNKNOWN) {};
+  EventSignalSender(pkgmgr_installer* installer);
   bool SendStart();
   bool SendOK();
   bool SendFail(ErrorType error);
   void SetPkgID(std::string pkgid);
   void SetReqType(ReqType req_type);
+  void SetUID(uid_t uid);
+  void SetSessionID(std::string session_id);
 
  private:
+  bool SendSignal(const char* status, ErrorType error);
+
   std::string pkgid_;
   ReqType req_type_;
+  uid_t uid_;
+  std::string session_id_;
+  std::unique_ptr<pkgmgr_installer,
+      decltype(pkgmgr_installer_free)*> installer_;
 };
 
 }  // res_handler
index 7434863fb609278ef77378cc9f374c99decab624..8fa10fbf0d5fb029572870d90c12339dc1f42f69 100644 (file)
@@ -30,6 +30,7 @@ class ParamChecker {
   ParamChecker(int argc, char* argv[]);
   ReqType GetRequestType();
   std::string GetPkgID() const;
+  std::string GetSessionID() const;
   uid_t GetUID() const;
   const std::list<ResPathInfo>& GetPathList() const;
   bool Validate();
index d4fff8ba204a82609e55299c055fab7157d839e5..be52769b966c2e89c96b34abf40fc3fb07af86ee 100644 (file)
@@ -28,16 +28,17 @@ namespace res_handler {
 
 class RequestHandlerInvoker {
  public:
-  RequestHandlerInvoker(ParamChecker option, EventSignalSender signal);
+  RequestHandlerInvoker(ParamChecker option,
+      std::shared_ptr<EventSignalSender> signal);
 
   bool Validate();
   bool Execute();
   const std::string GetHandlerType() const;
 
  private:
-  std::unique_ptr<AbstractRequestHandler> handler_;
   ParamChecker option_;
-  EventSignalSender signal_;
+  std::unique_ptr<AbstractRequestHandler> handler_;
+  std::shared_ptr<EventSignalSender> signal_;
 
   void SetReqHandler();
 };
index 332ca27431882ae73b616ba336456391d89234ae..b6c23d4b350e7d652275487c3694111d9a49eebc 100644 (file)
 #include <iostream>
 #include <string>
 
+#include <package-manager.h>
+#include <package-manager-types.h>
+
 #include "include/error_type.hh"
 #include "include/request_type.hh"
+#include "include/logging.hh"
 
 namespace res_handler {
 
+EventSignalSender::EventSignalSender(pkgmgr_installer* installer)
+    : pkgid_(""), req_type_(ReqType::REQ_TYPE_UNKNOWN),
+      installer_(installer, pkgmgr_installer_free) {}
+
+bool EventSignalSender::SendSignal(const char* status, ErrorType error) {
+  if (!installer_)
+    return false;
+
+  std::unique_ptr<pkgmgr_res_event_info, decltype(pkgmgr_res_event_info_free)*>
+      event_info(pkgmgr_res_event_info_new(), pkgmgr_res_event_info_free);
+  if (!event_info) {
+    LOG(ERROR) << "Fail to create event info";
+    return false;
+  }
+
+  pkgmgr_res_event_info_set_error_code(event_info.get(),
+      static_cast<int>(error));
+
+  if (pkgmgr_installer_send_res_copy_signal(installer_.get(), pkgid_.c_str(),
+      status, event_info.get()) != 0) {
+    LOG(ERROR) << "Fail to send resource copy signal";
+    return false;
+  }
+
+  return true;
+}
+
 bool EventSignalSender::SendStart() {
-  std::cout << "EventSignalSender::SendStart" << std::endl;
+  if (!SendSignal(PKGMGR_INSTALLER_START_KEY_STR, ErrorType::ERROR_NONE)) {
+    LOG(ERROR) << "Fail to send start signal";
+    return false;
+  }
 
   return true;
 }
 
 bool EventSignalSender::SendOK() {
-  std::cout << "EventSignalSender::SendOK" << std::endl;
+  if (!SendSignal(PKGMGR_INSTALLER_OK_EVENT_STR, ErrorType::ERROR_NONE)) {
+    LOG(ERROR) << "Fail to send ok signal";
+    return false;
+  }
 
   return true;
 }
 
 bool EventSignalSender::SendFail(ErrorType error) {
-  std::cout << "EventSignalSender::SendFail" << std::endl;
+  if (!SendSignal(PKGMGR_INSTALLER_FAIL_EVENT_STR, error)) {
+    LOG(ERROR) << "Fail to send fail signal";
+    return false;
+  }
 
   return true;
 }
@@ -48,7 +88,27 @@ void EventSignalSender::SetPkgID(std::string pkgid) {
 }
 
 void EventSignalSender::SetReqType(ReqType req_type) {
+  if (req_type == ReqType::REQ_TYPE_NEW)
+    pkgmgr_installer_set_request_type(installer_.get(), PKGMGR_REQ_RES_COPY);
+  else if (req_type == ReqType::REQ_TYPE_CREATEDIR)
+    pkgmgr_installer_set_request_type(installer_.get(),
+        PKGMGR_REQ_RES_CREATE_DIR);
+  else if (req_type == ReqType::REQ_TYPE_REMOVE)
+    pkgmgr_installer_set_request_type(installer_.get(), PKGMGR_REQ_RES_REMOVE);
+  else if (req_type == ReqType::REQ_TYPE_UNINSTALL)
+    pkgmgr_installer_set_request_type(installer_.get(),
+        PKGMGR_REQ_RES_UNINSTALL);
   req_type_ = req_type;
 }
 
+void EventSignalSender::SetUID(uid_t uid) {
+  pkgmgr_installer_set_uid(installer_.get(), uid);
+  uid_ = uid;
+}
+
+void EventSignalSender::SetSessionID(std::string session_id) {
+  pkgmgr_installer_set_session_id(installer_.get(), session_id.c_str());
+  session_id_ = session_id;
+}
+
 }  // namespace res_handler
index 72083a0569256290b5b6d5d32173cd3bc882340f..a34d37cd7689c3fcf739cdd2a9e807f2937cbef2 100644 (file)
@@ -58,7 +58,8 @@ ParamChecker::ParamChecker(int argc, char* argv[]) {
 
   options.add_options()
       ("uid,u", bpo::value<int>()->default_value(0), "user id")
-      ("session-id,k", bpo::value<std::string>(), "session id")
+      ("session-id,k", bpo::value<std::string>()->default_value(""),
+          "session id")
       ("path,p", bpo::value<std::vector<std::string>>()->multitoken(),
           "source-destination path")
       ("remove,r", bpo::value<std::string>(), "remove shared resource")
@@ -100,6 +101,10 @@ std::string ParamChecker::GetPkgID() const {
   return pkgid_;
 }
 
+std::string ParamChecker::GetSessionID() const {
+  return session_id_;
+}
+
 uid_t ParamChecker::GetUID() const {
   return uid_;
 }
index 588182c15f5a0b78a0f547ab414c59c55a2cd308..a0da08d6283cb42bc629e2436f1dbaad7a506f63 100644 (file)
@@ -46,7 +46,7 @@ std::string GetRootPathForUid(uid_t uid) {
 namespace res_handler {
 
 RequestHandlerInvoker::RequestHandlerInvoker(
-    ParamChecker option, EventSignalSender signal) :
+    ParamChecker option, std::shared_ptr<EventSignalSender> signal) :
         option_(option), signal_(signal) {
   SetReqHandler();
 }
@@ -54,6 +54,7 @@ RequestHandlerInvoker::RequestHandlerInvoker(
 bool RequestHandlerInvoker::Validate() {
   if (handler_ == nullptr) {
     LOG(ERROR) << "Failed to initialize handler";
+    signal_->SendFail(ErrorType::ERROR_SYSTEM_ERROR);
     return false;
   }
 
@@ -62,6 +63,7 @@ bool RequestHandlerInvoker::Validate() {
           option_.GetRequestType(), option_.GetPathList())
       != ErrorType::ERROR_NONE) {
     LOG(ERROR) << "Validation failed";
+    signal_->SendFail(ErrorType::ERROR_SYSTEM_ERROR);
     return false;
   }
 
@@ -69,11 +71,18 @@ bool RequestHandlerInvoker::Validate() {
 }
 
 bool RequestHandlerInvoker::Execute() {
-  if (handler_ == nullptr)
+  if (handler_ == nullptr) {
+    signal_->SendFail(ErrorType::ERROR_SYSTEM_ERROR);
     return false;
+  }
 
-  if (handler_->Execute() != ErrorType::ERROR_NONE)
+  signal_->SendStart();
+  ErrorType ret = handler_->Execute();
+  if (ret != ErrorType::ERROR_NONE) {
+    signal_->SendFail(ret);
     return false;
+  }
+  signal_->SendOK();
 
   return true;
 }
index b15b030282c38694720b32b6d52209aa280b77a9..8790639dfca00271f135c6eb156d9a5a69944650 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <iostream>
 
+#include <pkgmgr_installer.h>
+
 #include "include/event_signal_sender.hh"
 #include "include/logging.hh"
 #include "include/param_checker.hh"
 namespace res_handler {
 
 bool ResHandler::Init(int argc, char* argv[]) {
+  pkgmgr_installer *installer = pkgmgr_installer_new();
+  if (!installer) {
+    LOG(ERROR) << "Fail to get pkgmgr installer";
+    return false;
+  }
+  std::shared_ptr<EventSignalSender> signal =
+      std::make_shared<EventSignalSender>(installer);
+
   res_handler::ParamChecker option(argc, argv);
   if (!option.Validate()) {
     LOG(ERROR) << "Invalid argument has given";
+    signal->SendFail(ErrorType::ERROR_INVALID_PARAMETER);
     return false;
   }
+  signal->SetPkgID(option.GetPkgID());
+  signal->SetReqType(option.GetRequestType());
+  signal->SetUID(option.GetUID());
+  signal->SetSessionID(option.GetSessionID());
 
-  res_handler::EventSignalSender signal;
-  signal.SetPkgID(option.GetPkgID());
-  signal.SetReqType(option.GetRequestType());
-
-  handler_.reset(new res_handler::RequestHandlerInvoker(option, signal));
+  handler_.reset(new RequestHandlerInvoker(option, signal));
   if (!handler_->Validate()) {
     LOG(ERROR) << "Failed to initialize request handler";
     return false;
index 7591000f6a63f53d4574fe6e27d200cc5d10b43f..ab881386b3e1cba675d44a9978e970189a302819 100644 (file)
@@ -5,8 +5,10 @@ INCLUDE(FindPkgConfig)
 PKG_CHECK_MODULES(pkgmgr-tool_unittests REQUIRED
   dlog
   gmock
+  pkgmgr
   pkgmgr-parser
   pkgmgr-info
+  pkgmgr-installer
   libtzplatform-config
   libsmack
   sqlite3
index ac446a4d7f96a4c9757d309bf9a97da76a5cac56..be3ac620b54c713d5ffd1def1b8c48f463c7b569 100644 (file)
@@ -45,15 +45,16 @@ class Mocks : public ::testing::NiceMock<PkgMgrInfoMock>,
 class RequestHandlerInvokerTest : public TestFixture {
  public:
   RequestHandlerInvokerTest() : TestFixture(std::make_unique<Mocks>()) {
-    signal_sender_.SetPkgID("org.tizen.targepkgid");
-    signal_sender_.SetReqType(res_handler::ReqType::REQ_TYPE_UNKNOWN);
+    signal_sender_ = std::make_shared<res_handler::EventSignalSender>(nullptr);
+    signal_sender_->SetPkgID("org.tizen.targepkgid");
+    signal_sender_->SetReqType(res_handler::ReqType::REQ_TYPE_UNKNOWN);
   }
   virtual ~RequestHandlerInvokerTest() {}
 
   virtual void SetUp() {}
   virtual void TearDown() {}
 
-  res_handler::EventSignalSender signal_sender_;
+  std::shared_ptr<res_handler::EventSignalSender> signal_sender_;
 };
 
 TEST_F(RequestHandlerInvokerTest, CopyType) {