diff --git a/services/backup_sa/BUILD.gn b/services/backup_sa/BUILD.gn index b7ba886e93253f812d44cef4599d0214624bccc8..8c877bed7bf7acf436005dcaf3b355ec3aa5ce41 100644 --- a/services/backup_sa/BUILD.gn +++ b/services/backup_sa/BUILD.gn @@ -28,6 +28,7 @@ ohos_shared_library("backup_sa") { sources = [ "src/module_app_gallery/app_gallery_dispose_proxy.cpp", + "src/module_app_gallery/app_gallery_service_connection.cpp", "src/module_external/bms_adapter.cpp", "src/module_external/sms_adapter.cpp", "src/module_ipc/sa_backup_connection.cpp", diff --git a/services/backup_sa/include/module_app_gallery/app_gallery_dispose_proxy.h b/services/backup_sa/include/module_app_gallery/app_gallery_dispose_proxy.h index e98a16dbe30c3a5cd73b07e9e12c22bc786bf7d0..fdd41a59dadadc3ff0266cc06b27b7691bbb52fc 100644 --- a/services/backup_sa/include/module_app_gallery/app_gallery_dispose_proxy.h +++ b/services/backup_sa/include/module_app_gallery/app_gallery_dispose_proxy.h @@ -17,10 +17,12 @@ #define OHOS_FILEMGMT_BACKUP_APP_GALLERY_DISPOSE_PROXY_H #include +#include #include #include +#include "app_gallery_service_connection.h" #include "i_appgallery_service.h" namespace OHOS::FileManagement::Backup { @@ -39,24 +41,24 @@ public: static sptr GetInstance(); - DisposeErr StartBackup(const std::string &bundleName); - DisposeErr EndBackup(const std::string &bundleName); - DisposeErr StartRestore(const std::string &bundleName); - DisposeErr EndRestore(const std::string &bundleName); + DisposeErr StartBackup(const std::string &bundleName, const int32_t userId); + DisposeErr EndBackup(const std::string &bundleName, const int32_t userId); + DisposeErr StartRestore(const std::string &bundleName, const int32_t userId); + DisposeErr EndRestore(const std::string &bundleName, const int32_t userId); + + sptr GetAppGalleryConnection(const int32_t userId); + sptr ConnectAppGallery(const int32_t userId); - static std::condition_variable conditionVal_; static std::string abilityName; static std::string pkgName; - static std::mutex appRemoteObjLock_; - static std::mutex connectMutex; - static sptr appRemoteObj_; + static std::map> appGalleryConnectionMap_; private: - DisposeErr DoDispose(const std::string &bundleName, DisposeOperation disposeOperation); + DisposeErr DoDispose(const std::string &bundleName, DisposeOperation disposeOperation, const int32_t userId); private: static std::mutex instanceLock_; - static std::mutex conditionMutex_; + static std::mutex appGalleryConnectionLock_; static sptr appGalleryDisposeProxyInstance_; }; } // namespace OHOS::FileManagement::Backup diff --git a/services/backup_sa/include/module_app_gallery/app_gallery_service_connection.h b/services/backup_sa/include/module_app_gallery/app_gallery_service_connection.h index c5a06b7fc6f6c89d60e8ab65c85a19a7afbc42f9..30a2982e6bc1ec3459f7e899662b708c6e3b848f 100644 --- a/services/backup_sa/include/module_app_gallery/app_gallery_service_connection.h +++ b/services/backup_sa/include/module_app_gallery/app_gallery_service_connection.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2024 Huawei Device 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 @@ -18,67 +18,36 @@ #include #include -#include #include "ability_manager_client.h" #include "ability_connect_callback_stub.h" #include "want.h" #include "i_appgallery_service.h" -#include "module_external/bms_adapter.h" -#include "filemgmt_libhilog.h" namespace OHOS::FileManagement::Backup { using namespace OHOS::AppExecFwk; -const int32_t CONNECT_TIME = 3; -template class AppGralleryConnection : public AbilityConnectionStub { +class AppGalleryConnection : public AbilityConnectionStub { public: - void OnAbilityConnectDone(const AppExecFwk::ElementName &element, const sptr &remoteObject, - int resultCode) - { - std::string uri = element.GetURI(); - HILOGI("OnAbilityConnectDone, uri = %{public}s", uri.c_str()); - T::appRemoteObj_ = remoteObject; - T::conditionVal_.notify_one(); - } + AppGalleryConnection(int32_t userId) : userId(userId) {} - void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) - { - std::string uri = element.GetURI(); - HILOGI("OnAbilityDisconnectDone, uri = %{public}s", uri.c_str()); - T::appRemoteObj_ = nullptr; - } -}; + void OnAbilityConnectDone(const AppExecFwk::ElementName &element, const sptr &remoteObject, + int resultCode); -template bool ConnectExtAbility() -{ - HILOGI("ConnectExtAbility called"); - std::lock_guard autoLock(T::appRemoteObjLock_); - if (T::appRemoteObj_ != nullptr) { - return true; - } + void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode); - auto appGalleryBundleName = BundleMgrAdapter::GetAppGalleryBundleName(); - if (appGalleryBundleName.empty()) { - HILOGI("ConnectExtAbility GetAppGalleryBundleName failed"); - return false; - } + bool ConnectExtAbility(std::string abilityName); - Want want; - want.SetElementName(appGalleryBundleName.c_str(), T::abilityName); - sptr connect = new AppGralleryConnection(); - auto ret = AbilityManagerClient::GetInstance()->ConnectAbility(want, connect, -1); + sptr GetRemoteObj(); - std::unique_lock uniqueLock(T::connectMutex); - T::conditionVal_.wait_for(uniqueLock, std::chrono::seconds(CONNECT_TIME)); - if (ret != IAppGalleryService::ERR_OK || T::appRemoteObj_ == nullptr) { - HILOGI("ConnectExtAbility failed, ret=%{public}d", ret); - T::appRemoteObj_ = nullptr; - return false; - } - HILOGI("ConnectExtAbility success, ret=%{public}d", ret); - return true; +private: + int32_t userId; + std::mutex conditionMutex_; + std::condition_variable conditionVal_; + std::mutex connectMutex; + std::mutex appRemoteObjLock_; + sptr appRemoteObj_; }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_APP_GALLERY_SERVICE_CONNECTION_H \ No newline at end of file diff --git a/services/backup_sa/include/module_ipc/svc_session_manager.h b/services/backup_sa/include/module_ipc/svc_session_manager.h index 51b13b07e3dec52b377c4238becdf28126e0390e..7a28e0962f19eba7176a97c4ade4e778188ee571 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -68,6 +68,7 @@ struct BackupExtInfo { std::string backupParameters; int32_t backupPriority; std::string extInfo; + int32_t userId {0}; int32_t appendNum {1}; bool isClearData {true}; bool isInPublishFile {false}; @@ -282,12 +283,29 @@ public: */ std::string GetBackupExtInfo(const std::string &bundleName); + /** + * @brief 暂存应用用户id + * + * @param bundleName 应用名称 + * @param userId 用户id + */ + void SetBundleUserId(const std::string &bundleName, const int32_t userId); + + /** + * @brief 获取应用用户id + * + * @param bundleName 应用名称 + * @return int32_t userId + */ + int32_t GetBundleUserId(const std::string &bundleName); + /** * @brief 追加应用 * * @param bundleNames 应用名称 + * @param failedBundles 返回失败应用名称 */ - void AppendBundles(const std::vector &bundleNames); + void AppendBundles(const std::vector &bundleNames, std::vector &failedBundles); /** * @brief 添加指定应用 diff --git a/services/backup_sa/src/module_app_gallery/app_gallery_dispose_proxy.cpp b/services/backup_sa/src/module_app_gallery/app_gallery_dispose_proxy.cpp index e6817ebd96b9849a9298bf627dde230f210bd0b1..1b34d155b8d02e6fd7c096ac7d63488c3a081625 100644 --- a/services/backup_sa/src/module_app_gallery/app_gallery_dispose_proxy.cpp +++ b/services/backup_sa/src/module_app_gallery/app_gallery_dispose_proxy.cpp @@ -15,6 +15,7 @@ #include +#include "b_error/b_error.h" #include "b_radar/b_radar.h" #include "b_sa/b_sa_utils.h" #include "b_jsonutil/b_jsonutil.h" @@ -32,13 +33,10 @@ namespace { const auto APP_FOUNDATION_SERVICE = u"appgalleryservice.openapi.privacymanager.AppFoundationService"; } mutex AppGalleryDisposeProxy::instanceLock_; -mutex AppGalleryDisposeProxy::conditionMutex_; +mutex AppGalleryDisposeProxy::appGalleryConnectionLock_; string AppGalleryDisposeProxy::abilityName = "AppFoundationService"; -sptr AppGalleryDisposeProxy::appRemoteObj_; -condition_variable AppGalleryDisposeProxy::conditionVal_; -mutex AppGalleryDisposeProxy::appRemoteObjLock_; -mutex AppGalleryDisposeProxy::connectMutex; +std::map> AppGalleryDisposeProxy::appGalleryConnectionMap_; sptr AppGalleryDisposeProxy::appGalleryDisposeProxyInstance_; AppGalleryDisposeProxy::AppGalleryDisposeProxy() @@ -63,81 +61,81 @@ sptr AppGalleryDisposeProxy::GetInstance() return appGalleryDisposeProxyInstance_; } -DisposeErr AppGalleryDisposeProxy::StartBackup(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::StartBackup(const std::string &bundleName, const int32_t userId) { HILOGI("StartBackup, app %{public}s", bundleName.c_str()); - DisposeErr res = DoDispose(bundleName, DisposeOperation::START_BACKUP); + DisposeErr res = DoDispose(bundleName, DisposeOperation::START_BACKUP, userId); if (res != DisposeErr::REQUEST_FAIL) { AppRadar::Info info(bundleName, "", ""); - AppRadar::GetInstance().RecordBackupFuncRes(info, "StartBackup", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordBackupFuncRes(info, "StartBackup", userId, BizStageBackup::BIZ_STAGE_START_DISPOSE, static_cast(res)); } return res; } -DisposeErr AppGalleryDisposeProxy::EndBackup(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::EndBackup(const std::string &bundleName, const int32_t userId) { HILOGI("EndBackup, app %{public}s", bundleName.c_str()); - DisposeErr res = DoDispose(bundleName, DisposeOperation::END_BACKUP); + DisposeErr res = DoDispose(bundleName, DisposeOperation::END_BACKUP, userId); if (res != DisposeErr::REQUEST_FAIL) { AppRadar::Info info(bundleName, "", ""); - AppRadar::GetInstance().RecordBackupFuncRes(info, "EndBackup", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordBackupFuncRes(info, "EndBackup", userId, BizStageBackup::BIZ_STAGE_END_DISPOSE, static_cast(res)); } return res; } -DisposeErr AppGalleryDisposeProxy::StartRestore(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::StartRestore(const std::string &bundleName, const int32_t userId) { if (SAUtils::IsSABundleName(bundleName)) { HILOGI("SA does not need to StartRestore"); return DisposeErr::OK; } HILOGI("StartRestore, app %{public}s", bundleName.c_str()); - DisposeErr res = DoDispose(bundleName, DisposeOperation::START_RESTORE); + DisposeErr res = DoDispose(bundleName, DisposeOperation::START_RESTORE, userId); if (res != DisposeErr::REQUEST_FAIL) { AppRadar::Info info(bundleName, "", ""); - AppRadar::GetInstance().RecordRestoreFuncRes(info, "StartRestore", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordRestoreFuncRes(info, "StartRestore", userId, BizStageRestore::BIZ_STAGE_START_DISPOSE, static_cast(res)); } return res; } -DisposeErr AppGalleryDisposeProxy::EndRestore(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::EndRestore(const std::string &bundleName, const int32_t userId) { if (SAUtils::IsSABundleName(bundleName)) { HILOGI("SA does not need to EndRestore"); return DisposeErr::OK; } HILOGI("EndRestore, app %{public}s", bundleName.c_str()); - DisposeErr res = DoDispose(bundleName, DisposeOperation::END_RESTORE); + DisposeErr res = DoDispose(bundleName, DisposeOperation::END_RESTORE, userId); if (res != DisposeErr::REQUEST_FAIL) { AppRadar::Info info(bundleName, "", ""); - AppRadar::GetInstance().RecordRestoreFuncRes(info, "EndRestore", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordRestoreFuncRes(info, "EndRestore", userId, BizStageRestore::BIZ_STAGE_END_DISPOSE, static_cast(res)); } return res; } void RecordDoDisposeRes(const std::string &bundleName, - AppGalleryDisposeProxy::DisposeOperation disposeOperation, int32_t err) + AppGalleryDisposeProxy::DisposeOperation disposeOperation, int32_t userId, int32_t err) { AppRadar::Info info (bundleName, "", "REQUEST FAIL"); switch (disposeOperation) { case AppGalleryDisposeProxy::DisposeOperation::START_BACKUP: - AppRadar::GetInstance().RecordBackupFuncRes(info, "StartBackup", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordBackupFuncRes(info, "StartBackup", userId, BizStageBackup::BIZ_STAGE_START_DISPOSE, err); break; case AppGalleryDisposeProxy::DisposeOperation::END_BACKUP: - AppRadar::GetInstance().RecordBackupFuncRes(info, "EndBackup", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordBackupFuncRes(info, "EndBackup", userId, BizStageBackup::BIZ_STAGE_END_DISPOSE, err); break; case AppGalleryDisposeProxy::DisposeOperation::START_RESTORE: - AppRadar::GetInstance().RecordRestoreFuncRes(info, "StartRestore", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordRestoreFuncRes(info, "StartRestore", userId, BizStageRestore::BIZ_STAGE_START_DISPOSE, err); break; case AppGalleryDisposeProxy::DisposeOperation::END_RESTORE: - AppRadar::GetInstance().RecordRestoreFuncRes(info, "EndRestore", AppRadar::GetInstance().GetUserId(), + AppRadar::GetInstance().RecordRestoreFuncRes(info, "EndRestore", userId, BizStageRestore::BIZ_STAGE_END_DISPOSE, err); break; default: @@ -145,12 +143,44 @@ void RecordDoDisposeRes(const std::string &bundleName, } } -DisposeErr AppGalleryDisposeProxy::DoDispose(const std::string &bundleName, DisposeOperation disposeOperation) +sptr AppGalleryDisposeProxy::GetAppGalleryConnection(const int32_t userId) +{ + auto it = appGalleryConnectionMap_.find(userId); + if (it == appGalleryConnectionMap_.end()) { + HILOGI("appGalleryConnectionMap not contain %{public}d, will register", userId); + return nullptr; + } + HILOGI("appGalleryConnectionMap contain %{public}d", userId); + return appGalleryConnectionMap_[userId]; +} + +sptr AppGalleryDisposeProxy::ConnectAppGallery(const int32_t userId) +{ + std::unique_lock lock(appGalleryConnectionLock_); + sptr connection = GetAppGalleryConnection(userId); + if (connection == nullptr) { + connection = sptr(new AppGalleryConnection(userId)); + appGalleryConnectionMap_[userId] = connection; + } + if (connection->GetRemoteObj() == nullptr) { + HILOGI("AppGalleryConnection try to connect, userId = %{public}d", userId); + if (!connection->ConnectExtAbility(abilityName) || connection->GetRemoteObj() == nullptr) { + HILOGE("AppGalleryConnection failed to connect, userId = %{public}d", userId); + return nullptr; + } + } + return connection; +} + +DisposeErr AppGalleryDisposeProxy::DoDispose(const std::string &bundleName, DisposeOperation disposeOperation, + const int32_t userId) { try { - HILOGI("DoDispose, app %{public}s, operation %{public}d", bundleName.c_str(), disposeOperation); - if (!ConnectExtAbility() || appRemoteObj_ == nullptr) { - HILOGE("Can not connect to %{public}s", bundleName.c_str()); + HILOGI("DoDispose, app %{public}s, operation %{public}d, userId %{public}d", bundleName.c_str(), + disposeOperation, userId); + sptr connection = ConnectAppGallery(userId); + if (connection == nullptr) { + HILOGE("Get AppGalleryConnection failed, userId = %{public}d", userId); return DisposeErr::CONN_FAIL; } @@ -172,16 +202,16 @@ DisposeErr AppGalleryDisposeProxy::DoDispose(const std::string &bundleName, Disp MessageParcel reply; MessageOption option; - int32_t ret = appRemoteObj_->SendRequest(static_cast(disposeOperation), data, reply, option); + int32_t ret = connection->GetRemoteObj()->SendRequest(static_cast(disposeOperation), data, reply, option); if (ret != ERR_NONE) { - HILOGE("SendRequest error, code=%{public}d, bundleName=%{public}s , appindex =%{public}d", - ret, bundleDetailInfo.bundleName.c_str(), bundleDetailInfo.bundleIndex); - RecordDoDisposeRes(bundleName, disposeOperation, ret); + HILOGE("SendRequest error, code=%{public}d, bundleName=%{public}s , appindex=%{public}d, userId=%{public}d", + ret, bundleDetailInfo.bundleName.c_str(), bundleDetailInfo.bundleIndex, userId); + RecordDoDisposeRes(bundleName, disposeOperation, userId, ret); return DisposeErr::REQUEST_FAIL; } - HILOGI("SendRequest success, dispose=%{public}d, bundleName=%{public}s, appindex =%{public}d", - disposeOperation, bundleDetailInfo.bundleName.c_str(), bundleDetailInfo.bundleIndex); + HILOGI("SendRequest success, dispose=%{public}d, bundleName=%{public}s, appindex=%{public}d, userId=%{public}d", + disposeOperation, bundleDetailInfo.bundleName.c_str(), bundleDetailInfo.bundleIndex, userId); return DisposeErr::OK; } catch (const BError &e) { HILOGE("Catch exception, errCode = %{public}d", e.GetCode()); diff --git a/services/backup_sa/src/module_app_gallery/app_gallery_service_connection.cpp b/services/backup_sa/src/module_app_gallery/app_gallery_service_connection.cpp new file mode 100644 index 0000000000000000000000000000000000000000..10b2c19c1e326898dfda8cdedb977fe30d90e41f --- /dev/null +++ b/services/backup_sa/src/module_app_gallery/app_gallery_service_connection.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2024 Huawei Device 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 "module_app_gallery/app_gallery_service_connection.h" + +#include +#include + +#include "module_external/bms_adapter.h" +#include "filemgmt_libhilog.h" + +namespace OHOS::FileManagement::Backup { +const int32_t CONNECT_TIME = 3; + +void AppGalleryConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &element, + const sptr &remoteObject, int resultCode) +{ + std::string uri = element.GetURI(); + HILOGI("OnAbilityConnectDone, uri = %{public}s", uri.c_str()); + appRemoteObj_ = remoteObject; + conditionVal_.notify_one(); +} + +void AppGalleryConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) +{ + std::string uri = element.GetURI(); + HILOGI("OnAbilityDisconnectDone, uri = %{public}s", uri.c_str()); + appRemoteObj_ = nullptr; +} + +bool AppGalleryConnection::ConnectExtAbility(std::string abilityName) +{ + HILOGI("ConnectExtAbility called, userId = %{public}d", userId); + std::lock_guard autoLock(appRemoteObjLock_); + if (appRemoteObj_ != nullptr) { + return true; + } + + auto appGalleryBundleName = BundleMgrAdapter::GetAppGalleryBundleName(); + if (appGalleryBundleName.empty()) { + HILOGI("ConnectExtAbility GetAppGalleryBundleName failed, userId = %{public}d", userId); + return false; + } + + Want want; + want.SetElementName(appGalleryBundleName.c_str(), abilityName); + auto ret = AbilityManagerClient::GetInstance()->ConnectAbility(want, this, userId); + + std::unique_lock uniqueLock(connectMutex); + conditionVal_.wait_for(uniqueLock, std::chrono::seconds(CONNECT_TIME)); + if (ret != IAppGalleryService::ERR_OK || appRemoteObj_ == nullptr) { + HILOGI("ConnectExtAbility failed, ret=%{public}d, userId = %{public}d", ret, userId); + appRemoteObj_ = nullptr; + return false; + } + HILOGI("ConnectExtAbility success, ret=%{public}d, userId = %{public}d", ret, userId); + return true; +} + +sptr AppGalleryConnection::GetRemoteObj() +{ + return appRemoteObj_; +} +} // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 335987159e9409bac0c6eb5ed87bd9907573795c..0f3890bd9e7e06ad1a5f411857b37b60d217a28f 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -637,7 +637,9 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, const vectorDecreaseSessionCnt(__PRETTY_FUNCTION__); return BError(BError::Codes::OK); } - session_->AppendBundles(restoreBundleNames); + std::vector failedBundles; + session_->AppendBundles(restoreBundleNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); SetCurrentSessProperties(restoreInfos, restoreBundleNames, bundleNameDetailMap, isClearDataFlags, restoreType, oldBackupVersion); OnStartSched(); @@ -688,6 +690,7 @@ void Service::SetCurrentSessProperties(std::vector if (BundleMgrAdapter::IsUser0BundleName(bundleNameIndexInfo, session_->GetSessionUserId())) { SendUserIdToApp(bundleNameIndexInfo, session_->GetSessionUserId()); } + session_->SetBundleUserId(bundleNameIndexInfo, session_->GetSessionUserId()); session_->SetBackupExtName(bundleNameIndexInfo, restoreInfo.extensionName); session_->SetIsReadyLaunch(bundleNameIndexInfo); } @@ -723,7 +726,9 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, HILOGW("RestoreBundleNames is empty."); return BError(BError::Codes::OK); } - session_->AppendBundles(restoreBundleNames); + std::vector failedBundles; + session_->AppendBundles(restoreBundleNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); SetCurrentSessProperties(restoreInfos, restoreBundleNames, restoreType, oldBackupVersion); OnStartSched(); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); @@ -771,6 +776,7 @@ void Service::SetCurrentSessProperties(std::vector session_->SetBundleVersionCode(bundleNameIndexInfo, restoreInfo.versionCode); session_->SetBundleVersionName(bundleNameIndexInfo, restoreInfo.versionName); session_->SetBundleDataSize(bundleNameIndexInfo, restoreInfo.spaceOccupied); + session_->SetBundleUserId(bundleNameIndexInfo, session_->GetSessionUserId()); auto iter = isClearDataFlags.find(bundleNameIndexInfo); if (iter != isClearDataFlags.end()) { session_->SetClearDataFlag(bundleNameIndexInfo, iter->second); @@ -815,7 +821,9 @@ ErrCode Service::AppendBundlesBackupSession(const vector &bundleName auto bundleDetails = MakeDetailList(bundleNames); auto backupInfos = BundleMgrAdapter::GetBundleInfosForAppend(bundleDetails, session_->GetSessionUserId()); std::vector supportBackupNames = GetSupportBackupBundleNames(backupInfos, false, bundleNames); - session_->AppendBundles(supportBackupNames); + std::vector failedBundles; + session_->AppendBundles(supportBackupNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); SetCurrentBackupSessProperties(supportBackupNames, session_->GetSessionUserId(), backupInfos, false); OnStartSched(); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); @@ -858,7 +866,9 @@ ErrCode Service::AppendBundlesDetailsBackupSession(const vector &bun auto bundleDetails = MakeDetailList(bundleNames); auto backupInfos = BundleMgrAdapter::GetBundleInfosForAppend(bundleDetails, session_->GetSessionUserId()); std::vector supportBackupNames = GetSupportBackupBundleNames(backupInfos, false, bundleNames); - session_->AppendBundles(supportBackupNames); + std::vector failedBundles; + session_->AppendBundles(supportBackupNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); HandleCurGroupBackupInfos(backupInfos, bundleNameDetailMap, isClearDataFlags); OnStartSched(); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); @@ -891,6 +901,7 @@ void Service::HandleCurGroupBackupInfos(std::vector bundleNameIndexInfo.c_str(), GetAnonyString(uniCastInfo.detail).c_str(), uniCastInfo.detail.size()); session_->SetBackupExtInfo(bundleNameIndexInfo, uniCastInfo.detail); } + session_->SetBundleUserId(bundleNameIndexInfo, session_->GetSessionUserId()); session_->SetBackupExtName(bundleNameIndexInfo, info.extensionName); session_->SetIsReadyLaunch(bundleNameIndexInfo); } @@ -910,11 +921,13 @@ ErrCode Service::ServiceResultReport(const std::string restoreRetInfo, } SendEndAppGalleryNotify(callerName); if (sennario == BackupRestoreScenario::FULL_RESTORE) { - session_->GetServiceReverseProxy()->RestoreOnResultReport(restoreRetInfo, callerName, errCode); NotifyCloneBundleFinish(callerName, sennario); + session_->GetServiceReverseProxy()->RestoreOnResultReport(restoreRetInfo, callerName, errCode); + OnAllBundlesFinished(BError(BError::Codes::OK)); } else if (sennario == BackupRestoreScenario::INCREMENTAL_RESTORE) { - session_->GetServiceReverseProxy()->IncrementalRestoreOnResultReport(restoreRetInfo, callerName, errCode); NotifyCloneBundleFinish(callerName, sennario); + session_->GetServiceReverseProxy()->IncrementalRestoreOnResultReport(restoreRetInfo, callerName, errCode); + OnAllBundlesFinished(BError(BError::Codes::OK)); } else if (sennario == BackupRestoreScenario::FULL_BACKUP) { session_->GetServiceReverseProxy()->BackupOnResultReport(restoreRetInfo, callerName); } else if (sennario == BackupRestoreScenario::INCREMENTAL_BACKUP) { @@ -923,9 +936,11 @@ ErrCode Service::ServiceResultReport(const std::string restoreRetInfo, return BError(BError::Codes::OK); } catch (const BError &e) { NotifyCloneBundleFinish(callerName, sennario); + OnAllBundlesFinished(BError(BError::Codes::OK)); return e.GetCode(); // 任意异常产生,终止监听该任务 } catch (...) { NotifyCloneBundleFinish(callerName, sennario); + OnAllBundlesFinished(BError(BError::Codes::OK)); HILOGE("Unexpected exception"); return EPERM; } @@ -934,6 +949,7 @@ ErrCode Service::ServiceResultReport(const std::string restoreRetInfo, ErrCode Service::SAResultReport(const std::string bundleName, const std::string restoreRetInfo, const ErrCode errCode, const BackupRestoreScenario sennario) { + SADone(errCode, bundleName); if (sennario == BackupRestoreScenario::FULL_RESTORE) { session_->GetServiceReverseProxy()->RestoreOnResultReport(restoreRetInfo, bundleName); } else if (sennario == BackupRestoreScenario::INCREMENTAL_RESTORE) { @@ -944,13 +960,14 @@ ErrCode Service::SAResultReport(const std::string bundleName, const std::string } else if (sennario == BackupRestoreScenario::INCREMENTAL_BACKUP) { session_->GetServiceReverseProxy()->IncrementalBackupOnResultReport(restoreRetInfo, bundleName); } + OnAllBundlesFinished(BError(BError::Codes::OK)); if (sennario == BackupRestoreScenario::FULL_RESTORE || sennario == BackupRestoreScenario::INCREMENTAL_RESTORE) { BundleEndRadarReport(bundleName, errCode, IServiceReverse::Scenario::RESTORE); } else if (sennario == BackupRestoreScenario::FULL_BACKUP || sennario == BackupRestoreScenario::INCREMENTAL_BACKUP) { BundleEndRadarReport(bundleName, errCode, IServiceReverse::Scenario::BACKUP); } - return SADone(errCode, bundleName); + return BError(BError::Codes::OK); } void Service::NotifyCloneBundleFinish(std::string bundleName, const BackupRestoreScenario sennario) @@ -984,7 +1001,6 @@ void Service::NotifyCloneBundleFinish(std::string bundleName, const BackupRestor ClearSessionAndSchedInfo(bundleName); } RemoveExtensionMutex(bundleName); - OnAllBundlesFinished(BError(BError::Codes::OK)); } catch (...) { HILOGI("Unexpected exception"); ReleaseOnException(); @@ -1137,7 +1153,8 @@ void Service::ReportOnExtConnectFailed(const IServiceReverse::Scenario scenario, session_->ValidRestoreDataType(RestoreTypeEnum::RESTORE_DATA_WAIT_SEND)) { session_->GetServiceReverseProxy()->IncrementalRestoreOnBundleStarted(ret, bundleName); BundleBeginRadarReport(bundleName, ret, scenario); - DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName); + DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName, + session_->GetSessionUserId()); HILOGI("ExtConnectFailed EndRestore, code=%{public}d, bundleName=%{public}s", disposeErr, bundleName.c_str()); } else if (scenario == IServiceReverse::Scenario::BACKUP) { @@ -1146,7 +1163,8 @@ void Service::ReportOnExtConnectFailed(const IServiceReverse::Scenario scenario, } else if (scenario == IServiceReverse::Scenario::RESTORE) { session_->GetServiceReverseProxy()->RestoreOnBundleStarted(ret, bundleName); BundleBeginRadarReport(bundleName, ret, scenario); - DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName); + DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName, + session_->GetSessionUserId()); HILOGI("ExtConnectFailed EndRestore, code=%{public}d, bundleName=%{public}s", disposeErr, bundleName.c_str()); } @@ -1264,7 +1282,9 @@ void Service::HandleRestoreDepsBundle(const string &bundleName) HILOGI("Start restore session, bundle: %{public}s", bundle.first.c_str()); restoreBundleNames.emplace_back(bundle.first); } - session_->AppendBundles(restoreBundleNames); + std::vector failedBundles; + session_->AppendBundles(restoreBundleNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); for (const auto &bundle : restoreBundleMap) { for (auto &bundleInfo : SvcRestoreDepsManager::GetInstance().GetAllBundles()) { if (bundle.first != bundleInfo.name) { @@ -1311,7 +1331,8 @@ void Service::SendStartAppGalleryNotify(const BundleName &bundleName) return; } HILOGI("AppendIntoDisposalConfigFile OK, bundleName=%{public}s", bundleName.c_str()); - DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->StartRestore(bundleName); + DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->StartRestore(bundleName, + session_->GetSessionUserId()); HILOGI("StartRestore, code=%{public}d, bundleName=%{public}s", disposeErr, bundleName.c_str()); } @@ -1327,7 +1348,7 @@ void Service::SendEndAppGalleryNotify(const BundleName &bundleName) if (scenario != IServiceReverse::Scenario::RESTORE) { return; } - DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName); + DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName, session_->GetSessionUserId()); HILOGI("EndRestore, code=%{public}d, bundleName=%{public}s", disposeErr, bundleName.c_str()); if (disposeErr != DisposeErr::OK) { @@ -1346,7 +1367,8 @@ void Service::TryToClearDispose(const BundleName &bundleName) int32_t maxAtt = MAX_TRY_CLEAR_DISPOSE_NUM; int32_t att = 0; while (att < maxAtt) { - DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName); + DisposeErr disposeErr = AppGalleryDisposeProxy::GetInstance()->EndRestore(bundleName, + session_->GetSessionUserId()); HILOGI("EndRestore, code=%{public}d, bundleName=%{public}s", disposeErr, bundleName.c_str()); if (disposeErr == DisposeErr::OK) { break; @@ -1675,7 +1697,9 @@ ErrCode Service::AppendBundlesClearSession(const std::vector &bundle std::string bundleNameIndexStr = BJsonUtil::BuildBundleNameIndexInfo(info.name, info.appIndex); supportBundleNames.emplace_back(bundleNameIndexStr); } - session_->AppendBundles(supportBundleNames); + std::vector failedBundles; + session_->AppendBundles(supportBundleNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); for (auto info : backupInfos) { std::string bundleNameIndexInfo = BJsonUtil::BuildBundleNameIndexInfo(info.name, info.appIndex); session_->SetBackupExtName(bundleNameIndexInfo, info.extensionName); @@ -1870,7 +1894,6 @@ ErrCode Service::SADone(ErrCode errCode, std::string bundleName) saConnection->DisconnectBackupSAExt(); ClearSessionAndSchedInfo(bundleName); } - OnAllBundlesFinished(BError(BError::Codes::OK)); return BError(BError::Codes::OK); } catch (const BError &e) { ReleaseOnException(); diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 37f3063729ceed88d96430ddf47a8d5d2c882c2a..5d14f7825727177479ce79e1447214e5556f6932 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -365,7 +365,9 @@ ErrCode Service::AppendBundlesIncrementalBackupSession(const std::vectorGetSessionUserId()); std::vector supportBackupNames = GetSupportBackupBundleNames(backupInfos, true, bundleNames); - session_->AppendBundles(supportBackupNames); + std::vector failedBundles; + session_->AppendBundles(supportBackupNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); SetBundleIncDataInfo(bundlesToBackup, supportBackupNames); SetCurrentBackupSessProperties(supportBackupNames, session_->GetSessionUserId(), backupInfos, true); OnStartSched(); @@ -411,7 +413,9 @@ ErrCode Service::AppendBundlesIncrementalBackupSession(const std::vectorGetSessionUserId()); std::vector supportBackupNames = GetSupportBackupBundleNames(backupInfos, true, bundleNames); - session_->AppendBundles(supportBackupNames); + std::vector failedBundles; + session_->AppendBundles(supportBackupNames, failedBundles); + HandleExceptionOnAppendBundles(session_, failedBundles, {}); SetBundleIncDataInfo(bundlesToBackup, supportBackupNames); HandleCurGroupIncBackupInfos(backupInfos, bundleNameDetailMap, isClearDataFlags); OnStartSched(); @@ -823,6 +827,7 @@ void Service::SetCurrentBackupSessProperties(const vector &bundleNames, } else { session_->SetBundleDataSize(bundleName, bundleInfo.spaceOccupied); } + session_->SetBundleUserId(bundleName, userId); session_->SetBackupExtName(bundleName, bundleInfo.extensionName); session_->SetIsReadyLaunch(bundleName); } diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index 8b79408c3648adb0b68d8273dc95f98b445d96ae..ebeb2b62f0b045d0e3acd42f3ed5acffab8a1911 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -541,7 +541,29 @@ std::string SvcSessionManager::GetBackupExtInfo(const string &bundleName) return it->second.extInfo; } -void SvcSessionManager::AppendBundles(const vector &bundleNames) +void SvcSessionManager::SetBundleUserId(const string &bundleName, const int32_t userId) +{ + unique_lock lock(lock_); + if (!impl_.clientToken) { + throw BError(BError::Codes::SA_INVAL_ARG, "No caller token was specified"); + } + + auto it = GetBackupExtNameMap(bundleName); + it->second.userId = userId; +} + +int32_t SvcSessionManager::GetBundleUserId(const string &bundleName) +{ + shared_lock lock(lock_); + if (!impl_.clientToken) { + throw BError(BError::Codes::SA_INVAL_ARG, "No caller token was specified"); + } + + auto it = GetBackupExtNameMap(bundleName); + return it->second.userId; +} + +void SvcSessionManager::AppendBundles(const vector &bundleNames, vector &failedBundles) { unique_lock lock(lock_); if (!impl_.clientToken) { @@ -553,11 +575,15 @@ void SvcSessionManager::AppendBundles(const vector &bundleNames) BackupExtInfo info {}; auto it = impl_.backupExtNameMap.find(bundleName); if (it != impl_.backupExtNameMap.end()) { - HILOGI("BackupExtNameMap already contain %{public}s", bundleName.c_str()); - info.backUpConnection = impl_.backupExtNameMap[bundleName].backUpConnection; - info.saBackupConnection = impl_.backupExtNameMap[bundleName].saBackupConnection; - info.appendNum = impl_.backupExtNameMap[bundleName].appendNum + 1; - impl_.backupExtNameMap[bundleName] = info; + if (impl_.backupExtNameMap[bundleName].userId == GetSessionUserId()) { + HILOGI("BackupExtNameMap already contain %{public}s", bundleName.c_str()); + info.backUpConnection = impl_.backupExtNameMap[bundleName].backUpConnection; + info.saBackupConnection = impl_.backupExtNameMap[bundleName].saBackupConnection; + info.appendNum = impl_.backupExtNameMap[bundleName].appendNum + 1; + impl_.backupExtNameMap[bundleName] = info; + } else { + failedBundles.push_back(bundleName); + } continue; } if (SAUtils::IsSABundleName(bundleName)) { diff --git a/tests/mock/module_ipc/app_gallery_dispose_proxy_mock.cpp b/tests/mock/module_ipc/app_gallery_dispose_proxy_mock.cpp index ca6ce6a2b7e11cfd5a49f7080a3dec499b23e8d4..28ba2d8243f3a719226295bbd6534d6f0ce0ceaf 100644 --- a/tests/mock/module_ipc/app_gallery_dispose_proxy_mock.cpp +++ b/tests/mock/module_ipc/app_gallery_dispose_proxy_mock.cpp @@ -41,27 +41,28 @@ sptr AppGalleryDisposeProxy::GetInstance() return new AppGalleryDisposeProxy; } -DisposeErr AppGalleryDisposeProxy::StartBackup(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::StartBackup(const std::string &bundleName, const int32_t userId) { - return DoDispose(bundleName, DisposeOperation::START_BACKUP); + return DoDispose(bundleName, DisposeOperation::START_BACKUP, userId); } -DisposeErr AppGalleryDisposeProxy::EndBackup(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::EndBackup(const std::string &bundleName, const int32_t userId) { - return DoDispose(bundleName, DisposeOperation::END_BACKUP); + return DoDispose(bundleName, DisposeOperation::END_BACKUP, userId); } -DisposeErr AppGalleryDisposeProxy::StartRestore(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::StartRestore(const std::string &bundleName, const int32_t userId) { - return DoDispose(bundleName, DisposeOperation::START_RESTORE); + return DoDispose(bundleName, DisposeOperation::START_RESTORE, userId); } -DisposeErr AppGalleryDisposeProxy::EndRestore(const std::string &bundleName) +DisposeErr AppGalleryDisposeProxy::EndRestore(const std::string &bundleName, const int32_t userId) { - return DoDispose(bundleName, DisposeOperation::END_RESTORE); + return DoDispose(bundleName, DisposeOperation::END_RESTORE, userId); } -DisposeErr AppGalleryDisposeProxy::DoDispose(const std::string &bundleName, DisposeOperation disposeOperation) +DisposeErr AppGalleryDisposeProxy::DoDispose(const std::string &bundleName, DisposeOperation disposeOperation, + const int32_t userId) { return DisposeErr::OK; } diff --git a/tests/mock/module_ipc/include/app_gallery_dispose_proxy_mock.h b/tests/mock/module_ipc/include/app_gallery_dispose_proxy_mock.h index 190bea71a3a9ec24a884978f6f9401665095c488..4dae0f493551f67c8132c49025c9f4e05c2543f3 100644 --- a/tests/mock/module_ipc/include/app_gallery_dispose_proxy_mock.h +++ b/tests/mock/module_ipc/include/app_gallery_dispose_proxy_mock.h @@ -23,10 +23,10 @@ namespace OHOS::FileManagement::Backup { class BAppGalleryDisposeProxy { public: - virtual DisposeErr StartBackup(const std::string&) = 0; - virtual DisposeErr EndBackup(const std::string&) = 0; - virtual DisposeErr StartRestore(const std::string&) = 0; - virtual DisposeErr EndRestore(const std::string&) = 0; + virtual DisposeErr StartBackup(const std::string&, const int32_t) = 0; + virtual DisposeErr EndBackup(const std::string&, const int32_t) = 0; + virtual DisposeErr StartRestore(const std::string&, const int32_t) = 0; + virtual DisposeErr EndRestore(const std::string&, const int32_t) = 0; public: BAppGalleryDisposeProxy() = default; virtual ~BAppGalleryDisposeProxy() = default; @@ -36,10 +36,10 @@ public: class AppGalleryDisposeProxyMock : public BAppGalleryDisposeProxy { public: - MOCK_METHOD(DisposeErr, StartBackup, (const std::string&)); - MOCK_METHOD(DisposeErr, EndBackup, (const std::string&)); - MOCK_METHOD(DisposeErr, StartRestore, (const std::string&)); - MOCK_METHOD(DisposeErr, EndRestore, (const std::string&)); + MOCK_METHOD(DisposeErr, StartBackup, (const std::string&, const int32_t)); + MOCK_METHOD(DisposeErr, EndBackup, (const std::string&, const int32_t)); + MOCK_METHOD(DisposeErr, StartRestore, (const std::string&, const int32_t)); + MOCK_METHOD(DisposeErr, EndRestore, (const std::string&, const int32_t)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_APP_GALLERY_DISPOSE_PROXY_MOCK_H \ No newline at end of file diff --git a/tests/mock/module_ipc/src/app_gallery_dispose_proxy_mock.cpp b/tests/mock/module_ipc/src/app_gallery_dispose_proxy_mock.cpp index 945676d7e161dd96521d7ce37de493b60c1a5895..eab1cfcaedea8667c9eca1fbf13b2596a0f9f6ef 100644 --- a/tests/mock/module_ipc/src/app_gallery_dispose_proxy_mock.cpp +++ b/tests/mock/module_ipc/src/app_gallery_dispose_proxy_mock.cpp @@ -42,23 +42,23 @@ sptr AppGalleryDisposeProxy::GetInstance() return appGalleryDisposeProxyInstance_; } -DisposeErr AppGalleryDisposeProxy::StartBackup(const string &bundleName) +DisposeErr AppGalleryDisposeProxy::StartBackup(const string &bundleName, int32_t userId) { - return BAppGalleryDisposeProxy::proxy->StartBackup(bundleName); + return BAppGalleryDisposeProxy::proxy->StartBackup(bundleName, userId); } -DisposeErr AppGalleryDisposeProxy::EndBackup(const string &bundleName) +DisposeErr AppGalleryDisposeProxy::EndBackup(const string &bundleName, int32_t userId) { - return BAppGalleryDisposeProxy::proxy->EndBackup(bundleName); + return BAppGalleryDisposeProxy::proxy->EndBackup(bundleName, userId); } -DisposeErr AppGalleryDisposeProxy::StartRestore(const string &bundleName) +DisposeErr AppGalleryDisposeProxy::StartRestore(const string &bundleName, int32_t userId) { - return BAppGalleryDisposeProxy::proxy->StartRestore(bundleName); + return BAppGalleryDisposeProxy::proxy->StartRestore(bundleName, userId); } -DisposeErr AppGalleryDisposeProxy::EndRestore(const string &bundleName) +DisposeErr AppGalleryDisposeProxy::EndRestore(const string &bundleName, int32_t userId) { - return BAppGalleryDisposeProxy::proxy->EndRestore(bundleName); + return BAppGalleryDisposeProxy::proxy->EndRestore(bundleName, userId); } } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp index 8739d1da44b6ba0dc8bf9b91fbeb576878ff05e4..101b56b784350eaf8d55c02037470eabe96899eb 100644 --- a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp @@ -123,7 +123,14 @@ std::weak_ptr SvcSessionManager::GetSAExtConnection(const Bu return BSvcSessionManager::sessionManager->GetSAExtConnection(bundleName); } -void SvcSessionManager::AppendBundles(const vector &) {} +int32_t SvcSessionManager::GetBundleUserId(const string &bundleName) +{ + return 0; +} + +void SvcSessionManager::SetBundleUserId(const string &bundleName, const int32_t userId) {} + +void SvcSessionManager::AppendBundles(const vector &, vector &) {} sptr SvcSessionManager::CreateBackupConnection(BundleName &bundleName) { diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index bb61902f8218fb905d5e8c708e50d4602da2d1c8..3013bdc9bb3151427f35e944a30670bfbe84ae83 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -245,7 +245,7 @@ std::weak_ptr SvcSessionManager::GetSAExtConnection(const Bu return std::weak_ptr(it->second.saBackupConnection); } -void SvcSessionManager::AppendBundles(const vector &bundleNames) +void SvcSessionManager::AppendBundles(const vector &bundleNames, vector &failedBundles) { GTEST_LOG_(INFO) << "AppendBundles"; BackupExtInfo info {}; @@ -355,6 +355,24 @@ std::string SvcSessionManager::GetBundleVersionName(const std::string &bundleNam return it->second.versionName; } +void SvcSessionManager::SetBundleUserId(const std::string &bundleName, const int32_t userId) +{ + auto it = impl_.backupExtNameMap.find(bundleName); + if (it == impl_.backupExtNameMap.end()) { + return; + } + it->second.userId = userId; +} + +int32_t SvcSessionManager::GetBundleUserId(const std::string &bundleName) +{ + auto it = impl_.backupExtNameMap.find(bundleName); + if (it == impl_.backupExtNameMap.end()) { + return 0; + } + return it->second.userId; +} + void SvcSessionManager::SetBundleDataSize(const std::string &bundleName, int64_t dataSize) { auto it = impl_.backupExtNameMap.find(bundleName); diff --git a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp index bfdf4a3d5a1365b0ca21874b482793698ae6af97..a7fc374763d9e043b4978af4ccbf6ca7760004cc 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -139,9 +139,19 @@ std::weak_ptr SvcSessionManager::GetSAExtConnection(const Bu return BackupSvcSessionManager::session->GetSAExtConnection(bundleName); } -void SvcSessionManager::AppendBundles(const vector &bundleNames) +int32_t SvcSessionManager::GetBundleUserId(const string &bundleName) { - BackupSvcSessionManager::session->AppendBundles(bundleNames); + return BackupSvcSessionManager::session->GetBundleUserId(bundleName); +} + +void SvcSessionManager::SetBundleUserId(const string &bundleName, const int32_t userId) +{ + BackupSvcSessionManager::session->SetBundleUserId(bundleName, userId); +} + +void SvcSessionManager::AppendBundles(const vector &bundleNames, vector &failedBundles) +{ + BackupSvcSessionManager::session->AppendBundles(bundleNames, failedBundles); } sptr SvcSessionManager::CreateBackupConnection(BundleName &bundleName) diff --git a/tests/mock/module_ipc/svc_session_manager_throw_mock.h b/tests/mock/module_ipc/svc_session_manager_throw_mock.h index 2b3154b1aaa89244fe2287cc7ce0329bfa496c6c..4cf3ef3aeb91ed1ddcd198e5182e71e227418eab 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -51,7 +51,7 @@ public: virtual std::string GetBackupExtInfo(const std::string &) = 0; virtual void SetBackupExtName(const std::string &, const std::string &) = 0; virtual std::weak_ptr GetSAExtConnection(const BundleName &) = 0; - virtual void AppendBundles(const std::vector &) = 0; + virtual void AppendBundles(const std::vector &, std::vector &) = 0; virtual sptr CreateBackupConnection(BundleName &) = 0; virtual ErrCode Start() = 0; virtual ErrCode Finish() = 0; @@ -66,6 +66,8 @@ public: virtual int64_t GetBundleVersionCode(const std::string &) = 0; virtual void SetBundleVersionName(const std::string &, std::string) = 0; virtual std::string GetBundleVersionName(const std::string &) = 0; + virtual void SetBundleUserId(const std::string &, const int32_t) = 0; + virtual int32_t GetBundleUserId(const std::string &) = 0; virtual void SetBundleDataSize(const std::string &, int64_t) = 0; virtual bool StartFwkTimer(const std::string &, const Utils::Timer::TimerCallback &) = 0; virtual bool StopFwkTimer(const std::string &) = 0; @@ -122,7 +124,7 @@ public: MOCK_METHOD(std::string, GetBackupExtInfo, (const std::string &)); MOCK_METHOD(void, SetBackupExtName, (const std::string &, const std::string &)); MOCK_METHOD(std::weak_ptr, GetSAExtConnection, (const BundleName &)); - MOCK_METHOD(void, AppendBundles, (const std::vector &)); + MOCK_METHOD(void, AppendBundles, (const std::vector &, std::vector &)); MOCK_METHOD(sptr, CreateBackupConnection, (BundleName &)); MOCK_METHOD(ErrCode, Start, ()); MOCK_METHOD(ErrCode, Finish, ()); @@ -137,6 +139,8 @@ public: MOCK_METHOD(int64_t, GetBundleVersionCode, (const std::string &)); MOCK_METHOD(void, SetBundleVersionName, (const std::string &, std::string)); MOCK_METHOD(std::string, GetBundleVersionName, (const std::string &)); + MOCK_METHOD(void, SetBundleUserId, (const std::string &, const int32_t)); + MOCK_METHOD(int32_t, GetBundleUserId, (const std::string &)); MOCK_METHOD(void, SetBundleDataSize, (const std::string &, int64_t)); MOCK_METHOD(bool, StartFwkTimer, (const std::string &, const Utils::Timer::TimerCallback &)); MOCK_METHOD(bool, StopFwkTimer, (const std::string &)); diff --git a/tests/unittests/backup_sa/BUILD.gn b/tests/unittests/backup_sa/BUILD.gn index 370b915178107b9dfa61c7c06b4cab595bef8fe9..c637fbf3a6060b97c7d6d39ec4ad26e40193e542 100644 --- a/tests/unittests/backup_sa/BUILD.gn +++ b/tests/unittests/backup_sa/BUILD.gn @@ -18,6 +18,7 @@ group("backup_sa_test") { testonly = true deps = [ + "module_app_gallery:app_gallery_test", "module_ipc:backup_sa_ipc_test", "session:session_test", ] diff --git a/tests/unittests/backup_sa/module_app_gallery/BUILD.gn b/tests/unittests/backup_sa/module_app_gallery/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..24d57884cc146425f1aa3c41ee1cbf93c2c4c106 --- /dev/null +++ b/tests/unittests/backup_sa/module_app_gallery/BUILD.gn @@ -0,0 +1,73 @@ +# Copyright (c) 2024 Huawei Device 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. + +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +ohos_unittest("app_gallery_dispose_proxy_test") { + branch_protector_ret = "pac_ret" + + module_out_path = path_module_out_tests + + sources = [ + "${path_backup_mock}/module_external/src/bms_adapter_mock.cpp", + "${path_backup}/services/backup_sa/src/module_app_gallery/app_gallery_dispose_proxy.cpp", + "${path_backup}/services/backup_sa/src/module_app_gallery/app_gallery_service_connection.cpp", + "app_gallery_dispose_proxy_test.cpp", + ] + + include_dirs = [ + "${path_backup}/services/backup_sa/include", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${path_backup}/tests/unittests/backup_api/backup_impl/include", + "${path_backup_mock}/module_external/include", + ] + + deps = [ + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/tests/utils:backup_test_utils", + "${path_backup}/utils:backup_utils", + ] + + external_deps = [ + "ability_base:want", + "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", + "bundle_framework:appexecfwk_core", + "c_utils:utils", + "common_event_service:cesfwk_innerkits", + "googletest:gmock_main", + "googletest:gtest_main", + "hilog:libhilog", + "hisysevent:libhisysevent", + "hitrace:hitrace_meter", + "init:libbegetutil", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + "storage_service:storage_manager_sa_proxy", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private = public", + ] + + use_exceptions = true +} + +group("app_gallery_test") { + testonly = true + deps = [ ":app_gallery_dispose_proxy_test" ] +} diff --git a/tests/unittests/backup_sa/module_app_gallery/app_gallery_dispose_proxy_test.cpp b/tests/unittests/backup_sa/module_app_gallery/app_gallery_dispose_proxy_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..73a31317e816a0005b59b88a32248cf17537ff65 --- /dev/null +++ b/tests/unittests/backup_sa/module_app_gallery/app_gallery_dispose_proxy_test.cpp @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2024 Huawei Device 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 +#include +#include + +#include "b_error/b_error.h" +#include "b_radar/b_radar.h" +#include "b_sa/b_sa_utils.h" +#include "b_jsonutil/b_jsonutil.h" +#include "filemgmt_libhilog.h" +#include "message_parcel.h" + +#include "bms_adapter_mock.h" +#include "module_app_gallery/app_gallery_dispose_proxy.h" +#include "module_app_gallery/app_gallery_service_connection.h" +#include "want.h" + +namespace OHOS::FileManagement::Backup { +using namespace std; +using namespace testing; +using namespace testing::ext; + +class AppGalleryTest : public testing::Test { +public: + static void SetUpTestCase(void); + static void TearDownTestCase(); + void SetUp() {}; + void TearDown() {}; + + static inline shared_ptr bms = nullptr; +}; + +void AppGalleryTest::SetUpTestCase(void) +{ + bms = make_shared(); + BundleMgrAdapterMock::bms = bms; +} + +void AppGalleryTest::TearDownTestCase() +{ + BundleMgrAdapterMock::bms = nullptr; + bms = nullptr; +} + +/** + * @tc.number: App_Gallery_GetInstance_0100 + * @tc.name: App_Gallery_GetInstance_0100 + * @tc.desc: 测试 GetInstance + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_GetInstance_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_GetInstance_0100"; + try { + auto instance = AppGalleryDisposeProxy::GetInstance(); + bool result = instance != nullptr; + EXPECT_TRUE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_GetInstance_0100."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_GetInstance_0100"; +} + +/** + * @tc.number: App_Gallery_GetInstance_0200 + * @tc.name: App_Gallery_GetInstance_0200 + * @tc.desc: 测试 GetInstance + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_GetInstance_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_GetInstance_0200"; + try { + auto instance1 = AppGalleryDisposeProxy::GetInstance(); + auto instance2 = AppGalleryDisposeProxy::GetInstance(); + bool result = instance1 == instance2; + EXPECT_TRUE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_GetInstance_0200."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_GetInstance_0200"; +} + +/** + * @tc.number: App_Gallery_GetAppGalleryConnection_0100 + * @tc.name: App_Gallery_GetAppGalleryConnection_0100 + * @tc.desc: 测试 GetAppGalleryConnection + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_GetAppGalleryConnection_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_GetAppGalleryConnection_0100"; + try { + auto instance = AppGalleryDisposeProxy::GetInstance(); + EXPECT_TRUE(instance != nullptr); + int32_t userId = 100; + auto result = instance->GetAppGalleryConnection(userId); + EXPECT_TRUE(result == nullptr); + instance->appGalleryConnectionMap_[userId] = sptr(new AppGalleryConnection(userId)); + result = instance->GetAppGalleryConnection(userId); + EXPECT_TRUE(result != nullptr); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_GetAppGalleryConnection_0100."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_GetAppGalleryConnection_0100"; +} + +/** + * @tc.number: App_Gallery_ConnectAppGallery_0100 + * @tc.name: App_Gallery_ConnectAppGallery_0100 + * @tc.desc: 测试 ConnectAppGallery + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_ConnectAppGallery_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_ConnectAppGallery_0100"; + try { + auto instance = AppGalleryDisposeProxy::GetInstance(); + EXPECT_TRUE(instance != nullptr); + int32_t userId = 101; + EXPECT_CALL(*bms, GetAppGalleryBundleName()).WillOnce(Return("")); + auto result = instance->ConnectAppGallery(userId); + EXPECT_TRUE(result == nullptr); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_ConnectAppGallery_0100."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_ConnectAppGallery_0100"; +} + +/** + * @tc.number: App_Gallery_StartRestore_0100 + * @tc.name: App_Gallery_StartRestore_0100 + * @tc.desc: 测试 StartRestore + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_StartRestore_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_StartRestore_0100"; + try { + auto instance = AppGalleryDisposeProxy::GetInstance(); + EXPECT_TRUE(instance != nullptr); + std::string bundleName = "1234"; + int32_t userId = 102; + auto result = instance->StartRestore(bundleName, userId); + EXPECT_EQ(result, DisposeErr::OK); + result = instance->EndRestore(bundleName, userId); + EXPECT_EQ(result, DisposeErr::OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_StartRestore_0100."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_StartRestore_0100"; +} + +/** + * @tc.number: App_Gallery_StartRestore_0200 + * @tc.name: App_Gallery_StartRestore_0200 + * @tc.desc: 测试 StartRestore + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_StartRestore_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_StartRestore_0200"; + try { + auto instance = AppGalleryDisposeProxy::GetInstance(); + EXPECT_TRUE(instance != nullptr); + std::string bundleName = "testapp"; + int32_t userId = 102; + EXPECT_CALL(*bms, GetAppGalleryBundleName()).WillOnce(Return("")); + auto result = instance->StartRestore(bundleName, userId); + EXPECT_EQ(result, DisposeErr::CONN_FAIL); + EXPECT_CALL(*bms, GetAppGalleryBundleName()).WillOnce(Return("")); + result = instance->EndRestore(bundleName, userId); + EXPECT_EQ(result, DisposeErr::CONN_FAIL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_StartRestore_0200."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_StartRestore_0200"; +} + +/** + * @tc.number: App_Gallery_StartBackup_0100 + * @tc.name: App_Gallery_StartBackup_0100 + * @tc.desc: 测试 StartBackup + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(AppGalleryTest, App_Gallery_StartBackup_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin App_Gallery_StartBackup_0100"; + try { + auto instance = AppGalleryDisposeProxy::GetInstance(); + EXPECT_TRUE(instance != nullptr); + std::string bundleName = "1234"; + int32_t userId = 102; + EXPECT_CALL(*bms, GetAppGalleryBundleName()).WillOnce(Return("")); + auto result = instance->StartBackup(bundleName, userId); + EXPECT_EQ(result, DisposeErr::CONN_FAIL); + EXPECT_CALL(*bms, GetAppGalleryBundleName()).WillOnce(Return("")); + result = instance->EndBackup(bundleName, userId); + EXPECT_EQ(result, DisposeErr::CONN_FAIL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by App_Gallery_StartBackup_0100."; + } + GTEST_LOG_(INFO) << "ServiceTest-end App_Gallery_StartBackup_0100"; +} +} \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index d6891417596a7b6efac3dbc69dfaa91b4bec65c2..6685f522e0465f166c8fb7d4fd65fab27b0c714b 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -358,6 +358,7 @@ ohos_unittest("backup_restore_deps_manager_test") { sources = [ "${path_backup_mock}/accesstoken/accesstoken_kit_mock.cpp", "${path_backup}/services/backup_sa/src/module_app_gallery/app_gallery_dispose_proxy.cpp", + "${path_backup}/services/backup_sa/src/module_app_gallery/app_gallery_service_connection.cpp", "${path_backup}/services/backup_sa/src/module_ipc/sa_backup_connection.cpp", "${path_backup}/services/backup_sa/src/module_ipc/service.cpp", "${path_backup}/services/backup_sa/src/module_ipc/service_incremental.cpp", diff --git a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp index a2f71964b3683507412a13084aebac81e684b3a1..ec81f87d862d6fa88566bb101c38a46774ac2ade 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -931,6 +931,7 @@ HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0300, TestSize.Level1 RestoreTypeEnum restoreType = RestoreTypeEnum::RESTORE_DATA_WAIT_SEND; std::string backupVersion; + EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) .WillOnce(Return("bundleName")); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); @@ -940,6 +941,7 @@ HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0300, TestSize.Level1 EXPECT_TRUE(true); restoreBundleInfos[0].extensionName = "extensionName"; + EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) .WillOnce(Return("bundleName")); EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); @@ -947,12 +949,14 @@ HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0300, TestSize.Level1 isClearDataFlags, restoreType, backupVersion); EXPECT_TRUE(true); + EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) .WillOnce(Return("bundleName")); EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, isClearDataFlags, restoreType, backupVersion); + EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) .WillOnce(Return("bundleName")); EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(true)).WillOnce(Return(false)); @@ -960,6 +964,7 @@ HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0300, TestSize.Level1 service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, isClearDataFlags, restoreType, backupVersion); + EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) .WillOnce(Return("bundleName")); EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(true)); diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index c995e219cc830ca2803b8892e4c82f177899b7f0..57a194b1209d117d190ace3eb4d7b956f8e6cfd4 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -616,7 +616,7 @@ HWTEST_F(ServiceTest, SUB_Service_ReportOnExtConnectFailed_0000, TestSize.Level1 EXPECT_CALL(*session, ValidRestoreDataType(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)); EXPECT_CALL(*srProxy, IncrementalRestoreOnBundleStarted(_, _)).WillOnce(Return()); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); service->ReportOnExtConnectFailed(IServiceReverse::Scenario::RESTORE, bundleName, 0); EXPECT_TRUE(true); @@ -624,14 +624,14 @@ HWTEST_F(ServiceTest, SUB_Service_ReportOnExtConnectFailed_0000, TestSize.Level1 EXPECT_CALL(*session, ValidRestoreDataType(_)).WillOnce(Return(false)); EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)); EXPECT_CALL(*srProxy, RestoreOnBundleStarted(_, _)).WillOnce(Return()); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); service->ReportOnExtConnectFailed(IServiceReverse::Scenario::RESTORE, bundleName, 0); EXPECT_TRUE(true); EXPECT_CALL(*param, GetBackupOverrideIncrementalRestore()).WillOnce(Return(false)); EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)); EXPECT_CALL(*srProxy, RestoreOnBundleStarted(_, _)).WillOnce(Return()); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); service->ReportOnExtConnectFailed(IServiceReverse::Scenario::RESTORE, bundleName, 0); EXPECT_TRUE(true); } catch (...) { @@ -1066,7 +1066,7 @@ HWTEST_F(ServiceTest, SUB_Service_SendStartAppGalleryNotify_0000, TestSize.Level EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(false)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::RESTORE)); EXPECT_CALL(*jdConfig, IfBundleNameInDisposalConfigFile(_)).WillOnce(Return(true)); - EXPECT_CALL(*gallery, StartRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, StartRestore(_, _)).WillOnce(Return(DisposeErr::OK)); service->SendStartAppGalleryNotify(bundleName); EXPECT_TRUE(true); } catch (...) { @@ -1101,20 +1101,20 @@ HWTEST_F(ServiceTest, SUB_Service_SendEndAppGalleryNotify_0000, TestSize.Level1) EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(false)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::RESTORE)); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::REQUEST_FAIL)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::REQUEST_FAIL)); service->SendEndAppGalleryNotify(bundleName); EXPECT_TRUE(true); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(false)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::RESTORE)); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); EXPECT_CALL(*jdConfig, DeleteFromDisposalConfigFile(_)).WillOnce(Return(false)); service->SendEndAppGalleryNotify(bundleName); EXPECT_TRUE(true); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(false)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::RESTORE)); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); EXPECT_CALL(*jdConfig, DeleteFromDisposalConfigFile(_)).WillOnce(Return(true)); service->SendEndAppGalleryNotify(bundleName); EXPECT_TRUE(true); @@ -1139,12 +1139,12 @@ HWTEST_F(ServiceTest, SUB_Service_TryToClearDispose_0000, TestSize.Level1) GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_TryToClearDispose_0000"; try { BundleName bundleName; - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); EXPECT_CALL(*jdConfig, DeleteFromDisposalConfigFile(_)).WillOnce(Return(true)); service->TryToClearDispose(bundleName); EXPECT_TRUE(true); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::REQUEST_FAIL)) + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::REQUEST_FAIL)) .WillOnce(Return(DisposeErr::OK)); EXPECT_CALL(*jdConfig, DeleteFromDisposalConfigFile(_)).WillOnce(Return(false)); service->TryToClearDispose(bundleName); @@ -1182,7 +1182,7 @@ HWTEST_F(ServiceTest, SUB_Service_SendErrAppGalleryNotify_0000, TestSize.Level1) bundleNameList.emplace_back("bundleName"); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::RESTORE)); EXPECT_CALL(*jdConfig, GetBundleNameFromConfigFile()).WillOnce(Return(bundleNameList)); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); EXPECT_CALL(*jdConfig, DeleteFromDisposalConfigFile(_)).WillOnce(Return(true)); service->SendErrAppGalleryNotify(); EXPECT_TRUE(true); @@ -1213,7 +1213,7 @@ HWTEST_F(ServiceTest, SUB_Service_ClearDisposalOnSaStart_0000, TestSize.Level1) bundleNameList.emplace_back("bundleName"); EXPECT_CALL(*jdConfig, GetBundleNameFromConfigFile()).WillOnce(Return(bundleNameList)); - EXPECT_CALL(*gallery, EndRestore(_)).WillOnce(Return(DisposeErr::OK)); + EXPECT_CALL(*gallery, EndRestore(_, _)).WillOnce(Return(DisposeErr::OK)); EXPECT_CALL(*jdConfig, DeleteFromDisposalConfigFile(_)).WillOnce(Return(true)); service->ClearDisposalOnSaStart(); EXPECT_TRUE(true); diff --git a/tests/unittests/backup_sa/module_ipc/svc_session_manager_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_session_manager_test.cpp index ad790f8849e2af8f80d16043851097861ce48423..1aa90c65d1e3056a18463dcda14f5fc78c07f296 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_session_manager_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_session_manager_test.cpp @@ -70,13 +70,14 @@ void SvcSessionManagerTest::TearDownTestCase(void) void SvcSessionManagerTest::Init(IServiceReverse::Scenario scenario) { vector bundleNames; + vector failedBundles; map backupExtNameMap; bundleNames.emplace_back(BUNDLE_NAME); EXPECT_TRUE(sessionManagerPtr_ != nullptr); sessionManagerPtr_->Active( {.clientToken = CLIENT_TOKEN_ID, .scenario = scenario, .backupExtNameMap = {}, .clientProxy = remote_}); sessionManagerPtr_->IsOnAllBundlesFinished(); - sessionManagerPtr_->AppendBundles(bundleNames); + sessionManagerPtr_->AppendBundles(bundleNames, failedBundles); sessionManagerPtr_->Finish(); sessionManagerPtr_->IsOnAllBundlesFinished(); } @@ -1082,10 +1083,11 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_AppendBundles_0100, testin GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_AppendBundles_0100"; try { vector bundleNames; + vector failedBundles; try { EXPECT_TRUE(sessionManagerPtr_ != nullptr); sessionManagerPtr_->impl_.clientToken = 0; - sessionManagerPtr_->AppendBundles(bundleNames); + sessionManagerPtr_->AppendBundles(bundleNames, failedBundles); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); @@ -1095,14 +1097,14 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_AppendBundles_0100, testin bundleNames.emplace_back("app1"); sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; sessionManagerPtr_->impl_.backupExtNameMap.clear(); - sessionManagerPtr_->AppendBundles(bundleNames); + sessionManagerPtr_->AppendBundles(bundleNames, failedBundles); EXPECT_EQ(sessionManagerPtr_->impl_.backupExtNameMap.size(), 1); bundleNames.clear(); bundleNames.emplace_back("123"); sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; sessionManagerPtr_->impl_.backupExtNameMap.clear(); - sessionManagerPtr_->AppendBundles(bundleNames); + sessionManagerPtr_->AppendBundles(bundleNames, failedBundles); EXPECT_EQ(sessionManagerPtr_->impl_.backupExtNameMap.size(), 1); } catch (...) { EXPECT_FALSE(false); @@ -1517,6 +1519,75 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetBundleVersionName_0100, GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetBundleVersionName_0100"; } +/** + * @tc.number: SUB_backup_sa_session_SetBundleUserId_0100 + * @tc.name: SUB_backup_sa_session_SetBundleUserId_0100 + * @tc.desc: 测试 SetBundleUserId 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6VA38 + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_SetBundleUserId_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_SetBundleUserId_0100"; + try { + int32_t userId = 100; + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->SetBundleUserId(BUNDLE_NAME, userId); + EXPECT_TRUE(false); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + sessionManagerPtr_->impl_.backupExtNameMap.clear(); + sessionManagerPtr_->impl_.backupExtNameMap[BUNDLE_NAME] = {}; + sessionManagerPtr_->SetBundleUserId(BUNDLE_NAME, userId); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by SetBundleUserId."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_SetBundleUserId_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetBundleUserId_0100 + * @tc.name: SUB_backup_sa_session_GetBundleUserId_0100 + * @tc.desc: 测试 GetBundleUserId 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6VA38 + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetBundleUserId_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetBundleUserId_0100"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->GetBundleUserId(BUNDLE_NAME); + EXPECT_TRUE(false); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + sessionManagerPtr_->impl_.backupExtNameMap.clear(); + sessionManagerPtr_->impl_.backupExtNameMap[BUNDLE_NAME] = {}; + sessionManagerPtr_->GetBundleUserId(BUNDLE_NAME); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetBundleUserId."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetBundleUserId_0100"; +} + /** * @tc.number: SUB_backup_sa_session_Start_0100 * @tc.name: SUB_backup_sa_session_Start_0100