From 90f7070f171e8abe145d30150b976f0a4e13bd86 Mon Sep 17 00:00:00 2001 From: Piotr Ganicz Date: Fri, 21 Oct 2016 16:30:51 +0200 Subject: [PATCH 01/16] [Refactor] AppInstaller logic export This commit gather the logic of choosing proper steps sequence to app-installer repository. All backends have to prepare their own sequences for each pkgmgr request. The default implementation of such methods is provided and there is no need for overriding each function in backends. Submit together: - https://review.tizen.org/gerrit/#/c/93999/ - https://review.tizen.org/gerrit/#/c/93998/ Change-Id: I1f049c28908408a20db057bd36e246ba789c999b --- src/hybrid/hybrid_installer.cc | 88 ++++++++++++++++++++++------------------- src/hybrid/hybrid_installer.h | 20 ++++++++++ src/wgt/wgt_installer.cc | 89 +----------------------------------------- src/wgt/wgt_installer.h | 39 +++++++++--------- 4 files changed, 87 insertions(+), 149 deletions(-) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 4e36b4b..14521ab 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -103,9 +103,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) : AppInstaller("wgt", pkgmgr) { context_->cross_app_rules.set(true); context_->backend_data.set(new HybridBackendData()); +} - switch (pkgmgr_->GetRequestType()) { - case ci::RequestType::Install: +void HybridInstaller::InstallSteps() { AddStep(pkgmgr_); AddStep(); AddStep( @@ -152,8 +152,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); AddStep(); - break; - case ci::RequestType::Update: +} + +void HybridInstaller::UpdateSteps() { AddStep(pkgmgr_); AddStep(); AddStep( @@ -202,8 +203,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); - break; - case ci::RequestType::Uninstall: +} + +void HybridInstaller::UninstallSteps() { AddStep(pkgmgr_); AddStep(); AddStep(); @@ -227,12 +229,14 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - break; - case ci::RequestType::Reinstall: +} + +void HybridInstaller::ReinstallSteps() { // RDS is not supported for hybrid apps AddStep(); - break; - case ci::RequestType::Delta: +} + +void HybridInstaller::DeltaSteps() { AddStep(pkgmgr_); AddStep(); AddStep( @@ -284,8 +288,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); - break; - case ci::RequestType::Recovery: +} + +void HybridInstaller::RecoverySteps() { AddStep(pkgmgr_); AddStep(); AddStep( @@ -302,8 +307,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - break; - case ci::RequestType::MountInstall: +} + +void HybridInstaller::MountInstallSteps() { AddStep(pkgmgr_); AddStep(); AddStep( @@ -350,8 +356,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); AddStep(); - break; - case ci::RequestType::MountUpdate: +} + +void HybridInstaller::MountUpdateSteps() { AddStep(pkgmgr_); AddStep(); AddStep( @@ -399,8 +406,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); - break; - case ci::RequestType::ManifestDirectInstall: +} + +void HybridInstaller::ManifestDirectInstallSteps() { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -431,8 +439,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); AddStep(); - break; - case ci::RequestType::ManifestDirectUpdate: +} + +void HybridInstaller::ManifestDirectUpdateSteps() { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -463,8 +472,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); - break; - case ci::RequestType::ManifestPartialInstall: { +} + +void HybridInstaller::ManifestPartialInstallSteps() { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -483,9 +493,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); - break; - } - case ci::RequestType::ManifestPartialUpdate: { +} + +void HybridInstaller::ManifestPartialUpdateSteps() { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -506,9 +516,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); - break; - } - case ci::RequestType::PartialUninstall: { +} + +void HybridInstaller::PartialUninstallSteps() { AddStep(pkgmgr_); AddStep(); AddStep(); @@ -524,9 +534,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - break; - } - case ci::RequestType::EnablePkg: +} + +void HybridInstaller::EnablePkgSteps() { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -536,8 +546,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable); AddStep( ci::Plugin::ActionType::Uninstall); - break; - case ci::RequestType::DisablePkg: +} + +void HybridInstaller::DisablePkgSteps() { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -547,17 +558,12 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable); AddStep( ci::Plugin::ActionType::Uninstall); - break; - case ci::RequestType::MigrateExtImg: { +} + +void HybridInstaller::MigrateExtImgSteps() { AddStep(pkgmgr_); AddStep(); AddStep(); - break; - } - default: - AddStep(); - break; - } } } // namespace hybrid diff --git a/src/hybrid/hybrid_installer.h b/src/hybrid/hybrid_installer.h index 9824d21..8331393 100644 --- a/src/hybrid/hybrid_installer.h +++ b/src/hybrid/hybrid_installer.h @@ -8,6 +8,8 @@ #include "common/app_installer.h" #include "common/pkgmgr_interface.h" +namespace ci = common_installer; + namespace hybrid { /** @@ -24,6 +26,24 @@ class HybridInstaller : public common_installer::AppInstaller { explicit HybridInstaller(common_installer::PkgMgrPtr pkgmgr); SCOPE_LOG_TAG(HybridInstaller) + + private: + void InstallSteps() override; + void UpdateSteps() override; + void UninstallSteps() override; + void ReinstallSteps() override; + void DeltaSteps() override; + void RecoverySteps() override; + void MountInstallSteps() override; + void MountUpdateSteps() override; + void ManifestDirectInstallSteps() override; + void ManifestDirectUpdateSteps() override; + void DisablePkgSteps() override; + void EnablePkgSteps() override; + void ManifestPartialInstallSteps() override; + void ManifestPartialUpdateSteps() override; + void PartialUninstallSteps() override; + void MigrateExtImgSteps() override; }; } // namespace hybrid diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index ffa669f..e3d32ed 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -110,89 +110,6 @@ namespace wgt { WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) : AppInstaller("wgt", pkgrmgr) { context_->backend_data.set(new WgtBackendData()); - - /* treat the request */ - switch (pkgmgr_->GetRequestType()) { - case ci::RequestType::Install : { - InstallSteps(); - break; - } - case ci::RequestType::Update: { - UpdateSteps(); - break; - } - case ci::RequestType::Uninstall: { - UninstallSteps(); - break; - } - case ci::RequestType::Reinstall: { - ReinstallSteps(); - break; - } - case ci::RequestType::Delta: { - DeltaSteps(); - break; - } - case ci::RequestType::Recovery: { - RecoverySteps(); - break; - } - case ci::RequestType::MountInstall: { - MountInstallSteps(); - break; - } - case ci::RequestType::MountUpdate: { - MountUpdateSteps(); - break; - } - case ci::RequestType::ManifestDirectInstall: { - ManifestDirectInstallSteps(); - break; - } - case ci::RequestType::ManifestDirectUpdate: { - ManifestDirectUpdateSteps(); - break; - } - case ci::RequestType::ReadonlyUpdateInstall: { - ReadonlyUpdateInstallSteps(); - break; - } - case ci::RequestType::ReadonlyUpdateUninstall: { - ReadonlyUpdateUninstallSteps(); - break; - } - case ci::RequestType::ManifestPartialInstall: { - ManifestPartialInstallSteps(); - break; - } - case ci::RequestType::ManifestPartialUpdate: { - ManifestPartialUpdateSteps(); - break; - } - case ci::RequestType::PartialUninstall: { - ManifestPartialUninstallSteps(); - break; - } - case ci::RequestType::Move: { - MoveSteps(); - break; - } - case ci::RequestType::EnablePkg: { - EnablePkgSteps(); - break; - } - case ci::RequestType::DisablePkg: { - DisablePkgSteps(); - break; - } - case ci::RequestType::MigrateExtImg: { - MigrateExtImgSteps(); - break; - } - default: { - DefaultSteps(); - } - } } void WgtInstaller::InstallSteps() { AddStep(pkgmgr_); @@ -638,7 +555,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); } - void WgtInstaller::ManifestPartialUninstallSteps() { + void WgtInstaller::PartialUninstallSteps() { AddStep(pkgmgr_); AddStep(); AddStep(); @@ -696,8 +613,4 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); } - void WgtInstaller::DefaultSteps() { - AddStep(); - } - } // namespace wgt diff --git a/src/wgt/wgt_installer.h b/src/wgt/wgt_installer.h index 0c3a5e9..c25c2e1 100644 --- a/src/wgt/wgt_installer.h +++ b/src/wgt/wgt_installer.h @@ -26,26 +26,25 @@ class WgtInstaller : public common_installer::AppInstaller { explicit WgtInstaller(common_installer::PkgMgrPtr pkgrmgr); private: - void InstallSteps(); - void UpdateSteps(); - void UninstallSteps(); - void ReinstallSteps(); - void DeltaSteps(); - void RecoverySteps(); - void MountInstallSteps(); - void MountUpdateSteps(); - void ManifestDirectInstallSteps(); - void ManifestDirectUpdateSteps(); - void ReadonlyUpdateInstallSteps(); - void ReadonlyUpdateUninstallSteps(); - void ManifestPartialInstallSteps(); - void ManifestPartialUpdateSteps(); - void ManifestPartialUninstallSteps(); - void MoveSteps(); - void EnablePkgSteps(); - void DisablePkgSteps(); - void MigrateExtImgSteps(); - void DefaultSteps(); + void InstallSteps() override; + void UpdateSteps() override; + void UninstallSteps() override; + void ReinstallSteps() override; + void DeltaSteps() override; + void MoveSteps() override; + void RecoverySteps() override; + void MountInstallSteps() override; + void MountUpdateSteps() override; + void ManifestDirectInstallSteps() override; + void ManifestDirectUpdateSteps() override; + void ManifestPartialInstallSteps() override; + void ManifestPartialUpdateSteps() override; + void PartialUninstallSteps() override; + void ReadonlyUpdateInstallSteps() override; + void ReadonlyUpdateUninstallSteps() override; + void DisablePkgSteps() override; + void EnablePkgSteps() override; + void MigrateExtImgSteps() override; }; } // namespace wgt -- 2.7.4 From 35519ad818702263ead855736499c174b3e97dbe Mon Sep 17 00:00:00 2001 From: jongmyeong ko Date: Fri, 3 Mar 2017 01:14:18 -0800 Subject: [PATCH 02/16] Revert "[Refactor] AppInstaller logic export" This reverts commit 90f7070f171e8abe145d30150b976f0a4e13bd86. Change-Id: Iaaa68f8f60076803c49a5231b1be35478768846e --- src/hybrid/hybrid_installer.cc | 88 +++++++++++++++++++---------------------- src/hybrid/hybrid_installer.h | 20 ---------- src/wgt/wgt_installer.cc | 89 +++++++++++++++++++++++++++++++++++++++++- src/wgt/wgt_installer.h | 39 +++++++++--------- 4 files changed, 149 insertions(+), 87 deletions(-) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 14521ab..4e36b4b 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -103,9 +103,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) : AppInstaller("wgt", pkgmgr) { context_->cross_app_rules.set(true); context_->backend_data.set(new HybridBackendData()); -} -void HybridInstaller::InstallSteps() { + switch (pkgmgr_->GetRequestType()) { + case ci::RequestType::Install: AddStep(pkgmgr_); AddStep(); AddStep( @@ -152,9 +152,8 @@ void HybridInstaller::InstallSteps() { wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); AddStep(); -} - -void HybridInstaller::UpdateSteps() { + break; + case ci::RequestType::Update: AddStep(pkgmgr_); AddStep(); AddStep( @@ -203,9 +202,8 @@ void HybridInstaller::UpdateSteps() { ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); -} - -void HybridInstaller::UninstallSteps() { + break; + case ci::RequestType::Uninstall: AddStep(pkgmgr_); AddStep(); AddStep(); @@ -229,14 +227,12 @@ void HybridInstaller::UninstallSteps() { AddStep(); AddStep(); AddStep(); -} - -void HybridInstaller::ReinstallSteps() { + break; + case ci::RequestType::Reinstall: // RDS is not supported for hybrid apps AddStep(); -} - -void HybridInstaller::DeltaSteps() { + break; + case ci::RequestType::Delta: AddStep(pkgmgr_); AddStep(); AddStep( @@ -288,9 +284,8 @@ void HybridInstaller::DeltaSteps() { ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); -} - -void HybridInstaller::RecoverySteps() { + break; + case ci::RequestType::Recovery: AddStep(pkgmgr_); AddStep(); AddStep( @@ -307,9 +302,8 @@ void HybridInstaller::RecoverySteps() { AddStep(); AddStep(); AddStep(); -} - -void HybridInstaller::MountInstallSteps() { + break; + case ci::RequestType::MountInstall: AddStep(pkgmgr_); AddStep(); AddStep( @@ -356,9 +350,8 @@ void HybridInstaller::MountInstallSteps() { wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); AddStep(); -} - -void HybridInstaller::MountUpdateSteps() { + break; + case ci::RequestType::MountUpdate: AddStep(pkgmgr_); AddStep(); AddStep( @@ -406,9 +399,8 @@ void HybridInstaller::MountUpdateSteps() { ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); -} - -void HybridInstaller::ManifestDirectInstallSteps() { + break; + case ci::RequestType::ManifestDirectInstall: AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -439,9 +431,8 @@ void HybridInstaller::ManifestDirectInstallSteps() { wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); AddStep(); -} - -void HybridInstaller::ManifestDirectUpdateSteps() { + break; + case ci::RequestType::ManifestDirectUpdate: AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -472,9 +463,8 @@ void HybridInstaller::ManifestDirectUpdateSteps() { ci::Plugin::ActionType::Upgrade); AddStep(); AddStep(); -} - -void HybridInstaller::ManifestPartialInstallSteps() { + break; + case ci::RequestType::ManifestPartialInstall: { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -493,9 +483,9 @@ void HybridInstaller::ManifestPartialInstallSteps() { AddStep( wgt::filesystem::HybridAdditionalSharedDirs); AddStep(); -} - -void HybridInstaller::ManifestPartialUpdateSteps() { + break; + } + case ci::RequestType::ManifestPartialUpdate: { AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -516,9 +506,9 @@ void HybridInstaller::ManifestPartialUpdateSteps() { AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); -} - -void HybridInstaller::PartialUninstallSteps() { + break; + } + case ci::RequestType::PartialUninstall: { AddStep(pkgmgr_); AddStep(); AddStep(); @@ -534,9 +524,9 @@ void HybridInstaller::PartialUninstallSteps() { AddStep(); AddStep(); AddStep(); -} - -void HybridInstaller::EnablePkgSteps() { + break; + } + case ci::RequestType::EnablePkg: AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -546,9 +536,8 @@ void HybridInstaller::EnablePkgSteps() { ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable); AddStep( ci::Plugin::ActionType::Uninstall); -} - -void HybridInstaller::DisablePkgSteps() { + break; + case ci::RequestType::DisablePkg: AddStep(pkgmgr_); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, @@ -558,12 +547,17 @@ void HybridInstaller::DisablePkgSteps() { ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable); AddStep( ci::Plugin::ActionType::Uninstall); -} - -void HybridInstaller::MigrateExtImgSteps() { + break; + case ci::RequestType::MigrateExtImg: { AddStep(pkgmgr_); AddStep(); AddStep(); + break; + } + default: + AddStep(); + break; + } } } // namespace hybrid diff --git a/src/hybrid/hybrid_installer.h b/src/hybrid/hybrid_installer.h index 8331393..9824d21 100644 --- a/src/hybrid/hybrid_installer.h +++ b/src/hybrid/hybrid_installer.h @@ -8,8 +8,6 @@ #include "common/app_installer.h" #include "common/pkgmgr_interface.h" -namespace ci = common_installer; - namespace hybrid { /** @@ -26,24 +24,6 @@ class HybridInstaller : public common_installer::AppInstaller { explicit HybridInstaller(common_installer::PkgMgrPtr pkgmgr); SCOPE_LOG_TAG(HybridInstaller) - - private: - void InstallSteps() override; - void UpdateSteps() override; - void UninstallSteps() override; - void ReinstallSteps() override; - void DeltaSteps() override; - void RecoverySteps() override; - void MountInstallSteps() override; - void MountUpdateSteps() override; - void ManifestDirectInstallSteps() override; - void ManifestDirectUpdateSteps() override; - void DisablePkgSteps() override; - void EnablePkgSteps() override; - void ManifestPartialInstallSteps() override; - void ManifestPartialUpdateSteps() override; - void PartialUninstallSteps() override; - void MigrateExtImgSteps() override; }; } // namespace hybrid diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index e3d32ed..ffa669f 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -110,6 +110,89 @@ namespace wgt { WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) : AppInstaller("wgt", pkgrmgr) { context_->backend_data.set(new WgtBackendData()); + + /* treat the request */ + switch (pkgmgr_->GetRequestType()) { + case ci::RequestType::Install : { + InstallSteps(); + break; + } + case ci::RequestType::Update: { + UpdateSteps(); + break; + } + case ci::RequestType::Uninstall: { + UninstallSteps(); + break; + } + case ci::RequestType::Reinstall: { + ReinstallSteps(); + break; + } + case ci::RequestType::Delta: { + DeltaSteps(); + break; + } + case ci::RequestType::Recovery: { + RecoverySteps(); + break; + } + case ci::RequestType::MountInstall: { + MountInstallSteps(); + break; + } + case ci::RequestType::MountUpdate: { + MountUpdateSteps(); + break; + } + case ci::RequestType::ManifestDirectInstall: { + ManifestDirectInstallSteps(); + break; + } + case ci::RequestType::ManifestDirectUpdate: { + ManifestDirectUpdateSteps(); + break; + } + case ci::RequestType::ReadonlyUpdateInstall: { + ReadonlyUpdateInstallSteps(); + break; + } + case ci::RequestType::ReadonlyUpdateUninstall: { + ReadonlyUpdateUninstallSteps(); + break; + } + case ci::RequestType::ManifestPartialInstall: { + ManifestPartialInstallSteps(); + break; + } + case ci::RequestType::ManifestPartialUpdate: { + ManifestPartialUpdateSteps(); + break; + } + case ci::RequestType::PartialUninstall: { + ManifestPartialUninstallSteps(); + break; + } + case ci::RequestType::Move: { + MoveSteps(); + break; + } + case ci::RequestType::EnablePkg: { + EnablePkgSteps(); + break; + } + case ci::RequestType::DisablePkg: { + DisablePkgSteps(); + break; + } + case ci::RequestType::MigrateExtImg: { + MigrateExtImgSteps(); + break; + } + default: { + DefaultSteps(); + } + } } void WgtInstaller::InstallSteps() { AddStep(pkgmgr_); @@ -555,7 +638,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); } - void WgtInstaller::PartialUninstallSteps() { + void WgtInstaller::ManifestPartialUninstallSteps() { AddStep(pkgmgr_); AddStep(); AddStep(); @@ -613,4 +696,8 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); } + void WgtInstaller::DefaultSteps() { + AddStep(); + } + } // namespace wgt diff --git a/src/wgt/wgt_installer.h b/src/wgt/wgt_installer.h index c25c2e1..0c3a5e9 100644 --- a/src/wgt/wgt_installer.h +++ b/src/wgt/wgt_installer.h @@ -26,25 +26,26 @@ class WgtInstaller : public common_installer::AppInstaller { explicit WgtInstaller(common_installer::PkgMgrPtr pkgrmgr); private: - void InstallSteps() override; - void UpdateSteps() override; - void UninstallSteps() override; - void ReinstallSteps() override; - void DeltaSteps() override; - void MoveSteps() override; - void RecoverySteps() override; - void MountInstallSteps() override; - void MountUpdateSteps() override; - void ManifestDirectInstallSteps() override; - void ManifestDirectUpdateSteps() override; - void ManifestPartialInstallSteps() override; - void ManifestPartialUpdateSteps() override; - void PartialUninstallSteps() override; - void ReadonlyUpdateInstallSteps() override; - void ReadonlyUpdateUninstallSteps() override; - void DisablePkgSteps() override; - void EnablePkgSteps() override; - void MigrateExtImgSteps() override; + void InstallSteps(); + void UpdateSteps(); + void UninstallSteps(); + void ReinstallSteps(); + void DeltaSteps(); + void RecoverySteps(); + void MountInstallSteps(); + void MountUpdateSteps(); + void ManifestDirectInstallSteps(); + void ManifestDirectUpdateSteps(); + void ReadonlyUpdateInstallSteps(); + void ReadonlyUpdateUninstallSteps(); + void ManifestPartialInstallSteps(); + void ManifestPartialUpdateSteps(); + void ManifestPartialUninstallSteps(); + void MoveSteps(); + void EnablePkgSteps(); + void DisablePkgSteps(); + void MigrateExtImgSteps(); + void DefaultSteps(); }; } // namespace wgt -- 2.7.4 From 4d621d245beb97813bcc0b38b0032fdd3157dfc8 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Sat, 4 Mar 2017 18:05:39 +0900 Subject: [PATCH 03/16] Release version 0.4.0 Changes: - Smoke tests- check if package dont exist in skel directory - Fix rw filesystem validation - Rename smoke test to new convention - Add some missing error checking - Add signature check step in RW partial request - Add KillApp step in RW partial update - Adjust some values in xml Change-Id: I3f673fe1df183ba4bee8a140321c19c0c6417829 Signed-off-by: jongmyeongko --- packaging/wgt-backend.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/wgt-backend.spec b/packaging/wgt-backend.spec index 5158fe1..4dd083f 100644 --- a/packaging/wgt-backend.spec +++ b/packaging/wgt-backend.spec @@ -1,6 +1,6 @@ Name: wgt-backend Summary: Application installer backend for WGT -Version: 0.3.1 +Version: 0.4.0 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From e2687ca7eb39fc8aa1ba278199a2b641e376f4ab Mon Sep 17 00:00:00 2001 From: Damian Pietruchowski Date: Wed, 22 Feb 2017 17:12:39 +0100 Subject: [PATCH 04/16] [SmokeTest] Add request mode choice Smoke tests can be run with normal or global user. Normal user is created in environment SetUp() and is deleted in TearDown() method. Normal user name is "smokeuser". You can run tests by normal user with flags: -u or --request_mode=user You can run tests by global user with flags: -g or --request_mode=global Without above flags tests are run with global user by default Requires: - https://review.tizen.org/gerrit/#/c/116229/ Signed-off-by: Damian Pietruchowski Change-Id: If59225a8fac3f4ed25277f31466549c0cc636c50 --- src/unit_tests/smoke_test.cc | 134 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 112 insertions(+), 22 deletions(-) diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index 844fa1c..38b9945 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ #include #include #include +#include #include #include @@ -43,15 +45,51 @@ namespace bs = boost::system; namespace ci = common_installer; namespace { +ci::RequestMode kRequestMode = ci::RequestMode::GLOBAL; +const char *short_opts = "g:u"; +const struct option long_opts[] = { + { "request_mode", 1, NULL, 'r' }, + { 0, 0, 0, 0 } /* sentinel */ +}; +const char *request_modes[] { + "global", + "user" +}; +void ParseRequestMode(int argc, char** argv) { + int c; + int opt_idx = 0; + do { + c = getopt_long(argc, argv, short_opts, long_opts, &opt_idx); + switch (c) { + case 'r': + if (strncmp(optarg, request_modes[0], strlen(request_modes[0])) == 0) + kRequestMode = ci::RequestMode::GLOBAL; + else if (strncmp(optarg, request_modes[1], strlen(request_modes[1])) == 0) + kRequestMode = ci::RequestMode::USER; + else + LOG(ERROR) << "Wrong request mode " << optarg + << ". Available: \"global\" or \"user\""; + break; + case 'g': + kRequestMode = ci::RequestMode::GLOBAL; + break; + case 'u': + kRequestMode = ci::RequestMode::USER; + break; + default: + break; + } + } while (c != -1); +} const uid_t kGlobalUserUid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER); const uid_t kGlobalUserGid = tzplatform_getgid(TZ_SYS_GLOBALAPP_USER); const uid_t kDefaultUserUid = tzplatform_getuid(TZ_SYS_DEFAULT_USER); -const uid_t kTestUserId = kGlobalUserUid; -const gid_t kTestGroupId = kGlobalUserGid; +uid_t kTestUserId = kGlobalUserUid; +gid_t kTestGroupId = kGlobalUserGid; +std::string kTestUserIdStr = std::to_string(kTestUserId); +const char kNormalUserName[] = "smokeuser"; const char kSystemShareGroupName[] = "system_share"; -const std::string& kTestUserIdStr = - std::to_string(kTestUserId); const std::string& kDefaultUserIdStr = std::to_string(kDefaultUserUid); const char kLegacyExtImageDir[] = "legacy_extimage_dir"; const char kMigrateTestDBName[] = "app2sd_migrate.db"; @@ -152,6 +190,40 @@ bool TouchFile(const bf::path& path) { return true; } +bool AddTestUser(const char *user_name) { + std::cout << "Adding test user: " << user_name << std::endl; + gboolean ret = ci::AddUser(user_name); + if (boost::optional uid = ci::GetUidByUserName(user_name)) { + kTestUserId = *uid; + kTestUserIdStr = std::to_string(kTestUserId); + std::cout << "User created properly: uid=" << *uid; + if (boost::optional gid = ci::GetGidByUid(*uid)) { + kTestGroupId = *gid; + std::cout << " gid=" << *gid; + } + std::cout << std::endl; + return true; + } + LOG(ERROR) << "Adding test user failed"; + return false; +} + +bool DeleteTestUser(const char *user_name) { + std::cout << "Deleting test user: " << user_name << std::endl; + uid_t test_uid; + if (boost::optional uid = ci::GetUidByUserName(user_name)) + test_uid = *uid; + gboolean ret = ci::DeleteUser(user_name, true); + if (boost::optional uid = ci::GetUidByUserName(user_name)); + else { + std::cout << "User deleted properly: user_name=" << user_name + << " uid=" << test_uid << std::endl; + return true; + } + LOG(ERROR) << "Deleting test user failed"; + return false; +} + void RemoveAllRecoveryFiles() { bf::path root_path = ci::GetRootAppPath(false, kTestUserId); @@ -664,11 +736,11 @@ void RestorePath(const bf::path& path) { } } -std::vector SetupBackupDirectories(uid_t uid) { +std::vector SetupBackupDirectories() { std::vector entries; bf::path db_dir = bf::path(tzplatform_getenv(TZ_SYS_DB)); - if (uid != kGlobalUserUid) - db_dir = db_dir / "user" / std::to_string(uid); + if (kTestUserId != kGlobalUserUid) + db_dir = db_dir / "user" / std::to_string(kTestUserId); for (auto e : kDBEntries) { bf::path path = db_dir / e; entries.emplace_back(path); @@ -680,7 +752,7 @@ std::vector SetupBackupDirectories(uid_t uid) { entries.emplace_back(kPreloadIcons); } - if (uid == kGlobalUserUid) { + if (kTestUserId == kGlobalUserUid) { entries.emplace_back(kSkelDir); entries.emplace_back(kGlobalManifestDir); ci::UserList list = ci::GetUserList(); @@ -689,13 +761,13 @@ std::vector SetupBackupDirectories(uid_t uid) { entries.emplace_back(apps); } } else { - tzplatform_set_user(uid); + tzplatform_set_user(kTestUserId); bf::path approot = tzplatform_getenv(TZ_USER_APPROOT); tzplatform_reset_user(); entries.emplace_back(approot); } - bf::path apps_rw = ci::GetRootAppPath(false, uid); + bf::path apps_rw = ci::GetRootAppPath(false, kTestUserId); entries.emplace_back(apps_rw); return entries; @@ -718,12 +790,12 @@ void UninstallAllAppsInDirectory(bf::path dir, bool is_preload) { } } -void UninstallAllSmokeApps(uid_t uid) { - if (getuid() == 0) { +void UninstallAllSmokeApps() { + if (getuid() == 0 && kRequestMode == ci::RequestMode::GLOBAL) { bf::path root_path = kPreloadApps; UninstallAllAppsInDirectory(root_path, true); } - bf::path apps_rw = ci::GetRootAppPath(false, uid); + bf::path apps_rw = ci::GetRootAppPath(false, kTestUserId); UninstallAllAppsInDirectory(apps_rw, false); } @@ -733,27 +805,44 @@ namespace common_installer { class SmokeEnvironment : public testing::Environment { public: - explicit SmokeEnvironment(uid_t uid) : uid_(uid) { + explicit SmokeEnvironment() { } void SetUp() override { - backups_ = SetupBackupDirectories(uid_); + if (kRequestMode == ci::RequestMode::USER) + ASSERT_TRUE(AddTestUser(kNormalUserName)); + else { + kTestUserId = kGlobalUserUid; + kTestGroupId = kGlobalUserGid; + kTestUserIdStr = std::to_string(kTestUserId); + } + backups_ = SetupBackupDirectories(); for (auto& path : backups_) BackupPath(path); } void TearDown() override { - UninstallAllSmokeApps(uid_); + ASSERT_TRUE(kRequestMode == ci::RequestMode::GLOBAL || + (kRequestMode == ci::RequestMode::USER && + kGlobalUserUid != kTestUserId)); + UninstallAllSmokeApps(); for (auto& path : backups_) RestorePath(path); + if (kRequestMode == ci::RequestMode::USER) + ASSERT_TRUE(DeleteTestUser(kNormalUserName)); } private: - uid_t uid_; std::vector backups_; }; class SmokeTest : public testing::Test { }; +class PreloadSmokeTest : public testing::Test { + void SetUp() override { + ASSERT_TRUE(kRequestMode == ci::RequestMode::GLOBAL); + } +}; + TEST_F(SmokeTest, InstallationMode) { bf::path path = kSmokePackagesDirectory / "InstallationMode.wgt"; std::string pkgid = "smokewgt03"; @@ -1286,7 +1375,7 @@ TEST_F(SmokeTest, MigrateLegacyExternalImageMode) { ValidateExternalPackage(pkgid, {appid}); } -TEST_F(SmokeTest, InstallationMode_Preload) { +TEST_F(PreloadSmokeTest, InstallationMode_Preload) { ASSERT_EQ(getuid(), 0) << "Test cannot be run by normal user"; bf::path path = kSmokePackagesDirectory / "InstallationMode_Preload.wgt"; std::string pkgid = "smokewgt37"; @@ -1296,7 +1385,7 @@ TEST_F(SmokeTest, InstallationMode_Preload) { ValidatePackage(pkgid, {appid}, true); } -TEST_F(SmokeTest, UpdateMode_Preload) { +TEST_F(PreloadSmokeTest, UpdateMode_Preload) { ASSERT_EQ(getuid(), 0) << "Test cannot be run by normal user"; bf::path path_old = kSmokePackagesDirectory / "UpdateMode_Preload.wgt"; bf::path path_new = kSmokePackagesDirectory / "UpdateMode_Preload2.wgt"; @@ -1314,7 +1403,7 @@ TEST_F(SmokeTest, UpdateMode_Preload) { ValidateDataFiles(pkgid, kTestUserId); } -TEST_F(SmokeTest, DeinstallationMode_Preload) { +TEST_F(PreloadSmokeTest, DeinstallationMode_Preload) { ASSERT_EQ(getuid(), 0) << "Test cannot be run by normal user"; bf::path path = kSmokePackagesDirectory / "DeinstallationMode_Preload.wgt"; std::string pkgid = "smokewgt39"; @@ -1330,7 +1419,8 @@ TEST_F(SmokeTest, DeinstallationMode_Preload) { int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); - testing::AddGlobalTestEnvironment( - new common_installer::SmokeEnvironment(kGlobalUserUid)); + testing::Environment *env = testing::AddGlobalTestEnvironment( + new common_installer::SmokeEnvironment()); + ParseRequestMode(argc, argv); return RUN_ALL_TESTS(); } -- 2.7.4 From 24c8b7dbf25617328525678421ca19c8877cf966 Mon Sep 17 00:00:00 2001 From: Damian Pietruchowski Date: Tue, 7 Mar 2017 12:45:28 +0100 Subject: [PATCH 05/16] [SmokeTest] Fix rw filesystem validation Remove validation for files in rw directories Change-Id: I25c22040609664d5f707f42f67ff53e813b05ca0 Signed-off-by: Damian Pietruchowski --- src/unit_tests/smoke_test.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index 38b9945..e150b84 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -384,8 +384,10 @@ void ValidatePackageFS(const std::string& pkgid, bf::path rw_dir_path = rw_dir; is_rw_dir |= ci::MakeRelativePath(iter->path(), package_path) == rw_dir_path; } - if (is_rw_dir || iter->path().filename() == ".mmc") + if (is_rw_dir || iter->path().filename() == ".mmc") { + iter.no_push(); continue; + } struct stat stats; stat(iter->path().c_str(), &stats); ASSERT_EQ(uid, stats.st_uid) << "Invalid uid: " << iter->path(); -- 2.7.4 From f32618319568331491d0f6e3b7ce777f6e462bc1 Mon Sep 17 00:00:00 2001 From: Damian Pietruchowski Date: Thu, 9 Mar 2017 15:07:45 +0100 Subject: [PATCH 06/16] [SmokeTest] Regex match for uninstall in tear down After all tests, apps are uninstalled based on names of directories in globalapps or apps_rw directory. It should avoid trying to uninstall apps like "tmp" or "pkgdid.bck". Change-Id: If64970a49aa657df759de1173e1f1c96fe7e87ea Signed-off-by: Damian Pietruchowski --- src/unit_tests/smoke_test.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index e150b84..d4c0efc 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -32,6 +32,7 @@ #include #include #include +#include #include "hybrid/hybrid_installer.h" #include "wgt/wgt_app_query_interface.h" @@ -781,11 +782,15 @@ void UninstallAllAppsInDirectory(bf::path dir, bool is_preload) { bf::directory_iterator(dir), bf::directory_iterator())) { if (dir_entry.path().string().find("smoke") != std::string::npos && bf::is_directory(dir_entry)) { - if(Uninstall(dir_entry.path().filename().string(), PackageType::WGT, - is_preload, RequestResult::NORMAL) != - ci::AppInstaller::Result::OK) { - LOG(ERROR) << "Cannot uninstall smoke test app: " - << dir_entry.path().filename().string(); + std::string package = dir_entry.path().filename().string(); + std::regex pkg_regex("smoke[a-zA-Z]{3,}[1-9]{2,}"); + if (std::regex_match(package, pkg_regex)) { + if(Uninstall(dir_entry.path().filename().string(), PackageType::WGT, + is_preload, RequestResult::NORMAL) != + ci::AppInstaller::Result::OK) { + LOG(ERROR) << "Cannot uninstall smoke test app: " + << dir_entry.path().filename().string(); + } } } } -- 2.7.4 From 8df9eaf6ee1ad528374695dd58f7a0a25aace5b9 Mon Sep 17 00:00:00 2001 From: Piotr Dabrowski Date: Mon, 19 Sep 2016 15:43:16 +0200 Subject: [PATCH 07/16] Reworked sharing of widget's shared/res directory. ./res/wgt/shared/res directory content was moved to ./shared/res and then ./res/wgt/shared/res was symlinked to ./shared/res This broke signatures check for delta update. Now all items (files and directories) under ./res/wgt/shared/res are symlinked into ./shared/res, and vice versa. During delta update these symlinks are removed, so that the signatures check can complete successfully, and later the symlinks are recreated again. Added smoke tests for symlinking shared/res contents in Tizen 3.0 To added tests pass requires: - https://review.tizen.org/gerrit/#/c/117264/ Change-Id: I9423d78aba5cb338b14a9f8853754e0fa8980e0c --- src/hybrid/hybrid_installer.cc | 2 + src/unit_tests/smoke_test.cc | 71 ++++++++++++++++ src/unit_tests/test_samples/smoke/SharedRes24.wgt | Bin 0 -> 38439 bytes src/unit_tests/test_samples/smoke/SharedRes30.wgt | Bin 0 -> 38419 bytes .../test_samples/smoke/SharedRes30Delta.delta | Bin 0 -> 6053 bytes .../test_samples/smoke/SharedRes30Delta.wgt | Bin 0 -> 38431 bytes .../test_samples/smoke/SharedRes30Delta_2.wgt | Bin 0 -> 38431 bytes .../test_samples/smoke/SharedRes30Hybrid.wgt | Bin 0 -> 64163 bytes .../smoke/SharedRes30HybridDelta.delta | Bin 0 -> 8044 bytes .../test_samples/smoke/SharedRes30HybridDelta.wgt | Bin 0 -> 64231 bytes .../smoke/SharedRes30HybridDelta_2.wgt | Bin 0 -> 64232 bytes .../step_wgt_patch_storage_directories.cc | 87 +++++++++++++------ .../step_wgt_patch_storage_directories.h | 5 +- .../step_wgt_undo_patch_storage_directories.cc | 94 +++++++++++++++++++++ .../step_wgt_undo_patch_storage_directories.h | 39 +++++++++ src/wgt/wgt_installer.cc | 2 + 16 files changed, 274 insertions(+), 26 deletions(-) create mode 100644 src/unit_tests/test_samples/smoke/SharedRes24.wgt create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30.wgt create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30Delta.delta create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30Delta.wgt create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30Delta_2.wgt create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30Hybrid.wgt create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30HybridDelta.delta create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30HybridDelta.wgt create mode 100644 src/unit_tests/test_samples/smoke/SharedRes30HybridDelta_2.wgt create mode 100644 src/wgt/step/filesystem/step_wgt_undo_patch_storage_directories.cc create mode 100644 src/wgt/step/filesystem/step_wgt_undo_patch_storage_directories.h diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 4e36b4b..f1dd5c4 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -89,6 +89,7 @@ #include "wgt/step/filesystem/step_create_symbolic_link.h" #include "wgt/step/filesystem/step_wgt_patch_icons.h" #include "wgt/step/filesystem/step_wgt_patch_storage_directories.h" +#include "wgt/step/filesystem/step_wgt_undo_patch_storage_directories.h" #include "wgt/step/pkgmgr/step_generate_xml.h" #include "wgt/step/security/step_check_settings_level.h" #include "wgt/step/security/step_check_wgt_background_category.h" @@ -238,6 +239,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( ci::configuration::StepParseManifest::ManifestLocation::PACKAGE, ci::configuration::StepParseManifest::StoreLocation::NORMAL); + AddStep(); AddStep(); AddStep( ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index d4c0efc..8322b48 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -1422,6 +1422,77 @@ TEST_F(PreloadSmokeTest, DeinstallationMode_Preload) { CheckPackageReadonlyNonExistance(pkgid, {appid}); } +TEST_F(SmokeTest, SharedRes24) { + bf::path path = kSmokePackagesDirectory / "SharedRes24.wgt"; + std::string pkgid = "smokeSh2xx"; + std::string appid = "smokeSh2xx.SharedRes24"; + ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, {appid}); + bf::path root_path = ci::GetRootAppPath(false, kTestUserId); + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "NOT-SHARED-WGT")); // NOLINT + ASSERT_FALSE(bf::exists(root_path / pkgid / "shared" / "res" / "NOT-SHARED-WGT")); // NOLINT +} + +TEST_F(SmokeTest, SharedRes30) { + bf::path path = kSmokePackagesDirectory / "SharedRes30.wgt"; + std::string pkgid = "smokeSh3xx"; + std::string appid = "smokeSh3xx.SharedRes30"; + ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, {appid}); + bf::path root_path = ci::GetRootAppPath(false, kTestUserId); + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT")); // NOLINT + ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT")); // NOLINT +} + +TEST_F(SmokeTest, SharedRes30Delta) { + bf::path path = kSmokePackagesDirectory / "SharedRes30Delta.wgt"; + bf::path delta_package = kSmokePackagesDirectory / "SharedRes30Delta.delta"; + std::string pkgid = "smokeSh3De"; + std::string appid = "smokeSh3De.SharedRes30Delta"; + ASSERT_EQ(DeltaInstall(path, delta_package, PackageType::WGT), + ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, {appid}); + // Check delta modifications + bf::path root_path = ci::GetRootAppPath(false, kTestUserId); + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-2")); // NOLINT + ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT-2")); // NOLINT + ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-1")); // NOLINT + ASSERT_FALSE(bf::exists(root_path / pkgid / "shared" / "res" / "SHARED-WGT-1")); // NOLINT +} + +TEST_F(SmokeTest, SharedRes30Hybrid) { + bf::path path = kSmokePackagesDirectory / "SharedRes30Hybrid.wgt"; + std::string pkgid = "smokeSh3Hy"; + std::string appid1 = "smokeSh3Hy.SharedRes30Hybrid"; + std::string appid2 = "sharedres30hybridserivce"; + ASSERT_EQ(Install(path, PackageType::HYBRID), ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, {appid1, appid2}); + bf::path root_path = ci::GetRootAppPath(false, kTestUserId); + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT")); // NOLINT + ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT")); // NOLINT + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "shared" / "res" / "SHARED-TPK")); // NOLINT + ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-TPK")); // NOLINT +} + +TEST_F(SmokeTest, SharedRes30HybridDelta) { + bf::path path = kSmokePackagesDirectory / "SharedRes30HybridDelta.wgt"; + bf::path delta_package = kSmokePackagesDirectory / "SharedRes30HybridDelta.delta"; + std::string pkgid = "smokeSh3HD"; + std::string appid1 = "smokeSh3HD.SharedRes30HybridDelta"; + std::string appid2 = "sharedres30hybriddeltaserivce"; + ASSERT_EQ(DeltaInstall(path, delta_package, PackageType::HYBRID), + ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, {appid1, appid2}); + // Check delta modifications + bf::path root_path = ci::GetRootAppPath(false, kTestUserId); + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-2")); // NOLINT + ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT-2")); // NOLINT + ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "shared" / "res" / "SHARED-TPK-2")); // NOLINT + ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-TPK-2")); // NOLINT + ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-1")); // NOLINT + ASSERT_FALSE(bf::exists(root_path / pkgid / "shared" / "res" / "SHARED-WGT-1")); // NOLINT +} + } // namespace common_installer int main(int argc, char** argv) { diff --git a/src/unit_tests/test_samples/smoke/SharedRes24.wgt b/src/unit_tests/test_samples/smoke/SharedRes24.wgt new file mode 100644 index 0000000000000000000000000000000000000000..782e7e924926614c53ed245162d280fe3ce58219 GIT binary patch literal 38439 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 literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/SharedRes30.wgt b/src/unit_tests/test_samples/smoke/SharedRes30.wgt new file mode 100644 index 0000000000000000000000000000000000000000..e2358416c2c4e0f211fca86559fab178b1395520 GIT binary patch literal 38419 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 literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/SharedRes30Delta.delta b/src/unit_tests/test_samples/smoke/SharedRes30Delta.delta new file mode 100644 index 0000000000000000000000000000000000000000..26e28bf6b90899997e32454a0faaec8d27b89c86 GIT binary patch literal 6053 zcmb7|WmHw`)_^x59a17)3Y#urBV8Nm1}W)HN#{no8|m6KN|%&$_ok7M4iONf8-a`G z-0z;_9p5?k-m%6T>&JS=`_8$3Jaa0`At4h2001<=s56fgD$R>I4s-y3i2wi~1ds!a zT%0ZJ99f+#&25dGT^u27P#bFvb#wrdhCrM8&*1{a1Rx;ae-HR=YSH=}o!5`=b^fxZ z(Ircn2zJQz&6ZI+iqnkq8cu{VWXxOLHG^BeS6sBTCoki6)e*-XCWyztrDO^e$z0=b zgVkXyVQZ(&WG%f=P`gFw@>&)-yD(7+;s~Zji?m+-++MMM&~@$Be77xR0V^!jPinhs zzJO983uhUGyNfos$M$8ydgJH2!E7kiEq6HYj8u9Q5^g#PF!K5rCnY$bxRi}UBF%R{ z@NS>azD!oSz2g+D@}xhCA<{U=DP9cWcjPp7aXX<{+7-iQ6C?Vff1vpCQfa@1wyk@0 z9m~O7zRyS*WOpJI;B^6Ce;rCJ*`+YQa%}phB!=dKEc2v^G1Q6&e5N8PN?yQ1wjWbO z);(TEW)PH>>DOAS=NV|Qc8ea;c#GRRJ)DB__V~^xEA%^FWlYD!m9ch6SpGwJS2ChA z_#s-dR%SzSsR>1`3;G2JFKlxW%5r?LZ0>s{-NDxcOP3gQPUrKUVbBc|ep_Nh7Hr*O z^M3BTW|(K`axb-$`J_824T^Dew>G<Og^GHp30T2X7=k*-3Ut?ZIpvk!0n)X+{$9NVGSJr5!*@+@-*;eZ}z zz)OG&G(r`>OdUlz+_Mq%TI(a9GSn6mDG)9>iBvt@Waz@^>Wm$_qmR7{`jC?G(oclD zC^LG-5>-9eo8$R+glp`eh<=viM|{&5>)B^qQy!`shALxfD}^thHGX4Jifz&TJ1}W4 zU`cLsNQH*2zCk!si2?3yQa^^&hXVM9_lNAQj2`$}(~h0t-6G+8$OlX3MyXJUy|heE zxaH?;?A3|&(DjR9jk57>gMBok<2E&9AE%wx1p@;cC;j@=lgiX`;9zu%S2;BW|Nd1h z@5}YUXbyo!bxND?mG(!rEdh$RZYZnJkE)V3&R(v9ES$JjkDo#sa0tO1OUi$oZhT6fN7p~9yq+iDHIK=`aWwf|VXScR~%^5Kaf zx_Bm1@T(wv!BD_z;bfG+p?SLI<2ZF^>Z-H$r|tAzd1C(JrdYLDTzMNLt~$_JUI&Fo z4#PIg#o$o{7%$<5Xng6O4&+U=%mmDRUW@cnZ!UwNmtepjsc^)%bq0&=)$^}h>d%pM z`M!?1r*poclVK)Bo24Y_4kVFG+Xj;kiA=PN%8*`|DLzT{%WOZC3(S=^V`)5SC_Kgw zAIcKevm596S|=oq7-WPH(=UnOWnoY>W+qD99;V1F&f|R$Z8c#LI__*c4 zVve|_&cW40P17PI3&=C60OEI;39OnPOUFf8!h1!Fj%Pyf^iVTOMu^!ozwu! zkHVMlJ;#WbAX>R;PUE5N!4YNA1XcRnGbh~|>89@UH#|;8i}E=)0~BS@$s`AE`yu;) zwNmXJ!YvYjoNCED<4QH&p>)h}y^*gs@d~mdBw3e7;&#h! zt|0S@0wND~LL3o>o%;ICV08dR@Uad}V&M;7CghQHhtaMwN#gVHkq%|_ys`vAe`!S?JvIz$&a0-^5vnQ*zAw5fH?9+ z`sn%93Ge9}KgF!1w$#0mR{EThr$Tf=5XmLvAjt=nTkBkF9E4glyeL@R4cEarTNJ~M zqyrYML5Hf5x6wi2P zR%c(m?-)I*b_