diff --git a/frameworks/native/backup_ext/BUILD.gn b/frameworks/native/backup_ext/BUILD.gn index bc32d5e26..ab24d367b 100644 --- a/frameworks/native/backup_ext/BUILD.gn +++ b/frameworks/native/backup_ext/BUILD.gn @@ -34,6 +34,7 @@ ohos_shared_library("backup_extension_ability_native") { "src/ext_backup_loader.cpp", "src/ext_extension.cpp", "src/ext_extension_stub.cpp", + "src/sub_ext_extension.cpp", "src/tar_file.cpp", "src/untar_file.cpp", ] diff --git a/frameworks/native/backup_ext/include/ext_backup.h b/frameworks/native/backup_ext/include/ext_backup.h index abfc0a18c..aa41134c2 100644 --- a/frameworks/native/backup_ext/include/ext_backup.h +++ b/frameworks/native/backup_ext/include/ext_backup.h @@ -175,6 +175,8 @@ public: */ bool RestoreDataReady(); + void SetClearDataFlag(bool isClearData); + /** * @brief Invoke the extended function of the APP */ @@ -200,6 +202,7 @@ private: BConstants::ExtensionAction extAction_ {BConstants::ExtensionAction::INVALID}; ErrCode GetParament(const AAFwk::Want &want); static CreatorFunc creator_; + bool isClearData_ {true}; }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/include/ext_backup_js.h b/frameworks/native/backup_ext/include/ext_backup_js.h index 411f48dca..d81bd62f8 100644 --- a/frameworks/native/backup_ext/include/ext_backup_js.h +++ b/frameworks/native/backup_ext/include/ext_backup_js.h @@ -73,6 +73,13 @@ struct CallbackInfoEx { } }; +struct OnProcessCallBackInfo { + std::function onProcessCallback; + OnProcessCallBackInfo(std::function param) : onProcessCallback(param) + { + } +}; + class ExtBackupJs : public ExtBackup { public: /** @@ -161,6 +168,7 @@ private: std::shared_ptr callbackInfoBackup_; std::shared_ptr callbackInfoEx_; std::shared_ptr callbackInfo_; + std::shared_ptr onProcessCallback_; std::condition_variable callJsCon_; std::mutex callJsMutex_; std::atomic callExtDefaultFunc_ {false}; // extension default method, onBackup or onRestore diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 368e2683c..e1d79cf9b 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -34,6 +34,7 @@ #include "thread_pool.h" #include "timer.h" #include "unique_fd.h" +#include "untar_file.h" namespace OHOS::FileManagement::Backup { using CompareFilesResult = tuple, @@ -44,17 +45,15 @@ public: UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) override; ErrCode HandleClear() override; ErrCode PublishFile(const std::string &fileName) override; - ErrCode HandleBackup() override; - ErrCode HandleRestore() override; + ErrCode HandleBackup(bool isClearData) override; + ErrCode HandleRestore(bool isClearData) override; ErrCode GetIncrementalFileHandle(const std::string &fileName) override; ErrCode PublishIncrementalFile(const std::string &fileName) override; ErrCode HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) override; - ErrCode IncrementalOnBackup() override; + ErrCode IncrementalOnBackup(bool isClearData) override; std::tuple GetIncrementalBackupFileHandle() override; ErrCode GetBackupInfo(std::string &result) override; - ErrCode GetBundleProcessInfo(); ErrCode UpdateFdSendRate(std::string &bundleName, int32_t sendRate) override; - void AsyncTaskRestoreForUpgrade(void); void ExtClear(void); void AsyncTaskIncrementalRestoreForUpgrade(void); @@ -88,7 +87,7 @@ private: * * @param fileName name of the file that to be untar */ - int DoRestore(const string &fileName); + int DoRestore(const string &fileName, const off_t fileSize); /** * @brief incremental restore @@ -115,12 +114,13 @@ private: ErrCode errCode = 0); /** - * @brief extension backup restore is done + * @brief extension process Info * - * @param restoreRetInfo app restore reportInfo + * @param restoreRetInfo app processInfo + * @param scenario backup or restore + * @param errCode errCode */ - void ReportAppProcessInfo(const std::string restoreRetInfo, BackupRestoreScenario scenario, - ErrCode errCode = 0); + void ReportAppProcessInfo(const std::string processInfo, BackupRestoreScenario scenario); /** * @brief Executing Backup Tasks Asynchronously @@ -165,11 +165,14 @@ private: void AsyncTaskOnIncrementalBackup(); ErrCode IncrementalBigFileReady(const TarMap &pkgInfo, const vector &bigInfos, sptr proxy); - ErrCode BigFileReady(sptr proxy); + ErrCode BigFileReady(const TarMap &bigFileInfo, sptr proxy); void WaitToSendFd(std::chrono::system_clock::time_point &startTime, int &fdSendNum); void RefreshTimeInfo(std::chrono::system_clock::time_point &startTime, int &fdSendNum); void IncrementalPacket(const vector &infos, TarMap &tar, sptr proxy); - + void DoPacket(const map &srcFiles, TarMap &tar, sptr proxy); + void CheckTmpDirFileInfos(bool isSpecialVersion = false); + std::map GetIdxFileInfos(bool isSpecialVersion = false); + tuple> CheckRestoreFileInfos(); /** * @brief extension incremental backup restore is done * @@ -182,7 +185,14 @@ private: * * @param errCode */ - std::function RestoreResultCallbackEx(wptr obj); + std::function FullRestoreCallbackEx(wptr obj); + + /** + * @brief get callback for execute onRestore + * + * @param errCode + */ + std::function FullRestoreCallback(wptr obj); /** * @brief get callbackEx for execute onRestore with string param @@ -191,6 +201,13 @@ private: */ std::function IncRestoreResultCallbackEx(wptr obj); + /** + * @brief get callback for execute onRestore with string param + * + * @param errCode + */ + std::function IncRestoreResultCallback(wptr obj); + /** * @brief get callbackEx for execute onRestore * @@ -203,7 +220,40 @@ private: */ std::function AppDoneCallbackEx(wptr obj); std::function HandleBackupEx(wptr obj); - std::function HandleTaskBackupEx(wptr obj); + std::function HandleFullBackupCallbackEx(wptr obj); + std::function HandleFullBackupCallback(wptr obj); + + void HandleSpecialVersionRestore(); + void DeleteBackupIncrementalTars(); + void DeleteBackupTars(); + void SetClearDataFlag(bool isClearData); + std::vector GetExtManageInfo(); + ErrCode RestoreFilesForSpecialCloneCloud(); + void RestoreBigFilesForSpecialCloneCloud(const ExtManageInfo &item); + ErrCode RestoreTarForSpecialCloneCloud(const ExtManageInfo &item); + void RestoreBigFiles(bool appendTargetPath); + void FillEndFileInfos(const std::string &path, const unordered_map &result); + void RestoreBigFileAfter(const string &filePath, const struct stat &sta); + void DealIncreUnPacketResult(const off_t tarFileSize, const std::string &tarFileName, + const std::tuple &result); + + + + + + + + + + std::function ExecOnProcessCallback(wptr obj, + BackupRestoreScenario scenario); + // std::function ExecOnProcessTimeoutCallback(wptr obj); + bool CreateExecOnProcessTask(BackupRestoreScenario scenario); + bool ShutDownExecOnProcessTask(); + bool ExecOnProcessTimeoutTask(wptr obj); + bool ShutDownOnProcessTimeoutTask(); + + private: std::shared_mutex lock_; std::shared_ptr extension_; @@ -217,7 +267,41 @@ private: std::mutex waitTimeLock_; std::string bundleName_; int32_t sendRate_ = BConstants::DEFAULT_FD_SEND_RATE; - Utils::Timer extTime_ {"queryOnProcessTimer"}; + bool isClearData_ {true}; + bool isDebug_ {false}; + std::map endFileInfos_; + std::map> errFileInfos_; + bool isRpValid_ {false}; + + + + + + + + + + + + + + + + + + + + + + + Utils::Timer execOnProcessTaskTimer_ {"execOnProcessTaskTimer_"}; + uint32_t execOnProcessTaskTimerId_; + Utils::Timer execOnProcessTimeoutTimer_ {"execOnProcessTimeoutTimer_"}; + uint32_t execOnProcessTimeoutTimerId_; + int execOnProcessTimeoutTimes_; + bool isSameClock_ {false}; + bool appExecFinished_ {false}; + }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/include/ext_extension_stub.h b/frameworks/native/backup_ext/include/ext_extension_stub.h index 1e8720dff..86949011a 100644 --- a/frameworks/native/backup_ext/include/ext_extension_stub.h +++ b/frameworks/native/backup_ext/include/ext_extension_stub.h @@ -42,7 +42,6 @@ private: ErrCode CmdIncrementalOnBackup(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetIncrementalBackupFileHandle(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetBackupInfo(MessageParcel &data, MessageParcel &reply); - ErrCode CmdGetProcessInfo(MessageParcel &data, MessageParcel &reply); ErrCode CmdUpdateFdSendRate(MessageParcel &data, MessageParcel &reply); private: diff --git a/frameworks/native/backup_ext/include/untar_file.h b/frameworks/native/backup_ext/include/untar_file.h index 8d890b833..ecdee79b6 100644 --- a/frameworks/native/backup_ext/include/untar_file.h +++ b/frameworks/native/backup_ext/include/untar_file.h @@ -28,13 +28,22 @@ struct FileStatInfo { off_t mtime {0}; std::string longName {}; }; + +using ErrFileInfo = std::map>; +using EndFileInfo = std::map; + +const int FIRST_PARAM = 0; +const int SECOND_PARAM = 1; +const int THIRD_PARAM = 2; class UntarFile { public: typedef enum { ERR_FORMAT = -1 } ErrorCode; static UntarFile &GetInstance(); - int UnPacket(const std::string &tarFile, const std::string &rootPath); - int IncrementalUnPacket(const std::string &tarFile, const std::string &rootPath, - const std::unordered_map &includes); + std::tuple UnPacket( + const std::string &tarFile, const std::string &rootPath); + std::tuple IncrementalUnPacket( + const std::string &tarFile, const std::string &rootPath, + const std::unordered_map &includes); private: UntarFile() = default; @@ -47,14 +56,14 @@ private: * * @param rootpath 解包的目标路径 */ - int ParseTarFile(const std::string &rootPath); + std::tuple ParseTarFile(const std::string &rootPath); /** * @brief parse incremental tar file * * @param rootpath 解包的目标路径 */ - int ParseIncrementalTarFile(const std::string &rootPath); + std::tuple ParseIncrementalTarFile(const std::string &rootPath); /** * @brief verfy check sum @@ -84,7 +93,7 @@ private: * @param path 文件路径名 * @param mode 文件打开模式 */ - void CreateDir(std::string &path, mode_t mode); + ErrFileInfo CreateDir(std::string &path, mode_t mode); /** * @brief creat a file @@ -101,7 +110,7 @@ private: * @param info 文件属性结构体 * @param typeFlag 文件类型标志 */ - void ParseRegularFile(FileStatInfo &info, char typeFlag); + ErrFileInfo ParseRegularFile(FileStatInfo &info, char typeFlag); /** * @brief handle tar buffer @@ -110,7 +119,7 @@ private: * @param name 文件名 * @param info 文件属性结构体 */ - void HandleTarBuffer(const std::string &buff, const std::string &name, FileStatInfo &info); + off_t HandleTarBuffer(const std::string &buff, const std::string &name, FileStatInfo &info); /** * @brief parse file by typeFlag @@ -118,7 +127,7 @@ private: * @param typeFlag 文件类型标志 * @param info 文件属性结构体 */ - void ParseFileByTypeFlag(char typeFlag, FileStatInfo &info); + std::tuple ParseFileByTypeFlag(char typeFlag, FileStatInfo &info); /** * @brief parse incremental file by typeFlag @@ -126,7 +135,52 @@ private: * @param typeFlag 文件类型标志 * @param info 文件属性结构体 */ - int ParseIncrementalFileByTypeFlag(char typeFlag, FileStatInfo &info); + std::tuple ParseIncrementalFileByTypeFlag(char typeFlag, FileStatInfo &info); + + /** + * @brief Check tar and fill tar size + */ + int CheckAndFillTarSize(); + + /** + * @brief Read long name and recode errinfo + * + * @param info file state info + */ + std::tuple ReadLongName(FileStatInfo &info); + + /** + * @brief deal parse tar file result + * + * @param result parse tar file result info + * @param fileSize size of the file in tar + * @param fileName file state info + * @param fileInfos out param, record file info + * @param errInfos out param, record err file info + */ + int DealParseTarFileResult(const std::tuple &result, + const off_t fileSize, const std::string &fileName, EndFileInfo &fileInfos, ErrFileInfo &errInfos); + + /** + * @brief deal incremental parse tar file result + * + * @param result parse tar file result info + * @param fileSize size of the file in tar + * @param fileName file state info + * @param fileInfos out param, record file info + * @param errInfos out param, record err file info + */ + int DealIncreParseTarFileResult(const std::tuple &result, + const off_t fileSize, const std::string &fileName, EndFileInfo &fileInfos, ErrFileInfo &errInfos); + + /** + * @brief check if tar block valid + * + * @param buff check buff info + * @param header check header info + * @param ret out param, the err info + */ + bool CheckIfTarBlockValid(char *buff, size_t buffLen, TarHeader *header, int &ret); private: std::string rootPath_ {}; diff --git a/frameworks/native/backup_ext/src/ext_backup.cpp b/frameworks/native/backup_ext/src/ext_backup.cpp index 5ccb1a3dc..12dab2646 100644 --- a/frameworks/native/backup_ext/src/ext_backup.cpp +++ b/frameworks/native/backup_ext/src/ext_backup.cpp @@ -189,12 +189,6 @@ sptr ExtBackup::OnConnect(const AAFwk::Want &want) auto remoteObject = sptr(new BackupExtExtension(std::static_pointer_cast(shared_from_this()))); - - // 排除特殊场景 - if (!WasFromSpecialVersion() && !RestoreDataReady()) { - remoteObject->ExtClear(); - } - return remoteObject->AsObject(); } catch (const BError &e) { return nullptr; @@ -211,6 +205,11 @@ void ExtBackup::OnDisconnect(const AAFwk::Want &want) { try { HILOGI("begin disconnect"); + if (isClearData_) { + auto remoteObject = sptr( + new BackupExtExtension(std::static_pointer_cast(shared_from_this()))); + remoteObject->ExtClear(); + } Extension::OnDisconnect(want); extAction_ = BConstants::ExtensionAction::INVALID; HILOGI("end"); @@ -253,6 +252,11 @@ bool ExtBackup::RestoreDataReady() return restoreType_ == RestoreTypeEnum::RESTORE_DATA_READDY; } +void ExtBackup::SetClearDataFlag(bool isClearData) +{ + isClearData_ = isClearData; +} + ErrCode ExtBackup::OnBackup(function callback) { HILOGI("BackupExtensionAbility(base) OnBackup."); diff --git a/frameworks/native/backup_ext/src/ext_backup_js.cpp b/frameworks/native/backup_ext/src/ext_backup_js.cpp index 183a36d22..d0ded2816 100644 --- a/frameworks/native/backup_ext/src/ext_backup_js.cpp +++ b/frameworks/native/backup_ext/src/ext_backup_js.cpp @@ -844,10 +844,9 @@ ErrCode ExtBackupJs::OnProcess(std::function c HILOGI("BackupExtensionAbility(JS) OnProcess begin."); BExcepUltils::BAssert(jsObj_, BError::Codes::EXT_BROKEN_FRAMEWORK, "The app does not provide the OnProcess interface."); - callbackInfoBackup_ = std::make_shared(callback); - auto retParser = [jsRuntime {&jsRuntime_}, callBackInfo {callbackInfoBackup_}](napi_env env, + onProcessCallback_ = std::make_shared(callback); + auto retParser = [jsRuntime {&jsRuntime_}, callBackInfo {onProcessCallback_}](napi_env env, napi_value result) -> bool { - if (!CheckPromise(env, result)) { size_t strLen = 0; napi_status status = napi_get_value_string_utf8(env, result, nullptr, -1, &strLen); if (status != napi_ok) { @@ -856,13 +855,9 @@ ErrCode ExtBackupJs::OnProcess(std::function c size_t bufLen = strLen + 1; unique_ptr str = make_unique(bufLen); status = napi_get_value_string_utf8(env, result, str.get(), bufLen, &strLen); - callBackInfo->callbackParam(BError(BError::Codes::OK), str.get()); + callBackInfo->onProcessCallback(BError(BError::Codes::OK), str.get()); return true; - } - HILOGI("BackupExtensionAbulity(JS) OnProcess ok."); - return CallPromiseEx(*jsRuntime, result, callBackInfo.get()); }; - auto errCode = CallJsMethod("onProcess", jsRuntime_, jsObj_.get(), {}, retParser); if (errCode != ERR_OK) { HILOGE("CallJsMethod error, code:%{public}d.", errCode); diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 1f658e569..d456445f5 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -46,6 +46,7 @@ #include "b_filesystem/b_file_hash.h" #include "b_json/b_json_cached_entity.h" #include "b_jsonutil/b_jsonutil.h" +#include "b_ohos/startup/backup_para.h" #include "b_tarball/b_tarball_factory.h" #include "filemgmt_libhilog.h" #include "hitrace_meter.h" @@ -53,7 +54,6 @@ #include "sandbox_helper.h" #include "service_proxy.h" #include "tar_file.h" -#include "untar_file.h" #include "b_anony/b_anony.h" namespace OHOS::FileManagement::Backup { @@ -71,7 +71,6 @@ using namespace std; namespace { const int64_t DEFAULT_SLICE_SIZE = 100 * 1024 * 1024; // 分片文件大小为100M const uint32_t MAX_FILE_COUNT = 6000; // 单个tar包最多包含6000个文件 -const uint32_t MAX_FD_GROUP_USE_TIME = 1000; // 每组打开最大时间1000ms const int FILE_AND_MANIFEST_FD_COUNT = 2; // 每组文件和简报数量统计 } @@ -87,7 +86,7 @@ static std::set GetIdxFileData() return cache.GetExtManage(); } -static std::vector GetExtManageInfo() +std::vector BackupExtExtension::GetExtManageInfo() { string filePath = BExcepUltils::Canonicalize(INDEX_FILE_RESTORE); UniqueFd idxFd(open(filePath.data(), O_RDONLY)); @@ -141,14 +140,14 @@ static UniqueFd GetFileHandleForSpecialCloneCloud(const string &fileName) size_t filePathPrefix = filePath.find_last_of(BConstants::FILE_SEPARATOR_CHAR); if (filePathPrefix == string::npos) { HILOGE("GetFileHandleForSpecialCloneCloud: Invalid fileName"); - throw BError(BError::Codes::EXT_INVAL_ARG, fileName); + return UniqueFd(-1); } string path = filePath.substr(0, filePathPrefix); if (access(path.c_str(), F_OK) != 0) { bool created = ForceCreateDirectory(path.data()); if (!created) { - string str = string("Failed to create restore folder."); - throw BError(BError::Codes::EXT_INVAL_ARG, str); + HILOGE("Failed to create restore folder."); + return UniqueFd(-1); } } UniqueFd fd(open(fileName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); @@ -214,43 +213,47 @@ static string GetReportFileName(const string &fileName) static ErrCode GetIncreFileHandleForSpecialVersion(const string &fileName) { + HILOGI("extension:GetIncreFileHandleForSpecialVersion, filename:%{public}s", fileName.c_str()); + ErrCode errCode = ERR_OK; UniqueFd fd = GetFileHandleForSpecialCloneCloud(fileName); if (fd < 0) { HILOGE("Failed to open file = %{private}s, err = %{public}d", fileName.c_str(), errno); - throw BError(BError::Codes::EXT_INVAL_ARG, string("open tar file failed")); + errCode = errno; } string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); if (mkdir(path.data(), S_IRWXU) && errno != EEXIST) { - string str = string("Failed to create restore folder. ").append(std::generic_category().message(errno)); - throw BError(BError::Codes::EXT_INVAL_ARG, str); + HILOGE("Failed to create restore folder : %{private}s, err = %{public}d", path.c_str(), errno); + errCode = errno; } string reportName = path + BConstants::BLANK_REPORT_NAME; UniqueFd reportFd(open(reportName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); if (reportFd < 0) { HILOGE("Failed to open report file = %{private}s, err = %{public}d", reportName.c_str(), errno); - throw BError(BError::Codes::EXT_INVAL_ARG, string("open report file failed")); + errCode = errno; } auto proxy = ServiceProxy::GetInstance(); if (proxy == nullptr) { - throw BError(BError::Codes::EXT_BROKEN_BACKUP_SA, std::generic_category().message(errno)); + HILOGE("Failed to get file handle for special version clone"); + return BError(BError::Codes::EXT_BROKEN_BACKUP_SA).GetCode(); } - auto ret = proxy->AppIncrementalFileReady(fileName, move(fd), move(reportFd), ERR_OK); + auto ret = proxy->AppIncrementalFileReady(fileName, move(fd), move(reportFd), errCode); if (ret != ERR_OK) { HILOGE("Failed to AppIncrementalFileReady %{public}d", ret); } return ERR_OK; } -static string GetIncrementalFileHandlePath() +static string GetIncrementalFileHandlePath(const string &fileName) { string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); if (mkdir(path.data(), S_IRWXU) && errno != EEXIST) { string str = string("Failed to create restore folder. ").append(std::generic_category().message(errno)); throw BError(BError::Codes::EXT_INVAL_ARG, str); } - return path; + string tarName = path + fileName; + return tarName; } ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) @@ -262,19 +265,18 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) extension_->GetExtensionAction()); throw BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid"); } - HILOGI("extension: Start GetIncrementalFileHandle"); VerifyCaller(); if (extension_->SpecialVersionForCloneAndCloud()) { return GetIncreFileHandleForSpecialVersion(fileName); } - HILOGI("extension: single to single fileName:%{public}s", GetAnonyPath(fileName).c_str()); - string path = GetIncrementalFileHandlePath(); - string tarName = path + fileName; - if (access(tarName.c_str(), F_OK) == 0) { - throw BError(BError::Codes::EXT_INVAL_ARG, string("The file already exists")); - } + HILOGI("extension: GetIncrementalFileHandle single to single Name:%{public}s", GetAnonyPath(fileName).c_str()); + string tarName = GetIncrementalFileHandlePath(fileName); int32_t errCode = ERR_OK; + if (access(tarName.c_str(), F_OK) == 0) { + HILOGE("The file already exists, tarname = %{private}s, err =%{public}d", tarName.c_str(), errno); + errCode = errno; + } UniqueFd fd(open(tarName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); if (fd < 0) { HILOGE("Failed to open tar file = %{private}s, err = %{public}d", tarName.c_str(), errno); @@ -283,7 +285,8 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) // 对应的简报文件 string reportName = GetReportFileName(tarName); if (access(reportName.c_str(), F_OK) == 0) { - throw BError(BError::Codes::EXT_INVAL_ARG, string("The report file already exists")); + HILOGE("The report file already exists, Name = %{private}s, err =%{public}d", reportName.c_str(), errno); + errCode = errno; } UniqueFd reportFd(open(reportName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); if (reportFd < 0) { @@ -303,24 +306,29 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) } catch (...) { HILOGE("Failed to get incremental file handle"); DoClear(); - return BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + return BError(BError::Codes::EXT_BROKEN_IPC).GetCode(); } } ErrCode BackupExtExtension::HandleClear() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - HILOGI("begin clear"); - if (extension_ == nullptr) { - HILOGE("Failed to handle clear, extension is nullptr"); - return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); + try { + HILOGI("begin clear"); + if (extension_ == nullptr) { + HILOGE("Failed to handle clear, extension is nullptr"); + return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); + } + if (extension_->GetExtensionAction() == BConstants::ExtensionAction::INVALID) { + return BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid").GetCode(); + } + VerifyCaller(); + DoClear(); + return ERR_OK; + } catch (...) { + HILOGE("Failed to handle clear"); + return BError(BError::Codes::EXT_BROKEN_IPC).GetCode(); } - if (extension_->GetExtensionAction() == BConstants::ExtensionAction::INVALID) { - return BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid").GetCode(); - } - VerifyCaller(); - DoClear(); - return ERR_OK; } static ErrCode IndexFileReady(const TarMap &pkgInfo, sptr proxy) @@ -352,36 +360,26 @@ static ErrCode IndexFileReady(const TarMap &pkgInfo, sptr proxy) return ret; } -ErrCode BackupExtExtension::BigFileReady(sptr proxy) +ErrCode BackupExtExtension::BigFileReady(const TarMap &bigFileInfo, sptr proxy) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - UniqueFd fd(open(INDEX_FILE_BACKUP.data(), O_RDONLY)); - if (fd < 0) { - HILOGE("Failed to open index json file = %{private}s, err = %{public}d", INDEX_FILE_BACKUP.c_str(), errno); - return BError::GetCodeByErrno(errno); - } - BJsonCachedEntity cachedEntity(move(fd)); - auto cache = cachedEntity.Structuralize(); - auto pkgInfo = cache.GetExtManageInfo(); - HILOGI("BigFileReady Begin: pkgInfo file size is: %{public}zu", pkgInfo.size()); + HILOGI("BigFileReady Begin: bigFileInfo file size is: %{public}zu", bigFileInfo.size()); ErrCode ret {ERR_OK}; auto startTime = std::chrono::system_clock::now(); int fdNum = 0; - for (auto &item : pkgInfo) { - if (item.hashName.empty() || item.fileName.empty()) { - continue; - } + for (auto &item : bigFileInfo) { WaitToSendFd(startTime, fdNum); int32_t errCode = ERR_OK; - UniqueFd fd(open(item.fileName.data(), O_RDONLY)); + string fllePath = std::get<0>(item.second); + UniqueFd fd(open(fllePath.data(), O_RDONLY)); if (fd < 0) { - HILOGE("open file failed, file name is %{public}s, err = %{public}d", item.fileName.c_str(), errno); + HILOGE("open file failed, file name is %{public}s, err = %{public}d", fllePath.c_str(), errno); errCode = errno; } - ret = proxy->AppFileReady(item.hashName, std::move(fd), errCode); + ret = proxy->AppFileReady(item.first, std::move(fd), errCode); if (SUCCEEDED(ret)) { - HILOGI("The application is packaged successfully, package name is %{public}s", item.hashName.c_str()); + HILOGI("The application is packaged successfully, package name is %{public}s", item.first.c_str()); } else { HILOGW("Current file execute app file ready interface failed, ret is:%{public}d", ret); } @@ -441,6 +439,9 @@ ErrCode BackupExtExtension::PublishIncrementalFile(const string &fileName) } VerifyCaller(); // 异步执行解压操作 + if (BackupPara::GetBackupDebugState()) { + isDebug_ = true; + } if (extension_->AllowToBackupRestore()) { if (extension_->SpecialVersionForCloneAndCloud()) { HILOGI("Create task for Incremental SpecialVersion"); @@ -466,9 +467,10 @@ ErrCode BackupExtExtension::PublishIncrementalFile(const string &fileName) } } -ErrCode BackupExtExtension::HandleBackup() +ErrCode BackupExtExtension::HandleBackup(bool isClearData) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + SetClearDataFlag(isClearData); if (extension_ == nullptr) { HILOGE("Failed to handle backup, extension is nullptr"); return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); @@ -482,10 +484,10 @@ ErrCode BackupExtExtension::HandleBackup() .GetCode(); } AsyncTaskOnBackup(); - return 0; + return ERR_OK; } -static bool IsUserTar(const string &tarFile, const std::vector &extManageInfo) +static bool IsUserTar(const string &tarFile, const std::vector &extManageInfo, off_t &tarFileSize) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); if (tarFile.empty()) { @@ -495,13 +497,14 @@ static bool IsUserTar(const string &tarFile, const std::vector &e [&tarFile](const auto &item) { return item.hashName == tarFile; }); if (iter != extManageInfo.end()) { HILOGI("tarFile:%{public}s isUserTar:%{public}d", tarFile.data(), iter->isUserTar); + tarFileSize = iter->sta.st_size; return iter->isUserTar; } HILOGE("Can not find tarFile %{public}s", tarFile.data()); return false; } -static pair> GetFileInfos(const vector &includes, const vector &excludes) +static pair> GetFileInfos(const vector &includes, const vector &excludes) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); auto [errCode, files, smallFiles] = BDir::GetBigFiles(includes, excludes); @@ -537,6 +540,76 @@ static pair> GetFileInfos(const vector &includes, return {bigFiles, smallFiles}; } +/** + * 全量tar包回传 + */ +static ErrCode TarFileReady(const TarMap &tarFileInfo, sptr proxy) +{ + if (tarFileInfo.empty()) { + HILOGI("TarFileReady: No tar file found"); + return ERR_OK; + } + string tarName = tarFileInfo.begin()->first; + string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_BACKUP); + string tarPath = path + tarName; + int32_t errCode = ERR_OK; + UniqueFd fd(open(tarPath.data(), O_RDONLY)); + if (fd < 0) { + HILOGE("TarFileReady open file failed, file name is %{public}s, err = %{public}d", tarName.c_str(), errno); + errCode = errno; + } + int ret = proxy->AppFileReady(tarName, std::move(fd), errCode); + if (SUCCEEDED(ret)) { + HILOGI("TarFileReady: AppFileReady success for %{public}s", tarName.c_str()); + // 删除文件 + RemoveFile(tarName); + } else { + HILOGE("TarFileReady AppFileReady fail to be invoked for %{public}s: ret = %{public}d", tarName.c_str(), ret); + } + return ret; +} + +void BackupExtExtension::DoPacket(const map &srcFiles, TarMap &tar, sptr proxy) +{ + HILOGI("DoPacket begin, infos count: %{public}zu", srcFiles.size()); + string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_BACKUP); + int64_t totalSize = 0; + uint32_t fileCount = 0; + vector packFiles; + TarFile::GetInstance().SetPacketMode(true); // 设置下打包模式 + auto startTime = std::chrono::system_clock::now(); + int fdNum = 0; + for (auto small : srcFiles) { + totalSize += small.second; + fileCount += 1; + packFiles.emplace_back(small.first); + if (totalSize >= DEFAULT_SLICE_SIZE || fileCount >= MAX_FILE_COUNT) { + TarMap tarMap {}; + TarFile::GetInstance().Packet(packFiles, "part", path, tarMap); + tar.insert(tarMap.begin(), tarMap.end()); + // 执行tar包回传功能 + WaitToSendFd(startTime, fdNum); + TarFileReady(tarMap, proxy); + totalSize = 0; + fileCount = 0; + packFiles.clear(); + fdNum += FILE_AND_MANIFEST_FD_COUNT; + RefreshTimeInfo(startTime, fdNum); + } + } + if (fileCount > 0) { + // 打包回传 + TarMap tarMap {}; + TarFile::GetInstance().Packet(packFiles, "part", path, tarMap); + TarFileReady(tarMap, proxy); + fdNum = 1; + WaitToSendFd(startTime, fdNum); + tar.insert(tarMap.begin(), tarMap.end()); + packFiles.clear(); + RefreshTimeInfo(startTime, fdNum); + } +} + int BackupExtExtension::DoBackup(const BJsonEntityExtensionConfig &usrConfig) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); @@ -557,6 +630,11 @@ int BackupExtExtension::DoBackup(const BJsonEntityExtensionConfig &usrConfig) vector includes = usrConfig.GetIncludes(); vector excludes = usrConfig.GetExcludes(); + auto proxy = ServiceProxy::GetInstance(); + if (proxy == nullptr) { + throw BError(BError::Codes::EXT_BROKEN_BACKUP_SA, std::generic_category().message(errno)); + } + // 大文件处理 HILOGI("Start packet bigfiles and small files"); auto [bigFileInfo, smallFiles] = GetFileInfos(includes, excludes); @@ -567,26 +645,27 @@ int BackupExtExtension::DoBackup(const BJsonEntityExtensionConfig &usrConfig) } } + // 回传大文件 + HILOGI("Will notify BigFileReady"); + auto res = BigFileReady(bigFileInfo, proxy); + HILOGI("Start packet Tar files"); - // 分片打包 + // 分片打包, 回传tar包 TarMap tarMap {}; - TarFile::GetInstance().Packet(smallFiles, "part", path, tarMap); + DoPacket(smallFiles, tarMap, proxy); bigFileInfo.insert(tarMap.begin(), tarMap.end()); - auto proxy = ServiceProxy::GetInstance(); - if (proxy == nullptr) { - throw BError(BError::Codes::EXT_BROKEN_BACKUP_SA, std::generic_category().message(errno)); - } + HILOGI("Do backup, DoPacket end"); + HILOGI("Will notify IndexFileReady"); if (auto ret = IndexFileReady(bigFileInfo, proxy); ret) { return ret; } - HILOGI("Will notify BigFileReady"); - auto res = BigFileReady(proxy); + HILOGI("HandleBackup finish, ret = %{public}d", res); return res; } -int BackupExtExtension::DoRestore(const string &fileName) +int BackupExtExtension::DoRestore(const string &fileName, const off_t fileSize) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("Do restore"); @@ -603,18 +682,21 @@ int BackupExtExtension::DoRestore(const string &fileName) string tarName = path + fileName; // 当用户指定fullBackupOnly字段或指定版本的恢复,解压目录当前在/backup/restore - if (extension_->SpecialVersionForCloneAndCloud() || extension_->UseFullBackupOnly()) { - ErrCode err = UntarFile::GetInstance().UnPacket(tarName, path); - if (err != 0) { - HILOGE("Failed to untar file = %{public}s, err = %{public}d", tarName.c_str(), err); - return err; - } - } else { - ErrCode err = UntarFile::GetInstance().UnPacket(tarName, "/"); - if (err != 0) { - HILOGE("Failed to untar file = %{public}s, err = %{public}d", tarName.c_str(), err); - return err; + if (!extension_->SpecialVersionForCloneAndCloud() && !extension_->UseFullBackupOnly()) { + path = "/"; + } + auto [ret, fileInfos, errInfos] = UntarFile::GetInstance().UnPacket(tarName, path); + if (isDebug_) { + if (ret != 0) { + endFileInfos_[tarName] = fileSize; + errFileInfos_[tarName] = { ret }; } + endFileInfos_.merge(fileInfos); + errFileInfos_.merge(errInfos); + } + if (ret != 0) { + HILOGE("Failed to untar file = %{public}s, err = %{public}d", tarName.c_str(), ret); + return ret; } HILOGI("Application recovered successfully, package path is %{public}s", tarName.c_str()); @@ -637,6 +719,26 @@ static unordered_map GetTarIncludes(const string return rp.GetReportInfos(); } +void BackupExtExtension::DealIncreUnPacketResult(const off_t tarFileSize, const std::string &tarFileName, + const std::tuple &result) +{ + if (!isDebug_) { + return; + } + int err = std::get(result); + if (!isRpValid_) { + if (err != ERR_OK) { + endFileInfos_[tarFileName] = tarFileSize; + errFileInfos_[tarFileName] = {err}; + } else { + EndFileInfo tmpEndInfo = std::get(result); + endFileInfos_.merge(tmpEndInfo); + } + } + ErrFileInfo tmpErrInfo = std::get(result); + errFileInfos_.merge(tmpErrInfo); +} + int BackupExtExtension::DoIncrementalRestore() { HILOGI("Do incremental restore"); @@ -646,9 +748,11 @@ int BackupExtExtension::DoIncrementalRestore() } auto fileSet = GetIdxFileData(); auto extManageInfo = GetExtManageInfo(); + std::tuple unPacketRes; ErrCode err = ERR_OK; for (auto item : fileSet) { // 处理要解压的tar文件 - if (ExtractFileExt(item) == "tar" && !IsUserTar(item, extManageInfo)) { + off_t tarFileSize = 0; + if (ExtractFileExt(item) == "tar" && !IsUserTar(item, extManageInfo, tarFileSize)) { if (extension_->GetExtensionAction() != BConstants::ExtensionAction::RESTORE) { return EPERM; } @@ -658,11 +762,16 @@ int BackupExtExtension::DoIncrementalRestore() string tarName = path + item; // 当用户指定fullBackupOnly字段或指定版本的恢复,解压目录当前在/backup/restore - if (extension_->SpecialVersionForCloneAndCloud() || extension_->UseFullBackupOnly()) { - err = UntarFile::GetInstance().IncrementalUnPacket(tarName, path, GetTarIncludes(tarName)); - } else { - err = UntarFile::GetInstance().IncrementalUnPacket(tarName, "/", GetTarIncludes(tarName)); + unordered_map result = GetTarIncludes(tarName); + if ((!extension_->SpecialVersionForCloneAndCloud()) && (!extension_->UseFullBackupOnly())) { + path = "/"; } + if (isDebug_) { + FillEndFileInfos(path, result); + } + unPacketRes = UntarFile::GetInstance().IncrementalUnPacket(tarName, path, result); + err = std::get(unPacketRes); + DealIncreUnPacketResult(tarFileSize, item, unPacketRes); HILOGI("Application recovered successfully, package path is %{public}s", tarName.c_str()); } } @@ -708,27 +817,33 @@ void BackupExtExtension::AsyncTaskBackup(const string config) }); } -static void RestoreBigFilesForSpecialCloneCloud(ExtManageInfo item) +void BackupExtExtension::RestoreBigFilesForSpecialCloneCloud(const ExtManageInfo &item) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - struct stat &sta = item.sta; + if (isDebug_) { + endFileInfos_[item.hashName] = item.sta.st_size; + } + const struct stat &sta = item.sta; string fileName = item.hashName; if (chmod(fileName.c_str(), sta.st_mode) != 0) { HILOGE("Failed to chmod filePath, err = %{public}d", errno); + errFileInfos_[fileName].push_back(errno); } struct timespec tv[2] = {sta.st_atim, sta.st_mtim}; UniqueFd fd(open(fileName.data(), O_RDONLY)); if (fd < 0) { HILOGE("Failed to open file = %{public}s, err = %{public}d", GetAnonyPath(fileName).c_str(), errno); + errFileInfos_[fileName].push_back(errno); return; } if (futimens(fd.Get(), tv) != 0) { + errFileInfos_[fileName].push_back(errno); HILOGE("Failed to change the file time. %{public}s , %{public}d", GetAnonyPath(fileName).c_str(), errno); } } -static ErrCode RestoreTarForSpecialCloneCloud(ExtManageInfo item) +ErrCode BackupExtExtension::RestoreTarForSpecialCloneCloud(const ExtManageInfo &item) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); string tarName = item.hashName; @@ -740,7 +855,11 @@ static ErrCode RestoreTarForSpecialCloneCloud(ExtManageInfo item) if (untarPath.back() != BConstants::FILE_SEPARATOR_CHAR) { untarPath += BConstants::FILE_SEPARATOR_CHAR; } - ErrCode err = UntarFile::GetInstance().UnPacket(tarName, untarPath); + auto [err, fileInfos, errInfos] = UntarFile::GetInstance().UnPacket(tarName, untarPath); + if (isDebug_) { + endFileInfos_.merge(fileInfos); + errFileInfos_.merge(errInfos); + } if (err != ERR_OK) { HILOGE("Failed to untar file = %{public}s, err = %{public}d", tarName.c_str(), err); return err; @@ -751,11 +870,10 @@ static ErrCode RestoreTarForSpecialCloneCloud(ExtManageInfo item) return ERR_OK; } -static ErrCode RestoreFilesForSpecialCloneCloud() +ErrCode BackupExtExtension::RestoreFilesForSpecialCloneCloud() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); // 获取索引文件内容 - string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); UniqueFd fd(open(INDEX_FILE_RESTORE.data(), O_RDONLY)); if (fd < 0) { HILOGE("Failed to open index json file = %{private}s, err = %{public}d", INDEX_FILE_RESTORE.c_str(), errno); @@ -767,6 +885,7 @@ static ErrCode RestoreFilesForSpecialCloneCloud() HILOGI("Start do restore for SpecialCloneCloud."); for (auto &item : info) { if (item.hashName.empty()) { + HILOGE("Hash name empty"); continue; } if (item.isUserTar || item.isBigFile) { @@ -774,7 +893,12 @@ static ErrCode RestoreFilesForSpecialCloneCloud() RestoreBigFilesForSpecialCloneCloud(item); } else { // 待解压tar文件处理 - if (RestoreTarForSpecialCloneCloud(item) != ERR_OK) { + int ret = RestoreTarForSpecialCloneCloud(item); + if (isDebug_ && ret != ERR_OK) { + errFileInfos_[item.hashName].push_back(ret); + endFileInfos_[item.hashName] = item.sta.st_size; + } + if (ret != ERR_OK) { HILOGE("Failed to restore tar file %{public}s", item.hashName.c_str()); return ERR_INVALID_VALUE; } @@ -808,23 +932,26 @@ static bool RestoreBigFilePrecheck(string &fileName, const string &path, const s return true; } -static void RestoreBigFileAfter(const string &filePath, const struct stat &sta) +void BackupExtExtension::RestoreBigFileAfter(const string &filePath, const struct stat &sta) { if (chmod(filePath.c_str(), sta.st_mode) != 0) { + errFileInfos_[filePath].push_back(errno); HILOGE("Failed to chmod filePath, err = %{public}d", errno); } struct timespec tv[2] = {sta.st_atim, sta.st_mtim}; UniqueFd fd(open(filePath.data(), O_RDONLY)); if (fd < 0) { + errFileInfos_[filePath].push_back(errno); HILOGE("Failed to open file = %{public}s, err = %{public}d", GetAnonyPath(filePath).c_str(), errno); return; } if (futimens(fd.Get(), tv) != 0) { + errFileInfos_[filePath].push_back(errno); HILOGE("failed to change the file time. %{public}s , %{public}d", GetAnonyPath(filePath).c_str(), errno); } } -static void RestoreBigFiles(bool appendTargetPath) +void BackupExtExtension::RestoreBigFiles(bool appendTargetPath) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); // 获取索引文件内容 @@ -850,6 +977,7 @@ static void RestoreBigFiles(bool appendTargetPath) UniqueFd fd(open(reportPath.data(), O_RDONLY)); if (fd < 0) { HILOGE("Failed to open report file = %{public}s, err = %{public}d", reportPath.c_str(), errno); + errFileInfos_[item.hashName].push_back(errno); throw BError(BError::Codes::EXT_INVAL_ARG, string("open report file failed")); } BReportEntity rp(move(fd)); @@ -858,11 +986,15 @@ static void RestoreBigFiles(bool appendTargetPath) string fileName = path + itemHashName; string filePath = appendTargetPath ? (path + itemFileName) : itemFileName; + if (isDebug_) { + endFileInfos_[filePath] = item.sta.st_size; + } + if (!RestoreBigFilePrecheck(fileName, path, item.hashName, filePath)) { continue; } - if (!BFile::MoveFile(fileName, filePath)) { + errFileInfos_[filePath].push_back(errno); HILOGE("failed to move the file. err = %{public}d", errno); continue; } @@ -872,8 +1004,29 @@ static void RestoreBigFiles(bool appendTargetPath) HILOGI("End Restore Big Files"); } -static void DeleteBackupTars() +void BackupExtExtension::FillEndFileInfos(const std::string &path, + const unordered_map &result) { + isRpValid_ = result.size() > 0; + if (!isRpValid_) { + return; + } + for (const auto &it : result) { + std::string filePath = it.first; + if (!filePath.empty() && filePath.size() <= PATH_MAX) { + endFileInfos_[filePath] = it.second.size; + } else { + HILOGE("FileName : %{public}s error", GetAnonyPath(filePath).c_str()); + } + } +} + +void BackupExtExtension::DeleteBackupTars() +{ + if (!isClearData_) { + HILOGI("configured not clear data."); + return; + } HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); UniqueFd fd(open(INDEX_FILE_RESTORE.data(), O_RDONLY)); if (fd < 0) { @@ -887,7 +1040,8 @@ static void DeleteBackupTars() auto path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); auto extManageInfo = GetExtManageInfo(); for (auto &item : info) { - if (ExtractFileExt(item) != "tar" || IsUserTar(item, extManageInfo)) { + off_t tarFileSize = 0; + if (ExtractFileExt(item) != "tar" || IsUserTar(item, extManageInfo, tarFileSize)) { continue; } string tarPath = path + item; @@ -901,8 +1055,12 @@ static void DeleteBackupTars() HILOGI("End execute DeleteBackupTars"); } -static void DeleteBackupIncrementalTars() +void BackupExtExtension::DeleteBackupIncrementalTars() { + if (!isClearData_) { + HILOGI("configured not clear data."); + return; + } UniqueFd fd(open(INDEX_FILE_RESTORE.data(), O_RDONLY)); if (fd < 0) { HILOGE("Failed to open index json file = %{private}s, err = %{public}d", INDEX_FILE_RESTORE.c_str(), errno); @@ -915,7 +1073,8 @@ static void DeleteBackupIncrementalTars() auto path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); auto extManageInfo = GetExtManageInfo(); for (auto &item : info) { - if (ExtractFileExt(item) != "tar" || IsUserTar(item, extManageInfo)) { + off_t tarFileSize = 0; + if (ExtractFileExt(item) != "tar" || IsUserTar(item, extManageInfo, tarFileSize)) { continue; } string tarPath = path + item; @@ -937,6 +1096,17 @@ static void DeleteBackupIncrementalTars() } } +void BackupExtExtension::HandleSpecialVersionRestore() +{ + auto ret = RestoreFilesForSpecialCloneCloud(); + if (ret == ERR_OK) { + AsyncTaskRestoreForUpgrade(); + } else { + AppDone(ret); + DoClear(); + } +} + void BackupExtExtension::AsyncTaskRestore(std::set fileSet, const std::vector extManageInfo) { @@ -947,27 +1117,22 @@ void BackupExtExtension::AsyncTaskRestore(std::set fileSet, try { int ret = ERR_OK; if (ptr->extension_->SpecialVersionForCloneAndCloud()) { - ret = RestoreFilesForSpecialCloneCloud(); - if (ret == ERR_OK) { - ptr->AsyncTaskRestoreForUpgrade(); - } else { - ptr->AppDone(ret); - ptr->DoClear(); - } + ptr->HandleSpecialVersionRestore(); return; } // 解压 for (auto item : fileSet) { // 处理要解压的tar文件 - if (ExtractFileExt(item) == "tar" && !IsUserTar(item, extManageInfo)) { - ret = ptr->DoRestore(item); + off_t tarFileSize = 0; + if (ExtractFileExt(item) == "tar" && !IsUserTar(item, extManageInfo, tarFileSize)) { + ret = ptr->DoRestore(item, tarFileSize); } } // 恢复用户tar包以及大文件 // 目的地址是否需要拼接path(临时目录),FullBackupOnly为true并且非特殊场景 bool appendTargetPath = ptr->extension_->UseFullBackupOnly() && !ptr->extension_->SpecialVersionForCloneAndCloud(); - RestoreBigFiles(appendTargetPath); - DeleteBackupTars(); + ptr->RestoreBigFiles(appendTargetPath); + ptr->DeleteBackupTars(); if (ret == ERR_OK) { ptr->AsyncTaskRestoreForUpgrade(); } else { @@ -1003,17 +1168,22 @@ void BackupExtExtension::AsyncTaskIncrementalRestore() BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { + if (ptr != nullptr && ptr->isDebug_) { + ptr->CheckTmpDirFileInfos(); + } // 解压 int ret = ptr->DoIncrementalRestore(); // 恢复用户tar包以及大文件 // 目的地址是否需要拼接path(临时目录),FullBackupOnly为true并且非特殊场景 bool appendTargetPath = ptr->extension_->UseFullBackupOnly() && !ptr->extension_->SpecialVersionForCloneAndCloud(); - RestoreBigFiles(appendTargetPath); + ptr->RestoreBigFiles(appendTargetPath); // delete 1.tar/manage.json - DeleteBackupIncrementalTars(); - + ptr->DeleteBackupIncrementalTars(); + if (ptr != nullptr && ptr->isDebug_) { + ptr->CheckRestoreFileInfos(); + } if (ret == ERR_OK) { HILOGI("after extra, do incremental restore."); ptr->AsyncTaskIncrementalRestoreForUpgrade(); @@ -1050,7 +1220,13 @@ void BackupExtExtension::AsyncTaskIncreRestoreSpecialVersion() auto ptr = obj.promote(); BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); try { - int ret = RestoreFilesForSpecialCloneCloud(); + if (ptr != nullptr && ptr->isDebug_) { + ptr->CheckTmpDirFileInfos(true); + } + int ret = ptr->RestoreFilesForSpecialCloneCloud(); + if (ptr != nullptr && ptr->isDebug_) { + ptr->CheckRestoreFileInfos(); + } if (ret == ERR_OK) { ptr->AsyncTaskIncrementalRestoreForUpgrade(); } else { @@ -1084,27 +1260,13 @@ void BackupExtExtension::AsyncTaskRestoreForUpgrade() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); auto task = [obj {wptr(this)}]() { - auto callBackup = [obj](ErrCode errCode, std::string errMsg) { - auto extensionPtr = obj.promote(); - if (extensionPtr == nullptr) { - HILOGE("Ext extension handle have been released"); - return; - } - HILOGI("Current bundle will execute app done"); - if (errMsg.empty()) { - extensionPtr->AppDone(errCode); - } else { - std::string errInfo; - BJsonUtil::BuildRestoreErrInfo(errInfo, errCode, errMsg); - extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::FULL_RESTORE, errCode); - } - extensionPtr->DoClear(); - }; auto ptr = obj.promote(); BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { - auto callBackupEx = ptr->RestoreResultCallbackEx(obj); + auto callBackup = ptr->FullRestoreCallback(obj); + auto callBackupEx = ptr->FullRestoreCallbackEx(obj); + ptr->CreateExecOnProcessTask(BackupRestoreScenario::FULL_RESTORE); ErrCode err = ptr->extension_->OnRestore(callBackup, callBackupEx); if (err != ERR_OK) { ptr->AppDone(BError::GetCodeByErrno(err)); @@ -1141,27 +1303,13 @@ void BackupExtExtension::ExtClear() void BackupExtExtension::AsyncTaskIncrementalRestoreForUpgrade() { auto task = [obj {wptr(this)}]() { - auto callBackup = [obj](ErrCode errCode, std::string errMsg) { - auto extensionPtr = obj.promote(); - if (extensionPtr == nullptr) { - HILOGE("Ext extension handle have been released"); - return; - } - HILOGI("Current bundle will execute app done"); - if (errMsg.empty()) { - extensionPtr->AppIncrementalDone(errCode); - } else { - std::string errInfo; - BJsonUtil::BuildRestoreErrInfo(errInfo, errCode, errMsg); - extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::INCREMENTAL_RESTORE, errCode); - } - extensionPtr->DoClear(); - }; auto ptr = obj.promote(); BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { + auto callBackup = ptr->IncRestoreResultCallback(obj); auto callBackupEx = ptr->IncRestoreResultCallbackEx(obj); + ptr->CreateExecOnProcessTask(BackupRestoreScenario::INCREMENTAL_RESTORE); ErrCode err = ptr->extension_->OnRestore(callBackup, callBackupEx); if (err != ERR_OK) { HILOGE("OnRestore done, err = %{pubilc}d", err); @@ -1198,6 +1346,10 @@ void BackupExtExtension::DoClear() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { + if (!isClearData_) { + HILOGI("configured not clear data."); + return; + } string backupCache = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_BACKUP); string restoreCache = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); @@ -1224,7 +1376,11 @@ void BackupExtExtension::AppDone(ErrCode errCode) HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("AppDone Begin."); auto proxy = ServiceProxy::GetInstance(); - BExcepUltils::BAssert(proxy, BError::Codes::EXT_BROKEN_IPC, "Failed to obtain the ServiceProxy handle"); + if (proxy == nullptr) { + HILOGE("Failed to obtain the ServiceProxy handle"); + DoClear(); + return; + } auto ret = proxy->AppDone(errCode); if (ret != ERR_OK) { HILOGE("Failed to notify the app done. err = %{public}d", ret); @@ -1247,24 +1403,13 @@ void BackupExtExtension::AsyncTaskOnBackup() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); auto task = [obj {wptr(this)}]() { - auto callBackup = [obj](ErrCode errCode, std::string errMsg) { - HILOGI("begin call backup"); - auto extensionPtr = obj.promote(); - if (extensionPtr == nullptr) { - HILOGE("Ext extension handle have been released"); - return; - } - if (extensionPtr->extension_ == nullptr) { - HILOGE("Extension handle have been released"); - return; - } - extensionPtr->AsyncTaskBackup(extensionPtr->extension_->GetUsrConfig()); - }; auto ptr = obj.promote(); BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { - auto callBackupEx = ptr->HandleTaskBackupEx(obj); + auto callBackup = ptr->HandleFullBackupCallback(obj); + auto callBackupEx = ptr->HandleFullBackupCallbackEx(obj); + ptr->CreateExecOnProcessTask(BackupRestoreScenario::FULL_BACKUP); ErrCode err = ptr->extension_->OnBackup(callBackup, callBackupEx); if (err != ERR_OK) { HILOGE("OnBackup done, err = %{pubilc}d", err); @@ -1290,32 +1435,37 @@ void BackupExtExtension::AsyncTaskOnBackup() }); } -ErrCode BackupExtExtension::HandleRestore() +ErrCode BackupExtExtension::HandleRestore(bool isClearData) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - VerifyCaller(); - if (extension_ == nullptr) { - HILOGE("Failed to handle restore, extension is nullptr"); - throw BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr"); - } - if (extension_->GetExtensionAction() != BConstants::ExtensionAction::RESTORE) { - HILOGE("Failed to get file handle, because action is %{public}d invalid", extension_->GetExtensionAction()); - throw BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid"); - } - // read backup_config is allow to backup or restore - if (!extension_->AllowToBackupRestore()) { - HILOGE("Application does not allow backup or restore"); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") - .GetCode(); - } + try { + VerifyCaller(); + SetClearDataFlag(isClearData); + if (extension_ == nullptr) { + HILOGE("Failed to handle restore, extension is nullptr"); + return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); + } + if (extension_->GetExtensionAction() != BConstants::ExtensionAction::RESTORE) { + HILOGE("Failed to get file handle, because action is %{public}d invalid", extension_->GetExtensionAction()); + return BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid").GetCode(); + } + // read backup_config is allow to backup or restore + if (!extension_->AllowToBackupRestore()) { + HILOGE("Application does not allow backup or restore"); + return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") + .GetCode(); + } - // async do restore. - if (extension_->WasFromSpecialVersion() && extension_->RestoreDataReady()) { - HILOGI("Restore directly when upgrading."); - AsyncTaskRestoreForUpgrade(); + // async do restore. + if (extension_->WasFromSpecialVersion() && extension_->RestoreDataReady()) { + HILOGI("Restore directly when upgrading."); + AsyncTaskRestoreForUpgrade(); + } + return ERR_OK; + } catch (...) { + HILOGE("Failed to handle restore"); + return BError(BError::Codes::EXT_BROKEN_IPC).GetCode(); } - - return 0; } static bool CheckTar(const string &fileName) @@ -1397,27 +1547,33 @@ void BackupExtExtension::CompareFiles(UniqueFd incrementalFd, ErrCode BackupExtExtension::HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) { - HILOGI("Start HandleIncrementalBackup"); HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - if (extension_ == nullptr) { - HILOGE("Failed to handle incremental backup, extension is nullptr"); - return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); + try { + HILOGI("Start HandleIncrementalBackup"); + if (extension_ == nullptr) { + HILOGE("Failed to handle incremental backup, extension is nullptr"); + return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); + } + string usrConfig = extension_->GetUsrConfig(); + BJsonCachedEntity cachedEntity(usrConfig); + auto cache = cachedEntity.Structuralize(); + if (!cache.GetAllowToBackupRestore()) { + HILOGE("Application does not allow backup or restore"); + return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") + .GetCode(); + } + AsyncTaskDoIncrementalBackup(move(incrementalFd), move(manifestFd)); + return ERR_OK; + } catch (...) { + HILOGE("Failed to handle incremental backup"); + return BError(BError::Codes::EXT_INVAL_ARG).GetCode(); } - string usrConfig = extension_->GetUsrConfig(); - BJsonCachedEntity cachedEntity(usrConfig); - auto cache = cachedEntity.Structuralize(); - if (!cache.GetAllowToBackupRestore()) { - HILOGE("Application does not allow backup or restore"); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") - .GetCode(); - } - AsyncTaskDoIncrementalBackup(move(incrementalFd), move(manifestFd)); - return 0; } -ErrCode BackupExtExtension::IncrementalOnBackup() +ErrCode BackupExtExtension::IncrementalOnBackup(bool isClearData) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + SetClearDataFlag(isClearData); if (extension_ == nullptr) { HILOGE("Failed to handle incremental onBackup, extension is nullptr"); return BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr").GetCode(); @@ -1431,7 +1587,7 @@ ErrCode BackupExtExtension::IncrementalOnBackup() .GetCode(); } AsyncTaskOnIncrementalBackup(); - return 0; + return ERR_OK; } tuple BackupExtExtension::GetIncrementalBackupFileHandle() @@ -1631,6 +1787,13 @@ void BackupExtExtension::AsyncTaskOnIncrementalBackup() if (proxy == nullptr) { throw BError(BError::Codes::EXT_BROKEN_BACKUP_SA, std::generic_category().message(errno)); } + auto extPtr = obj.promote(); + if (extPtr == nullptr) { + HILOGE("Current extension execute call backup error, extPtr is empty"); + return; + } + extPtr->appExecFinished_ = true; + extPtr->ShutDownExecOnProcessTask(); HILOGI("Start GetAppLocalListAndDoIncrementalBackup"); proxy->GetAppLocalListAndDoIncrementalBackup(); }; @@ -1639,6 +1802,7 @@ void BackupExtExtension::AsyncTaskOnIncrementalBackup() BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { auto callBackupEx = ptr->HandleBackupEx(obj); + ptr->CreateExecOnProcessTask(BackupRestoreScenario::INCREMENTAL_BACKUP); ErrCode err = ptr->extension_->OnBackup(callBackup, callBackupEx); if (err != ERR_OK) { HILOGE("OnBackup done, err = %{pubilc}d", err); @@ -1799,7 +1963,11 @@ void BackupExtExtension::AppIncrementalDone(ErrCode errCode) { HILOGI("Begin"); auto proxy = ServiceProxy::GetInstance(); - BExcepUltils::BAssert(proxy, BError::Codes::EXT_BROKEN_IPC, "Failed to obtain the ServiceProxy handle"); + if (proxy == nullptr) { + HILOGE("Failed to obtain the ServiceProxy handle"); + DoClear(); + return; + } auto ret = proxy->AppIncrementalDone(errCode); if (ret != ERR_OK) { HILOGE("Failed to notify the app done. err = %{public}d", ret); @@ -1840,48 +2008,20 @@ ErrCode BackupExtExtension::GetBackupInfo(std::string &result) ErrCode BackupExtExtension::UpdateFdSendRate(std::string &bundleName, int32_t sendRate) { - std::lock_guard lock(updateSendRateLock_); - HILOGI("Update SendRate, bundleName:%{public}s, sendRate:%{public}d", bundleName.c_str(), sendRate); - VerifyCaller(); - bundleName_ = bundleName; - sendRate_ = sendRate; - if (sendRate > 0) { - startSendFdRateCon_.notify_one(); + try { + std::lock_guard lock(updateSendRateLock_); + HILOGI("Update SendRate, bundleName:%{public}s, sendRate:%{public}d", bundleName.c_str(), sendRate); + VerifyCaller(); + bundleName_ = bundleName; + sendRate_ = sendRate; + if (sendRate > 0) { + startSendFdRateCon_.notify_one(); + } + return ERR_OK; + } catch (...) { + HILOGE("Failed to UpdateFdSendRate"); + return BError(BError::Codes::EXT_BROKEN_IPC).GetCode(); } - return ERR_OK; -} - -std::function BackupExtExtension::RestoreResultCallbackEx(wptr obj) -{ - HILOGI("Begin get callbackEx"); - return [obj](ErrCode errCode, const std::string restoreRetInfo) { - auto extensionPtr = obj.promote(); - if (extensionPtr == nullptr) { - HILOGE("Ext extension handle have been released"); - return; - } - if (extensionPtr->extension_ == nullptr) { - HILOGE("Extension handle have been released"); - return; - } - extensionPtr->extension_->InvokeAppExtMethod(errCode, restoreRetInfo); - if (errCode == ERR_OK) { - if (restoreRetInfo.size()) { - HILOGI("Will notify restore result report"); - extensionPtr->AppResultReport(restoreRetInfo, BackupRestoreScenario::FULL_RESTORE); - } - return; - } - if (restoreRetInfo.empty()) { - extensionPtr->AppDone(errCode); - extensionPtr->DoClear(); - } else { - std::string errInfo; - BJsonUtil::BuildRestoreErrInfo(errInfo, errCode, restoreRetInfo); - extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::FULL_RESTORE, errCode); - extensionPtr->DoClear(); - } - }; } std::function BackupExtExtension::AppDoneCallbackEx(wptr obj) @@ -1916,10 +2056,14 @@ std::function BackupExtExtension::IncRestoreResultCa extensionPtr->extension_->InvokeAppExtMethod(errCode, restoreRetInfo); if (errCode == ERR_OK) { if (restoreRetInfo.size()) { + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); extensionPtr->AppResultReport(restoreRetInfo, BackupRestoreScenario::INCREMENTAL_RESTORE); } return; } + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); if (restoreRetInfo.empty()) { extensionPtr->AppIncrementalDone(errCode); extensionPtr->DoClear(); @@ -1952,117 +2096,12 @@ std::function BackupExtExtension::HandleBackup extensionPtr->extension_->InvokeAppExtMethod(errCode, backupExRetInfo); if (backupExRetInfo.size()) { HILOGI("Start GetAppLocalListAndDoIncrementalBackup"); + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); proxy->GetAppLocalListAndDoIncrementalBackup(); HILOGI("Will notify backup result report"); extensionPtr->AppResultReport(backupExRetInfo, BackupRestoreScenario::INCREMENTAL_BACKUP); } }; } - -std::function BackupExtExtension::HandleTaskBackupEx(wptr obj) -{ - HILOGI("Begin get HandleTaskBackupEx"); - return [obj](ErrCode errCode, const std::string backupExRetInfo) { - HILOGI("begin call backup"); - auto extensionPtr = obj.promote(); - if (extensionPtr == nullptr) { - HILOGE("Ext extension handle have been released"); - return; - } - if (extensionPtr->extension_ == nullptr) { - HILOGE("Extension handle have been released"); - return; - } - extensionPtr->extension_->InvokeAppExtMethod(errCode, backupExRetInfo); - if (backupExRetInfo.size()) { - extensionPtr->AsyncTaskBackup(extensionPtr->extension_->GetUsrConfig()); - HILOGI("Will notify backup result report"); - extensionPtr->AppResultReport(backupExRetInfo, BackupRestoreScenario::FULL_BACKUP); - } - }; -} - -void BackupExtExtension::WaitToSendFd(std::chrono::system_clock::time_point &startTime, int &fdSendNum) -{ - HILOGD("WaitToSendFd Begin"); - std::unique_lock lock(startSendMutex_); - startSendFdRateCon_.wait(lock, [this] { return sendRate_ > 0; }); - if (fdSendNum >= sendRate_) { - HILOGI("current time fd num is max rate, bundle name:%{public}s, rate:%{public}d", bundleName_.c_str(), - sendRate_); - auto curTime = std::chrono::system_clock::now(); - auto useTimeMs = std::chrono::duration_cast(curTime - startTime).count(); - if (useTimeMs < MAX_FD_GROUP_USE_TIME) { - int32_t sleepTime = MAX_FD_GROUP_USE_TIME - useTimeMs; - HILOGI("will wait time:%{public}d ms", sleepTime); - std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime)); - } else { - HILOGW("current fd send num exceeds one second"); - } - fdSendNum = 0; - startTime = std::chrono::system_clock::now(); - } - HILOGD("WaitToSendFd End"); -} - -void BackupExtExtension::RefreshTimeInfo(std::chrono::system_clock::time_point &startTime, int &fdSendNum) -{ - auto currentTime = std::chrono::system_clock::now(); - auto useTime = std::chrono::duration_cast(currentTime - startTime).count(); - if (useTime >= MAX_FD_GROUP_USE_TIME) { - HILOGI("RefreshTimeInfo Begin, fdSendNum is:%{public}d", fdSendNum); - startTime = std::chrono::system_clock::now(); - fdSendNum = 0; - } -} - -ErrCode BackupExtExtension::GetBundleProcessInfo(std::string &result) -{ - auto obj = wptr(this); - auto ptr = obj.promote(); - if (ptr == nullptr) { - HILOGE("Failed to get ext extension."); - return BError(BError::Codes::EXT_INVAL_ARG, "extension GetBundleProcessInfo exception").GetCode(); - } - if (ptr->extension_ == nullptr) { - HILOGE("Failed to get extension."); - return BError(BError::Codes::EXT_INVAL_ARG, "extension GetBundleProcessInfo exception").GetCode(); - } - auto onProcessCallBack = [ptr](ErrCode errCode, const std::string result) { - if (ptr == nullptr) { - HILOGE("Failed to get ext extension."); - return; - } - HILOGI("GetBundleProcessInfo start. result = %{public}s", result.c_str()); - ptr->bundleProcessInfo_ = result; - }; - auto ret = ptr->extension_->OnProcess(onProcessCallBack); - if (ret != ERR_OK) { - HILOGE("Failed to get bundleProcessInfo. err = %{public}d", ret); - return BError(BError::Codes::EXT_INVAL_ARG, "extension getBackupInfo exception").GetCode(); - } - HILOGD("bundleProcessInfo = %s", bundleProcessInfo_.c_str()); - result = bundleProcessInfo_; - if (!result.size()) { - - } else { - - } - backupInfo_.clear(); - - return ERR_OK; -} - -void BackupExtExtension::ReportAppProcessInfo(const std::string restoreRetInfo, BackupRestoreScenario scenario, ErrCode errCode) -{ - auto proxy = ServiceProxy::GetInstance(); - if (proxy == nullptr) { - HILOGE("ReportAppProcessInfo error, proxy is empty"); - } - auto ret = proxy->ServiceResultReport(restoreRetInfo, scenario, errCode); - if (ret != ERR_OK) { - HILOGE("Failed notify app restoreResultReport, errCode: %{public}d", ret); - } - -} } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/src/ext_extension_stub.cpp b/frameworks/native/backup_ext/src/ext_extension_stub.cpp index 667af89c2..1589df3b4 100644 --- a/frameworks/native/backup_ext/src/ext_extension_stub.cpp +++ b/frameworks/native/backup_ext/src/ext_extension_stub.cpp @@ -47,8 +47,6 @@ ExtExtensionStub::ExtExtensionStub() &ExtExtensionStub::CmdGetIncrementalBackupFileHandle; opToInterfaceMap_[static_cast(IExtensionInterfaceCode::CMD_GET_BACKUP_INFO)] = &ExtExtensionStub::CmdGetBackupInfo; - opToInterfaceMap_[static_cast(IExtensionInterfaceCode::CMD_GET_PROCESS_INFO)] = - &ExtExtensionStub::CmdGetProcessInfo; opToInterfaceMap_[static_cast(IExtensionInterfaceCode::CMD_INCREMENTAL_ON_BACKUP)] = &ExtExtensionStub::CmdIncrementalOnBackup; opToInterfaceMap_[static_cast(IExtensionInterfaceCode::CMD_UPDATE_FD_SENDRATE)] = @@ -108,7 +106,9 @@ ErrCode ExtExtensionStub::CmdHandleClear(MessageParcel &data, MessageParcel &rep ErrCode ExtExtensionStub::CmdHandleBackup(MessageParcel &data, MessageParcel &reply) { - ErrCode res = HandleBackup(); + bool isClearData = true; + isClearData = data.ReadBool(); + ErrCode res = HandleBackup(isClearData); if (!reply.WriteInt32(res)) { stringstream ss; ss << "Failed to send the result " << res; @@ -135,7 +135,9 @@ ErrCode ExtExtensionStub::CmdPublishFile(MessageParcel &data, MessageParcel &rep ErrCode ExtExtensionStub::CmdHandleRestore(MessageParcel &data, MessageParcel &reply) { - ErrCode res = HandleRestore(); + bool isClearData = true; + isClearData = data.ReadBool(); + ErrCode res = HandleRestore(isClearData); if (!reply.WriteInt32(res)) { stringstream ss; ss << "Failed to send the result " << res; @@ -189,7 +191,9 @@ ErrCode ExtExtensionStub::CmdHandleIncrementalBackup(MessageParcel &data, Messag ErrCode ExtExtensionStub::CmdIncrementalOnBackup(MessageParcel &data, MessageParcel &reply) { - ErrCode res = IncrementalOnBackup(); + bool isClearData = true; + isClearData = data.ReadBool(); + ErrCode res = IncrementalOnBackup(isClearData); if (!reply.WriteInt32(res)) { stringstream ss; ss << "Failed to send the result " << res; @@ -241,18 +245,4 @@ ErrCode ExtExtensionStub::CmdUpdateFdSendRate(MessageParcel &data, MessageParcel } return BError(BError::Codes::OK); } - -ErrCode ExtExtensionStub::CmdGetProcessInfo(MessageParcel &data, MessageParcel &reply) -{ - HILOGI("CmdGetProcessInfo Begin"); - std::string result; - int ret = GetBackupInfo(result); - if (!reply.WriteInt32(ret)) { - return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the ret").GetCode(); - } - if (!reply.WriteString(result)) { - return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the result").GetCode(); - } - return BError(BError::Codes::OK); -} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp new file mode 100644 index 000000000..e1554821e --- /dev/null +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -0,0 +1,651 @@ +/* + * 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 "ext_extension.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "accesstoken_kit.h" +#include "bundle_mgr_client.h" +#include "errors.h" +#include "ipc_skeleton.h" + +#include "b_error/b_error.h" +#include "b_error/b_excep_utils.h" +#include "b_filesystem/b_dir.h" +#include "b_filesystem/b_file.h" +#include "b_filesystem/b_file_hash.h" +#include "b_json/b_json_cached_entity.h" +#include "b_jsonutil/b_jsonutil.h" +#include "b_ohos/startup/backup_para.h" +#include "b_tarball/b_tarball_factory.h" +#include "filemgmt_libhilog.h" +#include "hitrace_meter.h" +#include "i_service.h" +#include "sandbox_helper.h" +#include "service_proxy.h" +#include "tar_file.h" +#include "b_anony/b_anony.h" + +namespace OHOS::FileManagement::Backup { +const uint32_t MAX_FD_GROUP_USE_TIME = 1000; // 每组打开最大时间1000ms + +void BackupExtExtension::WaitToSendFd(std::chrono::system_clock::time_point &startTime, int &fdSendNum) +{ + HILOGD("WaitToSendFd Begin"); + std::unique_lock lock(startSendMutex_); + startSendFdRateCon_.wait(lock, [this] { return sendRate_ > 0; }); + if (fdSendNum >= sendRate_) { + HILOGI("current time fd num is max rate, bundle name:%{public}s, rate:%{public}d", bundleName_.c_str(), + sendRate_); + auto curTime = std::chrono::system_clock::now(); + auto useTimeMs = std::chrono::duration_cast(curTime - startTime).count(); + if (useTimeMs < MAX_FD_GROUP_USE_TIME) { + int32_t sleepTime = MAX_FD_GROUP_USE_TIME - useTimeMs; + HILOGI("will wait time:%{public}d ms", sleepTime); + std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime)); + } else { + HILOGW("current fd send num exceeds one second"); + } + fdSendNum = 0; + startTime = std::chrono::system_clock::now(); + } + HILOGD("WaitToSendFd End"); +} + +void BackupExtExtension::RefreshTimeInfo(std::chrono::system_clock::time_point &startTime, int &fdSendNum) +{ + auto currentTime = std::chrono::system_clock::now(); + auto useTime = std::chrono::duration_cast(currentTime - startTime).count(); + if (useTime >= MAX_FD_GROUP_USE_TIME) { + HILOGI("RefreshTimeInfo Begin, fdSendNum is:%{public}d", fdSendNum); + startTime = std::chrono::system_clock::now(); + fdSendNum = 0; + } +} + +void BackupExtExtension::SetClearDataFlag(bool isClearData) +{ + isClearData_ = isClearData; + HILOGI("set clear data flag:%{public}d", isClearData); + if (extension_ == nullptr) { + HILOGE("Extension handle have been released"); + return; + } + extension_->SetClearDataFlag(isClearData); + if (!extension_->WasFromSpecialVersion() && !extension_->RestoreDataReady()) { + DoClear(); + } +} + +std::map BackupExtExtension::GetIdxFileInfos(bool isSpecialVersion) +{ + string restoreDir = isSpecialVersion ? "" : + string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); + auto extManageInfo = GetExtManageInfo(); + std::map idxFileInfos; + for (size_t i = 0; i < extManageInfo.size(); ++i) { + std::string realPath = restoreDir + extManageInfo[i].hashName; + idxFileInfos[realPath] = extManageInfo[i].sta.st_size; + } + return idxFileInfos; +} + +void BackupExtExtension::CheckTmpDirFileInfos(bool isSpecialVersion) +{ + ErrFileInfo errFiles; + auto idxFileInfos = GetIdxFileInfos(isSpecialVersion); + struct stat attr; + for (auto it : idxFileInfos) { + if (it.first.size() >= PATH_MAX || stat(it.first.data(), &attr) == -1) { + HILOGE("(Debug) Failed to get stat of %{public}s, errno = %{public}d", + GetAnonyPath(it.first).c_str(), errno); + errFiles[it.first].push_back(errno); + } else if (it.second != attr.st_size) { + HILOGE("(Debug) RecFile:%{public}s size err, recSize: %{public}" PRId64 ", idxSize: %{public}" PRId64 "", + GetAnonyPath(it.first).c_str(), attr.st_size, it.second); + errFiles[it.first] = std::vector(); + } + } + HILOGE("(Debug) Temp file check result: Total file: %{public}zu, err file: %{public}zu", + idxFileInfos.size(), errFiles.size()); + if (!errFiles.empty()) { + HILOGE("(Debug) The received file and idx is not same"); + } else { + HILOGI("(Debug) The received file and idx is same"); + } +} + +tuple> BackupExtExtension::CheckRestoreFileInfos() +{ + vector errFiles; + struct stat curFileStat {}; + for (const auto& it : endFileInfos_) { + if (lstat(it.first.c_str(), &curFileStat) != 0) { + HILOGE("(Debug) Failed to lstat, err = %{public}d", errno); + errFiles.emplace_back(it.first); + errFileInfos_[it.first].push_back(errno); + } else if (curFileStat.st_size != it.second) { + HILOGE("(Debug) File size check error, file: %{public}s", GetAnonyPath(it.first).c_str()); + errFiles.emplace_back(it.first); + errFileInfos_[it.first].push_back(errno); + } + } + for (const auto& it : errFileInfos_) { + for (const auto &codeIt : it.second) { + HILOGE("(Debug) errfileInfos file = %{public}s -> %{public}d", GetAnonyPath(it.first).c_str(), codeIt); + } + } + HILOGE("(Debug) End file check result Total file: %{public}zu, err file: %{public}zu", + endFileInfos_.size(), errFileInfos_.size()); + if (errFiles.size()) { + return {false, errFiles}; + } + return {true, errFiles}; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +std::function BackupExtExtension::HandleFullBackupCallbackEx( + wptr obj) +{ + HILOGI("Begin get HandleFullBackupCallbackEx"); + return [obj](ErrCode errCode, const std::string backupExRetInfo) { + HILOGI("begin call backup"); + auto extensionPtr = obj.promote(); + if (extensionPtr == nullptr) { + HILOGE("Ext extension handle have been released"); + return; + } + if (extensionPtr->extension_ == nullptr) { + HILOGE("Extension handle have been released"); + return; + } + extensionPtr->extension_->InvokeAppExtMethod(errCode, backupExRetInfo); + if (backupExRetInfo.size()) { + HILOGI("Will notify backup result report"); + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); + extensionPtr->AsyncTaskBackup(extensionPtr->extension_->GetUsrConfig()); + extensionPtr->AppResultReport(backupExRetInfo, BackupRestoreScenario::FULL_BACKUP); + } + }; +} + + +std::function BackupExtExtension::HandleFullBackupCallback( + wptr obj) +{ + HILOGI("Begin get HandleFullBackupCallbackEx"); + return [obj](ErrCode errCode, std::string errMsg) { + HILOGI("begin call backup"); + auto extensionPtr = obj.promote(); + if (extensionPtr == nullptr) { + HILOGE("Ext extension handle have been released"); + return; + } + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); + if (extensionPtr->extension_ == nullptr) { + HILOGE("Extension handle have been released"); + return; + } + extensionPtr->AsyncTaskBackup(extensionPtr->extension_->GetUsrConfig()); + }; +} + +std::function BackupExtExtension::FullRestoreCallbackEx(wptr obj) +{ + HILOGI("Begin get callbackEx"); + return [obj](ErrCode errCode, const std::string restoreRetInfo) { + auto extensionPtr = obj.promote(); + if (extensionPtr == nullptr) { + HILOGE("Ext extension handle have been released"); + return; + } + if (extensionPtr->extension_ == nullptr) { + HILOGE("Extension handle have been released"); + return; + } + extensionPtr->extension_->InvokeAppExtMethod(errCode, restoreRetInfo); + if (errCode == ERR_OK) { + if (restoreRetInfo.size()) { + HILOGI("Will notify restore result report"); + extensionPtr->AppResultReport(restoreRetInfo, BackupRestoreScenario::FULL_RESTORE); + } + return; + } + if (restoreRetInfo.empty()) { + extensionPtr->AppDone(errCode); + extensionPtr->DoClear(); + } else { + std::string errInfo; + BJsonUtil::BuildRestoreErrInfo(errInfo, errCode, restoreRetInfo); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::FULL_RESTORE, errCode); + extensionPtr->DoClear(); + } + }; +} + +std::function BackupExtExtension::FullRestoreCallback(wptr obj) +{ + return [obj](ErrCode errCode, std::string errMsg) { + auto extensionPtr = obj.promote(); + if (extensionPtr == nullptr) { + HILOGE("Ext extension handle have been released"); + return; + } + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); + HILOGI("Current bundle will execute app done"); + if (errMsg.empty()) { + extensionPtr->AppDone(errCode); + } else { + std::string errInfo; + BJsonUtil::BuildRestoreErrInfo(errInfo, errCode, errMsg); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::FULL_RESTORE, errCode); + } + extensionPtr->DoClear(); + }; +} + +std::function BackupExtExtension::IncRestoreResultCallback(wptr obj) +{ + HILOGI("Begin get callback for onRestore"); + return [obj](ErrCode errCode, std::string errMsg) { + auto extensionPtr = obj.promote(); + if (extensionPtr == nullptr) { + HILOGE("Ext extension handle have been released"); + return; + } + extensionPtr->appExecFinished_ = true; + extensionPtr->ShutDownExecOnProcessTask(); + HILOGI("Current bundle will execute app done"); + if (errMsg.empty()) { + extensionPtr->AppIncrementalDone(errCode); + } else { + std::string errInfo; + BJsonUtil::BuildRestoreErrInfo(errInfo, errCode, errMsg); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::INCREMENTAL_RESTORE, errCode); + } + extensionPtr->DoClear(); + }; +} + +void BackupExtExtension::ReportAppProcessInfo(const std::string processInfo, BackupRestoreScenario scenario) +{ + auto proxy = ServiceProxy::GetInstance(); + if (proxy == nullptr) { + HILOGE("Report app process error, proxy is empty"); + return; + } + auto ret = proxy->ReportAppProcessInfo(processInfo, scenario); + if (ret != ERR_OK) { + HILOGE("Report app process error, ipc failed, ret:%{public}d", ret); + return; + } +} + +std::function BackupExtExtension::ExecOnProcessCallback(wptr obj, + BackupRestoreScenario scenario) +{ + return [obj, scenario](ErrCode errCode, const std::string processInfo) { + auto extPtr = obj.promote(); + if (extPtr == nullptr) { + HILOGE("Execute onProcess callback error, extPtr is empty"); + return; + } + extPtr->ShutDownOnProcessTimeoutTask(); + if (extPtr->isSameClock_ && extPtr->execOnProcessTimeoutTimes_ > 0) { + HILOGE("Current time call onProcess no result, timeOut count:%{public}d", + extPtr->execOnProcessTimeoutTimes_); + return; + } + extPtr->execOnProcessTimeoutTimes_ = 0; // 正常场景重置超时次数 + if (processInfo.size()) { + extPtr->ReportAppProcessInfo(processInfo, scenario); + } else { + extPtr->ShutDownExecOnProcessTask(); // 认为没实现onProcess,停掉定时器 + return; + } + }; +} + +// std::function BackupExtExtension::ExecOnProcessTimeoutCallback( +// wptr obj) +// { + +// } + +bool BackupExtExtension::CreateExecOnProcessTask(BackupRestoreScenario scenario) +{ + auto taskCallBack = [obj{ wptr(this) }, scenario]() { + HILOGI("1111"); + auto extPtr = obj.promote(); + if (extPtr == nullptr) { + HILOGE("CreateExecOnProcessTask error, extPtr is empty"); + return; + } + extPtr->isSameClock_ = true; + auto onProcessCallback = extPtr->ExecOnProcessCallback(obj, scenario); + if (!extPtr->appExecFinished_) { // app没有结束,就继续执行 + extPtr->ExecOnProcessTimeoutTask(obj); + ErrCode ret = extPtr->extension_->OnProcess(onProcessCallback); + if (ret != ERR_OK) { + HILOGE("Execute js method onProcess error, ret:%{public}d", ret); + return; + } + } + extPtr->isSameClock_ = false; + }; + execOnProcessTaskTimer_.Setup(); + uint32_t onProcessTimerId = execOnProcessTaskTimer_.Register(taskCallBack, + BConstants::CALL_APP_ON_PROCESS_TIME_INTERVAL, false); + execOnProcessTaskTimerId_ = onProcessTimerId; + return true; +} + +bool BackupExtExtension::ShutDownExecOnProcessTask() +{ + HILOGI("Start Shutdown onProcess task timer"); + execOnProcessTaskTimer_.Shutdown(); + execOnProcessTaskTimer_.Unregister(execOnProcessTaskTimerId_); + HILOGI("End Shutdown onProcess task timer, execOnProcessTaskTimerId: %{public}d", execOnProcessTaskTimerId_); + return true; +} + +bool BackupExtExtension::ExecOnProcessTimeoutTask(wptr obj) +{ + auto timeoutCallback = [obj]() { + auto extPtr = obj.promote(); + if (extPtr == nullptr) { + HILOGE("CreateExecOnProcessTask error, extPtr is empty"); + return; + } + if (extPtr->execOnProcessTimeoutTimes_ >= BConstants::APP_ON_PROCESS_TIMEOUT_MAX_COUNT) { + HILOGE("Current App timeout more than three times, Will Report"); + extPtr->execOnProcessTimeoutTimes_ = 0; // 已经满足三次超时条件 + extPtr->ShutDownOnProcessTimeoutTask(); + extPtr->ShutDownExecOnProcessTask(); + extPtr->AppDone(BError(BError::Codes::EXT_ABILITY_DIED)); + } else { + extPtr->execOnProcessTimeoutTimes_++; + } + }; + execOnProcessTimeoutTimer_.Setup(); + uint32_t timeoutTimerId = execOnProcessTimeoutTimer_.Register(timeoutCallback, + BConstants::APP_ON_PROCESS_MAX_TIMEOUT, true); + execOnProcessTimeoutTimerId_ = timeoutTimerId; + return true; +} + +bool BackupExtExtension::ShutDownOnProcessTimeoutTask() +{ + HILOGI("Start Shutdown onProcess Timeout timer"); + execOnProcessTimeoutTimer_.Shutdown(); + execOnProcessTimeoutTimer_.Unregister(execOnProcessTimeoutTimerId_); + HILOGI("End Shutdown onProcess Timeout timer, timeoutTimerId: %{public}d", execOnProcessTimeoutTimerId_); + return true; +} +} // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/src/tar_file.cpp b/frameworks/native/backup_ext/src/tar_file.cpp index c4c8be795..772f5dc16 100644 --- a/frameworks/native/backup_ext/src/tar_file.cpp +++ b/frameworks/native/backup_ext/src/tar_file.cpp @@ -196,23 +196,23 @@ bool TarFile::I2OcsConvert(const struct stat &st, TarHeader &hdr, string &fileNa if (S_ISREG(st.st_mode)) { hdr.typeFlag = REGTYPE; - off_t hdrSize = st.st_size; - if (sizeof(off_t) <= OFF_T_SIZE || st.st_size <= static_cast(MAX_FILE_SIZE)) { - size = I2Ocs(sizeof(hdr.size), hdrSize); - ret = memcpy_s(hdr.size, sizeof(hdr.size), size.c_str(), min(sizeof(hdr.size) - 1, size.length())); - if (ret != EOK) { - HILOGE("Failed to call memcpy_s, err = %{public}d", ret); - return false; - } - } else { - HILOGE("Invalid tar header size"); - return false; - } } else if (S_ISDIR(st.st_mode)) { hdr.typeFlag = DIRTYPE; } else { return true; } + off_t hdrSize = st.st_size; + if (sizeof(off_t) <= OFF_T_SIZE || st.st_size <= static_cast(MAX_FILE_SIZE)) { + size = I2Ocs(sizeof(hdr.size), hdrSize); + ret = memcpy_s(hdr.size, sizeof(hdr.size), size.c_str(), min(sizeof(hdr.size) - 1, size.length())); + if (ret != EOK) { + HILOGE("Failed to call memcpy_s, err = %{public}d", ret); + return false; + } + } else { + HILOGE("Invalid tar header size"); + return false; + } if (S_ISDIR(st.st_mode) && fileName.back() != '/') { fileName.append("/"); diff --git a/frameworks/native/backup_ext/src/untar_file.cpp b/frameworks/native/backup_ext/src/untar_file.cpp index 502bd58ad..05931009e 100644 --- a/frameworks/native/backup_ext/src/untar_file.cpp +++ b/frameworks/native/backup_ext/src/untar_file.cpp @@ -77,23 +77,34 @@ static void RTrimNull(std::string &s) s.erase(iter.base(), s.end()); } -static int ReadLongName(FileStatInfo &info, FILE *tarFilePtr_, off_t tarFileSize_) +std::tuple UntarFile::ReadLongName(FileStatInfo &info) { size_t nameLen = static_cast(tarFileSize_); + int ret = 0; if (nameLen <= PATH_MAX_LEN) { string tempName(""); tempName.resize(nameLen); size_t read = fread(&(tempName[0]), sizeof(char), nameLen, tarFilePtr_); if (read < nameLen) { HILOGE("Failed to fread longName of %{private}s", info.fullPath.c_str()); - return -1; + ret = -1; } info.longName = tempName; } else { HILOGE("longName of %{private}s exceed PATH_MAX_LEN", info.fullPath.c_str()); + ret = -1; } - - return 0; + ErrFileInfo errFileInfo; + if (ret != 0) { + errFileInfo[info.fullPath].push_back(ret); + return {-1, errFileInfo}; + } + if (fseeko(tarFilePtr_, pos_ + tarFileBlockCnt_ * BLOCK_SIZE, SEEK_SET) != 0) { + HILOGE("Failed to fseeko of %{private}s, err = %{public}d", info.fullPath.c_str(), errno); + errFileInfo[info.fullPath].push_back(errno); + return {-1, errFileInfo}; + } + return {0, errFileInfo}; } UntarFile &UntarFile::GetInstance() @@ -102,45 +113,48 @@ UntarFile &UntarFile::GetInstance() return instance; } -int UntarFile::UnPacket(const string &tarFile, const string &rootPath) +std::tuple UntarFile::UnPacket( + const std::string &tarFile, const std::string &rootPath) { tarFilePtr_ = fopen(tarFile.c_str(), "rb"); if (tarFilePtr_ == nullptr) { HILOGE("Failed to open tar file %{public}s, err = %{public}d", tarFile.c_str(), errno); - return errno; + return {errno, {}, {}}; } - if (ParseTarFile(rootPath) != 0) { + auto [ret, fileInfos, errInfos] = ParseTarFile(rootPath); + if (ret != 0) { HILOGE("Failed to parse tar file"); } fclose(tarFilePtr_); tarFilePtr_ = nullptr; - return 0; + return {ret, fileInfos, errInfos}; } -int UntarFile::IncrementalUnPacket(const string &tarFile, const string &rootPath, - const unordered_map &includes) +std::tuple UntarFile::IncrementalUnPacket( + const string &tarFile, const string &rootPath, const unordered_map &includes) { includes_ = includes; tarFilePtr_ = fopen(tarFile.c_str(), "rb"); if (tarFilePtr_ == nullptr) { HILOGE("Failed to open tar file %{public}s, err = %{public}d", tarFile.c_str(), errno); - return errno; + return {errno, {}, {}}; } - if (ParseIncrementalTarFile(rootPath) != 0) { + auto [ret, fileInfos, errFileInfos] = ParseIncrementalTarFile(rootPath); + if (ret != 0) { HILOGE("Failed to parse tar file"); } fclose(tarFilePtr_); tarFilePtr_ = nullptr; - return 0; + return {ret, fileInfos, errFileInfos}; } -void UntarFile::HandleTarBuffer(const string &buff, const string &name, FileStatInfo &info) +off_t UntarFile::HandleTarBuffer(const string &buff, const string &name, FileStatInfo &info) { info.mode = static_cast(ParseOctalStr(&buff[0] + TMODE_BASE, TMODE_LEN)); info.uid = static_cast(ParseOctalStr(&buff[0] + TUID_BASE, TUID_LEN)); @@ -158,194 +172,244 @@ void UntarFile::HandleTarBuffer(const string &buff, const string &name, FileStat } if (realName.length() > 0 && realName[0] == '/') { info.fullPath = realName.substr(1, realName.length() - 1); - return; + return tarFileSize_; } info.fullPath = realName; + return tarFileSize_; } -int UntarFile::ParseTarFile(const string &rootPath) +int UntarFile::CheckAndFillTarSize() { - // re-parse tar header - rootPath_ = rootPath; - char buff[BLOCK_SIZE] = {0}; - FileStatInfo info {}; - // tarFileSize int ret = fseeko(tarFilePtr_, 0L, SEEK_END); if (ret != 0) { HILOGE("Failed to fseeko tarFileSize SEEK_SET, err = %{public}d", errno); + return ret; } tarFileSize_ = ftello(tarFilePtr_); // reback file to begin ret = fseeko(tarFilePtr_, 0L, SEEK_SET); if (ret != 0) { HILOGE("Failed to fseeko reback SEEK_SET, err = %{public}d", errno); + return ret; } - - while (1) { - readCnt_ = fread(buff, 1, BLOCK_SIZE, tarFilePtr_); - if (readCnt_ < BLOCK_SIZE) { - HILOGE("Parsing tar file completed, read data count is less then block size."); - return 0; - } - TarHeader *header = reinterpret_cast(buff); - // two empty continuous block indicate end of file - if (IsEmptyBlock(buff) && header->typeFlag != GNUTYPE_LONGNAME) { - char tailBuff[BLOCK_SIZE] = {0}; - size_t tailRead = fread(tailBuff, 1, BLOCK_SIZE, tarFilePtr_); - if (tailRead == BLOCK_SIZE && IsEmptyBlock(tailBuff)) { - HILOGE("Parsing tar file completed, tailBuff is empty."); - return 0; - } - } - // check header - if (!IsValidTarBlock(*header)) { - // when split unpack, ftell size is over than file really size [0,READ_BUFF_SIZE] - if (ftello(tarFilePtr_) > (tarFileSize_ + READ_BUFF_SIZE) || !IsEmptyBlock(buff)) { - HILOGE("Invalid tar file format"); - ret = ERR_FORMAT; - } - HILOGE("invalid tar block header"); - return ret; - } - HandleTarBuffer(string(buff, BLOCK_SIZE), header->name, info); - ParseFileByTypeFlag(header->typeFlag, info); - } - return ret; } -int UntarFile::ParseIncrementalTarFile(const string &rootPath) +int UntarFile::DealParseTarFileResult(const std::tuple &result, + const off_t fileSize, const std::string &fileName, EndFileInfo &fileInfos, ErrFileInfo &errInfos) +{ + auto [ret, isFilter, subErrInfos] = result; + if (ret != 0) { + HILOGE("Failed to parse incremental file by type flag"); + return ret; + } + if (!isFilter) { + fileInfos[fileName] = fileSize; + } + if (!errInfos.empty()) { + errInfos.merge(subErrInfos); + } + return 0; +} + +bool UntarFile::CheckIfTarBlockValid(char *buff, size_t buffLen, TarHeader *header, int &ret) +{ + // two empty continuous block indicate end of file + if (buff == nullptr || buffLen != BLOCK_SIZE || header == nullptr) { + return false; + } + if (IsEmptyBlock(buff) && header->typeFlag != GNUTYPE_LONGNAME) { + char tailBuff[BLOCK_SIZE] = {0}; + size_t tailRead = fread(tailBuff, 1, BLOCK_SIZE, tarFilePtr_); + if (tailRead == BLOCK_SIZE && IsEmptyBlock(tailBuff)) { + HILOGE("Parsing tar file completed, tailBuff is empty."); + ret = 0; + } + return false; + } + // check header + if (!IsValidTarBlock(*header)) { + // when split unpack, ftell size is over than file really size [0,READ_BUFF_SIZE] + if (ftello(tarFilePtr_) > (tarFileSize_ + READ_BUFF_SIZE) || !IsEmptyBlock(buff)) { + HILOGE("Invalid tar file format"); + ret = ERR_FORMAT; + } + HILOGE("invalid tar block header"); + return false; + } + return true; +} + +std::tuple UntarFile::ParseTarFile(const string &rootPath) { // re-parse tar header rootPath_ = rootPath; char buff[BLOCK_SIZE] = {0}; FileStatInfo info {}; + int ret = 0; + if ((ret = CheckAndFillTarSize()) != 0) { + return {ret, {}, {}}; + } + EndFileInfo fileInfos; + ErrFileInfo errInfos; + while (1) { + readCnt_ = fread(buff, 1, BLOCK_SIZE, tarFilePtr_); + if (readCnt_ < BLOCK_SIZE) { + HILOGE("Parsing tar file completed, read data count is less then block size."); + return {0, fileInfos, errInfos}; + } + TarHeader *header = reinterpret_cast(buff); + bool isValid = CheckIfTarBlockValid(buff, sizeof(buff), header, ret); + if (!isValid) { + return {ret, fileInfos, errInfos}; + } + off_t fileSize = HandleTarBuffer(string(buff, BLOCK_SIZE), header->name, info); + auto result = ParseFileByTypeFlag(header->typeFlag, info); + if ((ret = DealParseTarFileResult(result, fileSize, info.fullPath, fileInfos, errInfos)) != 0) { + return {ret, fileInfos, errInfos}; + } + } - // tarFileSize - int ret = fseeko(tarFilePtr_, 0L, SEEK_END); + return {ret, fileInfos, errInfos}; +} + +int UntarFile::DealIncreParseTarFileResult(const std::tuple &result, + const off_t fileSize, const std::string &fileName, EndFileInfo &fileInfos, ErrFileInfo &errInfos) +{ + auto [ret, isFilter, subErrInfo] = result; if (ret != 0) { - HILOGE("Failed to fseeko tarFile SEEK_END, err = %{public}d", errno); + HILOGE("Failed to parse incremental file by type flag"); return ret; } - tarFileSize_ = ftello(tarFilePtr_); - // reback file to begin - if ((ret = fseeko(tarFilePtr_, 0L, SEEK_SET)) != 0) { - HILOGE("Failed to fseeko tarFile SEEK_SET, err = %{public}d", errno); - return ret; + if (!isFilter) { + fileInfos[fileName] = fileSize; + if (!subErrInfo.empty()) { + errInfos.merge(subErrInfo); + } } + return 0; +} +std::tuple UntarFile::ParseIncrementalTarFile(const string &rootPath) +{ + // re-parse tar header + rootPath_ = rootPath; + char buff[BLOCK_SIZE] = {0}; + FileStatInfo info {}; + int ret = 0; + if ((ret = CheckAndFillTarSize()) != 0) { + return {ret, {}, {}}; + } + EndFileInfo fileInfos; + ErrFileInfo errFileInfo; do { readCnt_ = fread(buff, 1, BLOCK_SIZE, tarFilePtr_); if (readCnt_ < BLOCK_SIZE) { HILOGE("Parsing tar file completed, read data count is less then block size."); - return 0; + return {0, fileInfos, errFileInfo}; } TarHeader *header = reinterpret_cast(buff); - // two empty continuous block indicate end of file - if (IsEmptyBlock(buff) && header->typeFlag != GNUTYPE_LONGNAME) { - char tailBuff[BLOCK_SIZE] = {0}; - size_t tailRead = fread(tailBuff, 1, BLOCK_SIZE, tarFilePtr_); - if (tailRead == BLOCK_SIZE && IsEmptyBlock(tailBuff)) { - HILOGE("Parsing tar file completed, tailBuff is empty."); - return 0; - } + bool isValid = CheckIfTarBlockValid(buff, sizeof(buff), header, ret); + if (!isValid) { + return {ret, fileInfos, errFileInfo}; } - // check header - if (!IsValidTarBlock(*header)) { - // when split unpack, ftell size is over than file really size [0,READ_BUFF_SIZE] - if (ftello(tarFilePtr_) > (tarFileSize_ + READ_BUFF_SIZE) || !IsEmptyBlock(buff)) { - HILOGE("Invalid tar file format"); - ret = ERR_FORMAT; - } - return ret; - } - HandleTarBuffer(string(buff, BLOCK_SIZE), header->name, info); - if ((ret = ParseIncrementalFileByTypeFlag(header->typeFlag, info)) != 0) { - HILOGE("Failed to parse incremental file by type flag"); - return ret; + off_t fileSize = HandleTarBuffer(string(buff, BLOCK_SIZE), header->name, info); + auto result = ParseIncrementalFileByTypeFlag(header->typeFlag, info); + ret = DealIncreParseTarFileResult(result, fileSize, info.fullPath, fileInfos, errFileInfo); + if (ret != 0) { + return {ret, fileInfos, errFileInfo}; } } while (readCnt_ >= BLOCK_SIZE); - return ret; + return {ret, fileInfos, errFileInfo}; } -void UntarFile::ParseFileByTypeFlag(char typeFlag, FileStatInfo &info) +tuple UntarFile::ParseFileByTypeFlag(char typeFlag, FileStatInfo &info) { HILOGD("untar file: %{public}s, rootPath: %{public}s", GetAnonyPath(info.fullPath).c_str(), rootPath_.c_str()); + bool isFilter = true; + ErrFileInfo errFileInfo; switch (typeFlag) { case REGTYPE: case AREGTYPE: info.fullPath = GenRealPath(rootPath_, info.fullPath); - ParseRegularFile(info, typeFlag); + errFileInfo = ParseRegularFile(info, typeFlag); + isFilter = false; break; case SYMTYPE: break; case DIRTYPE: info.fullPath = GenRealPath(rootPath_, info.fullPath); - CreateDir(info.fullPath, info.mode); + errFileInfo = CreateDir(info.fullPath, info.mode); + isFilter = false; break; case GNUTYPE_LONGNAME: { - ReadLongName(info, tarFilePtr_, tarFileSize_); - fseeko(tarFilePtr_, pos_ + tarFileBlockCnt_ * BLOCK_SIZE, SEEK_SET); - break; - } - default: { - fseeko(tarFilePtr_, tarFileBlockCnt_ * BLOCK_SIZE, SEEK_CUR); - break; - } - } -} - -int UntarFile::ParseIncrementalFileByTypeFlag(char typeFlag, FileStatInfo &info) -{ - HILOGD("untar file: %{public}s, rootPath: %{public}s", GetAnonyPath(info.fullPath).c_str(), rootPath_.c_str()); - string tmpFullPath = info.fullPath; - RTrimNull(tmpFullPath); - switch (typeFlag) { - case REGTYPE: - case AREGTYPE: - if (!includes_.empty() && includes_.find(tmpFullPath) == includes_.end()) { // not in includes - if (fseeko(tarFilePtr_, pos_ + tarFileBlockCnt_ * BLOCK_SIZE, SEEK_SET) != 0) { - HILOGE("Failed to fseeko of %{private}s, err = %{public}d", info.fullPath.c_str(), errno); - return -1; - } - break; - } - info.fullPath = GenRealPath(rootPath_, info.fullPath); - ParseRegularFile(info, typeFlag); - break; - case SYMTYPE: - break; - case DIRTYPE: - info.fullPath = GenRealPath(rootPath_, info.fullPath); - CreateDir(info.fullPath, info.mode); - break; - case GNUTYPE_LONGNAME: { - int ret = ReadLongName(info, tarFilePtr_, tarFileSize_); - if (ret != 0) { - return ret; - } - if (fseeko(tarFilePtr_, pos_ + tarFileBlockCnt_ * BLOCK_SIZE, SEEK_SET) != 0) { - HILOGE("Failed to fseeko of %{private}s, err = %{public}d", info.fullPath.c_str(), errno); - return -1; - } + auto result = ReadLongName(info); + errFileInfo = std::get(result); + return {std::get(result), isFilter, errFileInfo}; break; } default: { if (fseeko(tarFilePtr_, tarFileBlockCnt_ * BLOCK_SIZE, SEEK_CUR) != 0) { HILOGE("Failed to fseeko of %{private}s, err = %{public}d", info.fullPath.c_str(), errno); - return -1; + return {-1, true, errFileInfo}; + } + break; + } + } + return {0, isFilter, errFileInfo}; +} + +std::tuple UntarFile::ParseIncrementalFileByTypeFlag(char typeFlag, FileStatInfo &info) +{ + HILOGD("untar file: %{public}s, rootPath: %{public}s", GetAnonyPath(info.fullPath).c_str(), rootPath_.c_str()); + string tmpFullPath = info.fullPath; + bool isFilter = true; + ErrFileInfo errFileInfo; + RTrimNull(tmpFullPath); + switch (typeFlag) { + case REGTYPE: + case AREGTYPE: { + if (!includes_.empty() && includes_.find(tmpFullPath) == includes_.end()) { // not in includes + if (fseeko(tarFilePtr_, pos_ + tarFileBlockCnt_ * BLOCK_SIZE, SEEK_SET) != 0) { + HILOGE("Failed to fseeko of %{private}s, err = %{public}d", info.fullPath.c_str(), errno); + return {-1, true, {}}; + } + break; + } + info.fullPath = GenRealPath(rootPath_, info.fullPath); + errFileInfo = ParseRegularFile(info, typeFlag); + isFilter = false; + break; + } + case SYMTYPE: + break; + case DIRTYPE: + info.fullPath = GenRealPath(rootPath_, info.fullPath); + errFileInfo = CreateDir(info.fullPath, info.mode); + isFilter = false; + break; + case GNUTYPE_LONGNAME: { + auto result = ReadLongName(info); + return {std::get(result), isFilter, std::get(result)}; + break; + } + default: { + if (fseeko(tarFilePtr_, tarFileBlockCnt_ * BLOCK_SIZE, SEEK_CUR) != 0) { + HILOGE("Failed to fseeko of %{private}s, err = %{public}d", info.fullPath.c_str(), errno); + return {-1, true, {}}; } break; } } - return 0; + return {0, isFilter, errFileInfo}; } -void UntarFile::ParseRegularFile(FileStatInfo &info, char typeFlag) +ErrFileInfo UntarFile::ParseRegularFile(FileStatInfo &info, char typeFlag) { + ErrFileInfo errFileInfo; FILE *destFile = CreateFile(info.fullPath, info.mode, typeFlag); if (destFile != nullptr) { string destStr(""); @@ -361,27 +425,32 @@ void UntarFile::ParseRegularFile(FileStatInfo &info, char typeFlag) remainSize -= readBuffSize; } fclose(destFile); - chmod(info.fullPath.data(), info.mode); + if (chmod(info.fullPath.data(), info.mode) != 0) { + HILOGE("Failed to chmod of %{public}s, err = %{public}d", GetAnonyPath(info.fullPath).c_str(), errno); + errFileInfo[info.fullPath].push_back(errno); + } struct utimbuf times; struct stat attr; if (stat(info.fullPath.c_str(), &attr) != 0) { - HILOGE("Failed to get stat of %{public}s, err = %{public}d", - GetAnonyPath(info.fullPath).c_str(), errno); + errFileInfo[info.fullPath].push_back(errno); + HILOGE("Failed to get stat of %{public}s, err = %{public}d", GetAnonyPath(info.fullPath).c_str(), errno); times.actime = info.mtime; } else { times.actime = attr.st_atime; } times.modtime = info.mtime; if (info.mtime != 0 && utime(info.fullPath.c_str(), ×) != 0) { - HILOGE("Failed to set mtime of %{public}s, err = %{public}d", - GetAnonyPath(info.fullPath).c_str(), errno); + errFileInfo[info.fullPath].push_back(errno); + HILOGE("Failed to set mtime of %{public}s, err = %{public}d", GetAnonyPath(info.fullPath).c_str(), errno); } // anyway, go to correct fseeko(tarFilePtr_, pos_ + tarFileBlockCnt_ * BLOCK_SIZE, SEEK_SET); } else { HILOGE("Failed to create file %{public}s, err = %{public}d", GetAnonyPath(info.fullPath).c_str(), errno); + errFileInfo[info.fullPath].push_back(errno); fseeko(tarFilePtr_, tarFileBlockCnt_ * BLOCK_SIZE, SEEK_CUR); } + return errFileInfo; } bool UntarFile::VerifyChecksum(TarHeader &header) @@ -430,10 +499,11 @@ string UntarFile::GenRealPath(const string &rootPath, const string &realName) return realPath; } -void UntarFile::CreateDir(string &path, mode_t mode) +ErrFileInfo UntarFile::CreateDir(string &path, mode_t mode) { + ErrFileInfo errFileInfo; if (path.empty()) { - return; + return errFileInfo; } size_t len = path.length(); if (path[len - 1] == '/') { @@ -443,8 +513,10 @@ void UntarFile::CreateDir(string &path, mode_t mode) HILOGW("directory does not exist, path:%{public}s, err = %{public}d", path.c_str(), errno); if (!ForceCreateDirectoryWithMode(path, mode)) { HILOGE("Failed to force create directory %{public}s, err = %{public}d", path.c_str(), errno); + errFileInfo[path].push_back(errno); } } + return errFileInfo; } FILE *UntarFile::CreateFile(string &filePath, mode_t mode, char fileType) diff --git a/frameworks/native/backup_kit_inner/src/service_incremental_reverse.cpp b/frameworks/native/backup_kit_inner/src/service_incremental_reverse.cpp index 1e281c7f3..ec842c432 100644 --- a/frameworks/native/backup_kit_inner/src/service_incremental_reverse.cpp +++ b/frameworks/native/backup_kit_inner/src/service_incremental_reverse.cpp @@ -72,7 +72,7 @@ void ServiceReverse::IncrementalBackupOnAllBundlesFinished(int32_t errCode) void ServiceReverse::IncrementalBackupOnProcessInfo(std::string bundleName, std::string processInfo) { - HILOGI("errCode = %{public}d", errCode); + HILOGI("bundleName = %{public}s", bundleName.c_str()); if (scenario_ != Scenario::BACKUP || !callbacksIncrementalBackup_.onProcess) { HILOGE("Error scenario or callback is nullptr, scenario = %{public}d", scenario_); return; @@ -137,7 +137,7 @@ void ServiceReverse::IncrementalRestoreOnResultReport(std::string result, std::s void ServiceReverse::IncrementalRestoreOnProcessInfo(std::string bundleName, std::string processInfo) { - HILOGI("begin incremental restore on result report, bundleName:%{public}s", bundleName.c_str()); + HILOGI("begin incremental report processInfo, bundleName:%{public}s", bundleName.c_str()); if (scenario_ != Scenario::RESTORE || !callbacksIncrementalRestore_.onProcess) { HILOGE("Error scenario or callback is nullptr, scenario = %{public}d", scenario_); return; diff --git a/frameworks/native/backup_kit_inner/src/service_proxy.cpp b/frameworks/native/backup_kit_inner/src/service_proxy.cpp index e15ccdf9f..f32e9e70c 100644 --- a/frameworks/native/backup_kit_inner/src/service_proxy.cpp +++ b/frameworks/native/backup_kit_inner/src/service_proxy.cpp @@ -597,14 +597,14 @@ ErrCode ServiceProxy::ReportAppProcessInfo(const std::string processInfo, const if (!data.WriteString(processInfo)) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send bundleName").GetCode(); } - if (!data.WriteInt32(static_cast(scenario))) { + if (!data.WriteInt32(static_cast(sennario))) { return BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the scenario").GetCode(); } MessageParcel reply; MessageOption option; option.SetWaitTime(BConstants::IPC_MAX_WAIT_TIME); int32_t ret = Remote()-> SendRequest(static_cast( - IServiceInterfaceCode::SERVICE_CMD_NOTIFY_BUNDLE_PROCESS_INFO), data, reply, option); + IServiceInterfaceCode::SERVICE_CMD_REPORT_APP_PROCESS_INFO), data, reply, option); if (ret != NO_ERROR) { string str = "Failed to send out the request because of " + to_string(ret); return BError(BError::Codes::SDK_INVAL_ARG, str.data()).GetCode(); diff --git a/frameworks/native/backup_kit_inner/src/service_reverse.cpp b/frameworks/native/backup_kit_inner/src/service_reverse.cpp index dfc19ba25..008604d9b 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse.cpp @@ -71,7 +71,7 @@ void ServiceReverse::BackupOnAllBundlesFinished(int32_t errCode) void ServiceReverse::BackupOnProcessInfo(std::string bundleName, std::string processInfo) { - HILOGI("errCode = %{public}d", errCode); + HILOGI("bundleName = %{public}s", bundleName.c_str()); if (scenario_ != Scenario::BACKUP || !callbacksBackup_.onProcess) { HILOGI("Error scenario or callback is nullptr"); return; @@ -137,7 +137,7 @@ void ServiceReverse::RestoreOnResultReport(string result, std::string bundleName void ServiceReverse::RestoreOnProcessInfo(std::string bundleName, std::string processInfo) { - HILOGI("errCode = %{public}d", errCode); + HILOGI("bundleName = %{public}s", bundleName.c_str()); if (scenario_ != Scenario::RESTORE || !callbacksRestore_.onProcess) { HILOGI("Error scenario or callback is nullptr"); return; diff --git a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp index 506f3ce24..8f970cab4 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp @@ -76,7 +76,7 @@ ServiceReverseStub::ServiceReverseStub() &ServiceReverseStub::CmdBackupOnBundleFinished; opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_BACKUP_ON_TASK_FINISHED)] = &ServiceReverseStub::CmdBackupOnAllBundlesFinished; - opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_RESTORE_ON_PROCESS_INFO)] = + opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_BACKUP_ON_PROCESS_INFO)] = &ServiceReverseStub::CmdBackupOnProcessInfo; opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_RESTORE_ON_FILE_READY)] = @@ -89,7 +89,7 @@ ServiceReverseStub::ServiceReverseStub() &ServiceReverseStub::CmdRestoreOnBundleFinished; opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_RESTORE_ON_TASK_FINISHED)] = &ServiceReverseStub::CmdRestoreOnAllBundlesFinished; - opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_BACKUP_ON_PROCESS_INFO)] = + opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_RESTORE_ON_PROCESS_INFO)] = &ServiceReverseStub::CmdRestoreOnProcessInfo; opToInterfaceMap_[static_cast(IServiceReverseInterfaceCode::SERVICER_INCREMENTAL_BACKUP_ON_FILE_READY)] = diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h index 06e833230..149b79a93 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore.h @@ -35,6 +35,7 @@ public: std::function onAllBundlesFinished; // 当整个恢复流程结束或意外中止时执行的回调函数 std::function onResultReport; // 某个应用恢复流程中自定义错误信息的上报的回调函数 std::function onBackupServiceDied; // 当备份服务意外死亡时执行的回调函数 + std::function onProcess; // 某个应用上报执行进度的的回调函数 }; public: diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h index 732ee591f..387ec3b0e 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h @@ -30,16 +30,15 @@ public: virtual ~IExtension() = default; virtual UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) = 0; virtual ErrCode HandleClear() = 0; - virtual ErrCode HandleBackup() = 0; + virtual ErrCode HandleBackup(bool isClearData) = 0; virtual ErrCode PublishFile(const std::string &fileName) = 0; - virtual ErrCode HandleRestore() = 0; + virtual ErrCode HandleRestore(bool isClearData) = 0; virtual ErrCode GetIncrementalFileHandle(const std::string &fileName) = 0; virtual ErrCode PublishIncrementalFile(const std::string &fileName) = 0; virtual ErrCode HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) = 0; - virtual ErrCode IncrementalOnBackup() = 0; + virtual ErrCode IncrementalOnBackup(bool isClearData) = 0; virtual std::tuple GetIncrementalBackupFileHandle() = 0; virtual ErrCode GetBackupInfo(std::string &result) = 0; - virtual ErrCode GetBackupInfo(std::string &processInfo) = 0; virtual ErrCode UpdateFdSendRate(std::string &bundleName, int32_t sendRate) = 0; }; } // namespace OHOS::FileManagement::Backup diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension_ipc_interface_code.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension_ipc_interface_code.h index 77f4281bd..15478e015 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension_ipc_interface_code.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension_ipc_interface_code.h @@ -31,7 +31,6 @@ enum class IExtensionInterfaceCode { CMD_GET_BACKUP_INFO, CMD_INCREMENTAL_ON_BACKUP, CMD_UPDATE_FD_SENDRATE, - CMD_GET_PROCESS_INFO, }; } // namespace OHOS::FileManagement::Backup diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h index d4701bbc6..08faef9a4 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h @@ -47,7 +47,7 @@ enum class IServiceInterfaceCode { SERVICE_CMD_UPDATE_TIMER, SERVICE_CMD_UPDATE_SENDRATE, SERVICE_CMD_GET_APP_LOCAL_LIST_AND_DO_INCREMENTAL_BACKUP, - SERVICE_CMD_REPORT_BUNDLE_PROCESS_INFO, + SERVICE_CMD_REPORT_APP_PROCESS_INFO, }; } // namespace OHOS::FileManagement::Backup diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h index ddd1f5c84..868361486 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_service_reverse.h @@ -64,7 +64,7 @@ public: ErrCode errCode = 0) = 0; virtual void IncrementalRestoreOnBundleFinished(int32_t errCode, std::string bundleName) = 0; virtual void IncrementalRestoreOnAllBundlesFinished(int32_t errCode) = 0; - virtual void IncrementalRestoreOnProcessInfo(const std::string &bundleName, const std::string &processInfo) = 0; + virtual void IncrementalRestoreOnProcessInfo(const std::string bundleName, const std::string processInfo) = 0; DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.FileManagement.Backup.IServiceReverse") }; diff --git a/interfaces/innerkits/native/file_uri/src/file_uri.cpp b/interfaces/innerkits/native/file_uri/src/file_uri.cpp index 11fb261c6..3050f29a5 100644 --- a/interfaces/innerkits/native/file_uri/src/file_uri.cpp +++ b/interfaces/innerkits/native/file_uri/src/file_uri.cpp @@ -59,7 +59,7 @@ string FileUri::GetName() return ""; } - if (posLast == sandboxPath.size()) { + if (posLast == (sandboxPath.size() - 1)) { return ""; } diff --git a/interfaces/kits/js/backup/general_callbacks.h b/interfaces/kits/js/backup/general_callbacks.h index 2c0dd0ad3..fca8a1385 100644 --- a/interfaces/kits/js/backup/general_callbacks.h +++ b/interfaces/kits/js/backup/general_callbacks.h @@ -53,7 +53,7 @@ public: LibN::NAsyncWorkCallback onAllBundlesEnd; LibN::NAsyncWorkCallback onBackupServiceDied; BackupRestoreCallback onResultReport; - LibN::NAsyncWorkCallback onProcess; + BackupRestoreCallback onProcess; }; } // namespace OHOS::FileManagement::Backup #endif // INTERFACES_KITS_JS_SRC_MOD_BACKUP_PROPERTIES_GENERAL_CALLBACKS_H \ No newline at end of file diff --git a/interfaces/kits/js/backup/prop_n_operation.cpp b/interfaces/kits/js/backup/prop_n_operation.cpp index d059dc95f..593c67a59 100644 --- a/interfaces/kits/js/backup/prop_n_operation.cpp +++ b/interfaces/kits/js/backup/prop_n_operation.cpp @@ -17,6 +17,7 @@ #include "b_error/b_error.h" #include "b_incremental_data.h" #include "b_resources/b_constants.h" +#include "b_sa/b_sa_utils.h" #include "filemgmt_libhilog.h" #include "filemgmt_libn.h" #include "incremental_backup_data.h" @@ -32,19 +33,6 @@ using namespace LibN; const int32_t H_TO_MS = 3600 * 1000; -static bool CheckPermission(const string &permission) -{ - Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); - return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permission) == - Security::AccessToken::PermissionState::PERMISSION_GRANTED; -} - -static bool IsSystemApp() -{ - uint64_t fullTokenId = OHOS::IPCSkeleton::GetCallingFullTokenID(); - return Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(fullTokenId); -} - static napi_value AsyncCallback(napi_env env, const NFuncArg& funcArg) { HILOGD("called LocalCapabilities::AsyncCallback begin"); @@ -182,6 +170,16 @@ static napi_value AsyncDataList(napi_env env, const NFuncArg& funcArg) napi_value PropNOperation::Async(napi_env env, napi_callback_info info) { HILOGD("called LocalCapabilities::Async begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { HILOGE("Number of arguments unmatched."); @@ -203,6 +201,16 @@ napi_value PropNOperation::Async(napi_env env, napi_callback_info info) napi_value PropNOperation::DoGetBackupInfo(napi_env env, napi_callback_info info) { HILOGD("called DoGetBackupInfo begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } std::string result; NFuncArg funcArg(env, info); if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { @@ -278,12 +286,12 @@ bool PropNOperation::UpdateSendRate(std::string &bundleName, int32_t sendRate) napi_value PropNOperation::DoUpdateTimer(napi_env env, napi_callback_info info) { HILOGD("called DoUpdateTimer begin"); - if (!CheckPermission("ohos.permission.BACKUP")) { - HILOGE("has not permission!"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); NError(E_PERMISSION).ThrowErr(env); return nullptr; } - if (!IsSystemApp()) { + if (!SAUtils::IsSystemApp()) { HILOGE("System App check fail!"); NError(E_PERMISSION_SYS).ThrowErr(env); return nullptr; @@ -326,12 +334,12 @@ napi_value PropNOperation::DoUpdateTimer(napi_env env, napi_callback_info info) napi_value PropNOperation::DoUpdateSendRate(napi_env env, napi_callback_info info) { HILOGD("called DoUpdateSendRate begin"); - if (!CheckPermission("ohos.permission.BACKUP")) { - HILOGE("has not permission!"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); NError(E_PERMISSION).ThrowErr(env); return nullptr; } - if (!IsSystemApp()) { + if (!SAUtils::IsSystemApp()) { HILOGE("System App check fail!"); NError(E_PERMISSION_SYS).ThrowErr(env); return nullptr; diff --git a/interfaces/kits/js/backup/session_backup_n_exporter.cpp b/interfaces/kits/js/backup/session_backup_n_exporter.cpp index 337ebb1e8..052e641d3 100644 --- a/interfaces/kits/js/backup/session_backup_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_backup_n_exporter.cpp @@ -269,7 +269,7 @@ static void OnProcess(weak_ptr pCallbacks, const BundleName na napi_create_string_utf8(env, bundleName.c_str(), bundleName.size(), &napi_bName); argv.push_back(napi_bName); napi_value napi_process = nullptr; - napi_create_string_utf8(env, process.c_str(), process.size(), &napi_res); + napi_create_string_utf8(env, process.c_str(), process.size(), &napi_process); argv.push_back(napi_process); return true; }; @@ -279,6 +279,16 @@ static void OnProcess(weak_ptr pCallbacks, const BundleName na napi_value SessionBackupNExporter::Constructor(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionBackup::Constructor begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ONE)) { HILOGE("Number of arguments unmatched."); @@ -355,6 +365,16 @@ static bool VerifyParamSuccess(NFuncArg &funcArg, std::vector &bund napi_value SessionBackupNExporter::AppendBundles(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionBackup::AppendBundles begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } std::vector bundleNames; std::vector bundleInfos; NFuncArg funcArg(env, cbinfo); @@ -398,6 +418,16 @@ napi_value SessionBackupNExporter::AppendBundles(napi_env env, napi_callback_inf napi_value SessionBackupNExporter::Release(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionBackup::Release begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ZERO)) { HILOGE("Number of arguments unmatched."); diff --git a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp index 4866c51a6..fbac4d7a1 100644 --- a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp @@ -22,6 +22,7 @@ #include "b_incremental_backup_session.h" #include "b_incremental_data.h" #include "b_resources/b_constants.h" +#include "b_sa/b_sa_utils.h" #include "backup_kit_inner.h" #include "directory_ex.h" #include "filemgmt_libhilog.h" @@ -275,7 +276,7 @@ static void OnProcess(weak_ptr pCallbacks, const BundleName na napi_create_string_utf8(env, bundleName.c_str(), bundleName.size(), &napi_bName); argv.push_back(napi_bName); napi_value napi_process = nullptr; - napi_create_string_utf8(env, process.c_str(), process.size(), &napi_res); + napi_create_string_utf8(env, process.c_str(), process.size(), &napi_process); argv.push_back(napi_process); return true; }; @@ -285,6 +286,16 @@ static void OnProcess(weak_ptr pCallbacks, const BundleName na napi_value SessionIncrementalBackupNExporter::Constructor(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionIncrementalBackup::Constructor begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ONE)) { HILOGE("Number of arguments unmatched"); @@ -420,6 +431,16 @@ static bool VerifyParamSuccess(NFuncArg &funcArg, std::vector napi_value SessionIncrementalBackupNExporter::AppendBundles(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionIncrementalBackup::AppendBundles begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } std::vector backupBundles; std::vector bundleInfos; NFuncArg funcArg(env, cbinfo); @@ -460,6 +481,16 @@ napi_value SessionIncrementalBackupNExporter::AppendBundles(napi_env env, napi_c napi_value SessionIncrementalBackupNExporter::Release(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionIncrementalBackup::Release begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ZERO)) { HILOGE("Number of arguments unmatched."); diff --git a/interfaces/kits/js/backup/session_restore_n_exporter.cpp b/interfaces/kits/js/backup/session_restore_n_exporter.cpp index 737e37f76..f84fc8b84 100644 --- a/interfaces/kits/js/backup/session_restore_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_restore_n_exporter.cpp @@ -281,7 +281,7 @@ static void OnProcess(weak_ptr pCallbacks, const BundleName na napi_create_string_utf8(env, bundleName.c_str(), bundleName.size(), &napi_bName); argv.push_back(napi_bName); napi_value napi_process = nullptr; - napi_create_string_utf8(env, process.c_str(), process.size(), &napi_res); + napi_create_string_utf8(env, process.c_str(), process.size(), &napi_process); argv.push_back(napi_process); return true; }; @@ -399,6 +399,16 @@ static bool VerifyNarg(napi_env env, NVal &callbacks) napi_value SessionRestoreNExporter::Constructor(napi_env env, napi_callback_info cbinfo) { HILOGI("called SessionRestore::Constructor begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (VerifyNapiObject(env, funcArg)) { return nullptr; @@ -434,23 +444,16 @@ napi_value SessionRestoreNExporter::Constructor(napi_env env, napi_callback_info return funcArg.GetThisVar(); } -napi_value SessionRestoreNExporter::AppendBundles(napi_env env, napi_callback_info cbinfo) +static NContextCBExec GetAppendBundlesCBExec(napi_env env, NFuncArg &funcArg, const int32_t fdRestore, + const std::vector &bundleNames, const std::vector &bundleInfos) { - HILOGI("called SessionRestore::AppendBundles begin"); - int32_t fdRestore = BConstants::INVALID_FD_NUM; - std::vector bundleNames; - std::vector bundleInfos; - NFuncArg funcArg(env, cbinfo); - if (!VerifyAppendBundlesParam(funcArg, fdRestore, bundleNames, bundleInfos, env)) { - return nullptr; - } auto restoreEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); if (!(restoreEntity && (restoreEntity->sessionWhole || restoreEntity->sessionSheet))) { HILOGE("Failed to get RestoreSession entity."); NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get RestoreSession entity.").GetCode()).ThrowErr(env); return nullptr; } - auto cbExec = [entity {restoreEntity}, fd {fdRestore}, bundles {bundleNames}, infos {bundleInfos}]() -> NError { + return [entity {restoreEntity}, fd {fdRestore}, bundles {bundleNames}, infos {bundleInfos}]() -> NError { if (!(entity && (entity->sessionWhole || entity->sessionSheet))) { return NError(BError(BError::Codes::SDK_INVAL_ARG, "restore session is nullptr").GetCode()); } @@ -469,10 +472,38 @@ napi_value SessionRestoreNExporter::AppendBundles(napi_env env, napi_callback_in } return NError(entity->sessionSheet->AppendBundles(UniqueFd(fd), bundles)); }; +} + +napi_value SessionRestoreNExporter::AppendBundles(napi_env env, napi_callback_info cbinfo) +{ + HILOGI("called SessionRestore::AppendBundles begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } + int32_t fdRestore = BConstants::INVALID_FD_NUM; + std::vector bundleNames; + std::vector bundleInfos; + NFuncArg funcArg(env, cbinfo); + if (!VerifyAppendBundlesParam(funcArg, fdRestore, bundleNames, bundleInfos, env)) { + return nullptr; + } + auto cbExec = GetAppendBundlesCBExec(env, funcArg, fdRestore, bundleNames, bundleInfos); + if (cbExec == nullptr) { + HILOGE("GetAppendBundlesCBExec fail!"); + return nullptr; + } auto cbCompl = [](napi_env env, NError err) -> NVal { return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUndefined(env); }; HILOGD("Called SessionRestore::AppendBundles end."); + NVal thisVar(env, funcArg.GetThisVar()); if (funcArg.GetArgc() == NARG_CNT::TWO) { return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; @@ -486,24 +517,16 @@ napi_value SessionRestoreNExporter::AppendBundles(napi_env env, napi_callback_in } } -napi_value SessionRestoreNExporter::PublishFile(napi_env env, napi_callback_info cbinfo) +static NContextCBExec GetPublishFileCBExec(napi_env env, NFuncArg &funcArg, const std::string &bundleName, + const std::string &fileName) { - HILOGD("called SessionRestore::PublishFile begin"); - std::string bundleName; - std::string fileName; - NFuncArg funcArg(env, cbinfo); - if (!VerifyPublishFileParam(funcArg, bundleName, fileName, env)) { - return nullptr; - } - auto restoreEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); if (!(restoreEntity && (restoreEntity->sessionWhole || restoreEntity->sessionSheet))) { HILOGE("Failed to get RestoreSession entity."); NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get RestoreSession entity.").GetCode()).ThrowErr(env); return nullptr; } - - auto cbExec = [entity {restoreEntity}, bundleName {bundleName}, fileName {fileName}]() -> NError { + return [entity {restoreEntity}, bundleName {bundleName}, fileName {fileName}]() -> NError { if (!(entity && (entity->sessionWhole || entity->sessionSheet))) { return NError(BError(BError::Codes::SDK_INVAL_ARG, "restore session is nullptr").GetCode()); } @@ -514,17 +537,42 @@ napi_value SessionRestoreNExporter::PublishFile(napi_env env, napi_callback_info if (SAUtils::IsSABundleName(fileName)) { HILOGI("SA %{public}s pushlish file", bundleName.c_str()); if (fcntl(std::atoi(fileName.c_str()), F_GETFD) == -1) { - HILOGE("PublishFile fd is invalid."); - return NError(BError(BError::Codes::SDK_INVAL_ARG, "PublishFile fd is invalid.").GetCode()); - } + HILOGE("PublishFile fd is invalid."); + return NError(BError(BError::Codes::SDK_INVAL_ARG, "PublishFile fd is invalid.").GetCode()); + } return NError(entity->sessionSheet->PublishSAFile(fileInfo, UniqueFd(std::atoi(fileName.c_str())))); } return NError(entity->sessionSheet->PublishFile(fileInfo)); }; +} + +napi_value SessionRestoreNExporter::PublishFile(napi_env env, napi_callback_info cbinfo) +{ + HILOGD("called SessionRestore::PublishFile begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } + std::string bundleName; + std::string fileName; + NFuncArg funcArg(env, cbinfo); + if (!VerifyPublishFileParam(funcArg, bundleName, fileName, env)) { + return nullptr; + } + auto cbExec = GetPublishFileCBExec(env, funcArg, bundleName, fileName); + if (cbExec == nullptr) { + HILOGE("GetPublishFileCBExec fail!"); + return nullptr; + } auto cbCompl = [](napi_env env, NError err) -> NVal { return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUndefined(env); }; - HILOGD("Called SessionRestore::PublishFile end."); NVal thisVar(env, funcArg.GetThisVar()); @@ -536,9 +584,42 @@ napi_value SessionRestoreNExporter::PublishFile(napi_env env, napi_callback_info } } +static NContextCBExec GetFileHandleCBExec(napi_env env, NFuncArg &funcArg, std::unique_ptr bundleName, + std::unique_ptr fileName) +{ + auto restoreEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (!(restoreEntity && (restoreEntity->sessionWhole || restoreEntity->sessionSheet))) { + HILOGE("Failed to get RestoreSession entity."); + NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get RestoreSession entity.").GetCode()).ThrowErr(env); + return nullptr; + } + return [entity {restoreEntity}, bundleName {string(bundleName.get())}, + fileName {string(fileName.get())}]() -> NError { + if (!(entity && (entity->sessionWhole || entity->sessionSheet))) { + return NError(BError(BError::Codes::SDK_INVAL_ARG, "restore session is nullptr").GetCode()); + } + string bundle = bundleName; + string file = fileName; + if (entity->sessionWhole) { + return NError(entity->sessionWhole->GetFileHandle(bundle, file)); + } + return NError(entity->sessionSheet->GetFileHandle(bundle, file)); + }; +} + napi_value SessionRestoreNExporter::GetFileHandle(napi_env env, napi_callback_info cbinfo) { HILOGD("called SessionRestore::GetFileHandle begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { HILOGE("Number of arguments unmatched."); @@ -560,29 +641,14 @@ napi_value SessionRestoreNExporter::GetFileHandle(napi_env env, napi_callback_in return nullptr; } - auto restoreEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); - if (!(restoreEntity && (restoreEntity->sessionWhole || restoreEntity->sessionSheet))) { - HILOGE("Failed to get RestoreSession entity."); - NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get RestoreSession entity.").GetCode()).ThrowErr(env); + auto cbExec = GetFileHandleCBExec(env, funcArg, move(bundleName), move(fileName)); + if (cbExec == nullptr) { + HILOGE("GetFileHandleCBExec fail!"); return nullptr; } - - auto cbExec = [entity {restoreEntity}, bundleName {string(bundleName.get())}, - fileName {string(fileName.get())}]() -> NError { - if (!(entity && (entity->sessionWhole || entity->sessionSheet))) { - return NError(BError(BError::Codes::SDK_INVAL_ARG, "restore session is nullptr").GetCode()); - } - string bundle = bundleName; - string file = fileName; - if (entity->sessionWhole) { - return NError(entity->sessionWhole->GetFileHandle(bundle, file)); - } - return NError(entity->sessionSheet->GetFileHandle(bundle, file)); - }; auto cbCompl = [](napi_env env, NError err) -> NVal { return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUndefined(env); }; - HILOGD("Called SessionRestore::GetFileHandle end."); NVal thisVar(env, funcArg.GetThisVar()); @@ -597,6 +663,16 @@ napi_value SessionRestoreNExporter::GetFileHandle(napi_env env, napi_callback_in napi_value SessionRestoreNExporter::Release(napi_env env, napi_callback_info cbinfo) { HILOGI("called SessionRestore::Release begin"); + if (!SAUtils::CheckBackupPermission()) { + HILOGE("Has not permission!"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + if (!SAUtils::IsSystemApp()) { + HILOGE("System App check fail!"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return nullptr; + } NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ZERO)) { HILOGE("Number of arguments unmatched."); @@ -623,7 +699,6 @@ napi_value SessionRestoreNExporter::Release(napi_env env, napi_callback_info cbi auto cbCompl = [](napi_env env, NError err) -> NVal { return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUndefined(env); }; - HILOGI("Called SessionRestore::Release end."); NVal thisVar(env, funcArg.GetThisVar()); diff --git a/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp b/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp index 53a0b7988..1b115fc1d 100644 --- a/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp +++ b/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp @@ -29,29 +29,9 @@ #include "tokenid_kit.h" const int32_t FOO_MAX_LEN = sizeof(FileShare_PolicyErrorResult) * OHOS::AppFileService::MAX_ARRAY_SIZE; -const std::string FILE_ACCESS_PERSIST_PERMISSION = "ohos.permission.FILE_ACCESS_PERSIST"; -const std::string FULL_MOUNT_ENABLE_PARAMETER = "const.filemanager.full_mount.enable"; using Exec = std::function &uriPolicies, std::deque &errorResults)>; -static bool CheckPermission(const std::string &permission) -{ - OHOS::Security::AccessToken::AccessTokenID tokenCaller = OHOS::IPCSkeleton::GetCallingTokenID(); - return OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permission) == - OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED; -} - -static bool CheckFileManagerFullMountEnable() -{ - char value[] = "false"; - int retSystem = GetParameter(FULL_MOUNT_ENABLE_PARAMETER.c_str(), "false", value, sizeof(value)); - if (retSystem > 0 && !strcmp(value, "true")) { - LOGI("The full mount enable parameter is true"); - return true; - } - LOGI("The full mount enable parameter is false"); - return false; -} static bool ConvertPolicyInfo(const FileShare_PolicyInfo *policies, int policyNum, @@ -173,12 +153,6 @@ static FileManagement_ErrCode ExecAction(const FileShare_PolicyInfo *policies, Exec exec) { (*resultNum) = 0; - if (!CheckFileManagerFullMountEnable()) { - return E_DEVICE_NOT_SUPPORT; - } - if (!CheckPermission(FILE_ACCESS_PERSIST_PERMISSION)) { - return E_PERMISSION; - } std::vector uriPolicies; if (!ConvertPolicyInfo(policies, policyNum, uriPolicies)) { return E_PARAMS; @@ -274,12 +248,6 @@ FileManagement_ErrCode OH_FileShare_CheckPersistentPermission(const FileShare_Po return E_PARAMS; } *resultNum = 0; - if (!CheckFileManagerFullMountEnable()) { - return E_DEVICE_NOT_SUPPORT; - } - if (!CheckPermission(FILE_ACCESS_PERSIST_PERMISSION)) { - return E_PERMISSION; - } std::vector uriPolicies; if (!ConvertPolicyInfo(policies, policyNum, uriPolicies)) { return E_PARAMS; diff --git a/services/backup_sa/BUILD.gn b/services/backup_sa/BUILD.gn index 5bf8af4f0..027216afe 100644 --- a/services/backup_sa/BUILD.gn +++ b/services/backup_sa/BUILD.gn @@ -66,6 +66,7 @@ ohos_shared_library("backup_sa") { "ability_runtime:ability_connect_callback_stub", "ability_runtime:ability_manager", "access_token:libaccesstoken_sdk", + "access_token:libtokenid_sdk", "bundle_framework:appexecfwk_base", "bundle_framework:appexecfwk_core", "c_utils:utils", diff --git a/services/backup_sa/include/module_external/bms_adapter.h b/services/backup_sa/include/module_external/bms_adapter.h index 5f106294c..e56ec31dd 100644 --- a/services/backup_sa/include/module_external/bms_adapter.h +++ b/services/backup_sa/include/module_external/bms_adapter.h @@ -63,6 +63,10 @@ public: static std::vector GetBundleInfosForSA(); static void GetBundleInfoForSA(std::string bundleName, std::vector &bundleInfos); +private: + static bool GetCurBundleExtenionInfo(AppExecFwk::BundleInfo &installedBundle, const std::string &bundleName, + std::vector &extensionInfos, sptr bms, + int32_t userId); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_BUNDLE_MGR_ADAPTER_H diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 86771d371..d9dd4a41d 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -77,7 +77,7 @@ public: ErrCode GetBackupInfo(BundleName &bundleName, std::string &result) override; ErrCode UpdateTimer(BundleName &bundleName, uint32_t timeOut, bool &result) override; ErrCode UpdateSendRate(std::string &bundleName, int32_t sendRate, bool &result) override; - ErrCode ReportBundleProcessInfo(const std::string processInfo, const BackupRestoreScenario sennario) override; + ErrCode ReportAppProcessInfo(const std::string processInfo, const BackupRestoreScenario sennario) override; ErrCode SAResultReport(const std::string bundleName, const std::string resultInfo, const ErrCode errCode, const BackupRestoreScenario sennario); @@ -319,12 +319,13 @@ private: * @param restoreBundleInfos 待恢复的应用 * @param restoreBundleNames 待恢复的应用包信息 * @param bundleNameDetailMap bundle和detail的对应关系 + * @param isClearDataFlags 清理数据标志集合 * @param restoreType 任务类型 */ void SetCurrentSessProperties(std::vector &restoreBundleInfos, std::vector &restoreBundleNames, std::map> &bundleNameDetailMap, - RestoreTypeEnum restoreType); + std::map &isClearDataFlags, RestoreTypeEnum restoreType); /** * @brief set session info diff --git a/services/backup_sa/include/module_ipc/service_stub.h b/services/backup_sa/include/module_ipc/service_stub.h index 2d6738ca8..08f78286e 100644 --- a/services/backup_sa/include/module_ipc/service_stub.h +++ b/services/backup_sa/include/module_ipc/service_stub.h @@ -62,7 +62,7 @@ private: int32_t CmdGetBackupInfo(MessageParcel &data, MessageParcel &reply); int32_t CmdUpdateTimer(MessageParcel &data, MessageParcel &reply); int32_t CmdUpdateSendRate(MessageParcel &data, MessageParcel &reply); - int32_t CmdReportBundleProcessInfo(MessageParcel &data, MessageParcel &reply); + int32_t CmdReportAppProcessInfo(MessageParcel &data, MessageParcel &reply); void ServiceStubSupplement(); void ServiceStubSuppAppendBundles(); diff --git a/services/backup_sa/include/module_ipc/svc_backup_connection.h b/services/backup_sa/include/module_ipc/svc_backup_connection.h index a8c46591c..1958fcb8c 100644 --- a/services/backup_sa/include/module_ipc/svc_backup_connection.h +++ b/services/backup_sa/include/module_ipc/svc_backup_connection.h @@ -76,7 +76,7 @@ public: * @param callConnected */ void SetCallback(std::function callConnected); - + /** * @brief Set the CallDied object * @@ -91,8 +91,9 @@ public: public: SvcBackupConnection(std::function callDied, - std::function callConnected) - : callDied_(callDied), callConnected_(callConnected) + std::function callConnected, + std::string bundleNameIndexInfo) + : callDied_(callDied), callConnected_(callConnected), bundleNameIndexInfo_(bundleNameIndexInfo) { } ~SvcBackupConnection() override {}; @@ -108,6 +109,7 @@ private: std::function callDied_; std::function callConnected_; + std::string bundleNameIndexInfo_; }; } // namespace OHOS::FileManagement::Backup diff --git a/services/backup_sa/include/module_ipc/svc_extension_proxy.h b/services/backup_sa/include/module_ipc/svc_extension_proxy.h index e817810ae..a20ef5112 100644 --- a/services/backup_sa/include/module_ipc/svc_extension_proxy.h +++ b/services/backup_sa/include/module_ipc/svc_extension_proxy.h @@ -25,13 +25,13 @@ class SvcExtensionProxy : public IRemoteProxy { public: UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) override; ErrCode HandleClear() override; - ErrCode HandleBackup() override; + ErrCode HandleBackup(bool isClearData) override; ErrCode PublishFile(const std::string &fileName) override; - ErrCode HandleRestore() override; + ErrCode HandleRestore(bool isClearData) override; ErrCode GetIncrementalFileHandle(const std::string &fileName) override; ErrCode PublishIncrementalFile(const std::string &fileName) override; ErrCode HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) override; - ErrCode IncrementalOnBackup() override; + ErrCode IncrementalOnBackup(bool isClearData) override; std::tuple GetIncrementalBackupFileHandle() override; ErrCode GetBackupInfo(std::string &result) override; ErrCode UpdateFdSendRate(std::string &bundleName, int32_t sendRate) override; 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 bdb674fed..7baf1cabb 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -66,6 +66,7 @@ struct BackupExtInfo { int32_t backupPriority; std::string extInfo; int32_t appendNum {1}; + bool isClearData {true}; }; class Service; @@ -478,6 +479,9 @@ public: Impl GetImpl(); int GetSessionCnt(); + void SetClearDataFlag(const std::string &bundleName, bool isClearData); + bool GetClearDataFlag(const std::string &bundleName); + private: /** * @brief 获取backup extension ability diff --git a/services/backup_sa/src/module_external/bms_adapter.cpp b/services/backup_sa/src/module_external/bms_adapter.cpp index 87b1cfda4..09a0d132a 100644 --- a/services/backup_sa/src/module_external/bms_adapter.cpp +++ b/services/backup_sa/src/module_external/bms_adapter.cpp @@ -22,6 +22,7 @@ #include "b_error/b_error.h" #include "b_file_info.h" +#include "b_jsonutil/b_jsonutil.h" #include "b_json/b_json_entity_extension_config.h" #include "b_resources/b_constants.h" #include "b_sa/b_sa_utils.h" @@ -47,7 +48,6 @@ const string LINUX_HAP_CODE_PATH = "2"; const string MEDIA_LIBRARY_HAP = "com.ohos.medialibrary.medialibrarydata"; const string EXTERNAL_FILE_HAP = "com.ohos.UserFile.ExternalFileManager"; const int E_ERR = -1; -const int SINGLE_BUNDLE_NUM = 1; const vector dataDir = {"app", "local", "distributed", "database", "cache"}; } // namespace @@ -95,7 +95,8 @@ static int64_t GetBundleStats(const string &bundleName, int32_t userId) } auto bms = GetBundleManager(); vector bundleStats; - bool res = bms->GetBundleStats(bundleName, userId, bundleStats); + BJsonUtil::BundleDetailInfo bundleDetailInfo = BJsonUtil::ParseBundleNameIndexStr(bundleName); + bool res = bms->GetBundleStats(bundleDetailInfo.bundleName, userId, bundleStats, bundleDetailInfo.bundleIndex); if (!res || bundleStats.size() != dataDir.size()) { HILOGE("An error occurred in querying bundle stats. name:%{public}s", bundleName.c_str()); return 0; @@ -122,25 +123,20 @@ vector BundleMgrAdapter::GetBundleInfos(const vecto continue; } AppExecFwk::BundleInfo installedBundle; - if (!bms->GetBundleInfo(bundleName, AppExecFwk::GET_BUNDLE_WITH_EXTENSION_INFO, installedBundle, userId)) { - if (bundleNames.size() != SINGLE_BUNDLE_NUM) { - HILOGE("bundleName:%{public}s, current bundle info for backup/restore is empty", bundleName.c_str()); - continue; - } - throw BError(BError::Codes::SA_BUNDLE_INFO_EMPTY, "Failed to get bundle info"); - } - if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || - installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { - HILOGI("Unsupported applications, name : %{public}s", installedBundle.name.data()); + std::vector extensionInfos; + bool getBundleSuccess = GetCurBundleExtenionInfo(installedBundle, bundleName, extensionInfos, bms, userId); + if (!getBundleSuccess) { + HILOGE("Get current extension failed"); continue; } auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = - GetAllowAndExtName(installedBundle.extensionInfos); + GetAllowAndExtName(extensionInfos); int64_t dataSize = 0; if (allToBackup) { dataSize = GetBundleStats(installedBundle.name, userId); } - bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.versionCode, + bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.appIndex, + installedBundle.versionCode, installedBundle.versionName, dataSize, 0, allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo}); @@ -258,6 +254,7 @@ static bool GenerateBundleStatsIncrease(int32_t userId, const vector &bu std::string curBundleName = bundleInfos[i].name; HILOGD("BundleMgrAdapter name for %{public}s", curBundleName.c_str()); BJsonEntityCaps::BundleInfo newBundleInfo = {.name = curBundleName, + .appIndex = bundleInfos[i].appIndex, .versionCode = bundleInfos[i].versionCode, .versionName = bundleInfos[i].versionName, .spaceOccupied = pkgFileSizes[i], @@ -284,16 +281,14 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement auto bundleName = bundleNameTime.bundleName; HILOGD("Begin get bundleName:%{private}s", bundleName.c_str()); AppExecFwk::BundleInfo installedBundle; - if (!bms->GetBundleInfo(bundleName, AppExecFwk::GET_BUNDLE_WITH_EXTENSION_INFO, installedBundle, userId)) { - throw BError(BError::Codes::SA_BROKEN_IPC, "Failed to get bundle info"); - } - if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || - installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { - HILOGI("Unsupported applications, name : %{private}s", installedBundle.name.data()); + std::vector extensionInfos; + bool getBundleSuccess = GetCurBundleExtenionInfo(installedBundle, bundleName, extensionInfos, bms, userId); + if (!getBundleSuccess) { + HILOGE("Failed to get bundle info from bms, bundleName:%{public}s", bundleName.c_str()); continue; } struct BJsonEntityCaps::BundleBackupConfigPara backupPara; - if (!GetBackupExtConfig(installedBundle.extensionInfos, backupPara)) { + if (!GetBackupExtConfig(extensionInfos, backupPara)) { HILOGE("No backup extension ability found"); continue; } @@ -301,7 +296,8 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement backupPara.excludes)) { continue; } - bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.versionCode, + bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.appIndex, + installedBundle.versionCode, installedBundle.versionName, 0, 0, backupPara.allToBackup, backupPara.fullBackupOnly, backupPara.extensionName, @@ -342,9 +338,9 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = GetAllowAndExtName(installedBundle.extensionInfos); if (!allToBackup) { - bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.versionCode, - installedBundle.versionName, 0, 0, allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, - extraInfo}); + bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.appIndex, + installedBundle.versionCode, installedBundle.versionName, 0, 0, allToBackup, fullBackupOnly, extName, + restoreDeps, supportScene, extraInfo}); continue; } auto it = std::find_if(extraIncreData.begin(), extraIncreData.end(), @@ -405,7 +401,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForSA() int32_t ret = samgrProxy->GetExtensionSaIds(BConstants::EXTENSION_BACKUP, saIds); HILOGI("GetExtensionSaIds ret: %{public}d", ret); for (auto saId : saIds) { - saBundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {std::to_string(saId), 0, "", 0, 0, true, false, + saBundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {std::to_string(saId), 0, 0, "", 0, 0, true, false, "", "", "", ""}); } return saBundleInfos; @@ -435,7 +431,38 @@ void BundleMgrAdapter::GetBundleInfoForSA(std::string bundleName, std::vector &extensionInfos, + sptr bms, int32_t userId) +{ + BJsonUtil::BundleDetailInfo bundleDetailInfo = BJsonUtil::ParseBundleNameIndexStr(bundleName); + int32_t flags = static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY) | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA); + ErrCode ret = bms->GetCloneBundleInfo(bundleDetailInfo.bundleName, flags, bundleDetailInfo.bundleIndex, + installedBundle, userId); + if (ret != ERR_OK) { + HILOGE("bundleName:%{public}s, ret:%{public}d, current bundle info for backup/restore is empty", + bundleName.c_str(), ret); + return false; + } + if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || + installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { + HILOGE("Unsupported applications, name : %{public}s", installedBundle.name.data()); + return false; + } + HILOGI("bundleName:%{public}s, hapMoudleInfos size:%{public}zu", bundleName.c_str(), + installedBundle.hapModuleInfos.size()); + std::vector hapModuleInfos = installedBundle.hapModuleInfos; + for (auto &hapModuleInfo : hapModuleInfos) { + extensionInfos.insert(extensionInfos.end(), hapModuleInfo.extensionInfos.begin(), + hapModuleInfo.extensionInfos.end()); + } + HILOGI("bundleName:%{public}s, extensionInfos size:%{public}zu", bundleName.c_str(), extensionInfos.size()); + return true; +} } // namespace OHOS::FileManagement::Backup diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 21dcb8d7e..e41a66431 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -54,6 +54,8 @@ #include "hisysevent.h" #include "hitrace_meter.h" #include "ipc_skeleton.h" +#include "access_token.h" +#include "tokenid_kit.h" #include "module_app_gallery/app_gallery_dispose_proxy.h" #include "module_external/bms_adapter.h" #include "module_external/sms_adapter.h" @@ -80,6 +82,7 @@ const int32_t CONNECT_WAIT_TIME_S = 15; const std::string BACKUPSERVICE_WORK_STATUS_KEY = "persist.backupservice.workstatus"; const std::string BACKUPSERVICE_WORK_STATUS_ON = "true"; const std::string BACKUPSERVICE_WORK_STATUS_OFF = "false"; +const std::string BACKUP_PERMISSION = "ohos.permission.BACKUP"; } // namespace /* Shell/Xts user id equal to 0/1, we need set default 100 */ @@ -202,8 +205,10 @@ string Service::VerifyCallerAndGetCallerName() if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenCaller, hapTokenInfo) != 0) { throw BError(BError::Codes::SA_INVAL_ARG, "Get hap token info failed"); } - session_->VerifyBundleName(hapTokenInfo.bundleName); - return hapTokenInfo.bundleName; + std::string bundleNameIndexInfo = BJsonUtil::BuildBundleNameIndexInfo(hapTokenInfo.bundleName, + hapTokenInfo.instIndex); + session_->VerifyBundleName(bundleNameIndexInfo); + return bundleNameIndexInfo; } else { string str = to_string(tokenCaller); HILOGE("tokenID = %{private}s", GetAnonyString(str).c_str()); @@ -217,23 +222,34 @@ void Service::VerifyCaller() uint32_t tokenCaller = IPCSkeleton::GetCallingTokenID(); int tokenType = Security::AccessToken::AccessTokenKit::GetTokenType(tokenCaller); switch (tokenType) { - case Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE: /* Update Service */ + case Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE: { /* Update Service */ + if (Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, BACKUP_PERMISSION) != + Security::AccessToken::PermissionState::PERMISSION_GRANTED) { + throw BError(BError::Codes::SA_REFUSED_ACT, + string("Permission denied, token type is ").append(to_string(tokenType))); + } + break; + } case Security::AccessToken::ATokenTypeEnum::TOKEN_HAP: { - const string permission = "ohos.permission.BACKUP"; - if (Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permission) == - Security::AccessToken::TypePermissionState::PERMISSION_DENIED) { - throw BError(BError::Codes::SA_INVAL_ARG, - string("Permission denied, token type is ").append(to_string(tokenType))); + if (Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, BACKUP_PERMISSION) != + Security::AccessToken::PermissionState::PERMISSION_GRANTED) { + throw BError(BError::Codes::SA_REFUSED_ACT, + string("Permission denied, token type is ").append(to_string(tokenType))); + } + uint64_t fullTokenId = OHOS::IPCSkeleton::GetCallingFullTokenID(); + if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(fullTokenId)) { + throw BError(BError::Codes::SA_REFUSED_ACT, + string("Permission denied, token type is ").append(to_string(tokenType))); } break; } case Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL: if (IPCSkeleton::GetCallingUid() != BConstants::SYSTEM_UID) { - throw BError(BError::Codes::SA_INVAL_ARG, "Calling uid is invalid"); + throw BError(BError::Codes::SA_REFUSED_ACT, "Calling uid is invalid"); } break; default: - throw BError(BError::Codes::SA_INVAL_ARG, string("Invalid token type ").append(to_string(tokenType))); + throw BError(BError::Codes::SA_REFUSED_ACT, string("Invalid token type ").append(to_string(tokenType))); break; } } @@ -285,16 +301,27 @@ ErrCode Service::InitBackupSession(sptr remote) } catch (const BError &e) { StopAll(nullptr, true); return e.GetCode(); + } catch (const exception &e) { + HILOGI("Catched an unexpected low-level exception %{public}s", e.what()); + return EPERM; + } catch (...) { + HILOGI("Unexpected exception"); + return EPERM; } } ErrCode Service::Start() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - VerifyCaller(session_->GetScenario()); - session_->Start(); - OnStartSched(); - return BError(BError::Codes::OK); + try { + VerifyCaller(session_->GetScenario()); + session_->Start(); + OnStartSched(); + return BError(BError::Codes::OK); + } catch (const BError &e) { + HILOGE("Failde to Start"); + return e.GetCode(); + } } static bool SpecialVersion(const string &versionName) @@ -338,6 +365,7 @@ static vector GetRestoreBundleNames(UniqueFd fd, for (auto &restoreInfo : restoreInfos) { if (SAUtils::IsSABundleName(restoreInfo.name)) { BJsonEntityCaps::BundleInfo info = {.name = restoreInfo.name, + .appIndex = restoreInfo.appIndex, .versionCode = restoreInfo.versionCode, .versionName = restoreInfo.versionName, .spaceOccupied = restoreInfo.spaceOccupied, @@ -355,6 +383,7 @@ static vector GetRestoreBundleNames(UniqueFd fd, continue; } BJsonEntityCaps::BundleInfo info = {.name = (*it).name, + .appIndex = (*it).appIndex, .versionCode = (*it).versionCode, .versionName = (*it).versionName, .spaceOccupied = (*it).spaceOccupied, @@ -372,7 +401,8 @@ static void HandleExceptionOnAppendBundles(sptr session, const vector &appendBundleNames, const vector &restoreBundleNames) { if (appendBundleNames.size() != restoreBundleNames.size()) { - HILOGE("AppendBundleNames not equal restoreBundleNames."); + HILOGE("AppendBundleNames not equal restoreBundleNames, appendBundleNames size:%{public}zu," + "restoreBundleNames size:%{public}zu", appendBundleNames.size(), restoreBundleNames.size()); for (auto bundleName : appendBundleNames) { auto it = find_if(restoreBundleNames.begin(), restoreBundleNames.end(), [&bundleName](const auto &obj) { return obj == bundleName; }); @@ -396,9 +426,10 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, const vector bundleNamesOnly; + std::map isClearDataFlags; std::map> bundleNameDetailMap = - BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, userId); - auto restoreInfos = GetRestoreBundleNames(move(fd), session_, bundleNamesOnly); + BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, userId, isClearDataFlags); + auto restoreInfos = GetRestoreBundleNames(move(fd), session_, bundleNames); auto restoreBundleNames = SvcRestoreDepsManager::GetInstance().GetRestoreBundleNames(restoreInfos, restoreType); HandleExceptionOnAppendBundles(session_, bundleNames, restoreBundleNames); if (restoreBundleNames.empty()) { @@ -407,7 +438,8 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, const vectorAppendBundles(restoreBundleNames); - SetCurrentSessProperties(restoreInfos, restoreBundleNames, bundleNameDetailMap, restoreType); + SetCurrentSessProperties(restoreInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); OnStartSched(); session_->DecreaseSessionCnt(); HILOGI("End"); @@ -492,42 +524,52 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, void Service::SetCurrentSessProperties(std::vector &restoreBundleInfos, std::vector &restoreBundleNames, - std::map> &bundleNameDetailMap, RestoreTypeEnum restoreType) + std::map> &bundleNameDetailMap, + std::map &isClearDataFlags, RestoreTypeEnum restoreType) { HILOGI("Start"); for (auto restoreInfo : restoreBundleInfos) { auto it = find_if(restoreBundleNames.begin(), restoreBundleNames.end(), - [&restoreInfo](const auto &bundleName) { return bundleName == restoreInfo.name; }); + [&restoreInfo](const auto &bundleName) { + std::string bundleNameIndexInfo = BJsonUtil::BuildBundleNameIndexInfo(restoreInfo.name, + restoreInfo.appIndex); + return bundleName == bundleNameIndexInfo; + }); if (it == restoreBundleNames.end()) { throw BError(BError::Codes::SA_BUNDLE_INFO_EMPTY, "Can't find bundle name"); } HILOGD("bundleName: %{public}s, extensionName: %{public}s", restoreInfo.name.c_str(), restoreInfo.extensionName.c_str()); + std::string bundleNameIndexInfo = BJsonUtil::BuildBundleNameIndexInfo(restoreInfo.name, restoreInfo.appIndex); if ((restoreInfo.allToBackup == false && !SpecialVersion(restoreInfo.versionName)) || (restoreInfo.extensionName.empty() && !SAUtils::IsSABundleName(restoreInfo.name))) { OnBundleStarted(BError(BError::Codes::SA_FORBID_BACKUP_RESTORE), session_, restoreInfo.name); - session_->RemoveExtInfo(restoreInfo.name); + session_->RemoveExtInfo(bundleNameIndexInfo); continue; } - session_->SetBundleRestoreType(restoreInfo.name, restoreType); - session_->SetBundleVersionCode(restoreInfo.name, restoreInfo.versionCode); - session_->SetBundleVersionName(restoreInfo.name, restoreInfo.versionName); - session_->SetBundleDataSize(restoreInfo.name, restoreInfo.spaceOccupied); - session_->SetBackupExtName(restoreInfo.name, restoreInfo.extensionName); + session_->SetBundleRestoreType(bundleNameIndexInfo, restoreType); + session_->SetBundleVersionCode(bundleNameIndexInfo, restoreInfo.versionCode); + session_->SetBundleVersionName(bundleNameIndexInfo, restoreInfo.versionName); + session_->SetBundleDataSize(bundleNameIndexInfo, restoreInfo.spaceOccupied); + session_->SetBackupExtName(bundleNameIndexInfo, restoreInfo.extensionName); + auto iter = isClearDataFlags.find(bundleNameIndexInfo); + if (iter != isClearDataFlags.end()) { + session_->SetClearDataFlag(bundleNameIndexInfo, iter->second); + } BJsonUtil::BundleDetailInfo broadCastInfo; BJsonUtil::BundleDetailInfo uniCastInfo; - bool broadCastRet = BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, restoreInfo.name, BROADCAST_TYPE, + bool broadCastRet = BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, bundleNameIndexInfo, BROADCAST_TYPE, broadCastInfo); if (broadCastRet) { bool notifyRet = DelayedSingleton::GetInstance()->NotifyBundleDetail(broadCastInfo); HILOGI("Publish event end, notify result is:%{public}d", notifyRet); } - bool uniCastRet = BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, restoreInfo.name, UNICAST_TYPE, + bool uniCastRet = BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, bundleNameIndexInfo, UNICAST_TYPE, uniCastInfo); if (uniCastRet) { HILOGI("current bundle, unicast info:%{public}s", GetAnonyString(uniCastInfo.detail).c_str()); - session_->SetBackupExtInfo(restoreInfo.name, uniCastInfo.detail); + session_->SetBackupExtInfo(bundleNameIndexInfo, uniCastInfo.detail); } } HILOGI("End"); @@ -579,22 +621,26 @@ ErrCode Service::AppendBundlesDetailsBackupSession(const vector &bun session_->IncreaseSessionCnt(); // BundleMgrAdapter::GetBundleInfos可能耗时 VerifyCaller(IServiceReverse::Scenario::BACKUP); std::vector bundleNamesOnly; + std::map isClearDataFlags; std::map> bundleNameDetailMap = - BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, session_->GetSessionUserId()); + BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + session_->GetSessionUserId(), isClearDataFlags); auto backupInfos = BundleMgrAdapter::GetBundleInfos(bundleNames, session_->GetSessionUserId()); session_->AppendBundles(bundleNames); for (auto info : backupInfos) { session_->SetBundleDataSize(info.name, info.spaceOccupied); session_->SetBackupExtName(info.name, info.extensionName); + auto iter = isClearDataFlags.find(info.name); + if (iter != isClearDataFlags.end()) { + session_->SetClearDataFlag(info.name, iter->second); + } if (info.allToBackup == false) { session_->GetServiceReverseProxy()->BackupOnBundleStarted( BError(BError::Codes::SA_FORBID_BACKUP_RESTORE), info.name); session_->RemoveExtInfo(info.name); } BJsonUtil::BundleDetailInfo uniCastInfo; - bool uniCastRet = BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, info.name, UNICAST_TYPE, - uniCastInfo); - if (uniCastRet) { + if (BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, info.name, UNICAST_TYPE, uniCastInfo)) { HILOGI("current bundle, unicast info:%{public}s", GetAnonyString(uniCastInfo.detail).c_str()); session_->SetBackupExtInfo(info.name, uniCastInfo.detail); } @@ -623,10 +669,15 @@ ErrCode Service::AppendBundlesDetailsBackupSession(const vector &bun ErrCode Service::Finish() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - VerifyCaller(session_->GetScenario()); - session_->Finish(); - OnAllBundlesFinished(BError(BError::Codes::OK)); - return BError(BError::Codes::OK); + try { + VerifyCaller(session_->GetScenario()); + session_->Finish(); + OnAllBundlesFinished(BError(BError::Codes::OK)); + return BError(BError::Codes::OK); + } catch (const BError &e) { + HILOGE("Failde to Finish"); + return e.GetCode(); + } } ErrCode Service::PublishFile(const BFileInfo &fileInfo) @@ -822,21 +873,23 @@ void Service::NotifyCloneBundleFinish(std::string bundleName) void Service::SetWant(AAFwk::Want &want, const BundleName &bundleName, const BConstants::ExtensionAction &action) { + BJsonUtil::BundleDetailInfo bundleDetail = BJsonUtil::ParseBundleNameIndexStr(bundleName); string backupExtName = session_->GetBackupExtName(bundleName); /* new device app ext name */ - HILOGD("BackupExtName: %{public}s, bundleName: %{public}s", backupExtName.data(), bundleName.data()); + HILOGI("BackupExtName: %{public}s, bundleName: %{public}s", backupExtName.data(), bundleName.data()); string versionName = session_->GetBundleVersionName(bundleName); /* old device app version name */ int64_t versionCode = session_->GetBundleVersionCode(bundleName); /* old device app version code */ RestoreTypeEnum restoreType = session_->GetBundleRestoreType(bundleName); /* app restore type */ string bundleExtInfo = session_->GetBackupExtInfo(bundleName); HILOGI("BundleExtInfo is:%{public}s", GetAnonyString(bundleExtInfo).c_str()); - want.SetElementName(bundleName, backupExtName); + want.SetElementName(bundleDetail.bundleName, backupExtName); want.SetParam(BConstants::EXTENSION_ACTION_PARA, static_cast(action)); want.SetParam(BConstants::EXTENSION_VERSION_CODE_PARA, static_cast(versionCode)); want.SetParam(BConstants::EXTENSION_RESTORE_TYPE_PARA, static_cast(restoreType)); want.SetParam(BConstants::EXTENSION_VERSION_NAME_PARA, versionName); want.SetParam(BConstants::EXTENSION_RESTORE_EXT_INFO_PARA, bundleExtInfo); want.SetParam(BConstants::EXTENSION_BACKUP_EXT_INFO_PARA, bundleExtInfo); + want.SetParam(BConstants::EXTENSION_APP_CLONE_INDEX_PARA, bundleDetail.bundleIndex); } ErrCode Service::LaunchBackupExtension(const BundleName &bundleName) @@ -868,7 +921,11 @@ ErrCode Service::LaunchBackupExtension(const BundleName &bundleName) return BError(BError::Codes::SA_INVAL_ARG); } ErrCode ret = backUpConnection->ConnectBackupExtAbility(want, session_->GetSessionUserId()); - return ret; + if (ret) { + HILOGE("ConnectBackupExtAbility faild, bundleName:%{public}s, ret:%{public}d", bundleName.c_str(), ret); + return BError(BError::Codes::SA_BOOT_EXT_FAIL); + } + return BError(BError::Codes::OK); } catch (const BError &e) { return e.GetCode(); } catch (const exception &e) { @@ -1030,7 +1087,7 @@ void Service::ExtStart(const string &bundleName) throw BError(BError::Codes::SA_INVAL_ARG, "ExtStart bundle task error, Extension backup Proxy is empty"); } if (scenario == IServiceReverse::Scenario::BACKUP) { - auto ret = proxy->HandleBackup(); + auto ret = proxy->HandleBackup(session_->GetClearDataFlag(bundleName)); session_->GetServiceReverseProxy()->BackupOnBundleStarted(ret, bundleName); if (ret) { ClearSessionAndSchedInfo(bundleName); @@ -1041,7 +1098,7 @@ void Service::ExtStart(const string &bundleName) if (scenario != IServiceReverse::Scenario::RESTORE) { throw BError(BError::Codes::SA_INVAL_ARG, "Failed to scenario"); } - auto ret = proxy->HandleRestore(); + auto ret = proxy->HandleRestore(session_->GetClearDataFlag(bundleName)); session_->GetServiceReverseProxy()->RestoreOnBundleStarted(ret, bundleName); auto fileNameVec = session_->GetExtFileNameRequest(bundleName); for (auto &fileName : fileNameVec) { @@ -1469,8 +1526,8 @@ ErrCode Service::GetBackupInfoCmdHandle(BundleName &bundleName, std::string &res AAFwk::Want want = CreateConnectWant(bundleName); auto ret = backupConnection->ConnectBackupExtAbility(want, session_->GetSessionUserId()); if (ret) { - HILOGE("ConnectBackupExtAbility faild, please check bundleName: %{public}s", bundleName.c_str()); - return BError(BError::Codes::EXT_ABILITY_DIED); + HILOGE("ConnectBackupExtAbility faild, bundleName:%{public}s, ret:%{public}d", bundleName.c_str(), ret); + return BError(BError::Codes::SA_BOOT_EXT_FAIL); } std::unique_lock lock(getBackupInfoMutx_); getBackupInfoCondition_.wait_for(lock, std::chrono::seconds(CONNECT_WAIT_TIME_S)); @@ -1709,7 +1766,7 @@ void Service::NotifyCallerCurAppDone(ErrCode errCode, const std::string &callerN } } -ErrCode Service::ReportBundleProcessInfo(const std::string processInfo, BackupRestoreScenario sennario) +ErrCode Service::ReportAppProcessInfo(const std::string processInfo, BackupRestoreScenario sennario) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { @@ -1729,9 +1786,6 @@ ErrCode Service::ReportBundleProcessInfo(const std::string processInfo, BackupRe } catch (const exception &e) { HILOGI("Catched an unexpected low-level exception %{public}s", e.what()); return EPERM; - } catch (...) { - HILOGI("Unexpected exception"); - return EPERM; } } } // namespace OHOS::FileManagement::Backup diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 07c6f6f87..7df256035 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -293,22 +293,26 @@ ErrCode Service::AppendBundlesIncrementalBackupSession(const std::vector bundleNamesOnly; + std::map isClearDataFlags; std::map> bundleNameDetailMap = - BJsonUtil::BuildBundleInfos(bundleNames, infos, bundleNamesOnly, session_->GetSessionUserId()); + BJsonUtil::BuildBundleInfos(bundleNames, infos, bundleNamesOnly, + session_->GetSessionUserId(), isClearDataFlags); auto backupInfos = BundleMgrAdapter::GetBundleInfos(bundleNames, session_->GetSessionUserId()); session_->AppendBundles(bundleNames); for (auto info : backupInfos) { session_->SetBundleDataSize(info.name, info.spaceOccupied); session_->SetBackupExtName(info.name, info.extensionName); + auto iter = isClearDataFlags.find(info.name); + if (iter != isClearDataFlags.end()) { + session_->SetClearDataFlag(info.name, iter->second); + } if (info.allToBackup == false) { session_->GetServiceReverseProxy()->IncrementalBackupOnBundleStarted( BError(BError::Codes::SA_FORBID_BACKUP_RESTORE), info.name); session_->RemoveExtInfo(info.name); } BJsonUtil::BundleDetailInfo uniCastInfo; - bool uniCastRet = BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, info.name, UNICAST_TYPE, - uniCastInfo); - if (uniCastRet) { + if (BJsonUtil::FindBundleInfoByName(bundleNameDetailMap, info.name, UNICAST_TYPE, uniCastInfo)) { HILOGI("current bundle, unicast info:%{public}s", GetAnonyString(uniCastInfo.detail).c_str()); session_->SetBackupExtInfo(info.name, uniCastInfo.detail); } @@ -519,7 +523,7 @@ bool Service::IncrementalBackup(const string &bundleName) throw BError(BError::Codes::SA_INVAL_ARG, "Extension backup Proxy is empty"); } if (scenario == IServiceReverse::Scenario::BACKUP && session_->GetIsIncrementalBackup()) { - auto ret = proxy->IncrementalOnBackup(); + auto ret = proxy->IncrementalOnBackup(session_->GetClearDataFlag(bundleName)); session_->GetServiceReverseProxy()->IncrementalBackupOnBundleStarted(ret, bundleName); if (ret) { ClearSessionAndSchedInfo(bundleName); @@ -528,7 +532,7 @@ bool Service::IncrementalBackup(const string &bundleName) return true; } else if (scenario == IServiceReverse::Scenario::RESTORE && BackupPara().GetBackupOverrideIncrementalRestore() && session_->ValidRestoreDataType(RestoreTypeEnum::RESTORE_DATA_WAIT_SEND)) { - auto ret = proxy->HandleRestore(); + auto ret = proxy->HandleRestore(session_->GetClearDataFlag(bundleName)); session_->GetServiceReverseProxy()->IncrementalRestoreOnBundleStarted(ret, bundleName); auto fileNameVec = session_->GetExtFileNameRequest(bundleName); for (auto &fileName : fileNameVec) { diff --git a/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp b/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp index 6a9cd7560..2e88f0104 100644 --- a/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp @@ -121,6 +121,24 @@ void ServiceReverseProxy::IncrementalBackupOnAllBundlesFinished(int32_t errCode) } } +void ServiceReverseProxy::IncrementalBackupOnProcessInfo(std::string bundleName, std::string processInfo) +{ + BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); + MessageParcel data; + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(processInfo)) { + throw BError(BError::Codes::SA_BROKEN_IPC); + } + + MessageParcel reply; + MessageOption option; + if (int err = Remote()->SendRequest( + static_cast(IServiceReverseInterfaceCode::SERVICER_INCREMENTAL_BACKUP_ON_PROCESS_INFO), + data, reply, option); + err != ERR_OK) { + throw BError(BError::Codes::SA_BROKEN_IPC, to_string(err)); + } +} + void ServiceReverseProxy::IncrementalRestoreOnBundleStarted(int32_t errCode, string bundleName) { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); @@ -217,4 +235,22 @@ void ServiceReverseProxy::IncrementalRestoreOnFileReady(string bundleName, strin throw BError(BError::Codes::SA_BROKEN_IPC, to_string(err)); } } + +void ServiceReverseProxy::IncrementalRestoreOnProcessInfo(std::string bundleName, std::string processInfo) +{ + BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); + MessageParcel data; + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(processInfo)) { + throw BError(BError::Codes::SA_BROKEN_IPC); + } + + MessageParcel reply; + MessageOption option; + if (int err = Remote()->SendRequest( + static_cast(IServiceReverseInterfaceCode::SERVICER_INCREMENTAL_RESTORE_ON_PROCESS_INFO), + data, reply, option); + err != ERR_OK) { + throw BError(BError::Codes::SA_BROKEN_IPC, to_string(err)); + } +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp index fdb44c962..b1f7a6e6c 100644 --- a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp @@ -113,6 +113,23 @@ void ServiceReverseProxy::BackupOnAllBundlesFinished(int32_t errCode) } } +void ServiceReverseProxy::BackupOnProcessInfo(std::string bundleName, std::string processInfo) +{ + BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); + MessageParcel data; + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(processInfo)) { + throw BError(BError::Codes::SA_BROKEN_IPC); + } + + MessageParcel reply; + MessageOption option; + if (int err = Remote()->SendRequest( + static_cast(IServiceReverseInterfaceCode::SERVICER_BACKUP_ON_PROCESS_INFO), data, reply, option); + err != ERR_OK) { + throw BError(BError::Codes::SA_BROKEN_IPC, to_string(err)); + } +} + void ServiceReverseProxy::RestoreOnBundleStarted(int32_t errCode, string bundleName) { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); @@ -209,4 +226,21 @@ void ServiceReverseProxy::RestoreOnResultReport(string result, std::string bundl throw BError(BError::Codes::SA_BROKEN_IPC, to_string(err)); } } + +void ServiceReverseProxy::RestoreOnProcessInfo(std::string bundleName, std::string processInfo) +{ + BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); + MessageParcel data; + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(processInfo)) { + throw BError(BError::Codes::SA_BROKEN_IPC); + } + + MessageParcel reply; + MessageOption option; + if (int err = Remote()->SendRequest( + static_cast(IServiceReverseInterfaceCode::SERVICER_RESTORE_ON_PROCESS_INFO), data, reply, option); + err != ERR_OK) { + throw BError(BError::Codes::SA_BROKEN_IPC, to_string(err)); + } +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/services/backup_sa/src/module_ipc/service_stub.cpp b/services/backup_sa/src/module_ipc/service_stub.cpp index 9f93ca029..f14bee9d2 100644 --- a/services/backup_sa/src/module_ipc/service_stub.cpp +++ b/services/backup_sa/src/module_ipc/service_stub.cpp @@ -44,8 +44,8 @@ void ServiceStub::ServiceStubSupplement() IServiceInterfaceCode::SERVICE_CMD_GET_APP_LOCAL_LIST_AND_DO_INCREMENTAL_BACKUP)] = &ServiceStub::CmdGetAppLocalListAndDoIncrementalBackup; opToInterfaceMap_[static_cast( - IServiceInterfaceCode::SERVICE_CMD_REPORT_BUNDLE_PROCESS_INFO)] = - &ServiceStub::CmdReportBundleProcessInfo; + IServiceInterfaceCode::SERVICE_CMD_REPORT_APP_PROCESS_INFO)] = + &ServiceStub::CmdReportAppProcessInfo; } void ServiceStub::ServiceStubSuppAppendBundles() @@ -625,17 +625,18 @@ int32_t ServiceStub::CmdGetIncrementalFileHandle(MessageParcel &data, MessagePar return GetIncrementalFileHandle(bundleName, fileName); } -int32_t ServiceStub::CmdReportBundleProcessInfo(MessageParcel &data, MessageParcel &reply) +int32_t ServiceStub::CmdReportAppProcessInfo(MessageParcel &data, MessageParcel &reply) { string processInfo; if (!data.ReadString(processInfo)) { return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive bundleName").GetCode(); } - BackupRestoreScenario secenrioInfo = static_cast(scenario); - if (!data.ReadInt32(errCode)) { + int32_t scenario; + if (!data.ReadInt32(scenario)) { return BError(BError::Codes::SA_INVAL_ARG, "Failed to receive errCode"); } - return ReportBundleProcessInfo(processInfo, secenrioInfo); + BackupRestoreScenario secenrioInfo = static_cast(scenario); + return ReportAppProcessInfo(processInfo, secenrioInfo); } template diff --git a/services/backup_sa/src/module_ipc/svc_backup_connection.cpp b/services/backup_sa/src/module_ipc/svc_backup_connection.cpp index befce1a26..f9dc891c6 100644 --- a/services/backup_sa/src/module_ipc/svc_backup_connection.cpp +++ b/services/backup_sa/src/module_ipc/svc_backup_connection.cpp @@ -63,7 +63,12 @@ void SvcBackupConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &el "PID", getpid(), "TIME", strTime.str() ); - callConnected_(move(bundleName)); + if (bundleNameIndexInfo_.find(bundleName) == string::npos) { + HILOGE("Current bundle name is wrong, bundleNameIndexInfo:%{public}s, bundleName:%{public}s", + bundleNameIndexInfo_.c_str(), bundleName.c_str()); + return; + } + callConnected_(move(bundleNameIndexInfo_)); HILOGI("called end"); } diff --git a/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp b/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp index c4355e6aa..434ac777c 100644 --- a/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp +++ b/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp @@ -101,13 +101,15 @@ ErrCode SvcExtensionProxy::HandleIncrementalBackup(UniqueFd incrementalFd, Uniqu return reply.ReadInt32(); } -ErrCode SvcExtensionProxy::IncrementalOnBackup() +ErrCode SvcExtensionProxy::IncrementalOnBackup(bool isClearData) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGD("Start"); BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; - data.WriteInterfaceToken(GetDescriptor()); + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteBool(isClearData)) { + return BError(BError::Codes::SDK_INVAL_ARG, "build param fail."); + } MessageParcel reply; MessageOption option; diff --git a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp index 57e126eb3..ce2bfcc36 100644 --- a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp +++ b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp @@ -79,13 +79,15 @@ ErrCode SvcExtensionProxy::HandleClear() return reply.ReadInt32(); } -ErrCode SvcExtensionProxy::HandleBackup() +ErrCode SvcExtensionProxy::HandleBackup(bool isClearData) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("Start"); BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; - data.WriteInterfaceToken(GetDescriptor()); + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteBool(isClearData)) { + return BError(BError::Codes::SDK_INVAL_ARG, "build param fail."); + } MessageParcel reply; MessageOption option; @@ -126,13 +128,15 @@ ErrCode SvcExtensionProxy::PublishFile(const string &fileName) return reply.ReadInt32(); } -ErrCode SvcExtensionProxy::HandleRestore() +ErrCode SvcExtensionProxy::HandleRestore(bool isClearData) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("Start"); BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; - data.WriteInterfaceToken(GetDescriptor()); + if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteBool(isClearData)) { + return BError(BError::Codes::SDK_INVAL_ARG, "build param fail."); + } MessageParcel reply; MessageOption option; diff --git a/services/backup_sa/src/module_ipc/svc_restore_deps_manager.cpp b/services/backup_sa/src/module_ipc/svc_restore_deps_manager.cpp index 94bb23b36..70879196a 100644 --- a/services/backup_sa/src/module_ipc/svc_restore_deps_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_restore_deps_manager.cpp @@ -15,6 +15,7 @@ #include "module_ipc/svc_restore_deps_manager.h" +#include "b_jsonutil/b_jsonutil.h" #include "filemgmt_libhilog.h" namespace OHOS::FileManagement::Backup { @@ -28,11 +29,12 @@ vector SvcRestoreDepsManager::GetRestoreBundleNames(const vector &bundleInfos) { for (auto &bundleInfo : bundleInfos) { - if (depsMap_.find(bundleInfo.name) != depsMap_.end()) { + std::string bundleNameIndexInfo = BJsonUtil::BuildBundleNameIndexInfo(bundleInfo.name, bundleInfo.appIndex); + if (depsMap_.find(bundleNameIndexInfo) != depsMap_.end()) { continue; } allBundles_.emplace_back(bundleInfo); @@ -92,7 +95,7 @@ void SvcRestoreDepsManager::BuildDepsMap(const vector SvcSessionManager::GetBackupAbilityExt(const string &b revPtrStrong->ExtConnectDone(move(bundleName)); }; - return sptr(new SvcBackupConnection(callDied, callConnected)); + return sptr(new SvcBackupConnection(callDied, callConnected, bundleName)); } std::shared_ptr SvcSessionManager::GetBackupSAExt(const std::string &bundleName) @@ -847,6 +847,26 @@ void SvcSessionManager::SetMemParaCurSize(int32_t size) memoryParaCurSize_ = size; } +void SvcSessionManager::SetClearDataFlag(const std::string &bundleName, bool isClearData) +{ + 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.isClearData = isClearData; + HILOGI("bundleName:%{public}s, set clear data flag:%{public}d.", bundleName.c_str(), isClearData); +} +bool SvcSessionManager::GetClearDataFlag(const std::string &bundleName) +{ + unique_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.isClearData; +} + bool SvcSessionManager::ValidRestoreDataType(RestoreTypeEnum restoreDataType) { return impl_.restoreDataType == restoreDataType; diff --git a/services/backup_sa/src/module_sched/sched_scheduler.cpp b/services/backup_sa/src/module_sched/sched_scheduler.cpp index 910b1e4f7..20f7e530c 100644 --- a/services/backup_sa/src/module_sched/sched_scheduler.cpp +++ b/services/backup_sa/src/module_sched/sched_scheduler.cpp @@ -83,7 +83,7 @@ void SchedScheduler::ExecutingQueueTasks(const string &bundleName) HILOGE("Extension connect failed = %{public}s", bundleName.data()); auto ptr = reversePtr.promote(); if (ptr) { - ptr->ExtConnectFailed(bundleName, BError(BError::Codes::SA_BOOT_TIMEOUT)); + ptr->ExtConnectFailed(bundleName, BError(BError::Codes::SA_BOOT_EXT_TIMEOUT)); } }; auto iTime = extTime_.Register(callStart, BConstants::EXT_CONNECT_MAX_TIME, true); diff --git a/test/fuzztest/backupext_fuzzer/BUILD.gn b/test/fuzztest/backupext_fuzzer/BUILD.gn index b406dbcd5..5d32a6bd6 100644 --- a/test/fuzztest/backupext_fuzzer/BUILD.gn +++ b/test/fuzztest/backupext_fuzzer/BUILD.gn @@ -42,6 +42,7 @@ ohos_fuzztest("BackupExtFuzzTest") { "${path_backup}/frameworks/native/backup_ext/src/ext_backup_loader.cpp", "${path_backup}/frameworks/native/backup_ext/src/ext_extension.cpp", "${path_backup}/frameworks/native/backup_ext/src/ext_extension_stub.cpp", + "${path_backup}/frameworks/native/backup_ext/src/sub_ext_extension.cpp", "${path_backup}/frameworks/native/backup_ext/src/tar_file.cpp", "${path_backup}/frameworks/native/backup_ext/src/untar_file.cpp", "backupext_fuzzer.cpp", diff --git a/test/unittest/file_share_ndk_test/BUILD.gn b/test/unittest/file_share_ndk_test/BUILD.gn index 75128bd0b..f1007eed3 100644 --- a/test/unittest/file_share_ndk_test/BUILD.gn +++ b/test/unittest/file_share_ndk_test/BUILD.gn @@ -16,7 +16,7 @@ import("//build/test.gni") group("unittest") { testonly = true deps = [ - "file_share_nopermission_test:file_share_no_permission_ndk_test", + "file_share_permission_sup_test:file_share_permission_ndk_sup_test", "file_share_permission_test:file_share_permission_ndk_test", ] } diff --git a/test/unittest/file_share_ndk_test/file_share_nopermission_test/file_share_nopermission_test.cpp b/test/unittest/file_share_ndk_test/file_share_nopermission_test/file_share_nopermission_test.cpp deleted file mode 100644 index 1689a4557..000000000 --- a/test/unittest/file_share_ndk_test/file_share_nopermission_test/file_share_nopermission_test.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * 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 - -#include "common_func.h" -#include "error_code.h" -#include "oh_file_share.h" -#include "parameter.h" - -using namespace testing::ext; -using namespace OHOS::AppFileService; -namespace { -const std::string FILE_MANAGER_FULL_MOUNT_ENABLE_PARAMETER_STR = "const.filemanager.full_mount.enable"; -} // namespace - -static bool CheckFileManagerFullMountEnable() -{ - char value[] = "false"; - int retSystem = GetParameter(FILE_MANAGER_FULL_MOUNT_ENABLE_PARAMETER_STR.c_str(), "false", value, sizeof(value)); - if (retSystem > 0 && !std::strcmp(value, "true")) { - return true; - } - GTEST_LOG_(INFO) << "Not supporting all mounts"; - return false; -} - -namespace OHOS::AppFileService::ModuleFileShareNoPermission { - -class NDKFileShareNoPermissionTest : public testing::Test { -public: - static void SetUpTestCase(void) {}; - static void TearDownTestCase(void) {}; - void SetUp() {}; - void TearDown() {}; -}; - -/** - * @tc.name: OH_FileShare_PersistPermission_test - * @tc.desc: Test function of OH_FileShare_PersistPermission() interface for no permission. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: - */ -HWTEST_F(NDKFileShareNoPermissionTest, OH_FileShare_PersistPermission_test, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test start"; - char policyUriChar[] = "file://com.example.filesharea/storage"; - FileShare_PolicyInfo policy = { - .uri = policyUriChar, - .length = sizeof(policyUriChar) - 1, - .operationMode = FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE - }; - FileShare_PolicyInfo policies[] = {policy}; - unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); - FileShare_PolicyErrorResult *result = nullptr; - unsigned int resultNum; - FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_PERMISSION); - } - if (result != nullptr) { - OH_FileShare_ReleasePolicyErrorResult(result, resultNum); - } - GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test end"; -} - -/** - * @tc.name: OH_FileShare_RevokePermission_test - * @tc.desc: Test function of OH_FileShare_RevokePermission() interface for no permission. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: - */ -HWTEST_F(NDKFileShareNoPermissionTest, OH_FileShare_RevokePermission_test, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "OH_FileShare_RevokePermission_test start"; - char policyUriChar[] = "file://com.example.filesharea/storage"; - FileShare_PolicyInfo policy = {.uri = policyUriChar, - .length = sizeof(policyUriChar) - 1, - .operationMode = - FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; - FileShare_PolicyInfo policies[] = {policy}; - unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); - FileShare_PolicyErrorResult *result = nullptr; - unsigned int resultNum; - FileManagement_ErrCode ret = OH_FileShare_RevokePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_PERMISSION); - } - if (result != nullptr) { - OH_FileShare_ReleasePolicyErrorResult(result, resultNum); - } - GTEST_LOG_(INFO) << "OH_FileShare_RevokePermission_test end"; -} - -/** - * @tc.name: OH_FileShare_ActivatePermission_test - * @tc.desc: Test function of OH_FileShare_ActivatePermission() interface for no permission. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: - */ -HWTEST_F(NDKFileShareNoPermissionTest, OH_FileShare_ActivatePermission_test, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "OH_FileShare_ActivatePermission_test start"; - char policyUriChar[] = "file://com.example.filesharea/storage"; - FileShare_PolicyInfo policy = {.uri = policyUriChar, - .length = sizeof(policyUriChar) - 1, - .operationMode = - FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; - FileShare_PolicyInfo policies[] = {policy}; - unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); - FileShare_PolicyErrorResult *result = nullptr; - unsigned int resultNum; - FileManagement_ErrCode ret = OH_FileShare_ActivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_PERMISSION); - } - if (result != nullptr) { - OH_FileShare_ReleasePolicyErrorResult(result, resultNum); - } - GTEST_LOG_(INFO) << "OH_FileShare_ActivatePermission_test end"; -} - -/** - * @tc.name: OH_FileShare_DeactivatePermission_test - * @tc.desc: Test function of OH_FileShare_DeactivatePermission() interface for no permission. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: - */ -HWTEST_F(NDKFileShareNoPermissionTest, OH_FileShare_DeactivatePermission_test, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "OH_FileShare_DeactivatePermission_test start"; - char policyUriChar[] = "file://com.example.filesharea/storage"; - FileShare_PolicyInfo policy = {.uri = policyUriChar, - .length = sizeof(policyUriChar) - 1, - .operationMode = - FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; - FileShare_PolicyInfo policies[] = {policy}; - unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); - FileShare_PolicyErrorResult *result = nullptr; - unsigned int resultNum; - FileManagement_ErrCode ret = OH_FileShare_DeactivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_PERMISSION); - } - if (result != nullptr) { - OH_FileShare_ReleasePolicyErrorResult(result, resultNum); - } - GTEST_LOG_(INFO) << "OH_FileShare_DeactivatePermission_test end"; -} - -/** - * @tc.name: OH_FileShare_CheckPersistentPermission_test - * @tc.desc: Test function of OH_FileShare_CheckPersistentPermission() interface for no permission. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: - */ -HWTEST_F(NDKFileShareNoPermissionTest, OH_FileShare_CheckPersistentPermission_test, TestSize.Level1) -{ - GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test start"; - char policyUriChar[] = "file://com.example.filesharea/storage"; - FileShare_PolicyInfo policy = {.uri = policyUriChar, - .length = sizeof(policyUriChar) - 1, - .operationMode = - FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; - FileShare_PolicyInfo policies[] = {policy}; - unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); - bool *result = nullptr; - unsigned int resultNum; - FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_PERMISSION); - } - if (result != nullptr) { - free(result); - } - GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test end"; -} - -} // namespace OHOS::AppFileService::ModuleFileShareNoPermission \ No newline at end of file diff --git a/test/unittest/file_share_ndk_test/file_share_nopermission_test/BUILD.gn b/test/unittest/file_share_ndk_test/file_share_permission_sup_test/BUILD.gn similarity index 62% rename from test/unittest/file_share_ndk_test/file_share_nopermission_test/BUILD.gn rename to test/unittest/file_share_ndk_test/file_share_permission_sup_test/BUILD.gn index ec3710413..5d75c18f5 100644 --- a/test/unittest/file_share_ndk_test/file_share_nopermission_test/BUILD.gn +++ b/test/unittest/file_share_ndk_test/file_share_permission_sup_test/BUILD.gn @@ -14,34 +14,46 @@ import("//build/test.gni") import("//foundation/filemanagement/app_file_service/app_file_service.gni") -ohos_unittest("file_share_no_permission_ndk_test") { +ohos_unittest("file_share_permission_ndk_sup_test") { branch_protector_ret = "pac_ret" sanitize = { integer_overflow = true cfi = true cfi_cross_dso = true debug = false + blocklist = "${app_file_service_path}/cfi_blocklist.txt" } module_out_path = "filemanagement/app_file_service" include_dirs = [ "include", "${app_file_service_path}/interfaces/kits/ndk/fileshare/include", + "${app_file_service_path}/tests/mock/file_permission_native_mock/include", + "${app_file_service_path}/tests/mock/parameter_mock/include", "//third_party/googletest/include", ] - - sources = [ "file_share_nopermission_test.cpp" ] + resource_config_file = "../../resource/ohos_test.xml" + sources = [ + "${app_file_service_path}/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp", + "${app_file_service_path}/tests/mock/file_permission_native_mock/src/file_permission_mock.cpp", + "file_share_permission_sup_test.cpp", + ] external_deps = [ + "ability_base:base", + "ability_base:want", "ability_base:zuri", + "access_token:libaccesstoken_sdk", + "access_token:libnativetoken", + "access_token:libtoken_setproc", "c_utils:utils", - "file_api:filemgmt_libn", + "common_event_service:cesfwk_innerkits", "hilog:libhilog", "init:libbegetutil", + "ipc:ipc_core", + "samgr:samgr_proxy", ] - deps = [ "${app_file_service_path}/interfaces/innerkits/native:fileshare_native", - "${app_file_service_path}/interfaces/kits/ndk/fileshare/src:ohfileshare", "//third_party/googletest:gmock_main", "//third_party/googletest:gtest_main", ] diff --git a/test/unittest/file_share_ndk_test/file_share_permission_sup_test/file_share_permission_sup_test.cpp b/test/unittest/file_share_ndk_test/file_share_permission_sup_test/file_share_permission_sup_test.cpp new file mode 100644 index 000000000..9d988473c --- /dev/null +++ b/test/unittest/file_share_ndk_test/file_share_permission_sup_test/file_share_permission_sup_test.cpp @@ -0,0 +1,339 @@ +/* + * 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 "oh_file_share.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "accesstoken_kit.h" +#include "nativetoken_kit.h" +#include "permission_def.h" +#include "permission_state_full.h" +#include "securec.h" +#include "token_setproc.h" +#include "uri.h" + +#include "error_code.h" +#include "file_permission_mock.h" + +using namespace testing::ext; +using namespace testing; +using namespace OHOS::AppFileService; +using namespace OHOS::Security::AccessToken; + +namespace OHOS::AppFileService::ModuleFileSharePermission { +void GrantNativePermission() +{ + const char **perms = new const char *[1]; + perms[0] = "ohos.permission.FILE_ACCESS_PERSIST"; + TokenInfoParams infoInstance = { + .dcapsNum = 0, + .permsNum = 1, + .aclsNum = 0, + .dcaps = nullptr, + .perms = perms, + .acls = nullptr, + .processName = "app_file_service", + .aplStr = "system_core", + }; + uint64_t tokenId = GetAccessTokenId(&infoInstance); + SetSelfTokenID(tokenId); + AccessTokenKit::ReloadNativeTokenInfo(); + delete[] perms; +} + +class NDKFileSharePermissionSupTest : public testing::Test { +public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp() {}; + void TearDown() {}; + static inline shared_ptr filePermMoc_ = nullptr; +}; + +void NDKFileSharePermissionSupTest::SetUpTestCase() +{ + GrantNativePermission(); + + filePermMoc_ = make_shared(); + FilePermissionMock::filePermissionMock = filePermMoc_; +} + +void NDKFileSharePermissionSupTest::TearDownTestCase() +{ + FilePermissionMock::filePermissionMock = nullptr; + filePermMoc_ = nullptr; +} + +/** + * @tc.name: OH_FileShare_PersistPermission_test_002 + * @tc.desc: Test function of OH_FileShare_PersistPermission() interface for invalid path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_PersistPermission_test_002, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_002 start"; + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = nullptr, + .length = 0, + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum; + FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_PARAMS); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + + policies[0].uri = policyUriChar; + ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_PARAMS); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + + policies[0].length = sizeof(policyUriChar); + ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_PARAMS); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_002 end"; +} + +/** + * @tc.name: OH_FileShare_PersistPermission_test_003 + * @tc.desc: Test function of OH_FileShare_PersistPermission() interface for invalid path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_PersistPermission_test_003, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_003 start"; + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = policyUriChar, + .length = strlen(policyUriChar), + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum; + + EXPECT_CALL(*filePermMoc_, PersistPermission(_, _)).WillOnce(Return(E_PERMISSION)); + FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_ENOMEM); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + + std::deque errorResults; + for (int i = 0; i <= MAX_ARRAY_SIZE; i++) { + PolicyErrorResult rlt; + errorResults.push_back(rlt); + } + + EXPECT_CALL(*filePermMoc_, PersistPermission(_, _)) + .WillOnce(DoAll(SetArgReferee<1>(errorResults), Return(E_PARAMS))); + ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_ENOMEM); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_003 end"; +} + +/** + * @tc.name: OH_FileShare_PersistPermission_test_004 + * @tc.desc: Test function of OH_FileShare_PersistPermission() interface for invalid path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_PersistPermission_test_004, TestSize.Level1) +{ + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = policyUriChar, + .length = strlen(policyUriChar), + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum; + + PolicyErrorResult rltOne = {.uri = string(policy.uri)}; + std::deque errorResults; + errorResults.push_back(rltOne); + EXPECT_CALL(*filePermMoc_, PersistPermission(_, _)) + .WillOnce(DoAll(SetArgReferee<1>(errorResults), Return(EPERM))); + FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_EPERM); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + + EXPECT_CALL(*filePermMoc_, PersistPermission(_, _)) + .WillOnce(DoAll(SetArgReferee<1>(errorResults), Return(E_EPERM))); + ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_UNKNOWN_ERROR); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_004 end"; +} + +/** + * @tc.name: OH_FileShare_PersistPermission_test_005 + * @tc.desc: Test function of OH_FileShare_PersistPermission() interface for invalid path. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_PersistPermission_test_005, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_005 start"; + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = policyUriChar, + .length = strlen(policyUriChar), + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum; + + EXPECT_CALL(*filePermMoc_, PersistPermission(_, _)).WillOnce(Return(E_NO_ERROR)); + FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_NO_ERROR); + OH_FileShare_ReleasePolicyErrorResult(result, resultNum); + GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_005 end"; +} + +/** + * @tc.name: OH_FileShare_CheckPersistentPermission_test_002 + * @tc.desc: Test function of OH_FileShare_CheckPersistentPermission() interface for FAILURE. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_CheckPersistentPermission_test_002, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_002 start"; + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = policyUriChar, + .length = 0, + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + bool *result = nullptr; + unsigned int resultNum; + FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_PARAMS); + if (result != nullptr) { + free(result); + } + + policies[0].length = strlen(policyUriChar); + EXPECT_CALL(*filePermMoc_, CheckPersistentPermission(_, _)).WillOnce(Return(EPERM)); + ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + free(result); + } + GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_002 end"; +} + +/** + * @tc.name: OH_FileShare_CheckPersistentPermission_test_003 + * @tc.desc: Test function of OH_FileShare_CheckPersistentPermission() interface for FAILURE. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_CheckPersistentPermission_test_003, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_003 start"; + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = policyUriChar, + .length = strlen(policyUriChar), + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + bool *result = nullptr; + unsigned int resultNum; + EXPECT_CALL(*filePermMoc_, CheckPersistentPermission(_, _)).WillOnce(Return(E_NO_ERROR)); + FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_ENOMEM); + if (result != nullptr) { + free(result); + } + + std::vector errorResults; + for (int i = 0; i <= sizeof(FileShare_PolicyErrorResult) * MAX_ARRAY_SIZE; i++) { + errorResults.push_back(false); + } + + EXPECT_CALL(*filePermMoc_, CheckPersistentPermission(_, _)) + .WillOnce(DoAll(SetArgReferee<1>(errorResults), Return(E_NO_ERROR))); + ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_ENOMEM); + if (result != nullptr) { + free(result); + } + GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_003 end"; +} + +/** + * @tc.name: OH_FileShare_CheckPersistentPermission_test_004 + * @tc.desc: Test function of OH_FileShare_CheckPersistentPermission() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionSupTest, OH_FileShare_CheckPersistentPermission_test_004, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_004 start"; + char policyUriChar[] = "file://com.example.filesharea/data/storage/fileShare02.txt"; + FileShare_PolicyInfo policy = {.uri = policyUriChar, + .length = strlen(policyUriChar), + .operationMode = + FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE}; + FileShare_PolicyInfo policies[] = {policy}; + unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); + bool *result = nullptr; + unsigned int resultNum; + + std::vector errorResults; + errorResults.push_back(false); + + EXPECT_CALL(*filePermMoc_, CheckPersistentPermission(_, _)) + .WillOnce(DoAll(SetArgReferee<1>(errorResults), Return(E_NO_ERROR))); + FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); + EXPECT_EQ(ret, E_NO_ERROR); + + if (result != nullptr) { + free(result); + } + GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_004 end"; +} +} // namespace OHOS::AppFileService::ModuleFileSharePermission diff --git a/test/unittest/file_share_ndk_test/file_share_permission_test/BUILD.gn b/test/unittest/file_share_ndk_test/file_share_permission_test/BUILD.gn index a35a2c810..88e9a42ec 100644 --- a/test/unittest/file_share_ndk_test/file_share_permission_test/BUILD.gn +++ b/test/unittest/file_share_ndk_test/file_share_permission_test/BUILD.gn @@ -27,6 +27,7 @@ ohos_unittest("file_share_permission_ndk_test") { include_dirs = [ "include", "${app_file_service_path}/interfaces/kits/ndk/fileshare/include", + "${app_file_service_path}/interfaces/kits/ndk/fileshare/src", "//third_party/googletest/include", ] resource_config_file = "../../resource/ohos_test.xml" diff --git a/test/unittest/file_share_ndk_test/file_share_permission_test/file_share_permission_test.cpp b/test/unittest/file_share_ndk_test/file_share_permission_test/file_share_permission_test.cpp index 0ac913e39..e5634aa6d 100644 --- a/test/unittest/file_share_ndk_test/file_share_permission_test/file_share_permission_test.cpp +++ b/test/unittest/file_share_ndk_test/file_share_permission_test/file_share_permission_test.cpp @@ -30,7 +30,7 @@ #include "file_permission.h" #include "ipc_skeleton.h" #include "log.h" -#include "oh_file_share.h" +#include "oh_file_share.cpp" #include "parameter.h" #include "sandbox_helper.h" #include "uri.h" @@ -70,17 +70,6 @@ void GrantNativePermission() delete[] perms; } -static bool CheckFileManagerFullMountEnable() -{ - char value[] = "false"; - int retSystem = GetParameter(FILE_MANAGER_FULL_MOUNT_ENABLE_PARAMETER_STR.c_str(), "false", value, sizeof(value)); - if (retSystem > 0 && !std::strcmp(value, "true")) { - return true; - } - GTEST_LOG_(INFO) << "Not supporting all mounts"; - return false; -} - class NDKFileSharePermissionTest : public testing::Test { public: static void SetUpTestCase(void); @@ -115,11 +104,7 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_PersistPermission_test_001, Te FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_NO_ERROR); - } + EXPECT_EQ(ret, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_001 end"; } @@ -145,15 +130,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_PersistPermission_test_002, Te FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_002 end"; @@ -224,15 +205,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_PersistPermission_test_004, Te FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_PersistPermission_test_004 end"; @@ -259,18 +236,10 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_RevokePermission_test_001, Tes FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); FileManagement_ErrCode ret = OH_FileShare_RevokePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_NO_ERROR); - } + EXPECT_EQ(ret, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_RevokePermission_test_001 end"; } @@ -296,15 +265,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_RevokePermission_test_002, Tes FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_RevokePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_RevokePermission_test_002 end"; @@ -371,11 +336,7 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_RevokePermission_test_004, Tes FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policiesA, policiesNumA, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); char policyUriCharB[] = "file://com.example.filesharea/data/storage/fileShare04.txt"; FileShare_PolicyInfo policyB = {.uri = policyUriCharB, @@ -385,15 +346,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_RevokePermission_test_004, Tes FileShare_PolicyInfo policies[] = {policyA, policyB}; unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); FileManagement_ErrCode ret = OH_FileShare_RevokePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_RevokePermission_test_004 end"; @@ -420,18 +377,10 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ActivatePermission_test_001, T FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); FileManagement_ErrCode ret = OH_FileShare_ActivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_NO_ERROR); - } + EXPECT_EQ(ret, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_ActivatePermission_test_001 end"; } @@ -457,15 +406,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ActivatePermission_test_002, T FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_ActivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_ActivatePermission_test_002 end"; @@ -532,11 +477,7 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ActivatePermission_test_004, T FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policiesA, policiesNumA, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); char policyUriCharB[] = "file://com.example.filesharea/data/storage/fileShare04.txt"; FileShare_PolicyInfo policyB = {.uri = policyUriCharB, @@ -546,15 +487,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ActivatePermission_test_004, T FileShare_PolicyInfo policies[] = {policyA, policyB}; unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); FileManagement_ErrCode ret = OH_FileShare_ActivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_ActivatePermission_test_004 end"; @@ -581,25 +518,13 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_DeactivatePermission_test_001, FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); FileManagement_ErrCode retActivate = OH_FileShare_ActivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retActivate, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retActivate, E_NO_ERROR); - } + EXPECT_EQ(retActivate, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); FileManagement_ErrCode ret = OH_FileShare_DeactivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(ret, E_NO_ERROR); - } + EXPECT_EQ(ret, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_DeactivatePermission_test_001 end"; } @@ -626,15 +551,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_DeactivatePermission_test_002, FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_DeactivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_DeactivatePermission_test_002 end"; @@ -701,18 +622,10 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_DeactivatePermission_test_004, FileShare_PolicyErrorResult *result = nullptr; unsigned int resultNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policiesA, policiesNumA, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); FileManagement_ErrCode retActivate = OH_FileShare_ActivatePermission(policiesA, policiesNumA, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retActivate, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retActivate, E_NO_ERROR); - } + EXPECT_EQ(retActivate, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(result, resultNum); char policyUriCharB[] = "file://com.example.filesharea/data/storage/fileShare04.txt"; FileShare_PolicyInfo policyB = {.uri = policyUriCharB, @@ -722,15 +635,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_DeactivatePermission_test_004, FileShare_PolicyInfo policies[] = {policyA, policyB}; unsigned int policiesNum = sizeof(policies) / sizeof(policies[0]); FileManagement_ErrCode ret = OH_FileShare_DeactivatePermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_EPERM); + if (result != nullptr) { + EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); } else { - EXPECT_EQ(ret, E_EPERM); - if (result != nullptr) { - EXPECT_EQ(FileShare_PolicyErrorCode::INVALID_PATH, result[0].code); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } OH_FileShare_ReleasePolicyErrorResult(result, resultNum); GTEST_LOG_(INFO) << "OH_FileShare_DeactivatePermission_test_004 end"; @@ -758,24 +667,16 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_CheckPersistentPermission_test unsigned int resultPersistNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policies, policiesNum, &resultPersist, &resultPersistNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(resultPersist, resultPersistNum); bool *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_NO_ERROR); + if (result != nullptr) { + EXPECT_EQ(result[0], false); } else { - EXPECT_EQ(ret, E_NO_ERROR); - if (result != nullptr) { - EXPECT_EQ(result[0], true); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } if (result != nullptr) { free(result); @@ -804,15 +705,11 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_CheckPersistentPermission_test bool *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_NO_ERROR); + if (result != nullptr) { + EXPECT_EQ(result[0], false); } else { - EXPECT_EQ(ret, E_NO_ERROR); - if (result != nullptr) { - EXPECT_EQ(result[0], false); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } if (result != nullptr) { free(result); @@ -884,11 +781,7 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_CheckPersistentPermission_test unsigned int resultPersistNum; FileManagement_ErrCode retPersist = OH_FileShare_PersistPermission(policiesA, policiesNumA, &resultPersist, &resultPersistNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(retPersist, E_DEVICE_NOT_SUPPORT); - } else { - EXPECT_EQ(retPersist, E_NO_ERROR); - } + EXPECT_EQ(retPersist, E_EPERM); OH_FileShare_ReleasePolicyErrorResult(resultPersist, resultPersistNum); char policyUriCharB[] = "file://com.example.filesharea/data/storage/fileShare04.txt"; FileShare_PolicyInfo policyB = {.uri = policyUriCharB, @@ -900,20 +793,295 @@ HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_CheckPersistentPermission_test bool *result = nullptr; unsigned int resultNum; FileManagement_ErrCode ret = OH_FileShare_CheckPersistentPermission(policies, policiesNum, &result, &resultNum); - if (!CheckFileManagerFullMountEnable()) { - EXPECT_EQ(ret, E_DEVICE_NOT_SUPPORT); + EXPECT_EQ(ret, E_NO_ERROR); + if (result != nullptr && resultNum == 2) { + EXPECT_EQ(result[0], false); + EXPECT_EQ(result[1], false); } else { - EXPECT_EQ(ret, E_NO_ERROR); - if (result != nullptr && resultNum == 2) { - EXPECT_EQ(result[0], true); - EXPECT_EQ(result[1], false); - } else { - EXPECT_FALSE(true); - } + EXPECT_FALSE(true); } if (result != nullptr) { free(result); } GTEST_LOG_(INFO) << "OH_FileShare_CheckPersistentPermission_test_004 end"; } + +/** + * @tc.name: OH_FileShare_ConvertPolicyInfo_0100 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyInfo_0100() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyInfo_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0100 start"; + char policyUriChar[] = "file://com.example.filesharea/storage"; + FileShare_PolicyInfo policy = { + .uri = policyUriChar, + .length = sizeof(policyUriChar) - 1, + .operationMode = FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE + }; + FileShare_PolicyInfo policies[] = {policy}; + int policiesNum = sizeof(policies) / sizeof(policies[0]); + std::vector uriPolicies; + bool ret = ConvertPolicyInfo(policies, policiesNum, uriPolicies); + EXPECT_TRUE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0100 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyInfo_0200 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyInfo_0200() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyInfo_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0200 start"; + FileShare_PolicyInfo policy = { + .uri = nullptr, + .length = 1, + .operationMode = FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE + }; + FileShare_PolicyInfo policies[] = {policy}; + int policiesNum = 1; + std::vector uriPolicies; + bool ret = ConvertPolicyInfo(policies, policiesNum, uriPolicies); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0200 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyInfo_0300 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyInfo_0300() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyInfo_0300, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0300 start"; + char policyUriChar[] = "file://com.example.filesharea/storage"; + FileShare_PolicyInfo policy = { + .uri = policyUriChar, + .length = 0, + .operationMode = FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE + }; + FileShare_PolicyInfo policies[] = {policy}; + int policiesNum = 1; + std::vector uriPolicies; + bool ret = ConvertPolicyInfo(policies, policiesNum, uriPolicies); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0300 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyInfo_0400 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyInfo_0400() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyInfo_0400, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0400 start"; + char policyUriChar[] = "file://com.example.filesharea/storage"; + FileShare_PolicyInfo policy = { + .uri = policyUriChar, + .length = sizeof(policyUriChar) + 1, + .operationMode = FileShare_OperationMode::READ_MODE | FileShare_OperationMode::WRITE_MODE + }; + FileShare_PolicyInfo policies[] = {policy}; + int policiesNum = sizeof(policies) / sizeof(policies[0]); + std::vector uriPolicies; + bool ret = ConvertPolicyInfo(policies, policiesNum, uriPolicies); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyInfo_0400 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResult_0100 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResult_0100() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResult_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0100 start"; + std::deque errorResults; + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum = 0; + bool ret = ConvertPolicyErrorResult(errorResults, &result, resultNum); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0100 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResult_0200 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResult_0200() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResult_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0200 start"; + std::deque errorResults; + for (int32_t i = 0; i <= FOO_MAX_LEN + 1; i++) { + OHOS::AppFileService::PolicyErrorResult errorResult; + errorResults.push_back(errorResult); + } + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum = 0; + bool ret = ConvertPolicyErrorResult(errorResults, &result, resultNum); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0200 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResult_0300 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResult_0300() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResult_0300, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0300 start"; + std::deque errorResults; + OHOS::AppFileService::PolicyErrorResult errorResult; + errorResults.push_back(errorResult); + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum = 0; + bool ret = ConvertPolicyErrorResult(errorResults, &result, resultNum); + EXPECT_TRUE(ret); + if (result[0].uri != nullptr) { + free(result[0].uri); + } + if (result[0].message != nullptr) { + free(result[0].message); + } + if (result != nullptr) { + free(result); + } + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0300 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResult_0400 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResult_0400() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResult_0400, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0400 start"; + std::deque errorResults; + OHOS::AppFileService::PolicyErrorResult errorResult; + errorResult.uri = "uri"; + errorResult.message = "message"; + errorResults.push_back(errorResult); + FileShare_PolicyErrorResult *result = nullptr; + unsigned int resultNum = 0; + bool ret = ConvertPolicyErrorResult(errorResults, &result, resultNum); + EXPECT_TRUE(ret); + if (result[0].uri != nullptr) { + free(result[0].uri); + } + if (result[0].message != nullptr) { + free(result[0].message); + } + if (result != nullptr) { + free(result); + } + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResult_0400 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResultBool_0100 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResultBool_0100() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResultBool_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResultBool_0100 start"; + std::vector errorResults; + bool *result = nullptr; + bool ret = ConvertPolicyErrorResultBool(errorResults, &result); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResultBool_0100 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResultBool_0200 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResultBool_0200() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResultBool_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResultBool_0200 start"; + std::vector errorResults(FOO_MAX_LEN + 1, true); + bool *result = nullptr; + bool ret = ConvertPolicyErrorResultBool(errorResults, &result); + EXPECT_FALSE(ret); + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResultBool_0200 end"; +} + +/** + * @tc.name: OH_FileShare_ConvertPolicyErrorResultBool_0300 + * @tc.desc: Test function of OH_FileShare_ConvertPolicyErrorResultBool_0300() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ConvertPolicyErrorResultBool_0300, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResultBool_0300 start"; + std::vector errorResults(1, true); + bool *result = nullptr; + bool ret = ConvertPolicyErrorResultBool(errorResults, &result); + EXPECT_TRUE(ret); + if (result != nullptr) { + free(result); + } + GTEST_LOG_(INFO) << "OH_FileShare_ConvertPolicyErrorResultBool_0300 end"; +} + +/** + * @tc.name: OH_FileShare_ErrorCodeConversion_0100 + * @tc.desc: Test function of OH_FileShare_ErrorCodeConversion_0100() interface for no permission. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: + */ +HWTEST_F(NDKFileSharePermissionTest, OH_FileShare_ErrorCodeConversion_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OH_FileShare_ErrorCodeConversion_0100 start"; + EXPECT_EQ(ErrorCodeConversion(static_cast(E_NO_ERROR)), E_NO_ERROR); + EXPECT_EQ(ErrorCodeConversion(static_cast(E_PERMISSION)), E_PERMISSION); + EXPECT_EQ(ErrorCodeConversion(static_cast(E_PARAMS)), E_PARAMS); + EXPECT_EQ(ErrorCodeConversion(EPERM), E_EPERM); + EXPECT_EQ(ErrorCodeConversion(-EPERM), E_UNKNOWN_ERROR); + GTEST_LOG_(INFO) << "OH_FileShare_ErrorCodeConversion_0100 end"; +} } // namespace OHOS::AppFileService::ModuleFileSharePermission diff --git a/test/unittest/file_uri_native/file_uri_test.cpp b/test/unittest/file_uri_native/file_uri_test.cpp index 45b5fe190..8e84576ff 100644 --- a/test/unittest/file_uri_native/file_uri_test.cpp +++ b/test/unittest/file_uri_native/file_uri_test.cpp @@ -106,6 +106,11 @@ namespace OHOS::AppFileService::ModuleFileUri { FileUri fileUri(fileStr); string name = fileUri.GetName(); EXPECT_EQ(name, "test.txt"); + + string fileStr2 = "/data/storage/el2/base/files/test.txt/"; + string uri2 = "file://" + BUNDLE_A + fileStr; + FileUri fileUri2(fileStr2); + EXPECT_EQ(fileUri2.GetName(), ""); GTEST_LOG_(INFO) << "FileUriTest-end File_uri_GetName_0000"; } @@ -130,6 +135,10 @@ namespace OHOS::AppFileService::ModuleFileUri { FileUri fileUri2(uri2); path = fileUri2.GetPath(); EXPECT_EQ(path, "/Photo/12/IMG_12345_999999"); + + string uri4 = "file://media/Photo/12/IMG_12345_999999"; + FileUri fileUri4(uri4); + EXPECT_EQ(fileUri2.GetPath(), "/Photo/12/IMG_12345_999999"); GTEST_LOG_(INFO) << "FileUriTest-end File_uri_GetPath_0000"; } diff --git a/test/unittest/remote_file_share/BUILD.gn b/test/unittest/remote_file_share/BUILD.gn index b3663db5a..13ca80d73 100644 --- a/test/unittest/remote_file_share/BUILD.gn +++ b/test/unittest/remote_file_share/BUILD.gn @@ -33,6 +33,7 @@ ohos_unittest("remote_file_share_test") { include_dirs = [ "include", "../../../interfaces/innerkits/native/remote_file_share/include", + "../../../interfaces/innerkits/native/remote_file_share/src", "${utils_system_safwk_path}/native/include", "${path_base}/include", ] @@ -41,4 +42,15 @@ ohos_unittest("remote_file_share_test") { "../../../interfaces/innerkits/native:remote_file_share_native", "//third_party/googletest:gtest_main", ] + + external_deps = [ + "ability_base:zuri", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "c_utils:utils", + "hilog:libhilog", + "init:libbegetutil", + "ipc:ipc_core", + "samgr:samgr_proxy", + ] } diff --git a/test/unittest/remote_file_share/remote_file_share_test.cpp b/test/unittest/remote_file_share/remote_file_share_test.cpp index 5559074ba..3f9bf5e9a 100644 --- a/test/unittest/remote_file_share/remote_file_share_test.cpp +++ b/test/unittest/remote_file_share/remote_file_share_test.cpp @@ -24,6 +24,7 @@ #include #include "remote_file_share.h" +#include "remote_file_share.cpp" namespace { using namespace std; @@ -396,6 +397,74 @@ namespace { GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_GetDfsUriFromLocal_0011"; } + /** + * @tc.name: Remote_file_share_GetDfsUriFromLocal_0012 + * @tc.desc: Test function of GetDfsUriFromLocal() interface for FAILURE. + * the file name is chinese which has been encoded + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7KDF7 + */ + HWTEST_F(RemoteFileShareTest, Remote_file_share_GetDfsUriFromLocal_0012, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "RemoteFileShareTest-begin Remote_file_share_GetDfsUriFromLocal_0012"; + string uriStr = "datashare://media/Photo/12/IMG_12345_0011/test.jpg"; + const int userId = 100; + + HmdfsUriInfo hui; + auto ret = RemoteFileShare::GetDfsUriFromLocal(uriStr, userId, hui); + EXPECT_EQ(ret, -EINVAL); + + uriStr = "datashare://media/Photo/12/IMG_12345_0011/test.jpg/others"; + ret = RemoteFileShare::GetDfsUriFromLocal(uriStr, userId, hui); + EXPECT_EQ(ret, -EINVAL); + GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_GetDfsUriFromLocal_0012"; + } + + /** + * @tc.name: Remote_file_share_GetDfsUriFromLocal_0013 + * @tc.desc: Test function of GetDfsUriFromLocal() interface for SUCCESS. + * the file name is chinese which has been encoded + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7KDF7 + */ + HWTEST_F(RemoteFileShareTest, Remote_file_share_GetDfsUriFromLocal_0013, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "RemoteFileShareTest-begin Remote_file_share_GetDfsUriFromLocal_0013"; + const string uriStr = "file://media/Photo/12/IMG_12345_0011/test.jpg"; + const int userId = 100; + + HmdfsUriInfo hui; + auto ret = RemoteFileShare::GetDfsUriFromLocal(uriStr, userId, hui); + EXPECT_NE(ret, 0); + GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_GetDfsUriFromLocal_0013"; + } + + /** + * @tc.name: Remote_file_share_GetDfsUriFromLocal_0014 + * @tc.desc: Test function of GetDfsUriFromLocal() interface for SUCCESS. + * the file name is chinese which has been encoded + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7KDF7 + */ + HWTEST_F(RemoteFileShareTest, Remote_file_share_GetDfsUriFromLocal_0014, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "RemoteFileShareTest-begin Remote_file_share_GetDfsUriFromLocal_0014"; + const string uriStr = "file://docs/storage/Users/currentUser/Documents/1.txt"; + const int userId = 100; + + HmdfsUriInfo hui; + auto ret = RemoteFileShare::GetDfsUriFromLocal(uriStr, userId, hui); + EXPECT_EQ(ret, E_OK); + EXPECT_EQ(hui.fileSize, 0); + GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_GetDfsUriFromLocal_0014"; + } + /** * @tc.name: remote_file_share_test_0012 * @tc.desc: Test function of TransRemoteUriToLocal() interface for SUCCESS. @@ -502,4 +571,96 @@ namespace { GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_TransRemoteUriToLocal_0015"; } + + /** + * @tc.name: remote_file_share_test_0016 + * @tc.desc: Test function of TransRemoteUriToLocal() interface for FAILURE. + * the inpute param is invalid + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7KDF7 + */ + HWTEST_F(RemoteFileShareTest, Remote_file_share_TransRemoteUriToLocal_0016, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "RemoteFileShareTest-begin Remote_file_share_TransRemoteUriToLocal_0016"; + const vector uriList = {"FILE://docs/storage/Users/currentUser/Document/1.txt", + "file://docs/storage/Users/currentUser/Download/Subject/2.jpg", + "file://docs/storage/Users/currentUser/Document/Subject1/Subject2/1.txt", + "file://docs/storage/100/account/Document/Subject1/Subject2/1.txt"}; + string networkId = ""; + string deviceId = "001"; + vector resultList; + int ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_EQ(ret, EINVAL); + + networkId = "100"; + deviceId = ""; + ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_EQ(ret, EINVAL); + + networkId = ""; + deviceId = ""; + ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_EQ(ret, EINVAL); + GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_TransRemoteUriToLocal_0016"; + } + + /** + * @tc.name: remote_file_share_test_0017 + * @tc.desc: Test function of TransRemoteUriToLocal() interface for FAILURE. + * the inpute param is invalid + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7KDF7 + */ + HWTEST_F(RemoteFileShareTest, remote_file_share_test_0017, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "RemoteFileShareTest-begin remote_file_share_test_0017"; + vector uriList = {"file://docs/storage/Users/currentUser/./Document/1.txt"}; + const string networkId = "100"; + const string deviceId = "001"; + vector resultList; + int ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_NE(ret, EINVAL); + + uriList[0].clear(); + uriList[0] = "datashare://docs/storage/Users/currentUser/Document/1.txt"; + ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_NE(ret, EINVAL); + + uriList[0].clear(); + uriList[0] = "file://media/Photo/12/IMG_12345_0011/test.jpg"; + ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_NE(ret, EINVAL); + + uriList[0].clear(); + uriList[0] = "file://docs/test/"; + ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_NE(ret, EINVAL); + + uriList[0].clear(); + uriList[0] = "file://docs/storage/"; + ret = RemoteFileShare::TransRemoteUriToLocal(uriList, networkId, deviceId, resultList); + EXPECT_NE(ret, EINVAL); + GTEST_LOG_(INFO) << "RemoteFileShareTest-end remote_file_share_test_0017"; + } + + /** + * @tc.name: remote_file_share_test_0000 + * @tc.desc: Test function of RemoteFileShare() interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H63TL + */ + HWTEST_F(RemoteFileShareTest, Remote_file_share_DeleteShareDir_0000, testing::ext::TestSize.Level1) + { + GTEST_LOG_(INFO) << "RemoteFileShareTest-begin Remote_file_share_DeleteShareDir_0000"; + string packagePath = "/data/filetest"; + string sharePath = "/data/filetest"; + EXPECT_EQ(true, DeleteShareDir(packagePath, sharePath)); + GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_DeleteShareDir_0000"; +} } diff --git a/tests/mock/accesstoken/accesstoken_kit_mock.cpp b/tests/mock/accesstoken/accesstoken_kit_mock.cpp index 153183770..f2c5795cc 100644 --- a/tests/mock/accesstoken/accesstoken_kit_mock.cpp +++ b/tests/mock/accesstoken/accesstoken_kit_mock.cpp @@ -14,6 +14,7 @@ */ #include "accesstoken_kit.h" +#include "tokenid_kit.h" namespace OHOS::Security::AccessToken { ATokenTypeEnum AccessTokenKit::GetTokenType(AccessTokenID tokenID) @@ -31,4 +32,9 @@ int AccessTokenKit::VerifyAccessToken(AccessTokenID tokenID, const std::string & { return 0; } + +bool TokenIdKit::IsSystemAppByFullTokenID(uint64_t tokenId) +{ + return true; +} } // namespace OHOS::Security::AccessToken diff --git a/tests/mock/backup_kit_inner/service_proxy_mock.cpp b/tests/mock/backup_kit_inner/service_proxy_mock.cpp index 95af50b71..48bb62cea 100644 --- a/tests/mock/backup_kit_inner/service_proxy_mock.cpp +++ b/tests/mock/backup_kit_inner/service_proxy_mock.cpp @@ -187,6 +187,11 @@ ErrCode ServiceProxy::UpdateSendRate(std::string &bundleName, int32_t sendRate, return BError(BError::Codes::OK); } +ErrCode ServiceProxy::ReportAppProcessInfo(const std::string processInfo, const BackupRestoreScenario sennario) +{ + return BError(BError::Codes::OK); +} + sptr ServiceProxy::GetInstance() { if (!GetMockGetInstance()) { diff --git a/tests/mock/module_external/bms_adapter_mock.cpp b/tests/mock/module_external/bms_adapter_mock.cpp index cef59d5f1..fd6b866a6 100644 --- a/tests/mock/module_external/bms_adapter_mock.cpp +++ b/tests/mock/module_external/bms_adapter_mock.cpp @@ -32,7 +32,8 @@ vector BundleMgrAdapter::GetBundleInfos(const vecto { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", {}, {}, 0, 0, true, false, "com.example.app2backup"}); + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + "com.example.app2backup"}); return bundleInfos; } @@ -46,7 +47,8 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", {}, {}, 0, 0, true, false, "com.example.app2backup"}); + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + "com.example.app2backup"}); return bundleInfos; } @@ -55,7 +57,8 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", {}, {}, 0, 0, true, false, "com.example.app2backup"}); + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + "com.example.app2backup"}); return bundleInfos; } diff --git a/tests/mock/module_ipc/service_mock.cpp b/tests/mock/module_ipc/service_mock.cpp index c058c5e83..6022b7f45 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -226,6 +226,11 @@ ErrCode Service::UpdateSendRate(std::string &bundleName, int32_t sendRate, bool return BError(BError::Codes::OK); } +ErrCode Service::ReportAppProcessInfo(const std::string processInfo, const BackupRestoreScenario sennario) +{ + return BError(BError::Codes::OK); +} + void Service::OnSABackup(const std::string &bundleName, const int &fd, const std::string &result, diff --git a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp index 1d7b598d4..1b224076d 100644 --- a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp +++ b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp @@ -30,6 +30,8 @@ void ServiceReverseProxy::BackupOnBundleFinished(int32_t errCode, string bundleN void ServiceReverseProxy::BackupOnAllBundlesFinished(int32_t errCode) {} +void ServiceReverseProxy::BackupOnProcessInfo(std::string bundleName, std::string processInfo) {} + void ServiceReverseProxy::RestoreOnBundleStarted(int32_t errCode, string bundleName) {} void ServiceReverseProxy::RestoreOnBundleFinished(int32_t errCode, string bundleName) {} @@ -40,6 +42,8 @@ void ServiceReverseProxy::RestoreOnFileReady(string bundleName, string fileName, void ServiceReverseProxy::RestoreOnResultReport(string result, string bundleName, ErrCode errCode) {} +void ServiceReverseProxy::RestoreOnProcessInfo(std::string bundleName, std::string processInfo) {} + void ServiceReverseProxy::IncrementalBackupOnFileReady(string bundleName, string fileName, int fd, int manifestFd, int32_t errCode) {} @@ -51,6 +55,8 @@ void ServiceReverseProxy::IncrementalBackupOnBundleFinished(int32_t errCode, str void ServiceReverseProxy::IncrementalBackupOnAllBundlesFinished(int32_t errCode) {} +void ServiceReverseProxy::IncrementalBackupOnProcessInfo(std::string bundleName, std::string processInfo) {} + void ServiceReverseProxy::IncrementalRestoreOnBundleStarted(int32_t errCode, string bundleName) {} void ServiceReverseProxy::IncrementalRestoreOnBundleFinished(int32_t errCode, string bundleName) {} @@ -61,4 +67,6 @@ void ServiceReverseProxy::IncrementalRestoreOnFileReady(string bundleName, strin int32_t errCode) {} void ServiceReverseProxy::IncrementalRestoreOnResultReport(string result, string bundleName, ErrCode errCode) {} + +void ServiceReverseProxy::IncrementalRestoreOnProcessInfo(std::string bundleName, std::string processInfo) {} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/mock/module_ipc/service_stub_mock.cpp b/tests/mock/module_ipc/service_stub_mock.cpp index 9d4b05569..a67743d58 100644 --- a/tests/mock/module_ipc/service_stub_mock.cpp +++ b/tests/mock/module_ipc/service_stub_mock.cpp @@ -81,6 +81,8 @@ void ServiceStub::ServiceStubSupplement() &ServiceStub::CmdUpdateTimer; opToInterfaceMap_[static_cast(IServiceInterfaceCode::SERVICE_CMD_UPDATE_SENDRATE)] = &ServiceStub::CmdUpdateSendRate; + opToInterfaceMap_[static_cast(IServiceInterfaceCode::SERVICE_CMD_REPORT_APP_PROCESS_INFO)] = + &ServiceStub::CmdReportAppProcessInfo; } int32_t ServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) @@ -311,4 +313,9 @@ int32_t ServiceStub::CmdGetIncrementalFileHandle(MessageParcel &data, MessagePar { return BError(BError::Codes::OK); } + +int32_t ServiceStub::CmdReportAppProcessInfo(MessageParcel &data, MessageParcel &reply) +{ + return BError(BError::Codes::OK); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp index bd20c461f..c7032836b 100644 --- a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp +++ b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp @@ -28,7 +28,7 @@ ErrCode SvcExtensionProxy::HandleClear() return 0; } -ErrCode SvcExtensionProxy::HandleBackup() +ErrCode SvcExtensionProxy::HandleBackup(bool isClearData) { return 0; } @@ -38,7 +38,7 @@ ErrCode SvcExtensionProxy::PublishFile(const string &fileName) return 0; } -ErrCode SvcExtensionProxy::HandleRestore() +ErrCode SvcExtensionProxy::HandleRestore(bool isClearData) { return 0; } @@ -63,7 +63,7 @@ ErrCode SvcExtensionProxy::HandleIncrementalBackup(UniqueFd incrementalFd, Uniqu return 0; } -ErrCode SvcExtensionProxy::IncrementalOnBackup() +ErrCode SvcExtensionProxy::IncrementalOnBackup(bool isClearData) { return 0; } diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index 528e46728..53b97b777 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -104,7 +104,8 @@ wptr SvcSessionManager::GetExtConnection(const BundleName & if (!it->second.backUpConnection) { auto callDied = [](const string &&bundleName) {}; auto callConnected = [](const string &&bundleName) {}; - it->second.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected)); + it->second.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, + bundleName)); sptr mock = sptr(new BackupExtExtensionMock()); it->second.backUpConnection->OnAbilityConnectDone({}, mock->AsObject(), 0); } @@ -114,7 +115,7 @@ wptr SvcSessionManager::GetExtConnection(const BundleName & sptr SvcSessionManager::GetBackupAbilityExt(const string &bundleName) { GTEST_LOG_(INFO) << "GetBackupAbilityExt"; - return sptr(new SvcBackupConnection(nullptr, nullptr)); + return sptr(new SvcBackupConnection(nullptr, nullptr, bundleName)); } void SvcSessionManager::DumpInfo(const int fd, const std::vector &args) @@ -398,6 +399,13 @@ int SvcSessionManager::GetSessionCnt() return sessionCnt_.load(); } +void SvcSessionManager::SetClearDataFlag(const std::string &bundleName, bool isNotClear) {} + +bool SvcSessionManager::GetClearDataFlag(const std::string &bundleName) +{ + return true; +} + void SvcSessionManager::SetIncrementalData(const BIncrementalData &incrementalData) {} int32_t SvcSessionManager::GetIncrementalManifestFd(const string &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 de45882f4..80acd08fc 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -280,6 +280,16 @@ int SvcSessionManager::GetSessionCnt() return BackupSvcSessionManager::session->GetSessionCnt(); } +void SvcSessionManager::SetClearDataFlag(const std::string &bundleName, bool isNotClear) +{ + BackupSvcSessionManager::session->SetClearDataFlag(bundleName, isNotClear); +} + +bool SvcSessionManager::GetClearDataFlag(const std::string &bundleName) +{ + return BackupSvcSessionManager::session->GetClearDataFlag(bundleName); +} + void SvcSessionManager::SetIncrementalData(const BIncrementalData &incrementalData) { BackupSvcSessionManager::session->SetIncrementalData(incrementalData); 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 633488906..f00d6e93d 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -79,6 +79,8 @@ public: virtual bool ValidRestoreDataType(RestoreTypeEnum) = 0; virtual SvcSessionManager::Impl GetImpl() = 0; virtual int GetSessionCnt() = 0; + virtual void SetClearDataFlag(const std::string &bundleName, bool isNotClear) = 0; + virtual bool GetClearDataFlag(const std::string &bundleName) = 0; virtual void SetIncrementalData(const BIncrementalData &) = 0; virtual int32_t GetIncrementalManifestFd(const std::string &) = 0; virtual int64_t GetLastIncrementalTime(const std::string &) = 0; @@ -140,6 +142,8 @@ public: MOCK_METHOD(bool, ValidRestoreDataType, (RestoreTypeEnum)); MOCK_METHOD(SvcSessionManager::Impl, GetImpl, ()); MOCK_METHOD(int, GetSessionCnt, ()); + MOCK_METHOD(void, SetClearDataFlag, (const std::string &, bool)); + MOCK_METHOD(bool, GetClearDataFlag, (const std::string &)); MOCK_METHOD(void, SetIncrementalData, (const BIncrementalData &)); MOCK_METHOD(int32_t, GetIncrementalManifestFd, (const std::string &)); MOCK_METHOD(int64_t, GetLastIncrementalTime, (const std::string &)); diff --git a/tests/moduletests/backup_kit_inner/b_session_backup_test.cpp b/tests/moduletests/backup_kit_inner/b_session_backup_test.cpp index 814cd7b54..10b69da7d 100644 --- a/tests/moduletests/backup_kit_inner/b_session_backup_test.cpp +++ b/tests/moduletests/backup_kit_inner/b_session_backup_test.cpp @@ -309,4 +309,70 @@ HWTEST_F(BSessionBackupTest, SUB_backup_b_session_backup_0700, testing::ext::Tes } GTEST_LOG_(INFO) << "BSessionBackupTest-end SUB_backup_b_session_backup_0700"; } + +/** + * @tc.number: SUB_backup_b_session_backup_0800 + * @tc.name: SUB_backup_b_session_backup_0800 + * @tc.desc: 测试AppendBundles接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(BSessionBackupTest, SUB_backup_b_session_backup_0800, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BSessionBackupTest-AppendBundles SUB_backup_b_session_backup_0800"; + try { + if (backupPtr_ == nullptr) { + GTEST_LOG_(INFO) << "SUB_backup_b_session_backup_0800 backupPtr_ == nullptr"; + return; + } + vector bundleNames; + vector detailInfos; + GTEST_LOG_(INFO) << "GetInstance is true"; + SetMockGetInstance(true); + auto ret = backupPtr_->AppendBundles(bundleNames, detailInfos); + EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); + GTEST_LOG_(INFO) << "GetInstance is false"; + SetMockGetInstance(false); + ret = backupPtr_->AppendBundles(bundleNames, detailInfos); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BSessionBackupTest-an exception occurred by AppendBundles."; + } + GTEST_LOG_(INFO) << "BSessionBackupTest-end SUB_backup_b_session_backup_0800"; +} + +/** + * @tc.number: SUB_backup_b_session_backup_0900 + * @tc.name: SUB_backup_b_session_backup_0900 + * @tc.desc: 测试AppendBundles接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(BSessionBackupTest, SUB_backup_b_session_backup_0900, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BSessionBackupTest-Release SUB_backup_b_session_backup_0900"; + try { + if (backupPtr_ == nullptr) { + GTEST_LOG_(INFO) << "SUB_backup_b_session_backup_0900 backupPtr_ == nullptr"; + return; + } + GTEST_LOG_(INFO) << "GetInstance is true"; + SetMockGetInstance(true); + auto ret = backupPtr_->Release(); + EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); + GTEST_LOG_(INFO) << "GetInstance is false"; + SetMockGetInstance(false); + ret = backupPtr_->Release(); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BSessionBackupTest-an exception occurred by Release."; + } + GTEST_LOG_(INFO) << "BSessionBackupTest-end SUB_backup_b_session_backup_0900"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/moduletests/backup_kit_inner/b_session_restore_async_test.cpp b/tests/moduletests/backup_kit_inner/b_session_restore_async_test.cpp index a25d4c1b3..deb124f87 100644 --- a/tests/moduletests/backup_kit_inner/b_session_restore_async_test.cpp +++ b/tests/moduletests/backup_kit_inner/b_session_restore_async_test.cpp @@ -236,6 +236,9 @@ HWTEST_F(BSessionRestoreAsyncTest, SUB_backup_b_session_restore_async_0500, test EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); ret = restorePtr_->AppendBundles(UniqueFd(-1), bundleNames); EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); + SetMockGetInstance(false); + ret = restorePtr_->AppendBundles(UniqueFd(-1), bundleNames); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); restorePtr_ = nullptr; } catch (...) { EXPECT_TRUE(false); @@ -269,6 +272,9 @@ HWTEST_F(BSessionRestoreAsyncTest, SUB_backup_b_session_restore_async_0501, test EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); ret = restorePtr_->AppendBundles(UniqueFd(-1), bundleNames, detailInfos); EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); + SetMockGetInstance(false); + ret = restorePtr_->AppendBundles(UniqueFd(-1), bundleNames, detailInfos); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); restorePtr_ = nullptr; } catch (...) { EXPECT_TRUE(false); @@ -300,10 +306,43 @@ HWTEST_F(BSessionRestoreAsyncTest, SUB_backup_b_session_restore_async_0600, test GTEST_LOG_(INFO) << "GetInstance is true but not equal to parameter"; SetMockGetInstance(true); restorePtr_->RegisterBackupServiceDied(nullptr); + Init(); + SetMockGetInstance(true); + restorePtr_->RegisterBackupServiceDied(callbacks_.onBackupServiceDied); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "BSessionRestoreAsyncTest-an exception occurred by RegisterBackupServiceDied."; } GTEST_LOG_(INFO) << "BSessionRestoreAsyncTest-end SUB_backup_b_session_restore_async_0600"; } + +/** + * @tc.number: SUB_backup_b_session_restore_async_0700 + * @tc.name: SUB_backup_b_session_restore_async_0700 + * @tc.desc: 测试Release接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I7L7A6 + */ +HWTEST_F(BSessionRestoreAsyncTest, SUB_backup_b_session_restore_async_0700, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BSessionRestoreAsyncTest-begin SUB_backup_b_session_restore_async_0700"; + try { + if (restorePtr_ == nullptr) { + GTEST_LOG_(INFO) << "SUB_backup_b_session_restore_async_0700 restorePtr_ == nullptr"; + return; + } + SetMockGetInstance(false); + ErrCode ret = restorePtr_->Release(); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); + SetMockGetInstance(true); + ret = restorePtr_->Release(); + EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BSessionRestoreAsyncTest-an exception occurred by ~BSessionRestoreAsync."; + } + GTEST_LOG_(INFO) << "BSessionRestoreAsyncTest-end SUB_backup_b_session_restore_async_0700"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h b/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h index 7484d1b8c..6ff7362e0 100644 --- a/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h +++ b/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h @@ -79,7 +79,7 @@ public: return BError(BError::Codes::OK); }; - ErrCode HandleBackup() override + ErrCode HandleBackup(bool isClearData) override { GTEST_LOG_(INFO) << "HandleBackup"; if (nHandleBackupNum_ == 1) { @@ -99,7 +99,7 @@ public: return BError(BError::Codes::OK); }; - ErrCode HandleRestore() override + ErrCode HandleRestore(bool isClearData) override { return BError(BError::Codes::OK); }; @@ -119,7 +119,7 @@ public: return BError(BError::Codes::OK); }; - ErrCode IncrementalOnBackup() override + ErrCode IncrementalOnBackup(bool isClearData) override { return BError(BError::Codes::OK); }; diff --git a/tests/unittests/backup_api/backup_impl/include/i_service_mock.h b/tests/unittests/backup_api/backup_impl/include/i_service_mock.h index 0a0ffa7e8..68a2e61ec 100644 --- a/tests/unittests/backup_api/backup_impl/include/i_service_mock.h +++ b/tests/unittests/backup_api/backup_impl/include/i_service_mock.h @@ -203,6 +203,11 @@ public: { return BError(BError::Codes::OK); } + + ErrCode ReportAppProcessInfo(const std::string processInfo, const BackupRestoreScenario sennario) + { + return BError(BError::Codes::OK); + } }; } // namespace OHOS::FileManagement::Backup #endif // MOCK_I_SERVICE_MOCK_H \ No newline at end of file diff --git a/tests/unittests/backup_api/backup_impl/include/service_reverse_mock.h b/tests/unittests/backup_api/backup_impl/include/service_reverse_mock.h index 4ea6262fd..7b1bf2f9b 100644 --- a/tests/unittests/backup_api/backup_impl/include/service_reverse_mock.h +++ b/tests/unittests/backup_api/backup_impl/include/service_reverse_mock.h @@ -41,12 +41,14 @@ public: void BackupOnResultReport(std::string result, std::string bundleName) override {}; void BackupOnBundleFinished(int32_t errCode, std::string bundleName) override {} void BackupOnAllBundlesFinished(int32_t errCode) override {} + void BackupOnProcessInfo(std::string bundleName, std::string processInfo) override {} void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) override {} void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) override {} void RestoreOnAllBundlesFinished(int32_t errCode) override {} void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) override {} void RestoreOnResultReport(std::string result, std::string bundleName, ErrCode errCode) override {} + void RestoreOnProcessInfo(std::string bundleName, std::string processInfo) override {} void IncrementalBackupOnFileReady(std::string bundleName, std::string fileName, int fd, int manifestFd, int32_t errCode) override {} @@ -54,6 +56,7 @@ public: void IncrementalBackupOnResultReport(std::string result, std::string bundleName) override {} void IncrementalBackupOnBundleFinished(int32_t errCode, std::string bundleName) override {} void IncrementalBackupOnAllBundlesFinished(int32_t errCode) override {} + void IncrementalBackupOnProcessInfo(std::string bundleName, std::string processInfo) override {} void IncrementalRestoreOnBundleStarted(int32_t errCode, std::string bundleName) override {} void IncrementalRestoreOnBundleFinished(int32_t errCode, std::string bundleName) override {} @@ -61,6 +64,7 @@ public: void IncrementalRestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int manifestFd, int32_t errCode) override {} void IncrementalRestoreOnResultReport(std::string result, std::string bundleName, ErrCode errCode) override {}; + void IncrementalRestoreOnProcessInfo(std::string bundleName, std::string processInfo) override {} }; } // namespace OHOS::FileManagement::Backup #endif // MOCK_SERVICE_REVERSE_MOCK_H \ No newline at end of file diff --git a/tests/unittests/backup_api/backup_impl/service_proxy_test.cpp b/tests/unittests/backup_api/backup_impl/service_proxy_test.cpp index f95584e61..e27627206 100644 --- a/tests/unittests/backup_api/backup_impl/service_proxy_test.cpp +++ b/tests/unittests/backup_api/backup_impl/service_proxy_test.cpp @@ -271,6 +271,36 @@ HWTEST_F(ServiceProxyTest, SUB_Service_proxy_AppDone_0100, testing::ext::TestSiz GTEST_LOG_(INFO) << "ServiceProxyTest-end SUB_Service_proxy_AppDone_0100"; } +/** + * @tc.number: SUB_Service_proxy_ServiceResultReport_0100 + * @tc.name: SUB_Service_proxy_ServiceResultReport_0100 + * @tc.desc: 测试 ServiceResultReport + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceProxyTest, SUB_Service_proxy_ServiceResultReport_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceProxyTest-begin SUB_Service_proxy_ServiceResultReport_0100"; + if (proxy_ == nullptr) { + GTEST_LOG_(INFO) << "SUB_Service_proxy_ServiceResultReport_0100 proxy_ == nullptr"; + return; + } + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)) + .Times(2) + .WillOnce(Invoke(mock_.GetRefPtr(), &IServiceMock::InvokeSendRequest)) + .WillOnce(Return(EPERM)); + std::string restoreRetInfo = "test_restoreRetInfo"; + BackupRestoreScenario scenario = FULL_BACKUP; + int32_t result = proxy_->ServiceResultReport(restoreRetInfo, scenario, BError(BError::Codes::OK)); + EXPECT_EQ(result, BError(BError::Codes::OK)); + + result = proxy_->ServiceResultReport(restoreRetInfo, scenario, BError(BError::Codes::OK)); + EXPECT_NE(result, BError(BError::Codes::OK)); + GTEST_LOG_(INFO) << "ServiceProxyTest-end SUB_Service_proxy_ServiceResultReport_0100"; +} + /** * @tc.number: SUB_Service_proxy_GetFileHandle_0100 * @tc.name: SUB_Service_proxy_GetFileHandle_0100 @@ -394,6 +424,38 @@ HWTEST_F(ServiceProxyTest, SUB_Service_proxy_AppendBundlesBackupSession_0100, te GTEST_LOG_(INFO) << "ServiceProxyTest-end SUB_Service_proxy_AppendBundlesBackupSession_0100"; } +/** + * @tc.number: SUB_Service_proxy_AppendBundlesDetailsBackupSession_0100 + * @tc.name: SUB_Service_proxy_AppendBundlesDetailsBackupSession_0100 + * @tc.desc: 测试 AppendBundlesDetailsBackupSession + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6URNZ + */ +HWTEST_F(ServiceProxyTest, SUB_Service_proxy_AppendBundlesDetailsBackupSession_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceProxyTest-begin SUB_Service_proxy_AppendBundlesDetailsBackupSession_0100"; + if (proxy_ == nullptr) { + GTEST_LOG_(INFO) << "SUB_Service_proxy_AppendBundlesDetailsBackupSession_0100 proxy_ == nullptr"; + return; + } + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)) + .Times(2) + .WillOnce(Invoke(mock_.GetRefPtr(), &IServiceMock::InvokeSendRequest)) + .WillOnce(Return(EPERM)); + + std::vector bundleNames; + std::vector detailInfos; + + int32_t result = proxy_->AppendBundlesDetailsBackupSession(bundleNames, detailInfos); + EXPECT_EQ(result, BError(BError::Codes::OK)); + + result = proxy_->AppendBundlesDetailsBackupSession(bundleNames, detailInfos); + EXPECT_NE(result, BError(BError::Codes::OK)); + GTEST_LOG_(INFO) << "ServiceProxyTest-end SUB_Service_proxy_AppendBundlesDetailsBackupSession_0100"; +} + /** * @tc.number: SUB_Service_proxy_Finish_0100 * @tc.name: SUB_Service_proxy_Finish_0100 @@ -604,6 +666,43 @@ HWTEST_F(ServiceProxyTest, SUB_Service_proxy_PublishIncrementalFile_0100, testin GTEST_LOG_(INFO) << "ServiceProxyTest-end SUB_Service_proxy_PublishIncrementalFile_0100"; } +/** + * @tc.number: SUB_Service_proxy_PublishSAIncrementalFile_0100 + * @tc.name: SUB_Service_proxy_PublishSAIncrementalFile_0100 + * @tc.desc: 测试 PublishSAIncrementalFile 接口调用成功和失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I90ZV5 + */ +HWTEST_F(ServiceProxyTest, SUB_Service_proxy_PublishSAIncrementalFile_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceProxyTest-begin SUB_Service_proxy_PublishSAIncrementalFile_0100"; + if (proxy_ == nullptr) { + GTEST_LOG_(INFO) << "SUB_Service_proxy_PublishSAIncrementalFile_0100 proxy_ == nullptr"; + return; + } + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)) + .Times(2) + .WillOnce(Invoke(mock_.GetRefPtr(), &IServiceMock::InvokeSendRequest)) + .WillOnce(Return(EPERM)); + + string bundleName = "com.example.app2backup"; + string fileName = ""; + BFileInfo fileInfo(bundleName, fileName, -1); + TestManager tm("AppIncrementalFileReady_GetFd_0100"); + std::string filePath = tm.GetRootDirCurTest().append(FILE_NAME); + UniqueFd fd(open(filePath.data(), O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR)); + ErrCode ret = proxy_->PublishSAIncrementalFile(fileInfo, move(fd)); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + TestManager tmErr("AppIncrementalFileReady_GetFd_0200"); + UniqueFd fdErr(open(tmErr.GetRootDirCurTest().append(FILE_NAME).data(), O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR)); + ret = proxy_->PublishSAIncrementalFile(fileInfo, move(fdErr)); + EXPECT_NE(ret, BError(BError::Codes::OK)); + GTEST_LOG_(INFO) << "ServiceProxyTest-end SUB_Service_proxy_PublishSAIncrementalFile_0100"; +} + /** * @tc.number: SUB_Service_proxy_AppIncrementalFileReady_0100 * @tc.name: SUB_Service_proxy_AppIncrementalFileReady_0100 diff --git a/tests/unittests/backup_api/backup_impl/service_reverse_stub_test.cpp b/tests/unittests/backup_api/backup_impl/service_reverse_stub_test.cpp index b69f91d46..d5c75557c 100644 --- a/tests/unittests/backup_api/backup_impl/service_reverse_stub_test.cpp +++ b/tests/unittests/backup_api/backup_impl/service_reverse_stub_test.cpp @@ -45,23 +45,27 @@ public: MOCK_METHOD2(BackupOnResultReport, void(string result, std::string bundleName)); MOCK_METHOD2(BackupOnBundleFinished, void(int32_t errCode, string bundleName)); MOCK_METHOD1(BackupOnAllBundlesFinished, void(int32_t errCode)); + MOCK_METHOD2(BackupOnProcessInfo, void(std::string bundleName, std::string processInfo)); MOCK_METHOD2(RestoreOnBundleStarted, void(int32_t errCode, std::string bundleName)); MOCK_METHOD2(RestoreOnBundleFinished, void(int32_t errCode, string bundleName)); MOCK_METHOD1(RestoreOnAllBundlesFinished, void(int32_t errCode)); MOCK_METHOD4(RestoreOnFileReady, void(string bundleName, string fileName, int fd, int32_t errCode)); MOCK_METHOD3(RestoreOnResultReport, void(string result, string bundleName, ErrCode errCode)); + MOCK_METHOD2(RestoreOnProcessInfo, void(std::string bundleName, std::string processInfo)); MOCK_METHOD5(IncrementalBackupOnFileReady, void(string bundleName, string fileName, int fd, int manifestFd, int32_t errCode)); MOCK_METHOD2(IncrementalBackupOnBundleStarted, void(int32_t errCode, string bundleName)); MOCK_METHOD2(IncrementalBackupOnResultReport, void(string result, std::string bundleName)); MOCK_METHOD2(IncrementalBackupOnBundleFinished, void(int32_t errCode, string bundleName)); MOCK_METHOD1(IncrementalBackupOnAllBundlesFinished, void(int32_t errCode)); + MOCK_METHOD2(IncrementalBackupOnProcessInfo, void(std::string bundleName, std::string processInfo)); MOCK_METHOD2(IncrementalRestoreOnBundleStarted, void(int32_t errCode, std::string bundleName)); MOCK_METHOD2(IncrementalRestoreOnBundleFinished, void(int32_t errCode, string bundleName)); MOCK_METHOD1(IncrementalRestoreOnAllBundlesFinished, void(int32_t errCode)); MOCK_METHOD5(IncrementalRestoreOnFileReady, void(string bundleName, string fileName, int fd, int manifestFd, int32_t errCode)); MOCK_METHOD3(IncrementalRestoreOnResultReport, void(string result, string bundleName, ErrCode errCode)); + MOCK_METHOD2(IncrementalRestoreOnProcessInfo, void(std::string bundleName, std::string processInfo)); }; class ServiceReverseStubTest : public testing::Test { diff --git a/tests/unittests/backup_ext/BUILD.gn b/tests/unittests/backup_ext/BUILD.gn index 5b41aab97..32e37d292 100644 --- a/tests/unittests/backup_ext/BUILD.gn +++ b/tests/unittests/backup_ext/BUILD.gn @@ -139,6 +139,7 @@ ohos_unittest("tar_file_test") { "${path_backup}/frameworks/native/backup_ext/src/ext_backup_loader.cpp", "${path_backup}/frameworks/native/backup_ext/src/ext_extension.cpp", "${path_backup}/frameworks/native/backup_ext/src/ext_extension_stub.cpp", + "${path_backup}/frameworks/native/backup_ext/src/sub_ext_extension.cpp", "${path_backup}/frameworks/native/backup_ext/src/tar_file.cpp", "${path_backup}/frameworks/native/backup_ext/src/untar_file.cpp", "tar_file_test.cpp", @@ -211,6 +212,7 @@ ohos_unittest("untar_file_test") { "${path_backup}/frameworks/native/backup_ext/src/ext_backup_loader.cpp", "${path_backup}/frameworks/native/backup_ext/src/ext_extension.cpp", "${path_backup}/frameworks/native/backup_ext/src/ext_extension_stub.cpp", + "${path_backup}/frameworks/native/backup_ext/src/sub_ext_extension.cpp", "${path_backup}/frameworks/native/backup_ext/src/tar_file.cpp", "${path_backup}/frameworks/native/backup_ext/src/untar_file.cpp", "untar_file_test.cpp", diff --git a/tests/unittests/backup_ext/ext_backup_js_test.cpp b/tests/unittests/backup_ext/ext_backup_js_test.cpp index b4dce1570..bb76737d1 100644 --- a/tests/unittests/backup_ext/ext_backup_js_test.cpp +++ b/tests/unittests/backup_ext/ext_backup_js_test.cpp @@ -1282,4 +1282,153 @@ HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_CallJSRestoreEx_0200, testing::ext:: } GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_CallJSRestoreEx_0200"; } + +/** + * @tc.number: SUB_backup_ext_js_CallJSRestore_0100 + * @tc.name: SUB_backup_ext_js_CallJSRestore_0100 + * @tc.desc: 测试 CallJSRestore 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_CallJSRestore_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_CallJSRestore_0100"; + try { + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto ret = extBackupJs->CallJSRestore(); + EXPECT_EQ(ret, EINVAL); + + extBackupJs->callbackInfo_ = std::make_shared([](ErrCode, std::string){}); + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_is_exception_pending(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, uv_queue_work(_, _, _, _)).WillOnce(WithArgs<1>(Invoke([](uv_work_t* work) { + CallJsParam *param = reinterpret_cast(work->data); + param->retParser(nullptr, nullptr); + return -1; + }))); + ret = extBackupJs->CallJSRestore(); + EXPECT_EQ(ret, EINVAL); + + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_is_exception_pending(_, _)) + .WillOnce(DoAll(SetArgPointee(true), Return(napi_ok))); + EXPECT_CALL(*napiMock, napi_get_and_clear_last_exception(_, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*napiMock, uv_queue_work(_, _, _, _)).WillOnce(WithArgs<1>(Invoke([](uv_work_t* work) { + CallJsParam *param = reinterpret_cast(work->data); + param->retParser(nullptr, nullptr); + return -1; + }))); + ret = extBackupJs->CallJSRestore(); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by CallJSRestore."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_CallJSRestore_0100"; +} + +/** + * @tc.number: SUB_backup_ext_js_CallJSRestore_0200 + * @tc.name: SUB_backup_ext_js_CallJSRestore_0200 + * @tc.desc: 测试 CallJSRestore 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_CallJSRestore_0200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_CallJSRestore_0200"; + try { + extBackupJs->callbackInfo_ = std::make_shared([](ErrCode, std::string){}); + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_is_promise(_, _, _)) + .WillOnce(DoAll(SetArgPointee(true), Return(napi_ok))); + EXPECT_CALL(*napiMock, napi_open_handle_scope(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_close_handle_scope(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*napiMock, uv_queue_work(_, _, _, _)).WillOnce(WithArgs<1>(Invoke([](uv_work_t* work) { + int value = 0; + CallJsParam *param = reinterpret_cast(work->data); + param->retParser(nullptr, reinterpret_cast(&value)); + return -1; + }))); + auto ret = extBackupJs->CallJSRestore(); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by CallJSRestore."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_CallJSRestore_0200"; +} + +/** + * @tc.number: SUB_backup_ext_js_GetBackupInfo_0100 + * @tc.name: SUB_backup_ext_js_GetBackupInfo_0100 + * @tc.desc: 测试 GetBackupInfo 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_GetBackupInfo_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_GetBackupInfo_0100"; + try { + extBackupJs->jsObj_ = make_unique(); + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto ret = extBackupJs->GetBackupInfo([](ErrCode, std::string){}); + EXPECT_EQ(ret, EINVAL); + + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*napiMock, uv_queue_work(_, _, _, _)).WillOnce(WithArgs<1>(Invoke([](uv_work_t* work) { + CallJsParam *param = reinterpret_cast(work->data); + param->retParser(nullptr, nullptr); + return -1; + }))); + ret = extBackupJs->GetBackupInfo([](ErrCode, std::string){}); + EXPECT_EQ(ret, EINVAL); + + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, uv_queue_work(_, _, _, _)).WillOnce(WithArgs<1>(Invoke([](uv_work_t* work) { + CallJsParam *param = reinterpret_cast(work->data); + param->retParser(nullptr, nullptr); + return -1; + }))); + ret = extBackupJs->GetBackupInfo([](ErrCode, std::string){}); + EXPECT_EQ(ret, EINVAL); + + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_is_promise(_, _, _)) + .WillOnce(DoAll(SetArgPointee(true), Return(napi_ok))); + EXPECT_CALL(*napiMock, napi_open_handle_scope(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_close_handle_scope(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*napiMock, uv_queue_work(_, _, _, _)).WillOnce(WithArgs<1>(Invoke([](uv_work_t* work) { + int value = 0; + CallJsParam *param = reinterpret_cast(work->data); + param->retParser(nullptr, reinterpret_cast(&value)); + return -1; + }))); + ret = extBackupJs->GetBackupInfo([](ErrCode, std::string){}); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by GetBackupInfo."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_GetBackupInfo_0200"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_ext/ext_extension_stub_test.cpp b/tests/unittests/backup_ext/ext_extension_stub_test.cpp index 413212265..ba73c7db6 100644 --- a/tests/unittests/backup_ext/ext_extension_stub_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_stub_test.cpp @@ -28,13 +28,13 @@ class ExtExtensionStubMock : public ExtExtensionStub { public: MOCK_METHOD(UniqueFd, GetFileHandle, (const std::string &fileName, int32_t &errCode)); MOCK_METHOD(ErrCode, HandleClear, ()); - MOCK_METHOD(ErrCode, HandleBackup, ()); + MOCK_METHOD(ErrCode, HandleBackup, (bool isClearData)); MOCK_METHOD(ErrCode, PublishFile, (const std::string &fileName)); - MOCK_METHOD(ErrCode, HandleRestore, ()); + MOCK_METHOD(ErrCode, HandleRestore, (bool isClearData)); MOCK_METHOD(ErrCode, GetIncrementalFileHandle, (const std::string &fileName)); MOCK_METHOD(ErrCode, PublishIncrementalFile, (const std::string &fileName)); MOCK_METHOD(ErrCode, HandleIncrementalBackup, (UniqueFd incrementalFd, UniqueFd manifestFd)); - MOCK_METHOD(ErrCode, IncrementalOnBackup, ()); + MOCK_METHOD(ErrCode, IncrementalOnBackup, (bool isClearData)); MOCK_METHOD((std::tuple), GetIncrementalBackupFileHandle, ()); MOCK_METHOD(ErrCode, GetBackupInfo, (std::string &result)); MOCK_METHOD(ErrCode, UpdateFdSendRate, (std::string &bundleName, int32_t sendRate)); @@ -201,13 +201,13 @@ HWTEST_F(ExtExtensionStubTest, SUB_backup_ext_ExtExtensionStub_CmdHandleBackup_0 try { MessageParcel data; MessageParcel reply; - EXPECT_CALL(*stub, HandleBackup()).WillOnce(Return(0)); + EXPECT_CALL(*stub, HandleBackup(_)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(false)); EXPECT_TRUE(stub != nullptr); auto err = stub->CmdHandleBackup(data, reply); EXPECT_EQ(err, BError(BError::Codes::EXT_BROKEN_IPC)); - EXPECT_CALL(*stub, HandleBackup()).WillOnce(Return(0)); + EXPECT_CALL(*stub, HandleBackup(_)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(true)); err = stub->CmdHandleBackup(data, reply); EXPECT_EQ(err, BError(BError::Codes::OK)); @@ -271,13 +271,13 @@ HWTEST_F(ExtExtensionStubTest, SUB_backup_ext_ExtExtensionStub_CmdHandleRestore_ try { MessageParcel data; MessageParcel reply; - EXPECT_CALL(*stub, HandleRestore()).WillOnce(Return(0)); + EXPECT_CALL(*stub, HandleRestore(_)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(false)); EXPECT_TRUE(stub != nullptr); auto err = stub->CmdHandleRestore(data, reply); EXPECT_EQ(err, BError(BError::Codes::EXT_BROKEN_IPC)); - EXPECT_CALL(*stub, HandleRestore()).WillOnce(Return(0)); + EXPECT_CALL(*stub, HandleRestore(_)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(true)); err = stub->CmdHandleRestore(data, reply); EXPECT_EQ(err, BError(BError::Codes::OK)); @@ -417,13 +417,13 @@ HWTEST_F(ExtExtensionStubTest, SUB_backup_ext_ExtExtensionStub_CmdIncrementalOnB try { MessageParcel data; MessageParcel reply; - EXPECT_CALL(*stub, IncrementalOnBackup()).WillOnce(Return(0)); + EXPECT_CALL(*stub, IncrementalOnBackup(_)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(false)); EXPECT_TRUE(stub != nullptr); auto err = stub->CmdIncrementalOnBackup(data, reply); EXPECT_EQ(err, BError(BError::Codes::EXT_BROKEN_IPC)); - EXPECT_CALL(*stub, IncrementalOnBackup()).WillOnce(Return(0)); + EXPECT_CALL(*stub, IncrementalOnBackup(_)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(true)); err = stub->CmdIncrementalOnBackup(data, reply); EXPECT_EQ(err, BError(BError::Codes::OK)); diff --git a/tests/unittests/backup_ext/ext_extension_test.cpp b/tests/unittests/backup_ext/ext_extension_test.cpp index 7022e5e1d..993b7173d 100644 --- a/tests/unittests/backup_ext/ext_extension_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_test.cpp @@ -27,6 +27,7 @@ #include "b_error/b_error.h" #include "b_error/b_excep_utils.h" #include "ext_extension.cpp" +#include "sub_ext_extension.cpp" namespace OHOS::FileManagement::Backup { using namespace std; @@ -153,8 +154,10 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0300, testing::ext::TestSize.Level try { string tarFile = " "; vector extManageInfo; - bool ret = IsUserTar(tarFile, extManageInfo); + off_t tarFileSize = 0; + bool ret = IsUserTar(tarFile, extManageInfo, tarFileSize); EXPECT_FALSE(ret); + EXPECT_TRUE(tarFileSize == 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; @@ -177,8 +180,10 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0301, testing::ext::TestSize.Level try { string tarFile = TAR_FILE; vector extManageInfo; - bool ret = IsUserTar(tarFile, extManageInfo); + off_t tarFileSize = 0; + bool ret = IsUserTar(tarFile, extManageInfo, tarFileSize); EXPECT_FALSE(ret); + EXPECT_TRUE(tarFileSize == 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; @@ -204,9 +209,12 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0302, testing::ext::TestSize.Level ExtManageInfo info; info.hashName = TAR_FILE; info.isUserTar = true; + info.sta.st_size = 1; // 1: test number; extManageInfo.push_back(info); - bool ret = IsUserTar(tarFile, extManageInfo); + off_t tarFileSize = 0; + bool ret = IsUserTar(tarFile, extManageInfo, tarFileSize); EXPECT_TRUE(ret); + EXPECT_TRUE(tarFileSize == 1); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; diff --git a/tests/unittests/backup_ext/tar_file_test.cpp b/tests/unittests/backup_ext/tar_file_test.cpp index 5e8b37785..49d094a2f 100644 --- a/tests/unittests/backup_ext/tar_file_test.cpp +++ b/tests/unittests/backup_ext/tar_file_test.cpp @@ -104,6 +104,13 @@ HWTEST_F(TarFileTest, SUB_Tar_File_Packet_0100, testing::ext::TestSize.Level1) bool ret = TarFile::GetInstance().Packet(srcFiles, tarFileName, pkPath, tarMap); EXPECT_TRUE(tarMap.empty()); EXPECT_FALSE(ret); + + TestManager tm("SUB_Tar_File_Packet_0100"); + string root = tm.GetRootDirCurTest(); + pkPath = root; + ret = TarFile::GetInstance().Packet(srcFiles, tarFileName, pkPath, tarMap); + EXPECT_TRUE(tarMap.empty()); + EXPECT_FALSE(ret); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "TarFileTest-an exception occurred by TarFile."; diff --git a/tests/unittests/backup_ext/untar_file_test.cpp b/tests/unittests/backup_ext/untar_file_test.cpp index 9d79edb43..13a425214 100644 --- a/tests/unittests/backup_ext/untar_file_test.cpp +++ b/tests/unittests/backup_ext/untar_file_test.cpp @@ -108,7 +108,7 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_UnPacket_0100, testing::ext::TestSize.Lev try { string tarFile(""); string rootPath(""); - int ret = UntarFile::GetInstance().UnPacket(tarFile, rootPath); + auto [ret, fileInfos, errFileInfos] = UntarFile::GetInstance().UnPacket(tarFile, rootPath); EXPECT_EQ(ret, ENOENT); ClearCache(); } catch (...) { @@ -151,7 +151,7 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_UnPacket_0200, testing::ext::TestSize.Lev GTEST_LOG_(INFO) << " execute tar failure, errno :" << errno; throw BError(errno); } - int ret = UntarFile::GetInstance().UnPacket(tarFile, rootPath); + auto [ret, fileInfos, errFileInfos] = UntarFile::GetInstance().UnPacket(tarFile, rootPath); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { @@ -186,7 +186,7 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_UnPacket_0300, testing::ext::TestSize.Lev SaveStringToFile(aFile, "hello"); string rootPath(root); - int ret = UntarFile::GetInstance().UnPacket(aFile, rootPath); + auto [ret, fileInfos, errFileInfos] = UntarFile::GetInstance().UnPacket(aFile, rootPath); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { @@ -225,7 +225,7 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_UnPacket_0400, testing::ext::TestSize.Lev } string rootPath(root); - int ret = UntarFile::GetInstance().UnPacket(tarFile, rootPath); + auto [ret, fileInfos, errFileInfos] = UntarFile::GetInstance().UnPacket(tarFile, rootPath); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { @@ -276,7 +276,7 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_UnPacket_0500, testing::ext::TestSize.Lev TarFile::GetInstance().Packet(smallFiles, "test", root, tarMap); string rootPath(root); - int ret = UntarFile::GetInstance().UnPacket(tarFile, rootPath); + auto [ret, fileInfos, errFileInfos] = UntarFile::GetInstance().UnPacket(tarFile, rootPath); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { @@ -328,7 +328,8 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_IncrementalUnPacket_0100, testing::ext::T string tarFile = root + "/test.0.tar"; string rootPath(root); unordered_map cloudFiles; - int ret = UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); + auto [ret, fileInfos, errFileInfos] = + UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { @@ -358,7 +359,8 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_IncrementalUnPacket_0200, testing::ext::T string tarFile = root + "/empty.0.tar"; string rootPath(root); unordered_map cloudFiles; - int ret = UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); + auto [ret, fileInfos, errFileInfos] = + UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); EXPECT_EQ(ret, 2); // 错误码2表示找不到文件或路径 ClearCache(); } catch (...) { @@ -404,7 +406,8 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_IncrementalUnPacket_0300, testing::ext::T FILE *currentTarFile = fopen(tarFile.c_str(), "wb+"); fwrite("\0", sizeof(uint8_t), 1, currentTarFile); fclose(currentTarFile); - int ret = UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); + auto [ret, fileInfos, errFileInfos] = + UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { @@ -461,7 +464,8 @@ HWTEST_F(UntarFileTest, SUB_Untar_File_IncrementalUnPacket_0400, testing::ext::T fseeko(currentTarFile, 1L, SEEK_SET); fwrite("\0", sizeof(uint8_t), 1, currentTarFile); fclose(currentTarFile); - int ret = UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); + auto [ret, fileInfos, errFileInfos] = + UntarFile::GetInstance().IncrementalUnPacket(tarFile, rootPath, cloudFiles); EXPECT_EQ(ret, 0); ClearCache(); } catch (...) { diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index 6a395d44a..1c9051f27 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -12,6 +12,7 @@ # limitations under the License. import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") import("//foundation/filemanagement/app_file_service/backup.gni") ohos_unittest("module_ipc_test") { @@ -93,7 +94,6 @@ ohos_unittest("backup_service_test") { "${path_backup_mock}/module_ipc/app_gallery_dispose_proxy_mock.cpp", "${path_backup_mock}/timer/timer_mock.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", "${path_backup}/services/backup_sa/src/module_ipc/svc_restore_deps_manager.cpp", "${path_backup}/services/backup_sa/src/module_notify/notify_work_service.cpp", @@ -107,6 +107,7 @@ ohos_unittest("backup_service_test") { include_dirs = [ "${path_backup}/services/backup_sa/include", "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${path_backup}/services/backup_sa/src/module_ipc", "${path_backup}/tests/unittests/backup_api/backup_impl/include", "${path_access_token}/interfaces/innerkits/accesstoken/include", "${path_backup_mock}/b_process/", @@ -143,7 +144,17 @@ ohos_unittest("backup_service_test") { blocklist = "${path_backup}/cfi_blocklist.txt" } + defines = [ "private=public" ] use_exceptions = true + + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + "-Dprivate=public", + "-Dprotected=public", + ] } ohos_unittest("backup_service_throw_test") { @@ -244,6 +255,7 @@ ohos_unittest("backup_service_session_test") { ] deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", "${path_backup}/tests/utils:backup_test_utils", "${path_backup}/utils:backup_utils", diff --git a/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp b/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp index 27273d9cf..505e0eb57 100644 --- a/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp @@ -121,6 +121,30 @@ HWTEST_F(SchedSchedulerTest, SUB_Service_Sched_0100, testing::ext::TestSize.Leve GTEST_LOG_(INFO) << "SchedSchedulerTest-end SUB_Service_Sched_0100"; } +/** + * @tc.number: SUB_Service_Sched_0200 + * @tc.name: SUB_Service_Sched_0200 + * @tc.desc: 测试 Sched接口,sessionPtr_为空场景 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SchedSchedulerTest, SUB_Service_Sched_0200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SchedSchedulerTest-begin SUB_Service_Sched_0200"; + try { + sptr schedPtrNull = sptr(new SchedScheduler(wptr(servicePtr_), nullptr)); + schedPtrNull->Sched(); + schedPtrNull->ExecutingQueueTasks("test"); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SchedSchedulerTest-an exception occurred by Sched."; + } + GTEST_LOG_(INFO) << "SchedSchedulerTest-end SUB_Service_Sched_0200"; +} + /** * @tc.number: SUB_Service_ExecutingQueueTasks_0100 * @tc.name: SUB_Service_ExecutingQueueTasks_0100 @@ -168,4 +192,49 @@ HWTEST_F(SchedSchedulerTest, SUB_Service_RemoveExtConn_0100, testing::ext::TestS } GTEST_LOG_(INFO) << "SchedSchedulerTest-end SUB_Service_RemoveExtConn_0100"; } + +/** + * @tc.number: SUB_Service_TryUnloadServiceTimer_0100 + * @tc.name: SUB_Service_TryUnloadServiceTimer_0100 + * @tc.desc: 测试 TryUnloadServiceTimer 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SchedSchedulerTest, SUB_Service_TryUnloadServiceTimer_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SchedSchedulerTest-begin SUB_Service_TryUnloadServiceTimer_0100"; + try { + EXPECT_TRUE(schedPtr_ != nullptr); + schedPtr_->TryUnloadServiceTimer(true); + schedPtr_->TryUnloadServiceTimer(false); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SchedSchedulerTest-an exception occurred by TryUnloadServiceTimer."; + } + GTEST_LOG_(INFO) << "SchedSchedulerTest-end SUB_Service_TryUnloadServiceTimer_0100"; +} + +/** + * @tc.number: SUB_Service_TryUnloadService_0100 + * @tc.name: SUB_Service_TryUnloadServicer_0100 + * @tc.desc: 测试 TryUnloadService 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SchedSchedulerTest, SUB_Service_TryUnloadService_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SchedSchedulerTest-begin SUB_Service_TryUnloadService_0100"; + try { + EXPECT_TRUE(schedPtr_ != nullptr); + schedPtr_->TryUnloadService(); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SchedSchedulerTest-an exception occurred by TryUnloadService."; + } + GTEST_LOG_(INFO) << "SchedSchedulerTest-end SUB_Service_TryUnloadService_0100"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp b/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp index 5cf982238..2dbda93df 100644 --- a/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_reverse_proxy_test.cpp @@ -2080,4 +2080,92 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_IncrementalRestoreOnR } GTEST_LOG_(INFO) << "ServiceReverseProxyTest-end SUB_ServiceReverse_proxy_IncrementalRestoreOnResultReport_0101"; } + +/** + * @tc.number: SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0100 + * @tc.name: SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0100 + * @tc.desc: Test function of IncrementalBackupOnResultReport interface for FAILURE. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9OVHB + */ +HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0100, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceReverseProxyTest-begin SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0100"; + try { + std::string bundleName = "app01"; + try { + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(false)); + EXPECT_TRUE(proxy_ != nullptr); + proxy_->IncrementalBackupOnResultReport(RESULT_REPORT, bundleName); + EXPECT_TRUE(false); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); + } + + try { + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); + proxy_->IncrementalBackupOnResultReport(RESULT_REPORT, bundleName); + EXPECT_TRUE(false); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); + } + + try { + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(false)); + proxy_->IncrementalBackupOnResultReport(RESULT_REPORT, bundleName); + EXPECT_TRUE(false); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); + } + + try { + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(-1)); + proxy_->IncrementalBackupOnResultReport(RESULT_REPORT, bundleName); + EXPECT_TRUE(false); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); + } + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceReverseProxyTest-an exception occurred by IncrementalBackupOnResultReport."; + } + GTEST_LOG_(INFO) << "ServiceReverseProxyTest-end SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0100"; +} + +/** + * @tc.number: SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0101 + * @tc.name: SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0101 + * @tc.desc: Test function of IncrementalBackupOnResultReport interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0101, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceReverseProxyTest-begin SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0101"; + try { + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)) + .Times(1) + .WillOnce(Invoke(mock_.GetRefPtr(), &ServiceReverseMock::InvokeSendRequest)); + std::string bundleName = "app01"; + EXPECT_TRUE(proxy_ != nullptr); + proxy_->IncrementalBackupOnResultReport(RESULT_REPORT, bundleName); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceReverseProxyTest-an exception occurred by RestoreOnResultReport."; + } + GTEST_LOG_(INFO) << "ServiceReverseProxyTest-end SUB_ServiceReverse_proxy_IncrementalBackupOnResultReport_0101"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/service_stub_test.cpp b/tests/unittests/backup_sa/module_ipc/service_stub_test.cpp index 9b9947fcb..f0e874501 100644 --- a/tests/unittests/backup_sa/module_ipc/service_stub_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_stub_test.cpp @@ -81,6 +81,7 @@ public: MOCK_METHOD2(GetBackupInfo, ErrCode(string &bundleName, string &result)); MOCK_METHOD3(UpdateTimer, ErrCode(BundleName &bundleName, uint32_t timeOut, bool &result)); MOCK_METHOD3(UpdateSendRate, ErrCode(std::string &bundleName, int32_t sendRate, bool &result)); + MOCK_METHOD2(ReportAppProcessInfo, ErrCode(const std::string processInfo, BackupRestoreScenario sennario)); }; class ServiceStubTest : public testing::Test { @@ -1331,4 +1332,160 @@ HWTEST_F(ServiceStubTest, SUB_backup_sa_ServiceStub_GetIncrementalFileHandle_010 } GTEST_LOG_(INFO) << "ServiceStubTest-end SUB_backup_sa_ServiceStub_GetIncrementalFileHandle_0100"; } + +/** + * @tc.number: SUB_backup_sa_ServiceStub_CmdResultReport_0100 + * @tc.name: SUB_backup_sa_ServiceStub_CmdResultReport_0100 + * @tc.desc: Test function of CmdResultReport interface for FAILURE. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceStubTest, SUB_backup_sa_ServiceStub_CmdResultReport_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceStubTest-begin SUB_backup_sa_ServiceStub_CmdResultReport_0100"; + try { + MessageParcel data; + MessageParcel reply; + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(false)); + EXPECT_TRUE(service != nullptr); + auto err = service->CmdResultReport(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_INVAL_ARG)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(false)); + err = service->CmdResultReport(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_INVAL_ARG)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(true)).WillOnce(Return(false)); + err = service->CmdResultReport(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_INVAL_ARG)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*service, ServiceResultReport(_, _, _)).WillOnce(Return(BError(BError::Codes::OK))); + EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(false)); + err = service->CmdResultReport(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_BROKEN_IPC)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceStubTest-an exception occurred by CmdResultReport."; + } + GTEST_LOG_(INFO) << "ServiceStubTest-end SUB_backup_sa_ServiceStub_CmdResultReport_0100"; +} + +/** + * @tc.number: SUB_backup_sa_ServiceStub_CmdResultReport_0200 + * @tc.name: SUB_backup_sa_ServiceStub_CmdResultReport_0200 + * @tc.desc: Test function of GetIncrementalFileHandle interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceStubTest, SUB_backup_sa_ServiceStub_CmdResultReport_0200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceStubTest-begin SUB_backup_sa_ServiceStub_CmdResultReport_0200"; + try { + MessageParcel data; + MessageParcel reply; + EXPECT_TRUE(service != nullptr); + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*service, ServiceResultReport(_, _, _)).WillOnce(Return(BError(BError::Codes::OK))); + EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(true)); + auto ret = service->CmdResultReport(data, reply); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceStubTest-an exception occurred by CmdResultReport."; + } + GTEST_LOG_(INFO) << "ServiceStubTest-end SUB_backup_sa_ServiceStub_CmdResultReport_0200"; +} + +/** + * @tc.number: SUB_backup_sa_ServiceStub_CmdUpdateSendRate_0100 + * @tc.name: SUB_backup_sa_ServiceStub_CmdUpdateSendRate_0100 + * @tc.desc: Test function of CmdUpdateSendRate interface for FAILURE. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceStubTest, SUB_backup_sa_ServiceStub_CmdUpdateSendRate_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceStubTest-begin SUB_backup_sa_ServiceStub_CmdUpdateSendRate_0100"; + try { + MessageParcel data; + MessageParcel reply; + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(false)); + EXPECT_TRUE(service != nullptr); + auto err = service->CmdUpdateSendRate(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_BROKEN_IPC)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(false)); + err = service->CmdUpdateSendRate(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_BROKEN_IPC)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*service, UpdateSendRate(_, _, _)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); + err = service->CmdUpdateSendRate(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_BROKEN_IPC)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*service, UpdateSendRate(_, _, _)).WillOnce(Return(BError(BError::Codes::OK))); + EXPECT_CALL(*messageParcelMock, WriteBool(_)).WillOnce(Return(false)); + err = service->CmdUpdateSendRate(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_BROKEN_IPC)); + + EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*service, UpdateSendRate(_, _, _)).WillOnce(Return(BError(BError::Codes::OK))); + EXPECT_CALL(*messageParcelMock, WriteBool(_)).WillOnce(Return(true)); + err = service->CmdUpdateSendRate(data, reply); + EXPECT_EQ(err, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceStubTest-an exception occurred by CmdUpdateSendRate."; + } + GTEST_LOG_(INFO) << "ServiceStubTest-end SUB_backup_sa_ServiceStub_CmdUpdateSendRate_0100"; +} + +/** + * @tc.number: SUB_backup_sa_ServiceStub_CmdGetAppLocalListAndDoIncrementalBackup_0100 + * @tc.name: SUB_backup_sa_ServiceStub_CmdGetAppLocalListAndDoIncrementalBackup_0100 + * @tc.desc: Test function of CmdGetAppLocalListAndDoIncrementalBackup interface for FAILURE. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceStubTest, SUB_backup_sa_ServiceStub_CmdGetAppLocalListAndDoIncrementalBackup_0100, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceStubTest-begin SUB_backup_sa_ServiceStub_CmdGetAppLocalListAndDoIncrementalBackup_0100"; + try { + MessageParcel data; + MessageParcel reply; + EXPECT_TRUE(service != nullptr); + EXPECT_CALL(*service, GetAppLocalListAndDoIncrementalBackup()).WillOnce(Return(BError(BError::Codes::OK))); + EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(false)); + auto err = service->CmdGetAppLocalListAndDoIncrementalBackup(data, reply); + EXPECT_EQ(err, BError(BError::Codes::SA_BROKEN_IPC)); + + EXPECT_CALL(*service, GetAppLocalListAndDoIncrementalBackup()).WillOnce(Return(BError(BError::Codes::OK))); + EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(true)); + err = service->CmdGetAppLocalListAndDoIncrementalBackup(data, reply); + EXPECT_EQ(err, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceStubTest-an exception occurred by CmdGetAppLocalListAndDoIncrementalBackup."; + } + GTEST_LOG_(INFO) << "ServiceStubTest-end SUB_backup_sa_ServiceStub_CmdGetAppLocalListAndDoIncrementalBackup_0100"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/service_test.cpp b/tests/unittests/backup_sa/module_ipc/service_test.cpp index f2e6511c8..88bf25085 100644 --- a/tests/unittests/backup_sa/module_ipc/service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_test.cpp @@ -20,6 +20,7 @@ #include #include "module_ipc/service.h" +#include "service.cpp" #include "service_reverse_mock.h" #include "test_manager.h" @@ -441,6 +442,43 @@ HWTEST_F(ServiceTest, SUB_Service_AppDone_0102, testing::ext::TestSize.Level1) GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_AppDone_0102"; } +/** + * @tc.number: SUB_Service_ServiceResultReport_0000 + * @tc.name: SUB_Service_ServiceResultReport_0000 + * @tc.desc: 测试 ServiceResultReport 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceTest, SUB_Service_ServiceResultReport_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_ServiceResultReport_0000"; + try { + GTEST_LOG_(INFO) << "SUB_Service_ServiceResultReport Branches Start"; + string bundleName = ""; + EXPECT_TRUE(servicePtr_ != nullptr); + auto ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::FULL_RESTORE, 0); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::INCREMENTAL_RESTORE, 0); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::FULL_BACKUP, 0); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::INCREMENTAL_BACKUP, 0); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", static_cast(1000), 0); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ServiceResultReport."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_ServiceResultReport_0000"; +} + /** * @tc.number: SUB_Service_LaunchBackupExtension_0100 * @tc.name: SUB_Service_LaunchBackupExtension_0100 @@ -523,6 +561,41 @@ HWTEST_F(ServiceTest, SUB_Service_GetFileHandle_0100, testing::ext::TestSize.Lev GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetFileHandle_0100"; } +/** + * @tc.number: SUB_Service_GetFileHandle_0101 + * @tc.name: SUB_Service_GetFileHandle_0101 + * @tc.desc: 测试 GetFileHandle 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceTest, SUB_Service_GetFileHandle_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetFileHandle_0101"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + BackupExtInfo extInfo {}; + auto callDied = [](const string &&bundleName) {}; + auto callConnected = [](const string &&bundleName) {}; + string bundleNameIndexInfo = "123456"; + extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, bundleNameIndexInfo)); + extInfo.schedAction = BConstants::ServiceSchedAction::RUNNING; + impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; + EXPECT_TRUE(servicePtr_ != nullptr); + ret = servicePtr_->GetFileHandle(BUNDLE_NAME, FILE_NAME); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetFileHandle."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetFileHandle_0101"; +} + /** * @tc.number: SUB_Service_OnBackupExtensionDied_0100 * @tc.name: SUB_Service_OnBackupExtensionDied_0100 @@ -554,6 +627,48 @@ HWTEST_F(ServiceTest, SUB_Service_OnBackupExtensionDied_0100, testing::ext::Test GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_OnBackupExtensionDied_0100"; } +/** + * @tc.number: SUB_Service_OnBackupExtensionDied_0101 + * @tc.name: SUB_Service_OnBackupExtensionDied_0101 + * @tc.desc: 测试 OnBackupExtensionDied 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceTest, SUB_Service_OnBackupExtensionDied_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_OnBackupExtensionDied_0101"; + try { + GTEST_LOG_(INFO) << "SUB_Service_OnBackupExtensionDied_0101 RESTORE"; + ErrCode ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + string bundleName = BUNDLE_NAME; + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + BackupExtInfo extInfo {}; + extInfo.backUpConnection = nullptr; + extInfo.versionName = "0.0.0.0-0.0.0.0"; + impl_.restoreDataType = RESTORE_DATA_WAIT_SEND; + impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; + impl_.scenario = IServiceReverse::Scenario::RESTORE; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->OnBackupExtensionDied(move(bundleName)); + GTEST_LOG_(INFO) << "SUB_Service_OnBackupExtensionDied_0101 BACKUP"; + + ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + impl_.restoreDataType = RESTORE_DATA_READDY; + bundleName = "123456789"; + impl_.backupExtNameMap[bundleName] = extInfo; + servicePtr_->OnBackupExtensionDied(move(bundleName)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetFileHandle."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_OnBackupExtensionDied_0101"; +} + /** * @tc.number: SUB_Service_ExtStart_0100 * @tc.name: SUB_Service_ExtStart_0100 @@ -584,6 +699,55 @@ HWTEST_F(ServiceTest, SUB_Service_ExtStart_0100, testing::ext::TestSize.Level1) GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_ExtStart_0100"; } +/** + * @tc.number: SUB_Service_ExtStart_0101 + * @tc.name: SUB_Service_ExtStart_0101 + * @tc.desc: 测试 ExtStart 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceTest, SUB_Service_ExtStart_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_ExtStart_0101"; + try { + GTEST_LOG_(INFO) << "SUB_Service_ExtStart_0101 BACKUP"; + std::string bundleName = "123456"; + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->ExtStart(bundleName); + + GTEST_LOG_(INFO) << "SUB_Service_ExtStart_0101 RESTORE"; + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + BackupExtInfo extInfo {}; + auto callDied = [](const string &&bundleName) {}; + auto callConnected = [](const string &&bundleName) {}; + string bundleNameIndexInfo = "123456789"; + extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, bundleNameIndexInfo)); + extInfo.backUpConnection->backupProxy_ = nullptr; + impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; + impl_.scenario = IServiceReverse::Scenario::UNDEFINED; + ret = Init(IServiceReverse::Scenario::UNDEFINED); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->ExtStart(BUNDLE_NAME); + + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->ExtStart(BUNDLE_NAME); + + ret = Init(IServiceReverse::Scenario::UNDEFINED); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->ExtStart(BUNDLE_NAME); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ExtStart."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_ExtStart_0101"; +} + /** * @tc.number: SUB_Service_Dump_0100 * @tc.name: SUB_Service_Dump_0100 @@ -678,6 +842,13 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectFailed_0100, testing::ext::TestSize. ret = Init(IServiceReverse::Scenario::BACKUP); EXPECT_EQ(ret, BError(BError::Codes::OK)); servicePtr_->ExtConnectFailed(BUNDLE_NAME, BError(BError::Codes::OK)); + + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + impl_.restoreDataType = RESTORE_DATA_READDY; + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->ExtConnectFailed(BUNDLE_NAME, BError(BError::Codes::OK)); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ExtConnectFailed."; @@ -873,6 +1044,30 @@ HWTEST_F(ServiceTest, SUB_Service_SendStartAppGalleryNotify_0100, testing::ext:: GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SendStartAppGalleryNotify_0100"; } +/** + * @tc.number: SUB_Service_SendStartAppGalleryNotify_0101 + * @tc.name: SUB_Service_SendStartAppGalleryNotify_0101 + * @tc.desc: 测试 SendStartAppGalleryNotify 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SendStartAppGalleryNotify_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SendStartAppGalleryNotify_0101"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->SendStartAppGalleryNotify(BUNDLE_NAME); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SendStartAppGalleryNotify."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SendStartAppGalleryNotify_0101"; +} + /** * @tc.number: SUB_Service_SessionDeactive_0100 * @tc.name: SUB_Service_SessionDeactive_0100 @@ -921,6 +1116,40 @@ HWTEST_F(ServiceTest, SUB_Service_GetBackupInfo_0100, testing::ext::TestSize.Lev GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetBackupInfo_0100"; } +/** + * @tc.number: SUB_Service_GetBackupInfo_0101 + * @tc.name: SUB_Service_GetBackupInfo_0101 + * @tc.desc: 测试 SessionDeactive 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_GetBackupInfo_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetBackupInfo_0101"; + try { + std::string bundleName = "com.example.app2backup"; + std::string result = "ok"; + auto ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->session_ = nullptr; + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + ret = servicePtr_->GetBackupInfo(bundleName, result); + EXPECT_NE(ret, BError(BError::Codes::OK)); + + impl_.clientToken = 0; + ret = servicePtr_->GetBackupInfo(bundleName, result); + EXPECT_NE(ret, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetBackupInfo."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetBackupInfo_0101"; +} + /** * @tc.number: SUB_Service_UpdateTimer_0100 * @tc.name: SUB_Service_UpdateTimer_0100 @@ -945,4 +1174,638 @@ HWTEST_F(ServiceTest, SUB_Service_UpdateTimer_0100, testing::ext::TestSize.Level } GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_UpdateTimer_0100"; } + +/** + * @tc.number: SUB_Service_UpdateTimer_0101 + * @tc.name: SUB_Service_UpdateTimer_0101 + * @tc.desc: 测试 UpdateTimer 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_UpdateTimer_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_UpdateTimer_0101"; + try { + std::string bundleName = "com.example.app2backup"; + bool result = true; + uint32_t timeOut = 30000; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->session_ = nullptr; + servicePtr_->UpdateTimer(bundleName, timeOut, result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by UpdateTimer."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_UpdateTimer_0101"; +} + +/** + * @tc.number: SUB_Service_GetBackupInfoCmdHandle_0100 + * @tc.name: SUB_Service_GetBackupInfoCmdHandle_0100 + * @tc.desc: 测试 GetBackupInfoCmdHandle 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_GetBackupInfoCmdHandle_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetBackupInfoCmdHandle_0100"; + try { + std::string bundleName = "com.example.app2backup"; + std::string result; + EXPECT_TRUE(servicePtr_ != nullptr); + auto ret = servicePtr_->GetBackupInfoCmdHandle(bundleName, result); + EXPECT_TRUE(ret == BError::BackupErrorCode::E_INVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetBackupInfoCmdHandle."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetBackupInfoCmdHandle_0100"; +} + +/** + * @tc.number: SUB_Service_SpecialVersion_0100 + * @tc.name: SUB_Service_SpecialVersion_0100 + * @tc.desc: 测试 SpecialVersion 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SpecialVersion_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SpecialVersion_0100"; + try { + std::string versionName = "0.0.0.0-0.0.0.0"; + EXPECT_TRUE(servicePtr_ != nullptr); + bool ret = SpecialVersion(versionName); + EXPECT_EQ(ret, true); + versionName = "1.1.1.1-1.1.1.1"; + ret = SpecialVersion(versionName); + EXPECT_EQ(ret, false); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SpecialVersion."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SpecialVersion_0100"; +} + +/** + * @tc.number: SUB_Service_OnBundleStarted_0100 + * @tc.name: SUB_Service_OnBundleStarted_0100 + * @tc.desc: 测试 OnBundleStarted 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_OnBundleStarted_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_OnBundleStarted_0100"; + try { + int32_t saID = 2503; + wptr reversePtr(new Service(saID)); + sptr session(new SvcSessionManager(reversePtr)); + EXPECT_TRUE(servicePtr_ != nullptr); + OnBundleStarted(BError(BError::Codes::SA_INVAL_ARG), session, BUNDLE_NAME); + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + impl_.scenario = IServiceReverse::Scenario::RESTORE; + OnBundleStarted(BError(BError::Codes::SA_INVAL_ARG), session, BUNDLE_NAME); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by OnBundleStarted."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_OnBundleStarted_0100"; +} + +/** + * @tc.number: SUB_Service_HandleExceptionOnAppendBundles_0100 + * @tc.name: SUB_Service_HandleExceptionOnAppendBundles_0100 + * @tc.desc: 测试 HandleExceptionOnAppendBundles 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_HandleExceptionOnAppendBundles_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_HandleExceptionOnAppendBundles_0100"; + try { + int32_t saID = 4801; + wptr reversePtr(new Service(saID)); + sptr session(new SvcSessionManager(reversePtr)); + vector appendBundleNames {"123456"}; + vector restoreBundleNames {"abcdef"}; + EXPECT_TRUE(servicePtr_ != nullptr); + HandleExceptionOnAppendBundles(session, appendBundleNames, restoreBundleNames); + + appendBundleNames.push_back("789"); + HandleExceptionOnAppendBundles(session, appendBundleNames, restoreBundleNames); + + restoreBundleNames.push_back("123456"); + restoreBundleNames.push_back("123"); + HandleExceptionOnAppendBundles(session, appendBundleNames, restoreBundleNames); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by HandleExceptionOnAppendBundles."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_HandleExceptionOnAppendBundles_0100"; +} + +/** + * @tc.number: SUB_Service_SetCurrentSessProperties_0100 + * @tc.name: SUB_Service_SetCurrentSessProperties_0100 + * @tc.desc: 测试 SetCurrentSessProperties 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SetCurrentSessProperties_0100"; + try { + BJsonEntityCaps::BundleInfo aInfo {}; + aInfo.name = "123456"; + aInfo.extensionName = "abcdef"; + aInfo.allToBackup = true; + std::vector restoreBundleInfos {aInfo}; + std::vector restoreBundleNames {"12345678"}; + RestoreTypeEnum restoreType = RESTORE_DATA_READDY; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->session_ = sptr(new SvcSessionManager(servicePtr_)); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleNames.push_back("123456"); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.allToBackup = true; + aInfo.versionName = "0.0.0.0-0.0.0.0"; + aInfo.extensionName = ""; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.name = "123456a"; + restoreBundleInfos.push_back(aInfo); + restoreBundleNames.push_back("123456a"); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.allToBackup = false; + aInfo.extensionName = ""; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.allToBackup = false; + aInfo.extensionName = ""; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + } catch (...) { + EXPECT_TRUE(true); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SetCurrentSessProperties."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SetCurrentSessProperties_0100"; +} + +/** + * @tc.number: SUB_Service_SetCurrentSessProperties_0101 + * @tc.name: SUB_Service_SetCurrentSessProperties_0101 + * @tc.desc: 测试 SetCurrentSessProperties 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SetCurrentSessProperties_0101"; + try { + BJsonEntityCaps::BundleInfo aInfo {}; + aInfo.name = "123456"; + aInfo.versionName = "0.0.0.0-0.0.0.0"; + aInfo.extensionName = "abcdef"; + aInfo.allToBackup = false; + std::vector restoreBundleInfos {aInfo}; + std::vector restoreBundleNames {"123456"}; + RestoreTypeEnum restoreType = RESTORE_DATA_READDY; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->session_ = sptr(new SvcSessionManager(servicePtr_)); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.extensionName = ""; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.name = "123456a"; + restoreBundleInfos.push_back(aInfo); + restoreBundleNames.push_back("123456a"); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SetCurrentSessProperties."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SetCurrentSessProperties_0101"; +} + +/** + * @tc.number: SUB_Service_SetCurrentSessProperties_0102 + * @tc.name: SUB_Service_SetCurrentSessProperties_0102 + * @tc.desc: 测试 SetCurrentSessProperties 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0102, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SetCurrentSessProperties_0102"; + try { + BJsonEntityCaps::BundleInfo aInfo {}; + aInfo.name = "123456"; + aInfo.versionName = "0.0.0.0-0.0.0.0"; + aInfo.extensionName = "abcdef"; + aInfo.allToBackup = false; + std::vector restoreBundleInfos {aInfo}; + std::vector restoreBundleNames {"123456"}; + RestoreTypeEnum restoreType = RESTORE_DATA_READDY; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.versionName = "1.1.1.1-1.1.1.1"; + aInfo.extensionName = ""; + aInfo.name = "123456"; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.name = "123456a"; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.extensionName = "abcdef"; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + + restoreBundleInfos.clear(); + aInfo.name = "123456"; + restoreBundleInfos.push_back(aInfo); + servicePtr_->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, restoreType); + } catch (...) { + EXPECT_TRUE(true); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SetCurrentSessProperties."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SetCurrentSessProperties_0102"; +} + +/** + * @tc.number: SUB_Service_AppendBundlesRestoreSession_0100 + * @tc.name: SUB_Service_AppendBundlesRestoreSession_0100 + * @tc.desc: 测试 AppendBundlesRestoreSession 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_AppendBundlesRestoreSession_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_AppendBundlesRestoreSession_0100"; + try { + UniqueFd fd = servicePtr_->GetLocalCapabilities(); + EXPECT_GE(fd, BError(BError::Codes::OK)); + vector bundleNames {}; + RestoreTypeEnum restoreType = RESTORE_DATA_READDY; + int32_t userId = 1; + EXPECT_TRUE(servicePtr_ != nullptr); + auto ret = servicePtr_->AppendBundlesRestoreSession(move(fd), bundleNames, restoreType, userId); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by AppendBundlesRestoreSession."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_AppendBundlesRestoreSession_0100"; +} + +/** + * @tc.number: SUB_Service_NotifyCloneBundleFinish_0100 + * @tc.name: SUB_Service_NotifyCloneBundleFinish_0100 + * @tc.desc: 测试 NotifyCloneBundleFinish 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_NotifyCloneBundleFinish_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_NotifyCloneBundleFinish_0100"; + try { + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + BackupExtInfo extInfo {}; + extInfo.backUpConnection = nullptr; + impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; + impl_.scenario = IServiceReverse::Scenario::RESTORE; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->NotifyCloneBundleFinish(BUNDLE_NAME); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by NotifyCloneBundleFinish."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_NotifyCloneBundleFinish_0100"; +} + +/** + * @tc.number: SUB_Service_LaunchBackupSAExtension_0100 + * @tc.name: SUB_Service_LaunchBackupSAExtension_0100 + * @tc.desc: 测试 LaunchBackupSAExtension 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_LaunchBackupSAExtension_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_LaunchBackupSAExtension_0100"; + try { + std::string bundleName = "123456"; + ErrCode ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + ret = servicePtr_->LaunchBackupSAExtension(BUNDLE_NAME); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + BackupExtInfo extInfo {}; + extInfo.backUpConnection = nullptr; + + auto callDied = [](const string &&bundleName) {}; + auto callConnected = [](const string &&bundleName) {}; + auto callBackup = [](const std::string &&bundleName, const int &&fd, const std::string &&result, + const ErrCode &&errCode) {}; + auto callRestore = [](const std::string &&bundleName, const std::string &&result, const ErrCode &&errCode) {}; + extInfo.saBackupConnection = + std::make_shared(callDied, callConnected, callBackup, callRestore); + + impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; + ret = servicePtr_->LaunchBackupSAExtension(bundleName); + EXPECT_NE(ret, BError(BError::Codes::OK)); + + ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + ret = servicePtr_->LaunchBackupSAExtension(bundleName); + EXPECT_NE(ret, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by LaunchBackupSAExtension."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_LaunchBackupSAExtension_0100"; +} + +/** + * @tc.number: SUB_Service_ExtConnectDied_0100 + * @tc.name: SUB_Service_ExtConnectDied_0100 + * @tc.desc: 测试 ExtConnectDied 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_ExtConnectDied_0100"; + try { + std::string callName = "123456"; + ErrCode ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + BackupExtInfo extInfo {}; + auto callDied = [](const string &&bundleName) {}; + auto callConnected = [](const string &&bundleName) {}; + string bundleNameIndexInfo = "123456789"; + extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, bundleNameIndexInfo)); + impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; + impl_.scenario = IServiceReverse::Scenario::RESTORE; + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->ExtConnectDied(callName); + extInfo.backUpConnection->isConnected_.store(true); + servicePtr_->ExtConnectDied(callName); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ExtConnectDied."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_ExtConnectDied_0100"; +} + +/** + * @tc.number: SUB_Service_NoticeClientFinish_0100 + * @tc.name: SUB_Service_NoticeClientFinish_0100 + * @tc.desc: 测试 NoticeClientFinish 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_NoticeClientFinish_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_NoticeClientFinish_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->NoticeClientFinish(BUNDLE_NAME, BError(BError::Codes::OK)); + GTEST_LOG_(INFO) << "SUB_Service_NoticeClientFinish_0100 BACKUP"; + ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->NoticeClientFinish(BUNDLE_NAME, BError(BError::Codes::OK)); + + SvcSessionManager::Impl impl_; + impl_.clientToken = 1; + impl_.restoreDataType = RESTORE_DATA_READDY; + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->NoticeClientFinish(BUNDLE_NAME, BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by NoticeClientFinish."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_NoticeClientFinish_0100"; +} + +/** + * @tc.number: SUB_Service_OnAllBundlesFinished_0100 + * @tc.name: SUB_Service_OnAllBundlesFinished_0100 + * @tc.desc: 测试 OnAllBundlesFinished 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ServiceTest, SUB_Service_OnAllBundlesFinished_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_OnAllBundlesFinished_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->session_ = sptr(new SvcSessionManager(servicePtr_)); + servicePtr_->OnAllBundlesFinished(BError(BError::Codes::OK)); + + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->OnAllBundlesFinished(BError(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by OnAllBundlesFinished."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_OnAllBundlesFinished_0100"; +} + +/** + * @tc.number: SUB_Service_SendEndAppGalleryNotify_0100 + * @tc.name: SUB_Service_SendEndAppGalleryNotify_0100 + * @tc.desc: 测试 SendEndAppGalleryNotify 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SendEndAppGalleryNotify_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SendEndAppGalleryNotify_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->SendEndAppGalleryNotify(BUNDLE_NAME); + + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->SendEndAppGalleryNotify(BUNDLE_NAME); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SendEndAppGalleryNotify."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SendEndAppGalleryNotify_0100"; +} + +/** + * @tc.number: SUB_Service_SendErrAppGalleryNotify_0100 + * @tc.name: SUB_Service_SendErrAppGalleryNotify_0100 + * @tc.desc: 测试 SendErrAppGalleryNotify 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_SendErrAppGalleryNotify_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SendErrAppGalleryNotify_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->SendErrAppGalleryNotify(); + + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->SendErrAppGalleryNotify(); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SendErrAppGalleryNotify."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SendErrAppGalleryNotify_0100"; +} + +/** + * @tc.number: SUB_Service_ClearDisposalOnSaStart_0100 + * @tc.name: SUB_Service_ClearDisposalOnSaStart_0100 + * @tc.desc: 测试 ClearDisposalOnSaStart 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_ClearDisposalOnSaStart_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_ClearDisposalOnSaStart_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->ClearDisposalOnSaStart(); + + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->ClearDisposalOnSaStart(); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ClearDisposalOnSaStart."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_ClearDisposalOnSaStart_0100"; +} + +/** + * @tc.number: SUB_Service_DeleteDisConfigFile_0100 + * @tc.name: SUB_Service_DeleteDisConfigFile_0100 + * @tc.desc: 测试 DeleteDisConfigFile 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_DeleteDisConfigFile_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_DeleteDisConfigFile_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->DeleteDisConfigFile(); + + ret = Init(IServiceReverse::Scenario::RESTORE); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + servicePtr_->DeleteDisConfigFile(); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by DeleteDisConfigFile."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_DeleteDisConfigFile_0100"; +} + +/** + * @tc.number: SUB_Service_UnloadService_0100 + * @tc.name: SUB_Service_UnloadService_0100 + * @tc.desc: 测试 UnloadService 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I8ZIMJ + */ +HWTEST_F(ServiceTest, SUB_Service_UnloadService_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_UnloadService_0100"; + try { + ErrCode ret = Init(IServiceReverse::Scenario::BACKUP); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_TRUE(servicePtr_ != nullptr); + servicePtr_->sched_ = nullptr; + servicePtr_->UnloadService(); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by UnloadService."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_UnloadService_0100"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp index cfdfacc4c..772053763 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp @@ -53,7 +53,7 @@ static void CallDone(const std::string &&name) void SvcBackupConnectionTest::SetUpTestCase() { - backupCon_ = sptr(new SvcBackupConnection(CallDied, CallDone)); + backupCon_ = sptr(new SvcBackupConnection(CallDied, CallDone, "com.example.app")); castMock = std::make_shared(); IfaceCastMock::cast = castMock; } diff --git a/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp index 0e54994bf..aa55e0dc0 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp @@ -148,15 +148,17 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_HandleBackup_0100, testi GTEST_LOG_(INFO) << "SvcExtensionProxyTest-begin SUB_Ext_Extension_proxy_HandleBackup_0100"; try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); EXPECT_TRUE(proxy_ != nullptr); - ErrCode ret = proxy_->HandleBackup(); + ErrCode ret = proxy_->HandleBackup(true); EXPECT_EQ(EPERM, ret); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(0)); - ret = proxy_->HandleBackup(); + ret = proxy_->HandleBackup(true); EXPECT_EQ(BError(BError::Codes::OK), ret); } catch (...) { EXPECT_TRUE(false); @@ -218,15 +220,17 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_HandleRestore_0100, test GTEST_LOG_(INFO) << "SvcExtensionProxyTest-begin SUB_Ext_Extension_proxy_HandleRestore_0100"; try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); EXPECT_TRUE(proxy_ != nullptr); - ErrCode ret = proxy_->HandleRestore(); + ErrCode ret = proxy_->HandleRestore(true); EXPECT_EQ(EPERM, ret); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(0)); EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(0)); - ret = proxy_->HandleRestore(); + ret = proxy_->HandleRestore(true); EXPECT_EQ(BError(BError::Codes::OK), ret); } catch (...) { EXPECT_TRUE(false); @@ -287,6 +291,66 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_GetBackupInfo_0100, test GTEST_LOG_(INFO) << "SvcExtensionProxyTest-end SUB_Ext_Extension_proxy_GetBackupInfo_0100"; } +/** + * @tc.number: SUB_Ext_Extension_proxy_UpdateFdSendRate_0100 + * @tc.name: SUB_Ext_Extension_proxy_UpdateFdSendRate_0100 + * @tc.desc: 测试 HandleRestore 接口调用成功和失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcExtensionProxyTest, SUB_Service_GetBackupInfoCmdHandle_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcExtensionProxyTest-begin SUB_Ext_Extension_proxy_UpdateFdSendRate_0100"; + try { + std::string bundleName = "bundleName"; + int32_t sendRate = 0; + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); + EXPECT_TRUE(proxy_ != nullptr); + ErrCode ret = proxy_->UpdateFdSendRate(bundleName, sendRate); + EXPECT_EQ(EPERM, ret); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(false)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->UpdateFdSendRate(bundleName, sendRate); + EXPECT_EQ(EPERM, ret); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->UpdateFdSendRate(bundleName, sendRate); + EXPECT_EQ(EPERM, ret); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->UpdateFdSendRate(bundleName, sendRate); + EXPECT_EQ(BError(BError::Codes::OK), ret); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->UpdateFdSendRate(bundleName, sendRate); + EXPECT_EQ(BError(BError::Codes::OK), ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcExtensionProxyTest-an exception occurred by UpdateFdSendRate."; + } + GTEST_LOG_(INFO) << "SvcExtensionProxyTest-end SUB_Ext_Extension_proxy_UpdateFdSendRate_0100"; +} + /** * @tc.number: SUB_Ext_Extension_proxy_GetIncrementalFileHandle_0100 * @tc.name: SUB_Ext_Extension_proxy_GetIncrementalFileHandle_0100 @@ -398,6 +462,51 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_HandleIncrementalBackup_ GTEST_LOG_(INFO) << "SvcExtensionProxyTest-end SUB_Ext_Extension_proxy_HandleIncrementalBackup_0100"; } +/** + * @tc.number: SUB_Ext_Extension_proxy_IncrementalOnBackup_0100 + * @tc.name: SUB_Ext_Extension_proxy_IncrementalOnBackup_0100 + * @tc.desc: 测试 IncrementalOnBackup 接口调用成功和失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_IncrementalOnBackup_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcExtensionProxyTest-begin SUB_Ext_Extension_proxy_IncrementalOnBackup_0100"; + try { + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(false)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); + EXPECT_TRUE(proxy_ != nullptr); + ErrCode ret = proxy_->IncrementalOnBackup(true); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(false)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->IncrementalOnBackup(true); + EXPECT_NE(ret, ErrCode(BError::Codes::OK)); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->IncrementalOnBackup(true); + EXPECT_EQ(ret, ErrCode(EPERM)); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); + EXPECT_TRUE(proxy_ != nullptr); + ret = proxy_->IncrementalOnBackup(true); + EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcExtensionProxyTest-an exception occurred by IncrementalOnBackup."; + } + GTEST_LOG_(INFO) << "SvcExtensionProxyTest-end SUB_Ext_Extension_proxy_IncrementalOnBackup_0100"; +} + /** * @tc.number: SUB_Ext_Extension_proxy_GetIncrementalBackupFileHandle_0100 * @tc.name: SUB_Ext_Extension_proxy_GetIncrementalBackupFileHandle_0100 diff --git a/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp new file mode 100644 index 000000000..69baa543f --- /dev/null +++ b/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp @@ -0,0 +1,149 @@ +/* + * 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. + */ + +/** + * @tc.number: SUB_backup_sa_session_GetLastIncrementalTime_0100 + * @tc.name: SUB_backup_sa_session_GetLastIncrementalTime_0100 + * @tc.desc: 测试 GetLastIncrementalTime + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetLastIncrementalTime_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetLastIncrementalTime_0100"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->GetLastIncrementalTime(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_->GetLastIncrementalTime(BUNDLE_NAME); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetLastIncrementalTime."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetLastIncrementalTime_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_DecreaseSessionCnt_0100 + * @tc.name: SUB_backup_sa_session_DecreaseSessionCnt_0100 + * @tc.desc: 测试 DecreaseSessionCnt + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_DecreaseSessionCnt_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_DecreaseSessionCnt_0100"; + try { + sessionManagerPtr_->DecreaseSessionCnt(); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by DecreaseSessionCnt."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_DecreaseSessionCnt_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_DecreaseSessionCnt_0101 + * @tc.name: SUB_backup_sa_session_DecreaseSessionCnt_0101 + * @tc.desc: 测试 DecreaseSessionCnt + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_DecreaseSessionCnt_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_DecreaseSessionCnt_0101"; + try { + sessionManagerPtr_->IncreaseSessionCnt(); + sessionManagerPtr_->DecreaseSessionCnt(); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by DecreaseSessionCnt."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_DecreaseSessionCnt_0101"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetServiceSchedAction_0104 + * @tc.name: SUB_backup_sa_session_GetServiceSchedAction_0104 + * @tc.desc: 测试 GetServiceSchedAction 获取状态 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetServiceSchedAction_0104, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetServiceSchedAction_0104"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->GetServiceSchedAction(BUNDLE_NAME); + EXPECT_TRUE(true); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetServiceSchedAction."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetServiceSchedAction_0104"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetServiceSchedAction_0105 + * @tc.name: SUB_backup_sa_session_GetServiceSchedAction_0105 + * @tc.desc: 测试 GetServiceSchedAction 获取状态 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetServiceSchedAction_0105, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetServiceSchedAction_0105"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->SetServiceSchedAction(BUNDLE_NAME, BConstants::ServiceSchedAction::RUNNING); + EXPECT_TRUE(true); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetServiceSchedAction."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetServiceSchedAction_0105"; +} \ No newline at end of file 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 a60ac156d..411ade2de 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 @@ -627,6 +627,92 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetExtFileNameRequest_0100 GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetExtFileNameRequest_0100"; } +/** + * @tc.number: SUB_backup_sa_session_GetExtFileNameRequest_0101 + * @tc.name: SUB_backup_sa_session_GetExtFileNameRequest_0101 + * @tc.desc: 测试 GetExtFileNameRequest 获取暂存真实文件请求 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetExtFileNameRequest_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetExtFileNameRequest_0101"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->GetExtFileNameRequest(BUNDLE_NAME); + EXPECT_TRUE(true); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetExtFileNameRequest."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetExtFileNameRequest_0101"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetExtFileNameRequest_0102 + * @tc.name: SUB_backup_sa_session_GetExtFileNameRequest_0102 + * @tc.desc: 测试 GetExtFileNameRequest 获取暂存真实文件请求 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetExtFileNameRequest_0102, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetExtFileNameRequest_0102"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + sessionManagerPtr_->impl_.scenario = IServiceReverse::Scenario::UNDEFINED; + sessionManagerPtr_->GetExtFileNameRequest(BUNDLE_NAME); + EXPECT_TRUE(true); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetExtFileNameRequest."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetExtFileNameRequest_0102"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetExtFileNameRequest_0103 + * @tc.name: SUB_backup_sa_session_GetExtFileNameRequest_0103 + * @tc.desc: 测试 GetExtFileNameRequest 获取暂存真实文件请求 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetExtFileNameRequest_0103, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetExtFileNameRequest_0103"; + try { + try { + EXPECT_TRUE(sessionManagerPtr_ != nullptr); + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + sessionManagerPtr_->impl_.scenario = IServiceReverse::Scenario::RESTORE; + sessionManagerPtr_->GetExtFileNameRequest(BUNDLE_NAME); + EXPECT_TRUE(true); + } catch (BError &err) { + EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_INVAL_ARG); + } + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetExtFileNameRequest."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetExtFileNameRequest_0103"; +} + /** * @tc.number: SUB_backup_sa_session_GetExtConnection_0100 * @tc.name: SUB_backup_sa_session_GetExtConnection_0100 @@ -668,7 +754,7 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetExtConnection_0100, tes } BackupExtInfo info; - info.backUpConnection = sptr(new SvcBackupConnection(nullptr, nullptr)); + info.backUpConnection = sptr(new SvcBackupConnection(nullptr, nullptr, BUNDLE_NAME)); sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; sessionManagerPtr_->impl_.backupExtNameMap[BUNDLE_NAME] = info; auto ret = sessionManagerPtr_->GetExtConnection(BUNDLE_NAME); @@ -1764,7 +1850,7 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_ClearSessionData_0100, tes BackupExtInfo info; info.timerStatus = true; info.schedAction = BConstants::ServiceSchedAction::RUNNING; - info.backUpConnection = sptr(new SvcBackupConnection(nullptr, nullptr)); + info.backUpConnection = sptr(new SvcBackupConnection(nullptr, nullptr, BUNDLE_NAME)); EXPECT_TRUE(sessionManagerPtr_ != nullptr); sessionManagerPtr_->impl_.backupExtNameMap.clear(); sessionManagerPtr_->impl_.backupExtNameMap[BUNDLE_NAME] = info; @@ -1886,37 +1972,5 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetIncrementalManifestFd_0 GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetIncrementalManifestFd_0100"; } -/** - * @tc.number: SUB_backup_sa_session_GetLastIncrementalTime_0100 - * @tc.name: SUB_backup_sa_session_GetLastIncrementalTime_0100 - * @tc.desc: 测试 GetLastIncrementalTime - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I6F3GV - */ -HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetLastIncrementalTime_0100, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetLastIncrementalTime_0100"; - try { - try { - EXPECT_TRUE(sessionManagerPtr_ != nullptr); - sessionManagerPtr_->impl_.clientToken = 0; - sessionManagerPtr_->GetLastIncrementalTime(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_->GetLastIncrementalTime(BUNDLE_NAME); - EXPECT_TRUE(true); - } catch (...) { - EXPECT_TRUE(false); - GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetLastIncrementalTime."; - } - GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetLastIncrementalTime_0100"; -} +#include "svc_session_manager_ex_test.cpp" } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/session/b_incremental_session_test.cpp b/tests/unittests/backup_sa/session/b_incremental_session_test.cpp index d45ffbda8..44f0e1d15 100644 --- a/tests/unittests/backup_sa/session/b_incremental_session_test.cpp +++ b/tests/unittests/backup_sa/session/b_incremental_session_test.cpp @@ -646,4 +646,34 @@ HWTEST_F(IncrementalSessionTest, SUB_b_incremental_session_test_1900, testing::e GTEST_LOG_(INFO) << "IncrementalSessionTest-end SUB_b_incremental_session_test_1900"; } +/** + * @tc.number: SUB_b_incremental_session_test_2000 + * @tc.name: SUB_b_incremental_session_test_2000 + * @tc.desc: 测试 PublishSAFile 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesI9KPRL + */ +HWTEST_F(IncrementalSessionTest, SUB_b_incremental_session_test_2000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "IncrementalSessionTest-begin SUB_b_incremental_session_test_2000"; + try { + ServiceProxy::serviceProxy_ = nullptr; + BFileInfo fileInfo; + UniqueFd fd; + EXPECT_TRUE(restoreSession != nullptr); + auto err = restoreSession->PublishSAFile(fileInfo, move(fd)); + EXPECT_EQ(err, BError(BError::Codes::SDK_BROKEN_IPC).GetCode()); + + EXPECT_CALL(*proxy, PublishIncrementalFile(_)).WillOnce(Return(0)); + ServiceProxy::serviceProxy_ = proxy; + err = restoreSession->PublishSAFile(fileInfo, move(fd)); + EXPECT_EQ(err, BError(BError::Codes::OK).GetCode()); + } catch (...) { + EXPECT_TRUE(true); + GTEST_LOG_(INFO) << "IncrementalSessionTest-an exception occurred by RemoveExtConn."; + } + GTEST_LOG_(INFO) << "IncrementalSessionTest-end SUB_b_incremental_session_test_2000"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_tools/BUILD.gn b/tests/unittests/backup_tools/BUILD.gn index 15fa2bced..0a0c1d50a 100644 --- a/tests/unittests/backup_tools/BUILD.gn +++ b/tests/unittests/backup_tools/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023 Huawei Device Co., Ltd. +# Copyright (c) 2022-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 @@ -21,12 +21,16 @@ ohos_unittest("backup_tool_test") { sources = [ "${path_backup_mock}/b_filesystem/b_file_mock.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/b_incremental_backup_session.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/b_incremental_data.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/service_incremental_reverse.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/service_reverse.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp", "${path_backup}/tests/mock/backup_kit_inner/b_session_backup_mock.cpp", "${path_backup}/tools/backup_tool/src/tools_op.cpp", "${path_backup}/tools/backup_tool/src/tools_op_backup.cpp", "${path_backup}/tools/backup_tool/src/tools_op_check_sa.cpp", "${path_backup}/tools/backup_tool/src/tools_op_help.cpp", - "${path_backup}/tools/backup_tool/src/tools_op_incremental_backup.cpp", "backup_tool/tools_op_backup_test.cpp", "backup_tool/tools_op_check_sa_test.cpp", "backup_tool/tools_op_help_test.cpp", @@ -37,9 +41,11 @@ ohos_unittest("backup_tool_test") { include_dirs = [ "${path_base}/include", + "${path_backup}/frameworks/native/backup_kit_inner/include", "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", "${path_backup}/interfaces/inner_api/native/backup_kit_inner", "${path_backup}/tools/backup_tool/include", + "${path_backup}/tools/backup_tool/src", ] include_dirs += backup_mock_utils_include @@ -81,10 +87,14 @@ ohos_unittest("backup_tool_restore_test") { sources = [ "${path_backup_mock}/b_filesystem/b_file_mock.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/b_incremental_data.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/b_incremental_restore_session.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/service_incremental_reverse.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/service_reverse.cpp", + "${path_backup}/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp", "${path_backup}/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp", "${path_backup}/tests/mock/backup_kit_inner/b_session_restore_mock.cpp", "${path_backup}/tools/backup_tool/src/tools_op.cpp", - "${path_backup}/tools/backup_tool/src/tools_op_incremental_restore.cpp", "backup_tool/tools_op_incremental_restore_test.cpp", "backup_tool/tools_op_restore_async_test.cpp", "backup_tool/tools_op_restore_test.cpp", @@ -93,6 +103,7 @@ ohos_unittest("backup_tool_restore_test") { include_dirs = [ "${path_base}/include", + "${path_backup}/frameworks/native/backup_kit_inner/include", "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", "${path_backup}/interfaces/inner_api/native/backup_kit_inner", "${path_backup}/tools/backup_tool/include", diff --git a/tests/unittests/backup_tools/backup_tool/tools_op_incremental_backup_test.cpp b/tests/unittests/backup_tools/backup_tool/tools_op_incremental_backup_test.cpp index a4b754222..75727088e 100644 --- a/tests/unittests/backup_tools/backup_tool/tools_op_incremental_backup_test.cpp +++ b/tests/unittests/backup_tools/backup_tool/tools_op_incremental_backup_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -21,7 +21,7 @@ #include "b_resources/b_constants.h" #include "tools_op.h" -#include "tools_op_incremental_backup.h" +#include "tools_op_incremental_backup.cpp" #include "utils_mock_global_variable.h" namespace OHOS::FileManagement::Backup { @@ -178,4 +178,397 @@ HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_03 } GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_backup_0300"; } + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0400 + * @tc.name: SUB_backup_tools_op_incremental_backup_0400 + * @tc.desc: 测试OnFileReady分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_restore_0400, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_restore_0400"; + try { + auto ctx = make_shared(); + BFileInfo fileInfo; + fileInfo.owner = "test"; + fileInfo.fileName = "/manage.json"; + fileInfo.sn = 1; + UniqueFd fd(open("textFile", O_RDONLY)); + UniqueFd manifestFd(open("textManifest", O_RDONLY)); + OnFileReady(ctx, fileInfo, move(fd), move(manifestFd)); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_restore_0400"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0500 + * @tc.name: SUB_backup_tools_op_incremental_backup_0500 + * @tc.desc: 测试OnBundleStarted分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0500, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0500"; + try { + auto ctx = make_shared(); + ErrCode err = 0; + BundleName name = "bundle"; + OnBundleStarted(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0500"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0501 + * @tc.name: SUB_backup_tools_op_incremental_backup_0501 + * @tc.desc: 测试OnBundleStarted分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0501, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0501"; + try { + auto ctx = make_shared(); + ctx->SetBundleFinishedCount(1); + ErrCode err = -1; + BundleName name = "bundle"; + OnBundleStarted(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0501"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0600 + * @tc.name: SUB_backup_tools_op_incremental_backup_0600 + * @tc.desc: 测试OnBundleFinished分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0600, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0600"; + try { + auto ctx = make_shared(); + ctx->SetBundleFinishedCount(1); + ErrCode err = 0; + BundleName name = "bundle"; + OnBundleFinished(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0600"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0700 + * @tc.name: SUB_backup_tools_op_incremental_backup_0700 + * @tc.desc: 测试OnAllBundlesFinished分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0700, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0700"; + try { + auto ctx = make_shared(); + ErrCode err = 0; + OnAllBundlesFinished(ctx, err); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0700"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0701 + * @tc.name: SUB_backup_tools_op_incremental_backup_0701 + * @tc.desc: 测试OnAllBundlesFinished分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0701, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0701"; + try { + auto ctx = make_shared(); + ErrCode err = -1; + OnAllBundlesFinished(ctx, err); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0701"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0800 + * @tc.name: SUB_backup_tools_op_incremental_backup_0800 + * @tc.desc: 测试OnBackupServiceDied分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0800, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0800"; + try { + auto ctx = make_shared(); + OnBackupServiceDied(ctx); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0800"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_0900 + * @tc.name: SUB_backup_tools_op_incremental_backup_0900 + * @tc.desc: 测试BackupToolDirSoftlinkToBackupDir分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_0900, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_0900"; + try { + BackupToolDirSoftlinkToBackupDir(); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_0900"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1000 + * @tc.name: SUB_backup_tools_op_incremental_backup_1000 + * @tc.desc: 测试GetLocalCapabilitiesIncremental分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1000"; + try { + auto ctx = make_shared(); + string pathCapFile = ""; + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times = {"100"}; + int32_t ret = GetLocalCapabilitiesIncremental(ctx, pathCapFile, bundleNames, times); + EXPECT_EQ(-EPERM, ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1000"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1001 + * @tc.name: SUB_backup_tools_op_incremental_backup_1001 + * @tc.desc: 测试GetLocalCapabilitiesIncremental分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1001"; + try { + auto ctx = make_shared(); + string pathCapFile = "/data/backup"; + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times; + times.push_back("100"); + times.push_back("200"); + int32_t ret = GetLocalCapabilitiesIncremental(ctx, pathCapFile, bundleNames, times); + EXPECT_EQ(-EPERM, ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1001"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1100 + * @tc.name: SUB_backup_tools_op_incremental_backup_1100 + * @tc.desc: 测试Init分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1100"; + try { + string pathCapFile = "/data/backup"; + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times; + times.push_back("100"); + times.push_back("200"); + int32_t ret = Init(pathCapFile, bundleNames, times); + EXPECT_EQ(-EPERM, ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1100"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1200 + * @tc.name: SUB_backup_tools_op_incremental_backup_1200 + * @tc.desc: 测试Exec分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1200"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"bundles", {"bundle1", "bundle2"}}, + {"incrementalTime", {"time"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1200"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1201 + * @tc.name: SUB_backup_tools_op_incremental_backup_1201 + * @tc.desc: 测试Exec分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1201, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1201"; + try { + map> mapArgToVal = { + {"bundles", {"bundle1"}}, + {"incrementalTime", {"time"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1201"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1202 + * @tc.name: SUB_backup_tools_op_incremental_backup_1202 + * @tc.desc: 测试Exec分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1202, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1202"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"incrementalTime", {"time"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1202"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_backup_1203 + * @tc.name: SUB_backup_tools_op_incremental_backup_1203 + * @tc.desc: 测试Exec分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalBackupTest, SUB_backup_tools_op_incremental_backup_1203, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-begin SUB_backup_tools_op_incremental_backup_1203"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"bundles", {"bundle1"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalBackupTest-end SUB_backup_tools_op_incremental_backup_1203"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_tools/backup_tool/tools_op_incremental_restore_test.cpp b/tests/unittests/backup_tools/backup_tool/tools_op_incremental_restore_test.cpp index a5f8038a8..94de50821 100644 --- a/tests/unittests/backup_tools/backup_tool/tools_op_incremental_restore_test.cpp +++ b/tests/unittests/backup_tools/backup_tool/tools_op_incremental_restore_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -21,7 +21,7 @@ #include "b_resources/b_constants.h" #include "tools_op.h" -#include "tools_op_incremental_restore.h" +#include "tools_op_incremental_restore.cpp" namespace OHOS::FileManagement::Backup { using namespace std; @@ -195,4 +195,655 @@ HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_ } GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_restore_0300"; } + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0400 + * @tc.name: SUB_backup_tools_op_incremental_restore_0400 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0400, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0400"; + try { + auto ctx = make_shared(); + BFileInfo fileInfo; + fileInfo.owner = "test"; + fileInfo.fileName = "/manage.json"; + fileInfo.sn = 1; + UniqueFd fd(open("textFile", O_RDONLY)); + UniqueFd manifestFd(open("textManifest", O_RDONLY)); + OnFileReady(ctx, fileInfo, move(fd), move(manifestFd), 0); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0400"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0500 + * @tc.name: SUB_backup_tools_op_incremental_restore_0500 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0500, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0500"; + try { + auto ctx = make_shared(); + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times = {"100"}; + int32_t ret = InitRestoreSession(ctx, bundleNames, times); + EXPECT_EQ(-EPERM, ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0500"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0501 + * @tc.name: SUB_backup_tools_op_incremental_restore_0501 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0501, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0501"; + try { + auto ctx = make_shared(); + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times; + times.push_back("100"); + times.push_back("200"); + int32_t ret = InitRestoreSession(nullptr, bundleNames, times); + EXPECT_EQ(-EPERM, ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0501"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0502 + * @tc.name: SUB_backup_tools_op_incremental_restore_0502 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0502, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0502"; + try { + auto ctx = make_shared(); + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times; + times.push_back("10"); + times.push_back("20"); + int32_t ret = InitRestoreSession(ctx, bundleNames, times); + EXPECT_EQ(0, ret); + + BFileInfo fileInfo; + fileInfo.owner = "test"; + fileInfo.fileName = "manage.json"; + fileInfo.sn = 1; + UniqueFd fd(open("textFile", O_RDONLY)); + UniqueFd manifestFd(open("textManifest", O_RDONLY)); + OnFileReady(ctx, fileInfo, move(fd), move(manifestFd), 0); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0502"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0600 + * @tc.name: SUB_backup_tools_op_incremental_restore_0600 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0600, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0600"; + try { + auto ctx = make_shared(); + ErrCode err = 0; + BundleName name = "bundle"; + OnBundleStarted(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0600"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0601 + * @tc.name: SUB_backup_tools_op_incremental_restore_0601 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0601, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0601"; + try { + auto ctx = make_shared(); + ctx->cnt_ = 1; + ErrCode err = -1; + BundleName name = "bundle"; + OnBundleStarted(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0601"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0700 + * @tc.name: SUB_backup_tools_op_incremental_restore_0700 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0700, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0700"; + try { + auto ctx = make_shared(); + ctx->cnt_ = 1; + ErrCode err = 0; + BundleName name = "bundle"; + OnBundleFinished(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0700"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0701 + * @tc.name: SUB_backup_tools_op_incremental_restore_0701 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0701, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0701"; + try { + auto ctx = make_shared(); + ctx->cnt_ = 1; + ErrCode err = -1; + BundleName name = "bundle"; + OnBundleFinished(ctx, err, name); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0701"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0800 + * @tc.name: SUB_backup_tools_op_incremental_restore_0800 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0800, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0800"; + try { + auto ctx = make_shared(); + ErrCode err = 0; + OnAllBundlesFinished(ctx, err); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0800"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0801 + * @tc.name: SUB_backup_tools_op_incremental_restore_0801 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0801, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0801"; + try { + auto ctx = make_shared(); + ErrCode err = -1; + OnAllBundlesFinished(ctx, err); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0801"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_0900 + * @tc.name: SUB_backup_tools_op_incremental_restore_0900 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_0900, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_0900"; + try { + auto ctx = make_shared(); + OnBackupServiceDied(ctx); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_0900"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1000 + * @tc.name: SUB_backup_tools_op_incremental_restore_1000 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1000"; + try { + shared_ptr restore = nullptr; + RestoreApp(restore); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1000"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1001 + * @tc.name: SUB_backup_tools_op_incremental_restore_1001 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1001"; + try { + shared_ptr restore = make_shared(); + restore->session_ = nullptr; + RestoreApp(restore); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1001"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1002 + * @tc.name: SUB_backup_tools_op_incremental_restore_1002 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1002"; + try { + shared_ptr restore = make_shared(); + restore->session_ = {}; + BIncrementalData data("text", 1); + restore->lastIncrementalData = {data}; + RestoreApp(restore); + EXPECT_TRUE(true); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1002"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1003 + * @tc.name: SUB_backup_tools_op_incremental_restore_1003 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1003"; + try { + auto ctx = make_shared(); + vector bundleNames; + bundleNames.push_back("bundle1"); + bundleNames.push_back("bundle2"); + vector times; + times.push_back("10"); + times.push_back("20"); + int32_t ret = InitRestoreSession(ctx, bundleNames, times); + EXPECT_EQ(0, ret); + + RestoreApp(ctx); + EXPECT_TRUE(ctx); + } catch (BError &e) { + EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1003"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1100 + * @tc.name: SUB_backup_tools_op_incremental_restore_1100 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1100"; + try { + string pathCapFile = ""; + vector bundleNames = {"com.example.app2backup/"}; + bool depMode = true; + vector times = {"10"}; + int32_t ret = Init(pathCapFile, bundleNames, depMode, times); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1100"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1101 + * @tc.name: SUB_backup_tools_op_incremental_restore_1101 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1101"; + try { + string pathCapFile = "/data/backup"; + vector bundleNames = {"com.example.app2backup/"}; + bool depMode = true; + vector times = {"1"}; + int32_t ret = Init(pathCapFile, bundleNames, depMode, times); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1101"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1102 + * @tc.name: SUB_backup_tools_op_incremental_restore_1102 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1102, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1102"; + try { + string pathCapFile = ""; + vector bundleNames = {"com.example.app2backup/"}; + bool depMode = false; + vector times = {"10"}; + int32_t ret = Init(pathCapFile, bundleNames, depMode, times); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1102"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1200 + * @tc.name: SUB_backup_tools_op_incremental_restore_1200 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1200"; + try { + map> mapArgToVal; + mapArgToVal["depMode"] = {"false"}; + g_exec(mapArgToVal); + EXPECT_EQ(mapArgToVal["depMode"][0], "false"); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1200"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1201 + * @tc.name: SUB_backup_tools_op_incremental_restore_1201 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1201, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1201"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"bundles", {"bundle1"}}, + {"incrementalTime", {"time"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1201"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1202 + * @tc.name: SUB_backup_tools_op_incremental_restore_1202 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1202, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1202"; + try { + map> mapArgToVal = { + {"bundles", {"bundle1"}}, + {"incrementalTime", {"time"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1202"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1203 + * @tc.name: SUB_backup_tools_op_incremental_restore_1203 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1203, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1203"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"bundles", {"bundle1"}}, + {"incrementalTime", {"time"}}, + {"depMode", {"true"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1203"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1204 + * @tc.name: SUB_backup_tools_op_incremental_restore_1204 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1204, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1204"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"incrementalTime", {"time"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1204"; +} + +/** + * @tc.number: SUB_backup_tools_op_incremental_restore_1205 + * @tc.name: SUB_backup_tools_op_incremental_restore_1205 + * @tc.desc: 测试 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(ToolsOpIncrementalRestoreTest, SUB_backup_tools_op_incremental_restore_1205, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-begin SUB_backup_tools_op_incremental_restore_1205"; + try { + map> mapArgToVal = { + {"pathCapFile", {"path"}}, + {"bundles", {"bundle1"}} + }; + int ret = g_exec(mapArgToVal); + EXPECT_LT(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ToolsOpIncrementalRestoreTest-end SUB_backup_tools_op_incremental_restore_1205"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_utils/BUILD.gn b/tests/unittests/backup_utils/BUILD.gn index e731c8a97..47be52ea6 100644 --- a/tests/unittests/backup_utils/BUILD.gn +++ b/tests/unittests/backup_utils/BUILD.gn @@ -54,6 +54,8 @@ ohos_unittest("b_file_test") { "b_filesystem/b_file_test.cpp", ] + include_dirs = [ "${path_backup}/utils/src/b_filesystem" ] + deps = [ "${path_backup}/tests/utils:backup_test_utils", "${path_backup}/utils/:backup_utils", diff --git a/tests/unittests/backup_utils/b_error/b_error_test.cpp b/tests/unittests/backup_utils/b_error/b_error_test.cpp index d48c401d7..7a77a1791 100644 --- a/tests/unittests/backup_utils/b_error/b_error_test.cpp +++ b/tests/unittests/backup_utils/b_error/b_error_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -452,4 +452,58 @@ HWTEST_F(BErrorTest, b_error_int_0100, testing::ext::TestSize.Level0) EXPECT_EQ(result, 0); GTEST_LOG_(INFO) << "BErrorTest-end b_error_int_0100"; } + +/** + * @tc.number: SUB_backup_b_error_GetCodeByErrno_0100 + * @tc.name: b_error_GetCodeByErrno_0100 + * @tc.desc: Test function of int interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BErrorTest, b_error_GetCodeByErrno_0100, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BErrorTest-begin b_error_GetCodeByErrno_0100"; + int32_t errnoSys = 0; + int result = BError::GetCodeByErrno(errnoSys); + EXPECT_EQ(result, 0); + GTEST_LOG_(INFO) << "BErrorTest-end b_error_GetCodeByErrno_0100"; +} + +/** + * @tc.number: SUB_backup_b_error_GetCodeByErrno_0200 + * @tc.name: b_error_GetCodeByErrno_0200 + * @tc.desc: Test function of int interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BErrorTest, b_error_GetCodeByErrno_0200, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BErrorTest-begin b_error_GetCodeByErrno_0200"; + int32_t errnoSys = EPERM; + int result = BError::GetCodeByErrno(errnoSys); + EXPECT_EQ(result, BError::BackupErrorCode::E_PERM); + GTEST_LOG_(INFO) << "BErrorTest-end b_error_GetCodeByErrno_0200"; +} + +/** + * @tc.number: SUB_backup_b_error_GetCodeByErrno_0300 + * @tc.name: b_error_GetCodeByErrno_0300 + * @tc.desc: Test function of int interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BErrorTest, b_error_GetCodeByErrno_0300, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BErrorTest-begin b_error_GetCodeByErrno_0300"; + int32_t errnoSys = -EPERM; + int result = BError::GetCodeByErrno(errnoSys); + EXPECT_EQ(result, BError::BackupErrorCode::E_UKERR); + GTEST_LOG_(INFO) << "BErrorTest-end b_error_GetCodeByErrno_0300"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp index fc93f542f..531a63406 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp @@ -24,6 +24,7 @@ #include #include "b_filesystem/b_dir.h" +#include "b_dir.cpp" #include "b_process/b_process.h" #include "test_manager.h" @@ -318,4 +319,28 @@ HWTEST_F(BDirTest, b_dir_GetDirs_0100, testing::ext::TestSize.Level1) GTEST_LOG_(INFO) << "BDirTest-end b_dir_GetDirs_0100"; } +/** + * @tc.number: SUB_backup_b_dir_GetFile_0100 + * @tc.name: b_dir_GetFile_0100 + * @tc.desc: Test function of GetFile interface for SUCCESS + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(BDirTest, b_dir_GetFile_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BDirTest-begin b_dir_GetFile_0100"; + try { + string path = "/"; + auto [errCode, subFiles, subSmallFiles] = GetFile(path); + string pathData = "/data"; + auto [errCode1, subFiles1, subSmallFiles1] = GetFile(pathData, PATH_MAX_LEN); + auto [errCode2, subFiles2, subSmallFiles2] = GetFile(pathData); + EXPECT_EQ(errCode, 0); + } catch (...) { + GTEST_LOG_(INFO) << "BDirTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BDirTest-end b_dir_GetFile_0100"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_utils/b_filesystem/b_file_hash_test.cpp b/tests/unittests/backup_utils/b_filesystem/b_file_hash_test.cpp index a0f8621a8..bedfa2e60 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_file_hash_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_file_hash_test.cpp @@ -74,4 +74,26 @@ HWTEST_F(BFileHashTest, b_file_hash_HashWithSHA256_0100, testing::ext::TestSize. } GTEST_LOG_(INFO) << "BFileHashTest-end b_file_hash_HashWithSHA256_0100"; } + +/** + * @tc.number: SUB_backup_b_file_hash_HashWithSHA256_0101 + * @tc.name: b_file_hash_HashWithSHA256_0100 + * @tc.desc: Test function of HashWithSHA256 interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + */ +HWTEST_F(BFileHashTest, b_file_hash_HashWithSHA256_0101, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BFileHashTest-begin b_file_hash_HashWithSHA256_0101"; + try { + std::string filePath = "/errPath"; + auto [res, fileHash] = BackupFileHash::HashWithSHA256(filePath); + EXPECT_NE(res, 0); + } catch (const exception &e) { + GTEST_LOG_(INFO) << "BFileHashTest-an exception occurred by HashWithSHA256."; + e.what(); + } + GTEST_LOG_(INFO) << "BFileHashTest-end b_file_hash_HashWithSHA256_0101"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_utils/b_json/b_json_entity_ext_manage_test.cpp b/tests/unittests/backup_utils/b_json/b_json_entity_ext_manage_test.cpp index a09c55ebc..239a274bd 100644 --- a/tests/unittests/backup_utils/b_json/b_json_entity_ext_manage_test.cpp +++ b/tests/unittests/backup_utils/b_json/b_json_entity_ext_manage_test.cpp @@ -526,6 +526,31 @@ HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0803, testing::ext:: GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0803"; } +/** + * @tc.number: SUB_backup_b_json_entity_ext_manage_0804 + * @tc.name: b_json_entity_ext_manage_0804 + * @tc.desc: 测试GetExtManageInfo + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0804, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0804"; + try { + string_view sv = R"([{"isBigFile":false}, {"fileName":"test"}])"; + BJsonCachedEntity cachedEntity(sv); + auto cache = cachedEntity.Structuralize(); + auto mp = cache.GetExtManageInfo(); + EXPECT_TRUE(mp.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0804"; +} + /** * @tc.number: SUB_backup_b_json_entity_ext_manage_0900 * @tc.name: b_json_entity_ext_manage_0900 @@ -674,4 +699,32 @@ HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0903, testing::ext:: } GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0903"; } + +/** + * @tc.number: SUB_backup_b_json_entity_ext_manage_0904 + * @tc.name: b_json_entity_ext_manage_0904 + * @tc.desc: 测试CheckOwnPackTar各种异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesI9JXNH + */ +HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0904, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0904"; + try { + string fileName = "/home/user/test.tar"; + auto ret = CheckOwnPackTar(fileName); + EXPECT_FALSE(ret); + + fileName = string(BConstants::PATH_BUNDLE_BACKUP_HOME) + .append(BConstants::SA_BUNDLE_BACKUP_BACKUP).append("/part1.tar"); + ret = CheckOwnPackTar(fileName); + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0904"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_utils/b_json/b_report_entity_test.cpp b/tests/unittests/backup_utils/b_json/b_report_entity_test.cpp index 3e51ac258..cbdba7332 100644 --- a/tests/unittests/backup_utils/b_json/b_report_entity_test.cpp +++ b/tests/unittests/backup_utils/b_json/b_report_entity_test.cpp @@ -227,4 +227,124 @@ HWTEST_F(BReportEntityTest, b_report_entity_DealLine_0100, testing::ext::TestSiz GTEST_LOG_(INFO) << "BReportEntityTest-end b_report_entity_DealLine_0100"; } +/** + * @tc.number: SUB_backup_b_report_entity_DealLine_0101 + * @tc.name: b_report_entity_DealLine_0101 + * @tc.desc: Test function of DealLine interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + */ +HWTEST_F(BReportEntityTest, b_report_entity_DealLine_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BReportEntityTest-begin b_report_entity_DealLine_0101"; + try { + unordered_map keys; + int num = 1; + string line = ""; + unordered_map infos; + DealLine(keys, num, line, infos); + EXPECT_EQ(infos.size(), 0); + } catch (const exception &e) { + GTEST_LOG_(INFO) << "BReportEntityTest-an exception occurred by DealLine. " << e.what(); + EXPECT_TRUE(false); + } + GTEST_LOG_(INFO) << "BReportEntityTest-end b_report_entity_DealLine_0101"; +} + +/** + * @tc.number: SUB_backup_b_report_entity_StorageDealLine_0100 + * @tc.name: b_report_entity_StorageDealLine_0100 + * @tc.desc: Test function of DealLine interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + */ +HWTEST_F(BReportEntityTest, b_report_entity_StorageDealLine_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BReportEntityTest-begin b_report_entity_StorageDealLine_0100"; + try { + unordered_map keys; + int num = 1; + string line = ""; + StorageDealLine(keys, num, line); + EXPECT_TRUE(true); + } catch (const exception &e) { + GTEST_LOG_(INFO) << "BReportEntityTest-an exception occurred by DealLine. " << e.what(); + EXPECT_TRUE(false); + } + GTEST_LOG_(INFO) << "BReportEntityTest-end b_report_entity_StorageDealLine_0100"; +} + +/** + * @tc.number: SUB_backup_b_report_entity_StorageDealLine_0101 + * @tc.name: b_report_entity_StorageDealLine_0101 + * @tc.desc: Test function of DealLine interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + */ +HWTEST_F(BReportEntityTest, b_report_entity_StorageDealLine_0101, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BReportEntityTest-begin b_report_entity_StorageDealLine_0101"; + try { + unordered_map keys; + int num = 0; + string line = "test\r"; + StorageDealLine(keys, num, line); + EXPECT_TRUE(true); + } catch (const exception &e) { + GTEST_LOG_(INFO) << "BReportEntityTest-an exception occurred by DealLine. " << e.what(); + EXPECT_TRUE(false); + } + GTEST_LOG_(INFO) << "BReportEntityTest-end b_report_entity_StorageDealLine_0101"; +} + +/** + * @tc.number: SUB_backup_b_report_entity_StorageDealLine_0102 + * @tc.name: b_report_entity_StorageDealLine_0102 + * @tc.desc: Test function of DealLine interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + */ +HWTEST_F(BReportEntityTest, b_report_entity_StorageDealLine_0102, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BReportEntityTest-begin b_report_entity_StorageDealLine_0102"; + try { + unordered_map keys; + int num = 1; + string line = "key1;key2;key3"; + StorageDealLine(keys, num, line); + EXPECT_TRUE(true); + } catch (const exception &e) { + GTEST_LOG_(INFO) << "BReportEntityTest-an exception occurred by DealLine. " << e.what(); + EXPECT_TRUE(false); + } + GTEST_LOG_(INFO) << "BReportEntityTest-end b_report_entity_StorageDealLine_0102"; +} + +/** + * @tc.number: SUB_backup_b_report_entity_StorageDealLine_0103 + * @tc.name: b_report_entity_StorageDealLine_0103 + * @tc.desc: Test function of DealLine interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + */ +HWTEST_F(BReportEntityTest, b_report_entity_StorageDealLine_0103, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BReportEntityTest-begin b_report_entity_StorageDealLine_0103"; + try { + unordered_map keys; + int num = INFO_ALIGN_NUM; + string line = "key1;key2;key3"; + StorageDealLine(keys, num, line); + EXPECT_TRUE(true); + } catch (const exception &e) { + GTEST_LOG_(INFO) << "BReportEntityTest-an exception occurred by DealLine. " << e.what(); + EXPECT_TRUE(false); + } + GTEST_LOG_(INFO) << "BReportEntityTest-end b_report_entity_StorageDealLine_0103"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_utils/b_jsonutil/b_jsonutil_test.cpp b/tests/unittests/backup_utils/b_jsonutil/b_jsonutil_test.cpp index 4cb7c1f98..f1536a851 100644 --- a/tests/unittests/backup_utils/b_jsonutil/b_jsonutil_test.cpp +++ b/tests/unittests/backup_utils/b_jsonutil/b_jsonutil_test.cpp @@ -30,6 +30,10 @@ namespace OHOS::FileManagement::Backup { using namespace std; +namespace { +constexpr uint32_t TEST_USER_ID = 100; +} // namespace + class BJsonUtilTest : public testing::Test { public: static void SetUpTestCase(void) {}; @@ -52,8 +56,7 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_ParseBundleNameIndexStr_0100, testing::ext::T GTEST_LOG_(INFO) << "BJsonUtilTest-begin b_dir_GetDirFiles_0100"; try { std::string bundleName = "com.hos.app01:1"; - std::string pattern = ":"; - BJsonUtil::BundleDetailInfo detailInfo = BJsonUtil::ParseBundleNameIndexStr(bundleName, pattern); + BJsonUtil::BundleDetailInfo detailInfo = BJsonUtil::ParseBundleNameIndexStr(bundleName); EXPECT_EQ("com.hos.app01", detailInfo.bundleName); } catch (...) { EXPECT_TRUE(false); @@ -76,8 +79,7 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_ParseBundleNameIndexStr_0200, testing::ext::T GTEST_LOG_(INFO) << "BJsonUtilTest-begin ParseBundleNameIndexStr_0200"; try { std::string bundleName = "com.hos.app01"; - std::string pattern = ":"; - BJsonUtil::BundleDetailInfo detailInfo = BJsonUtil::ParseBundleNameIndexStr(bundleName, pattern); + BJsonUtil::BundleDetailInfo detailInfo = BJsonUtil::ParseBundleNameIndexStr(bundleName); EXPECT_EQ("com.hos.app01", detailInfo.bundleName); } catch (...) { EXPECT_TRUE(false); @@ -107,9 +109,11 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0100, testing::ext::TestSize std::string bundleInfo2 = "info2"; bundleInfos.push_back(bundleInfo); bundleInfos.push_back(bundleInfo2); - int32_t userId = 100; + int32_t userId = TEST_USER_ID; std::vector bundleNamesOnly; - auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, userId); + std::map isClearDataFlags; + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); EXPECT_TRUE(result.empty()); } catch (...) { EXPECT_TRUE(false); @@ -135,11 +139,13 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0200, testing::ext::TestSize std::string bundleName = "bundle"; bundleNames.push_back(bundleName); std::vector bundleInfos; - std::string bundleInfo = "info1"; + std::string bundleInfo = "{\"infos\":\"infos\"}"; bundleInfos.push_back(bundleInfo); - int32_t userId = 100; + int32_t userId = TEST_USER_ID; std::vector bundleNamesOnly; - auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, userId); + std::map isClearDataFlags; + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); EXPECT_FALSE(result.empty()); } catch (...) { EXPECT_TRUE(false); @@ -162,24 +168,17 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0300, testing::ext::TestSize GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0300"; try { std::vector bundleNames; - std::string bundleName = "bundle1"; - std::string bundleName2 = "bundle2"; - std::string bundleName3 = "bundle3"; + std::string bundleName = "bundle1:"; bundleNames.push_back(bundleName); - bundleNames.push_back(bundleName2); - bundleNames.push_back(bundleName3); std::vector bundleInfos; std::string bundleInfo = "info1"; - std::string bundleInfo2 = "info2"; - std::string bundleInfo3 = "info3"; bundleInfos.push_back(bundleInfo); - bundleInfos.push_back(bundleInfo2); - bundleInfos.push_back(bundleInfo3); - int32_t userId = 100; + int32_t userId = TEST_USER_ID; std::vector bundleNamesOnly; - int32_t size = 3; - auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, userId); - EXPECT_EQ(bundleNamesOnly.size(), size); + std::map isClearDataFlags; + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_TRUE(result.empty()); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; @@ -187,6 +186,38 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0300, testing::ext::TestSize GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0300"; } +/** + * @tc.number: b_jsonutil_BuildBundleInfos_0301 + * @tc.name: b_jsonutil_BuildBundleInfos_0301 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0301, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0301"; + try { + std::vector bundleNames; + std::string bundleName = ":bundle1"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = "info1"; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_TRUE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0301"; +} + /** * @tc.number: b_jsonutil_BuildBundleInfos_0400 * @tc.name: b_jsonutil_BuildBundleInfos_0400 @@ -204,12 +235,16 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0400, testing::ext::TestSize std::string bundleName = "bundle1"; bundleNames.push_back(bundleName); std::vector bundleInfos; - std::string bundleInfo = {"{\"infos\":[{\"type\":\"type1\",\"details\":\"details1\"}]}"}; + std::string bundleInfo = { + "{\"infos\":[{\"type\":\"type1\",\"details\":\"details1\"}],\"clearBackupData\": \"false\"}" + }; bundleInfos.push_back(bundleInfo); - int32_t userId = 100; + int32_t userId = TEST_USER_ID; std::vector bundleNamesOnly; - - auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, userId); + std::map isClearDataFlags; + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_EQ(isClearDataFlags[bundleName], false); EXPECT_FALSE(result.empty()); } catch (...) { EXPECT_TRUE(false); @@ -218,6 +253,206 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0400, testing::ext::TestSize GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0400"; } +/** + * @tc.number: b_jsonutil_BuildBundleInfos_0500 + * @tc.name: b_jsonutil_BuildBundleInfos_0500 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0500, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0500"; + try { + std::vector bundleNames; + std::string bundleName = "bundle"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = {"{\"infos\":[{\"type\":null}]}"}; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_EQ(isClearDataFlags[bundleName], true); + EXPECT_FALSE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0500"; +} + +/** + * @tc.number: b_jsonutil_BuildBundleInfos_0600 + * @tc.name: b_jsonutil_BuildBundleInfos_0600 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0600, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0600"; + try { + std::vector bundleNames; + std::string bundleName = "bundle"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = {"{\"infos\":[{\"type\":123}],\"clearBackupData\": \"true\"}"}; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_EQ(isClearDataFlags[bundleName], true); + EXPECT_FALSE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0600"; +} + +/** + * @tc.number: b_jsonutil_BuildBundleInfos_0700 + * @tc.name: b_jsonutil_BuildBundleInfos_0700 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0700, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0700"; + try { + std::vector bundleNames; + std::string bundleName = "bundle"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = {"{\"infos\":[{\"type\":\"testType\",\"details\":null}]}"}; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_FALSE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0700"; +} + +/** + * @tc.number: b_jsonutil_BuildBundleInfos_0800 + * @tc.name: b_jsonutil_BuildBundleInfos_0800 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0800, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0800"; + try { + std::vector bundleNames; + std::string bundleName = "bundle"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = {"{\"infos\":[{\"type\":\"testType\",\"details\":[]}]}"}; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_FALSE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0800"; +} + +/** + * @tc.number: b_jsonutil_BuildBundleInfos_0900 + * @tc.name: b_jsonutil_BuildBundleInfos_0900 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_0900, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_0900"; + try { + std::vector bundleNames; + std::string bundleName = "bundle"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = {"{\"infos\":[{\"type\":\"testType\",\"details\":[\"detail\"]}]}"}; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_FALSE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_0900"; +} + +/** + * @tc.number: b_jsonutil_BuildBundleInfos_1000 + * @tc.name: b_jsonutil_BuildBundleInfos_1000 + * @tc.desc: Test function of BuildBundleInfos interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_BuildBundleInfos_1000, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin BuildBundleInfos_1000"; + try { + std::vector bundleNames; + std::string bundleName = "bundle"; + bundleNames.push_back(bundleName); + std::vector bundleInfos; + std::string bundleInfo = {"{\"infos\":[\"infos\"]}"}; + bundleInfos.push_back(bundleInfo); + int32_t userId = TEST_USER_ID; + std::vector bundleNamesOnly; + std::map isClearDataFlags; + + auto result = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, + userId, isClearDataFlags); + EXPECT_FALSE(result.empty()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end BuildBundleInfos_1000"; +} + /** * @tc.number: b_jsonutil_FindBundleInfoByName_0100 * @tc.name: b_jsonutil_FindBundleInfoByName_0100 @@ -277,6 +512,38 @@ HWTEST_F(BJsonUtilTest, b_jsonutil_FindBundleInfoByName_0200, testing::ext::Test GTEST_LOG_(INFO) << "BJsonUtilTest-end FindBundleInfoByName_0200"; } +/** + * @tc.number: b_jsonutil_FindBundleInfoByName_0300 + * @tc.name: b_jsonutil_FindBundleInfoByName_0300 + * @tc.desc: Test function of FindBundleInfoByName interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 0 + * @tc.require: I6F3GV + */ +HWTEST_F(BJsonUtilTest, b_jsonutil_FindBundleInfoByName_0300, testing::ext::TestSize.Level0) +{ + GTEST_LOG_(INFO) << "BJsonUtilTest-begin FindBundleInfoByName_0300"; + try { + std::map> bundleNameDetailsMap; + std::string bundleName = "bundle1"; + std::string jobType = "type"; + std::string jobType1 = "type1"; + BJsonUtil::BundleDetailInfo detailInfo; + detailInfo.bundleName = bundleName; + detailInfo.type = jobType; + bundleNameDetailsMap[bundleName] = {detailInfo}; + BJsonUtil::BundleDetailInfo bundleDetail; + + bool result = BJsonUtil::FindBundleInfoByName(bundleNameDetailsMap, bundleName, jobType1, bundleDetail); + EXPECT_EQ(false, result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonUtilTest-an exception occurred."; + } + GTEST_LOG_(INFO) << "BJsonUtilTest-end FindBundleInfoByName_0300"; +} + /** * @tc.number: b_jsonutil_BuildRestoreErrInfo_0100 * @tc.name: b_jsonutil_BuildRestoreErrInfo_0100 diff --git a/tools/backup_tool/src/tools_op_incremental_restore_async.cpp b/tools/backup_tool/src/tools_op_incremental_restore_async.cpp index 7acfa5897..f39f53196 100644 --- a/tools/backup_tool/src/tools_op_incremental_restore_async.cpp +++ b/tools/backup_tool/src/tools_op_incremental_restore_async.cpp @@ -248,10 +248,7 @@ static void OnResultReport(shared_ptr ctx, const std::st static void OnProcess(shared_ptr ctx, const std::string bundleName, const std::string processInfo) { - printf("static void OnProcess(shared_ptr ctx, const std::string bundleName, const std::string processInfo) -{ - printf("OnResultReport bundleName = %s, result = %s\n", bundleName.c_str(), processInfo.c_str()); -} bundleName = %s, result = %s\n", bundleName.c_str(), processInfo.c_str()); + printf("OnProcess bundleName = %s, processInfo = %s\n", bundleName.c_str(), processInfo.c_str()); } static void RestoreApp(shared_ptr restore, vector &bundleNames) diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 632b98ae1..151ab2480 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -83,12 +83,15 @@ ohos_shared_library("backup_utils") { public_configs = [ ":utils_public_config" ] external_deps = [ + "access_token:libaccesstoken_sdk", + "access_token:libtokenid_sdk", "cJSON:cjson", "c_utils:utils", "faultloggerd:libdfx_dumpcatcher", "hilog:libhilog", "hitrace:hitrace_meter", "init:libbegetutil", + "ipc:ipc_core", ] include_dirs = [ diff --git a/utils/include/b_error/b_error.h b/utils/include/b_error/b_error.h index 02bd0440e..8e84877d2 100644 --- a/utils/include/b_error/b_error.h +++ b/utils/include/b_error/b_error.h @@ -70,8 +70,9 @@ public: SA_REFUSED_ACT = 0x3002, SA_BROKEN_ROOT_DIR = 0x3003, SA_FORBID_BACKUP_RESTORE = 0x3004, - SA_BOOT_TIMEOUT = 0x3005, + SA_BOOT_EXT_TIMEOUT = 0x3005, SA_BUNDLE_INFO_EMPTY = 0x3006, + SA_BOOT_EXT_FAIL = 0x3007, // 0x4000~0x4999 backup_SDK错误 SDK_INVAL_ARG = 0x4000, @@ -89,6 +90,7 @@ public: EXT_BACKUP_PACKET_ERROR = 0x5007, EXT_METHOD_NOT_EXIST = 0x5008, EXT_THROW_EXCEPTION = 0x5009, + EXT_BACKUP_UNPACKET_ERROR = 0x5010, // 0x6000~0x6999 sa_ext错误 SA_EXT_ERR_CALL = 0x6000, @@ -112,6 +114,8 @@ public: E_EMPTY = 13500005, E_PACKET = 13500006, E_EXCEPTION = 13500007, + E_UNPACKET = 13500008, + E_BEF = 13500009, }; public: @@ -227,8 +231,9 @@ private: {Codes::SA_REFUSED_ACT, "SA refuse to act"}, {Codes::SA_BROKEN_ROOT_DIR, "SA failed to operate on the given root dir"}, {Codes::SA_FORBID_BACKUP_RESTORE, "SA forbid backup or restore"}, - {Codes::SA_BOOT_TIMEOUT, "SA boot application extension time out"}, + {Codes::SA_BOOT_EXT_TIMEOUT, "SA boot application extension time out"}, {Codes::SA_BUNDLE_INFO_EMPTY, "SA the bundle info for backup/restore is empty"}, + {Codes::SA_BOOT_EXT_FAIL, "SA failed to boot application extension"}, {Codes::SDK_INVAL_ARG, "SDK received invalid arguments"}, {Codes::SDK_BROKEN_IPC, "SDK failed to do IPC"}, {Codes::SDK_MIXED_SCENARIO, "SDK involed backup/restore when doing the contrary"}, @@ -241,6 +246,7 @@ private: {Codes::EXT_FORBID_BACKUP_RESTORE, "forbid backup or restore"}, {Codes::EXT_BACKUP_PACKET_ERROR, "Backup packet error"}, {Codes::EXT_THROW_EXCEPTION, "Extension throw exception"}, + {Codes::EXT_BACKUP_UNPACKET_ERROR, "Backup unpacket error"}, }; static inline const std::map errCodeTable_ { @@ -256,8 +262,9 @@ private: {static_cast(Codes::SA_REFUSED_ACT), BackupErrorCode::E_PERM}, {static_cast(Codes::SA_BROKEN_ROOT_DIR), BackupErrorCode::E_UKERR}, {static_cast(Codes::SA_FORBID_BACKUP_RESTORE), BackupErrorCode::E_FORBID}, - {static_cast(Codes::SA_BOOT_TIMEOUT), BackupErrorCode::E_BTO}, + {static_cast(Codes::SA_BOOT_EXT_TIMEOUT), BackupErrorCode::E_BTO}, {static_cast(Codes::SA_BUNDLE_INFO_EMPTY), BackupErrorCode::E_EMPTY}, + {static_cast(Codes::SA_BOOT_EXT_FAIL), BackupErrorCode::E_BEF}, {static_cast(Codes::SDK_INVAL_ARG), BackupErrorCode::E_INVAL}, {static_cast(Codes::SDK_BROKEN_IPC), BackupErrorCode::E_IPCSS}, {static_cast(Codes::SDK_MIXED_SCENARIO), BackupErrorCode::E_INVAL}, @@ -270,6 +277,7 @@ private: {static_cast(Codes::EXT_FORBID_BACKUP_RESTORE), BackupErrorCode::E_FORBID}, {static_cast(Codes::EXT_BACKUP_PACKET_ERROR), BackupErrorCode::E_PACKET}, {static_cast(Codes::EXT_THROW_EXCEPTION), BackupErrorCode::E_EXCEPTION}, + {static_cast(Codes::EXT_BACKUP_UNPACKET_ERROR), BackupErrorCode::E_UNPACKET}, {BackupErrorCode::E_IPCSS, BackupErrorCode::E_IPCSS}, {BackupErrorCode::E_INVAL, BackupErrorCode::E_INVAL}, {BackupErrorCode::E_NOTEXIST, BackupErrorCode::E_NOTEXIST}, @@ -285,10 +293,12 @@ private: {BackupErrorCode::E_EMPTY, BackupErrorCode::E_EMPTY}, {BackupErrorCode::E_PACKET, BackupErrorCode::E_PACKET}, {BackupErrorCode::E_EXCEPTION, BackupErrorCode::E_EXCEPTION}, + {BackupErrorCode::E_UNPACKET, BackupErrorCode::E_UNPACKET}, + {BackupErrorCode::E_BEF, BackupErrorCode::E_BEF}, }; static inline const std::map sysErrnoCodeTable_ { - {EPERM, BackupErrorCode::E_IPCSS}, + {EPERM, BackupErrorCode::E_PERM}, {EIO, BackupErrorCode::E_IO}, {EBADF, BackupErrorCode::E_IO}, {EACCES, BackupErrorCode::E_IO}, diff --git a/utils/include/b_filesystem/b_dir.h b/utils/include/b_filesystem/b_dir.h index 753529cb6..e1e728d29 100644 --- a/utils/include/b_filesystem/b_dir.h +++ b/utils/include/b_filesystem/b_dir.h @@ -46,7 +46,7 @@ public: * @param excludes 需要排除的文件及目录集合 * @return 错误码、大文件名集合 */ - static std::tuple, std::vector> GetBigFiles( + static std::tuple, std::map> GetBigFiles( const std::vector &includes, const std::vector &excludes); /** diff --git a/utils/include/b_json/b_json_entity_caps.h b/utils/include/b_json/b_json_entity_caps.h index 30c38e667..e641077e0 100644 --- a/utils/include/b_json/b_json_entity_caps.h +++ b/utils/include/b_json/b_json_entity_caps.h @@ -24,6 +24,7 @@ class BJsonEntityCaps : public BJsonEntity { public: struct BundleInfo { std::string name; + int appIndex; int64_t versionCode; std::string versionName; int64_t spaceOccupied; @@ -74,6 +75,7 @@ public: for (const auto &item : bundleInfos) { Json::Value arrObj; arrObj["name"] = item.name; + arrObj["appIndex"] = item.appIndex; arrObj["versionCode"] = item.versionCode; arrObj["versionName"] = item.versionName; arrObj["spaceOccupied"] = item.spaceOccupied; @@ -210,7 +212,11 @@ public: if (item.isMember("fullBackupOnly") && item["fullBackupOnly"].isBool()) { fullBackupOnly = item["fullBackupOnly"].asBool(); } - bundleInfos.emplace_back(BundleInfo {item["name"].asString(), item["versionCode"].asInt64(), + int appIndex = 0; + if (item.isMember("appIndex") && item["appIndex"].isInt()) { + appIndex = item["appIndex"].asInt(); + } + bundleInfos.emplace_back(BundleInfo {item["name"].asString(), appIndex, item["versionCode"].asInt64(), item["versionName"].asString(), item["spaceOccupied"].asInt64(), increSpaceOccupied, item["allToBackup"].asBool(), fullBackupOnly, diff --git a/utils/include/b_jsonutil/b_jsonutil.h b/utils/include/b_jsonutil/b_jsonutil.h index 9efa19376..478328a7e 100644 --- a/utils/include/b_jsonutil/b_jsonutil.h +++ b/utils/include/b_jsonutil/b_jsonutil.h @@ -34,11 +34,10 @@ public: * @brief 带有拼接字符的bundleName按照拼接字符进行分割 * * @param bundleNameStr bundleName拼接index的字符串 - * @param patternInfo 拼接字符串 * * @return 分割好的结果赋值给结构体 */ - static BundleDetailInfo ParseBundleNameIndexStr (const std::string &bundleNameStr, const std::string &patternInfo); + static BundleDetailInfo ParseBundleNameIndexStr (const std::string &bundleNameStr); /** * @brief 将传进来的bundleNames的集合进行按照拼接字符分割处理 @@ -48,26 +47,27 @@ public: * @param patternInfo 拼接的字符 * @param realBundleNames 分割后真正的bundleNames * @param userId userId + * @param isClearDataFlags 框架是否清理标志集合 * * @return 包名和解析结果的对应关系集合 * */ static std::map> BuildBundleInfos( const std::vector &bundleNames, const std::vector &details, - std::vector &realBundleNames, int32_t userId); + std::vector &realBundleNames, int32_t userId, + std::map &isClearDataFlags); /** * @brief 解析单个bundle对应的json串 * - * @param bundleDetailInfo json串 - * @param bundleDetail 结构体对象 - * @param bundleNameOnly bundle名称 - * @param bundleIndex bundle对应的索引 - * @param userId userId + * @param bundleInfo json串 + * @param bundleDetails 结构体对象 + * @param bundleDetailInfo bundle信息 + * @param isClearData 框架是否清理标志 * */ static void ParseBundleInfoJson(const std::string &bundleInfo, std::vector &bundleDetails, - std::string &bundleNameOnly, int bundleIndex, int32_t userId); + BJsonUtil::BundleDetailInfo bundleDetailInfo, bool &isClearData); /** * @brief 根据业务类型和bundleName确定唯一的bundleInfo @@ -94,6 +94,27 @@ public: * */ static bool BuildRestoreErrInfo(std::string &jsonStr, int errCode, std::string errMsg); + + /** + * @brief 拼接包名和分身对应的索引 + * + * @param bundleName 包名 + * @param bundleIndex 索引 + * + * @return 拼接结果 + */ + static std::string BuildBundleNameIndexInfo(const std::string &bundleName, int bundleIndex); + + /** + * @brief 组建恢复文件错误信息的json + * + * @param jsonStr 组建结果 + * @param errCode 错误码 + * + * @return 是否组建成功 + * + */ + static bool BuildRestoreErrInfo(std::string &jsonStr, std::map> errFileInfo); }; } // namespace OHOS::FileManagement::Backup diff --git a/utils/include/b_ohos/startup/backup_para.h b/utils/include/b_ohos/startup/backup_para.h index 1cdf80737..c5c6ef481 100644 --- a/utils/include/b_ohos/startup/backup_para.h +++ b/utils/include/b_ohos/startup/backup_para.h @@ -49,6 +49,13 @@ public: * @return 获取的配置项backup.overrideIncrementalRestore的值为true时则返回true,否则返回false */ bool GetBackupOverrideIncrementalRestore(); + + /** + * @brief 获取backup.para配置项backupDebugState的值 + * + * @return 获取的配置项backup.backupDebugState的值为true时则返回true,否则返回false + */ + static bool GetBackupDebugState(); }; } // namespace OHOS::FileManagement::Backup diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 6d4a9dbb8..3f9926022 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -30,6 +30,7 @@ static inline const char *EXTENSION_VERSION_CODE_PARA = "versionCode"; static inline const char *EXTENSION_VERSION_NAME_PARA = "versionName"; static inline const char *EXTENSION_RESTORE_EXT_INFO_PARA = "restoreExtInfo"; static inline const char *EXTENSION_BACKUP_EXT_INFO_PARA = "backupExtInfo"; +static inline const char *EXTENSION_APP_CLONE_INDEX_PARA = "ohos.extra.param.key.appCloneIndex"; enum class ExtensionAction { INVALID = 0, diff --git a/utils/include/b_sa/b_sa_utils.h b/utils/include/b_sa/b_sa_utils.h index 1548fed1e..86d1b8aa9 100644 --- a/utils/include/b_sa/b_sa_utils.h +++ b/utils/include/b_sa/b_sa_utils.h @@ -21,6 +21,9 @@ namespace OHOS::FileManagement::Backup { class SAUtils { public: static bool IsSABundleName(std::string bundleName); + static bool CheckBackupPermission(); + static bool CheckPermission(const std::string &permission); + static bool IsSystemApp(); }; } // namespace OHOS::FileManagement::Backup::BEncryption #endif // OHOS_FILEMGMT_BACKUP_B_SA_H \ No newline at end of file diff --git a/utils/src/b_error/b_error.cpp b/utils/src/b_error/b_error.cpp index d99d3e62e..5d13b4ec6 100644 --- a/utils/src/b_error/b_error.cpp +++ b/utils/src/b_error/b_error.cpp @@ -52,6 +52,7 @@ string BError::WrapMessageWithExtraInfos(const char *fileName, (void)HILOG_IMPL(LOG_CORE, LOG_DEBUG, LOG_DOMAIN, LOG_TAG, "%{public}s", res.c_str()); return res; } + int BError::GetCode() const { int code = static_cast(GetRawCode()); diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 23d9b525c..32e5932b5 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -55,10 +55,10 @@ static bool IsEmptyDirectory(const string &path) return isEmpty; } -static tuple, vector> GetFile(const string &path, off_t size = -1) +static tuple, map> GetFile(const string &path, off_t size = -1) { map files; - vector smallFiles; + map smallFiles; struct stat sta = {}; if (stat(path.data(), &sta) == -1) { return {BError(errno).GetCode(), files, smallFiles}; @@ -67,7 +67,7 @@ static tuple, vector> GetFile(const st return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; } if (sta.st_size <= size) { - smallFiles.emplace_back(path); + smallFiles.insert(make_pair(path, sta.st_size)); } else { files.try_emplace(path, sta); } @@ -85,19 +85,19 @@ static uint32_t CheckOverLongPath(const string &path) return len; } -static tuple, vector> GetDirFilesDetail(const string &path, - bool recursion, - off_t size = -1) +static tuple, map> GetDirFilesDetail(const string &path, + bool recursion, + off_t size = -1) { map files; - vector smallFiles; + map smallFiles; if (IsEmptyDirectory(path)) { string newPath = path; if (path.at(path.size()-1) != '/') { newPath += '/'; } - smallFiles.emplace_back(newPath); + smallFiles.insert(make_pair(newPath, 0)); return {ERR_OK, files, smallFiles}; } @@ -111,32 +111,33 @@ static tuple, vector> GetDirFilesDetai // current dir OR parent dir if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0)) { continue; - } else if (ptr->d_type == DT_DIR) { - if (!recursion) { - continue; - } - auto [errCode, subFiles, subSmallFiles] = - GetDirFilesDetail(IncludeTrailingPathDelimiter(path) + string(ptr->d_name), recursion, size); - if (errCode != 0) { - return {errCode, files, smallFiles}; - } - files.merge(subFiles); - smallFiles.insert(smallFiles.end(), subSmallFiles.begin(), subSmallFiles.end()); - } else if (ptr->d_type == DT_LNK) { - continue; - } else { + } else if (ptr->d_type == DT_REG) { struct stat sta = {}; string fileName = IncludeTrailingPathDelimiter(path) + string(ptr->d_name); if (CheckOverLongPath(fileName) >= PATH_MAX_LEN || stat(fileName.data(), &sta) == -1) { continue; } if (sta.st_size <= size) { - smallFiles.emplace_back(fileName); + smallFiles.insert(make_pair(fileName, sta.st_size)); continue; } files.try_emplace(fileName, sta); + } else if (ptr->d_type != DT_DIR) { + HILOGE("Not support file type"); + continue; } + // DT_DIR type + if (!recursion) { + continue; + } + auto [errCode, subFiles, subSmallFiles] = + GetDirFilesDetail(IncludeTrailingPathDelimiter(path) + string(ptr->d_name), recursion, size); + if (errCode != 0) { + return {errCode, files, smallFiles}; + } + files.merge(subFiles); + smallFiles.insert(subSmallFiles.begin(), subSmallFiles.end()); } return {ERR_OK, files, smallFiles}; } @@ -198,20 +199,20 @@ static set ExpandPathWildcard(const vector &vec, bool onlyPath) return filteredPath; } -tuple, vector> BDir::GetBigFiles(const vector &includes, - const vector &excludes) +tuple, map> BDir::GetBigFiles(const vector &includes, + const vector &excludes) { set inc = ExpandPathWildcard(includes, false); map incFiles; - vector incSmallFiles; + map incSmallFiles; for (const auto &item : inc) { auto [errCode, files, smallFiles] = GetDirFilesDetail(item, true, BConstants::BIG_FILE_BOUNDARY); if (errCode == 0) { int32_t num = static_cast(files.size()); incFiles.merge(move(files)); HILOGI("big files: %{public}d; small files: %{public}d", num, static_cast(smallFiles.size())); - incSmallFiles.insert(incSmallFiles.end(), smallFiles.begin(), smallFiles.end()); + incSmallFiles.insert(smallFiles.begin(), smallFiles.end()); } } @@ -234,10 +235,10 @@ tuple, vector> BDir::GetBigFiles(const return false; }; - vector resSmallFiles; + map resSmallFiles; for (const auto &item : incSmallFiles) { - if (!isMatch(excludes, item)) { - resSmallFiles.emplace_back(item); + if (!isMatch(excludes, item.first)) { + resSmallFiles.insert(make_pair(item.first, item.second)); } } @@ -259,5 +260,4 @@ vector BDir::GetDirs(const vector &paths) vector dirs(inc.begin(), inc.end()); return dirs; } - } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/src/b_filesystem/b_file.cpp b/utils/src/b_filesystem/b_file.cpp index 32e81090d..097125673 100644 --- a/utils/src/b_filesystem/b_file.cpp +++ b/utils/src/b_filesystem/b_file.cpp @@ -186,10 +186,19 @@ bool BFile::MoveFile(const string &from, const string &to) throw BError(errno); } newPath.append("/").append(basename(name.get())); - if (rename(oldPath.c_str(), newPath.c_str())) { - HILOGE("failed to rename path, oldPath: %{public}s, newPath: %{public}s, errno: %{public}d", - GetAnonyPath(oldPath).c_str(), GetAnonyPath(newPath).c_str(), errno); - throw BError(errno); + if (rename(oldPath.c_str(), newPath.c_str()) != 0) { + HILOGI("rename err,try copy errno: %{public}d", errno); + UniqueFd fdFrom(open(oldPath.data(), O_RDONLY)); + if (fdFrom == -1) { // -1: fd error code + HILOGE("failed to open the file %{public}s", GetAnonyPath(from).c_str()); + throw BError(errno); + } + UniqueFd fdTo(open(newPath.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); + if (fdTo == -1) { // -1: fd error code + HILOGE("failed to open the file %{public}s", GetAnonyPath(to).c_str()); + throw BError(errno); + } + SendFile(fdTo, fdFrom); } return true; } catch (const BError &e) { diff --git a/utils/src/b_jsonutil/b_jsonutil.cpp b/utils/src/b_jsonutil/b_jsonutil.cpp index 578be2fd8..220b9c6a4 100644 --- a/utils/src/b_jsonutil/b_jsonutil.cpp +++ b/utils/src/b_jsonutil/b_jsonutil.cpp @@ -28,11 +28,10 @@ namespace { const static std::string BUNDLE_INDEX_SPLICE = ":"; } -BJsonUtil::BundleDetailInfo BJsonUtil::ParseBundleNameIndexStr(const std::string &bundleNameStr, - const std::string &patternInfo) +BJsonUtil::BundleDetailInfo BJsonUtil::ParseBundleNameIndexStr(const std::string &bundleNameStr) { HILOGI("Start parse bundle name and index"); - size_t hasPos = bundleNameStr.find(patternInfo); + size_t hasPos = bundleNameStr.find(BUNDLE_INDEX_SPLICE); BundleDetailInfo bundleDetailInfo; if (hasPos == std::string::npos) { bundleDetailInfo.bundleName = bundleNameStr; @@ -50,7 +49,8 @@ BJsonUtil::BundleDetailInfo BJsonUtil::ParseBundleNameIndexStr(const std::string std::map> BJsonUtil::BuildBundleInfos( const std::vector &bundleNames, const std::vector &bundleInfos, - std::vector &bundleNamesOnly, int32_t userId) + std::vector &bundleNamesOnly, int32_t userId, + std::map &isClearDataFlags) { std::map> bundleNameDetailMap; if (bundleNames.size() != bundleInfos.size()) { @@ -74,28 +74,42 @@ std::map> BJsonUtil::Build bundleNamesOnly.emplace_back(bundleName); } else { std::string bundleNameSplit = bundleName.substr(0, pos); - std::string indexSplit = bundleName.substr(pos, bundleName.size() - 1); + std::string indexSplit = bundleName.substr(pos + 1); int index = std::stoi(indexSplit); bundleNameOnly = bundleNameSplit; bundleIndex = index; bundleNamesOnly.emplace_back(bundleNameSplit); } std::string bundleInfo = bundleInfos[i]; - ParseBundleInfoJson(bundleInfo, bundleDetailInfos, bundleNameOnly, bundleIndex, userId); - bundleNameDetailMap[bundleNameOnly] = bundleDetailInfos; + bool isClearData = true; + BJsonUtil::BundleDetailInfo bundleDetailInfo; + bundleDetailInfo.bundleName = bundleNameOnly; + bundleDetailInfo.bundleIndex = bundleIndex; + bundleDetailInfo.userId = userId; + ParseBundleInfoJson(bundleInfo, bundleDetailInfos, bundleDetailInfo, isClearData); + isClearDataFlags[bundleName] = isClearData; + bundleNameDetailMap[bundleName] = bundleDetailInfos; } HILOGI("End BuildBundleInfos"); return bundleNameDetailMap; } void BJsonUtil::ParseBundleInfoJson(const std::string &bundleInfo, std::vector &bundleDetails, - std::string &bundleNameOnly, int bundleIndex, int32_t userId) + BJsonUtil::BundleDetailInfo bundleDetailInfo, bool &isClearData) { cJSON *root = cJSON_Parse(bundleInfo.c_str()); if (root == nullptr) { HILOGE("Parse json error,root is null"); return; } + cJSON *clearBackupData = cJSON_GetObjectItem(root, "clearBackupData"); + if (clearBackupData == nullptr || !cJSON_IsString(clearBackupData) || (clearBackupData->valuestring == nullptr)) { + HILOGE("Parse json error."); + } else { + std::string value = clearBackupData->valuestring; + isClearData = value.compare("false") != 0; + HILOGI("bundleName:%{public}s clear data falg:%{public}d", bundleDetailInfo.bundleName.c_str(), isClearData); + } cJSON *infos = cJSON_GetObjectItem(root, "infos"); if (infos == nullptr || !cJSON_IsArray(infos) || cJSON_GetArraySize(infos) == 0) { HILOGE("Parse json error, infos is not array"); @@ -104,10 +118,6 @@ void BJsonUtil::ParseBundleInfoJson(const std::string &bundleInfo, std::vector> errFileInfo) +{ + cJSON *errJson = cJSON_CreateObject(); + if (errJson == nullptr) { + HILOGE("Creat json failed"); + return false; + } + cJSON *arrJson = cJSON_CreateArray(); + if (arrJson == nullptr) { + cJSON_Delete(errJson); + return false; + } + for (const auto &it : errFileInfo) { + for (const auto &codeIt : it.second) { + cJSON *eleJson = cJSON_CreateObject(); + if (eleJson == nullptr) { + HILOGE("Creat eleJson failed"); + continue; + } + cJSON_AddStringToObject(eleJson, "type", "ErrorInfo"); + cJSON_AddStringToObject(eleJson, "errorInfo", it.first.c_str()); + cJSON_AddNumberToObject(eleJson, "errorCode", codeIt); + cJSON_AddItemToArray(arrJson, eleJson); + } + } + cJSON_AddItemToObject(errJson, "resultInfo", arrJson); + char *data = cJSON_Print(errJson); + if (data == nullptr) { + cJSON_Delete(errJson); + return false; + } + jsonStr = std::string(data); + cJSON_Delete(errJson); + cJSON_free(data); + return true; +} } \ No newline at end of file diff --git a/utils/src/b_ohos/startup/backup_para.cpp b/utils/src/b_ohos/startup/backup_para.cpp index c5f9c1d9d..a9df69780 100644 --- a/utils/src/b_ohos/startup/backup_para.cpp +++ b/utils/src/b_ohos/startup/backup_para.cpp @@ -27,7 +27,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; - +const char* BACKUP_DEBUG_STATE = "sys.backup.check.enable"; /** * @brief 获取配置参数的值 * @@ -38,7 +38,6 @@ using namespace std; static tuple GetConfigParameterValue(const string &key, uint32_t len) { int handle = static_cast(FindParameter(key.c_str())); - HILOGI("start get config param value."); if (handle == -1) { HILOGI("Fail to find parameter."); return {false, ""}; @@ -50,7 +49,6 @@ static tuple GetConfigParameterValue(const string &key, uint32_t l HILOGI("Fail to get parameter value."); return {false, ""}; } - HILOGI("end get config param value."); return {true, buffer.get()}; } catch (const bad_alloc &e) { HILOGE("Fail to get parameter value: %{public}s.", e.what()); @@ -106,4 +104,16 @@ tuple BackupPara::GetBackupDebugOverrideAccount() } return {false, 0}; } + +bool BackupPara::GetBackupDebugState() +{ + char paraValue[30] = {0}; // 30: for system paramter + auto res = GetParameter(BACKUP_DEBUG_STATE, "-1", paraValue, sizeof(paraValue)); + if (res <= 0) { + HILOGE("GetParameter fail, key:%{public}s res:%{public}d", BACKUP_DEBUG_STATE, res); + return false; + } + std::string result(paraValue); + return result == "true"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/src/b_sa/b_sa_utils.cpp b/utils/src/b_sa/b_sa_utils.cpp index 05d090e81..399cb1026 100644 --- a/utils/src/b_sa/b_sa_utils.cpp +++ b/utils/src/b_sa/b_sa_utils.cpp @@ -14,9 +14,17 @@ */ #include "b_sa/b_sa_utils.h" +#include "access_token.h" +#include "accesstoken_kit.h" +#include "ipc_skeleton.h" +#include "tokenid_kit.h" namespace OHOS::FileManagement::Backup { +namespace { + const std::string BACKUP_PERMISSION = "ohos.permission.BACKUP"; +} + bool SAUtils::IsSABundleName(std::string bundleName) { if (bundleName.empty()) { @@ -29,4 +37,24 @@ bool SAUtils::IsSABundleName(std::string bundleName) } return true; } + +bool SAUtils::CheckBackupPermission() +{ + Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); + return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, BACKUP_PERMISSION) == + Security::AccessToken::PermissionState::PERMISSION_GRANTED; +} + +bool SAUtils::CheckPermission(const std::string &permission) +{ + Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); + return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permission) == + Security::AccessToken::PermissionState::PERMISSION_GRANTED; +} + +bool SAUtils::IsSystemApp() +{ + uint64_t fullTokenId = OHOS::IPCSkeleton::GetCallingFullTokenID(); + return Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(fullTokenId); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file