From e88ad6d70cf94d213c4a1997277079ee0a1df89b Mon Sep 17 00:00:00 2001 From: libo429 Date: Wed, 22 May 2024 15:30:57 +0800 Subject: [PATCH] add errCode & full restore Signed-off-by: libo429 --- .../native/backup_ext/include/ext_extension.h | 2 +- .../native/backup_ext/src/ext_extension.cpp | 16 +++++++++++--- .../backup_ext/src/ext_extension_stub.cpp | 4 +++- .../include/service_reverse.h | 2 +- .../backup_kit_inner/src/service_reverse.cpp | 4 ++-- .../src/service_reverse_stub.cpp | 3 ++- .../backup_kit_inner/impl/b_session_restore.h | 2 +- .../impl/b_session_restore_async.h | 2 +- .../backup_kit_inner/impl/i_extension.h | 2 +- .../backup_kit_inner/impl/i_service_reverse.h | 2 +- .../js/backup/session_restore_n_exporter.cpp | 22 +++++++++++++------ .../module_ipc/service_reverse_proxy.h | 2 +- .../include/module_ipc/svc_extension_proxy.h | 2 +- services/backup_sa/src/module_ipc/service.cpp | 16 +++++--------- .../src/module_ipc/service_reverse_proxy.cpp | 4 ++-- .../src/module_ipc/svc_extension_proxy.cpp | 3 ++- .../b_session_restore_async_mock.cpp | 8 +++---- .../b_session_restore_mock.cpp | 4 ++-- .../module_ipc/service_reverse_proxy_mock.cpp | 2 +- .../module_ipc/svc_extension_proxy_mock.cpp | 2 +- .../b_session_restore_async_test.cpp | 4 ++-- .../b_session_restore_test.cpp | 4 ++-- .../backup_impl/include/ext_extension_mock.h | 8 ++++++- .../include/service_reverse_mock.h | 2 +- .../backup_impl/service_reverse_stub_test.cpp | 16 +++++++++++--- .../backup_impl/service_reverse_test.cpp | 12 +++++----- .../module_ipc/service_reverse_proxy_test.cpp | 16 +++++++++----- .../module_ipc/svc_extension_proxy_test.cpp | 9 ++++---- .../tools_op_restore_async_test.cpp | 4 ++-- .../backup_tool/tools_op_restore_test.cpp | 8 +++---- tools/backup_tool/src/tools_op_restore.cpp | 16 +++++++------- .../src/tools_op_restore_async.cpp | 4 ++-- utils/include/b_error/b_error.h | 12 ++++++++-- utils/src/b_error/b_error.cpp | 4 ++-- 34 files changed, 135 insertions(+), 88 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 236d595a6..d8aa5b981 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -39,7 +39,7 @@ using CompareFilesResult = tuple, map>; class BackupExtExtension : public ExtExtensionStub { public: - UniqueFd GetFileHandle(const std::string &fileName) override; + UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) override; ErrCode HandleClear() override; ErrCode PublishFile(const std::string &fileName) override; ErrCode HandleBackup() override; diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index d9f729487..24e434ff3 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -154,7 +154,7 @@ static UniqueFd GetFileHandleForSpecialCloneCloud(const string &fileName) return fd; } -UniqueFd BackupExtExtension::GetFileHandle(const string &fileName) +UniqueFd BackupExtExtension::GetFileHandle(const string &fileName, int32_t &errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { @@ -166,7 +166,11 @@ UniqueFd BackupExtExtension::GetFileHandle(const string &fileName) VerifyCaller(); if (extension_->SpeicalVersionForCloneAndCloud()) { - return GetFileHandleForSpecialCloneCloud(fileName); + UniqueFd fd = GetFileHandleForSpecialCloneCloud(fileName); + if (fd < 0) { + errCode = BError::GetCodeByErrno(errno); + } + return fd; } string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); @@ -179,10 +183,16 @@ UniqueFd BackupExtExtension::GetFileHandle(const string &fileName) if (access(tarName.c_str(), F_OK) == 0) { throw BError(BError::Codes::EXT_INVAL_ARG, string("The file already exists")); } - return UniqueFd(open(tarName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); + UniqueFd tarFd(open(tarName.data(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)); + if (tarFd < 0) { + HILOGE("Open file failed, file name is %{private}s, err = %{public}d", tarName.data(), errno); + errCode = BError::GetCodeByErrno(errno); + } + return tarFd; } catch (...) { HILOGE("Failed to get file handle"); DoClear(); + errCode = BError::BackupErrorCode::E_UKERR; return UniqueFd(-1); } } diff --git a/frameworks/native/backup_ext/src/ext_extension_stub.cpp b/frameworks/native/backup_ext/src/ext_extension_stub.cpp index daec6dfd8..9b9623cd0 100644 --- a/frameworks/native/backup_ext/src/ext_extension_stub.cpp +++ b/frameworks/native/backup_ext/src/ext_extension_stub.cpp @@ -80,9 +80,11 @@ ErrCode ExtExtensionStub::CmdGetFileHandle(MessageParcel &data, MessageParcel &r return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName").GetCode(); } - UniqueFd fd = GetFileHandle(fileName); + int32_t errCode = ERR_OK; + UniqueFd fd = GetFileHandle(fileName, errCode); bool fdFlag = fd < 0 ? false : true; reply.WriteBool(fdFlag); + reply.WriteInt32(errCode); if (fdFlag == true && !reply.WriteFileDescriptor(fd)) { return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode(); } diff --git a/frameworks/native/backup_kit_inner/include/service_reverse.h b/frameworks/native/backup_kit_inner/include/service_reverse.h index e3618eb72..17008c7ac 100644 --- a/frameworks/native/backup_kit_inner/include/service_reverse.h +++ b/frameworks/native/backup_kit_inner/include/service_reverse.h @@ -34,7 +34,7 @@ public: 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) override; + void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) override; void RestoreOnResultReport(std::string result, std::string bundleName) override; void IncrementalBackupOnFileReady(std::string bundleName, std::string fileName, int fd, int manifestFd, diff --git a/frameworks/native/backup_kit_inner/src/service_reverse.cpp b/frameworks/native/backup_kit_inner/src/service_reverse.cpp index 04f779561..e004a4164 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse.cpp @@ -97,14 +97,14 @@ void ServiceReverse::RestoreOnAllBundlesFinished(int32_t errCode) callbacksRestore_.onAllBundlesFinished(errCode); } -void ServiceReverse::RestoreOnFileReady(string bundleName, string fileName, int fd) +void ServiceReverse::RestoreOnFileReady(string bundleName, string fileName, int fd, int32_t errCode) { if (scenario_ != Scenario::RESTORE || !callbacksRestore_.onFileReady) { HILOGI("Error scenario or callback is nullptr"); return; } BFileInfo bFileInfo(bundleName, fileName, 0); - callbacksRestore_.onFileReady(bFileInfo, UniqueFd(fd)); + callbacksRestore_.onFileReady(bFileInfo, UniqueFd(fd), errCode); } void ServiceReverse::RestoreOnResultReport(string result, std::string bundleName) 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 0d4d1656e..f24cc6608 100644 --- a/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp +++ b/frameworks/native/backup_kit_inner/src/service_reverse_stub.cpp @@ -175,7 +175,8 @@ int32_t ServiceReverseStub::CmdRestoreOnFileReady(MessageParcel &data, MessagePa if (fdFlag == true) { fd = data.ReadFileDescriptor(); } - RestoreOnFileReady(bundleName, fileName, fd); + int32_t errCode = data.ReadInt32(); + RestoreOnFileReady(bundleName, fileName, fd, errCode); return BError(BError::Codes::OK); } 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 dfe89ba34..ae9169474 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 @@ -29,7 +29,7 @@ namespace OHOS::FileManagement::Backup { class BSessionRestore { public: struct Callbacks { - std::function onFileReady; // 当备份服务有文件待发送时执行的回调 + std::function onFileReady; // 当备份服务有文件待发送时执行的回调 std::function onBundleStarted; // 当启动某个应用的恢复流程结束时执行的回调函数 std::function onBundleFinished; // 当某个应用的恢复流程结束或意外中止时执行的回调函数 std::function onAllBundlesFinished; // 当整个恢复流程结束或意外中止时执行的回调函数 diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h index 5140e0e08..405b659e8 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_restore_async.h @@ -32,7 +32,7 @@ namespace OHOS::FileManagement::Backup { class BSessionRestoreAsync : public std::enable_shared_from_this { public: struct Callbacks { - std::function onFileReady; // 当备份服务有文件待发送时执行的回调 + std::function onFileReady; // 当备份服务有文件待发送时执行的回调 std::function onBundleStarted; // 当启动某个应用的恢复流程结束时执行的回调函数 std::function onBundleFinished; // 当某个应用的恢复流程结束或意外中止时执行的回调函数 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 c74267fd0..46f9b67c6 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 @@ -27,7 +27,7 @@ public: DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.FileManagement.Backup.IExtension"); public: - virtual UniqueFd GetFileHandle(const std::string &fileName) = 0; + virtual UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) = 0; virtual ErrCode HandleClear() = 0; virtual ErrCode HandleBackup() = 0; virtual ErrCode PublishFile(const std::string &fileName) = 0; 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 5c33a08ec..9052208cd 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 @@ -38,7 +38,7 @@ public: virtual void BackupOnAllBundlesFinished(int32_t errCode) = 0; virtual void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) = 0; - virtual void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd) = 0; + virtual void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) = 0; virtual void RestoreOnResultReport(std::string result, std::string bundleName) = 0; virtual void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) = 0; virtual void RestoreOnAllBundlesFinished(int32_t errCode) = 0; diff --git a/interfaces/kits/js/backup/session_restore_n_exporter.cpp b/interfaces/kits/js/backup/session_restore_n_exporter.cpp index 73927f143..7d4c83d92 100644 --- a/interfaces/kits/js/backup/session_restore_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_restore_n_exporter.cpp @@ -40,7 +40,8 @@ struct RestoreEntity { shared_ptr callbacks; }; -static void OnFileReadyWhole(weak_ptr pCallbacks, const BFileInfo &fileInfo, UniqueFd fd) +static void OnFileReadyWhole(weak_ptr pCallbacks, const BFileInfo &fileInfo, + UniqueFd fd, int32_t errCode) { if (pCallbacks.expired()) { HILOGI("callbacks is unbound"); @@ -57,11 +58,18 @@ static void OnFileReadyWhole(weak_ptr pCallbacks, const BFileI } auto cbCompl = [bundleName {fileInfo.owner}, fileName {fileInfo.fileName}, - fd {make_shared(fd.Release())}](napi_env env, NError err) -> NVal { + fd {make_shared(fd.Release())}, + errCode](napi_env env, NError err) -> NVal { if (err) { return {env, err.GetNapiErr(env)}; } - NVal obj = NVal::CreateObject(env); + HILOGI("callback function restore OnFileReadyWhole errCode: %{public}d", errCode); + NVal obj; + if (errCode != 0) { + obj = NVal {env, NError(errCode).GetNapiErr(env)}; + } else { + obj = NVal::CreateObject(env); + } obj.AddProp({ NVal::DeclareNapiProperty(BConstants::BUNDLE_NAME.c_str(), NVal::CreateUTF8String(env, bundleName).val_), NVal::DeclareNapiProperty(BConstants::URI.c_str(), NVal::CreateUTF8String(env, fileName).val_), @@ -390,9 +398,8 @@ napi_value SessionRestoreNExporter::Constructor(napi_env env, napi_callback_info if (bSheet) { restoreEntity->sessionWhole = nullptr; restoreEntity->sessionSheet = BIncrementalRestoreSession::Init(BIncrementalRestoreSession::Callbacks { - .onFileReady = - bind(OnFileReadySheet, restoreEntity->callbacks, placeholders::_1, placeholders::_2, placeholders::_3, - placeholders::_4), + .onFileReady = bind(OnFileReadySheet, restoreEntity->callbacks, placeholders::_1, placeholders::_2, + placeholders::_3, placeholders::_4), .onBundleStarted = bind(onBundleBegin, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onBundleFinished = bind(onBundleEnd, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onAllBundlesFinished = bind(onAllBundlesEnd, restoreEntity->callbacks, placeholders::_1), @@ -401,7 +408,8 @@ napi_value SessionRestoreNExporter::Constructor(napi_env env, napi_callback_info } else { restoreEntity->sessionSheet = nullptr; restoreEntity->sessionWhole = BSessionRestore::Init(BSessionRestore::Callbacks { - .onFileReady = bind(OnFileReadyWhole, restoreEntity->callbacks, placeholders::_1, placeholders::_2), + .onFileReady = bind(OnFileReadyWhole, restoreEntity->callbacks, placeholders::_1, + placeholders::_2, placeholders::_3), .onBundleStarted = bind(onBundleBegin, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onBundleFinished = bind(onBundleEnd, restoreEntity->callbacks, placeholders::_1, placeholders::_2), .onAllBundlesFinished = bind(onAllBundlesEnd, restoreEntity->callbacks, placeholders::_1), diff --git a/services/backup_sa/include/module_ipc/service_reverse_proxy.h b/services/backup_sa/include/module_ipc/service_reverse_proxy.h index bc2dc898b..9c133524f 100644 --- a/services/backup_sa/include/module_ipc/service_reverse_proxy.h +++ b/services/backup_sa/include/module_ipc/service_reverse_proxy.h @@ -29,7 +29,7 @@ public: void BackupOnAllBundlesFinished(int32_t errCode) override; void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) override; - void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd) override; + void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd, int32_t errCode) override; void RestoreOnResultReport(std::string result, std::string bundleName) override; void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) override; void RestoreOnAllBundlesFinished(int32_t errCode) override; 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 a2ea56900..6c675114d 100644 --- a/services/backup_sa/include/module_ipc/svc_extension_proxy.h +++ b/services/backup_sa/include/module_ipc/svc_extension_proxy.h @@ -23,7 +23,7 @@ namespace OHOS::FileManagement::Backup { class SvcExtensionProxy : public IRemoteProxy { public: - UniqueFd GetFileHandle(const std::string &fileName) override; + UniqueFd GetFileHandle(const std::string &fileName, int32_t &errCode) override; ErrCode HandleClear() override; ErrCode HandleBackup() override; ErrCode PublishFile(const std::string &fileName) override; diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 33938dd42..baca2ceae 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -818,11 +818,9 @@ ErrCode Service::GetFileHandle(const string &bundleName, const string &fileName) if (!proxy) { throw BError(BError::Codes::SA_INVAL_ARG, "Extension backup Proxy is empty"); } - UniqueFd fd = proxy->GetFileHandle(fileName); - if (fd < 0) { - HILOGE("Failed to extension file handle"); - } - session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd)); + int32_t errCode = 0; + UniqueFd fd = proxy->GetFileHandle(fileName, errCode); + session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd), errCode); } else { session_->SetExtFileNameRequest(bundleName, fileName); } @@ -936,11 +934,9 @@ void Service::ExtStart(const string &bundleName) session_->GetServiceReverseProxy()->RestoreOnBundleStarted(ret, bundleName); auto fileNameVec = session_->GetExtFileNameRequest(bundleName); for (auto &fileName : fileNameVec) { - UniqueFd fd = proxy->GetFileHandle(fileName); - if (fd < 0) { - HILOGE("Failed to extension file handle"); - } - session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd)); + int32_t errCode = 0; + UniqueFd fd = proxy->GetFileHandle(fileName, errCode); + session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd), errCode); } return; } catch (const BError &e) { 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 66924a4e3..82488e2a2 100644 --- a/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_reverse_proxy.cpp @@ -171,13 +171,13 @@ void ServiceReverseProxy::RestoreOnAllBundlesFinished(int32_t errCode) } } -void ServiceReverseProxy::RestoreOnFileReady(string bundleName, string fileName, int fd) +void ServiceReverseProxy::RestoreOnFileReady(string bundleName, string fileName, int fd, int32_t errCode) { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; bool fdFlag = fd < 0 ? false : true; if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || - !data.WriteBool(fdFlag) || (fdFlag == true && !data.WriteFileDescriptor(fd))) { + !data.WriteBool(fdFlag) || (fdFlag == true && !data.WriteFileDescriptor(fd)) || !data.WriteInt32(errCode)) { throw BError(BError::Codes::SA_BROKEN_IPC); } 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 fc21746d4..2afa454c9 100644 --- a/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp +++ b/services/backup_sa/src/module_ipc/svc_extension_proxy.cpp @@ -26,7 +26,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; const int INVALID_FD = -1; -UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName) +UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName, int32_t &errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("Start"); @@ -50,6 +50,7 @@ UniqueFd SvcExtensionProxy::GetFileHandle(const string &fileName) HILOGI("Successful"); bool fdFlag = reply.ReadBool(); + errCode = reply.ReadInt32(); UniqueFd fd = UniqueFd(INVALID_FD); if (fdFlag == true) { fd = UniqueFd(reply.ReadFileDescriptor()); diff --git a/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp b/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp index 4b77fba4c..89d28b3f3 100644 --- a/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp +++ b/tests/mock/backup_kit_inner/b_session_restore_async_mock.cpp @@ -73,13 +73,13 @@ ErrCode BSessionRestoreAsync::AppendBundles(UniqueFd remoteCap, vectorBackupOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceReverseTest-an exception occurred by BackupOnFileReady."; @@ -447,7 +447,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_RestoreOnFileReady_0100, GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_RestoreOnFileReady_0100"; try { Init(IServiceReverse::Scenario::RESTORE); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); service_->BackupOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); @@ -470,7 +470,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_RestoreOnFileReady_0101, GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_RestoreOnFileReady_0101"; try { Init(IServiceReverse::Scenario::BACKUP); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceReverseTest-an exception occurred by RestoreOnFileReady."; @@ -492,7 +492,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_RestoreOnFileReady_0102, GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_RestoreOnFileReady_0102"; try { Init(IServiceReverse::Scenario::RESTORE, 1); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceReverseTest-an exception occurred by RestoreOnFileReady."; @@ -715,7 +715,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_0200, testing::ext::TestS GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_0200"; try { Init(IServiceReverse::Scenario::RESTORE, 1); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); service_->RestoreOnBundleStarted(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnBundleFinished(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnAllBundlesFinished(BError(BError::Codes::OK)); @@ -740,7 +740,7 @@ HWTEST_F(ServiceReverseTest, SUB_backup_ServiceReverse_0201, testing::ext::TestS GTEST_LOG_(INFO) << "ServiceReverseTest-begin SUB_backup_ServiceReverse_0201"; try { Init(IServiceReverse::Scenario::RESTORE, 0); - service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1); + service_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, -1, 0); service_->RestoreOnBundleStarted(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnBundleFinished(BError(BError::Codes::OK), BUNDLE_NAME); service_->RestoreOnAllBundlesFinished(BError(BError::Codes::OK)); 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 9f766621e..db46b1cf2 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 @@ -840,9 +840,13 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 .WillOnce(Invoke(mock_.GetRefPtr(), &ServiceReverseMock::InvokeSendRequest)); TestManager tm("ServiceReverseProxyTest_GetFd_0200"); + int32_t errCode = 0; std::string filePath = tm.GetRootDirCurTest().append(FILE_NAME); UniqueFd fd(open(filePath.data(), O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, fd); + if (fd < 0) { + errCode = BError::GetCodeByErrno(errno); + } + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, fd, errCode); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -866,7 +870,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 try { try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -875,7 +879,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -884,7 +888,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 try { EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -913,7 +917,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); @@ -924,7 +928,7 @@ HWTEST_F(ServiceReverseProxyTest, SUB_ServiceReverse_proxy_RestoreOnFileReady_01 EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteBool(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteFileDescriptor(_)).WillOnce(Return(false)); - proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0); + proxy_->RestoreOnFileReady(BUNDLE_NAME, FILE_NAME, 0, 0); EXPECT_TRUE(false); } catch (BError &err) { EXPECT_EQ(err.GetRawCode(), BError::Codes::SA_BROKEN_IPC); 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 2011f852f..9bf519c47 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 @@ -69,15 +69,16 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_GetFileHandle_0100, test GTEST_LOG_(INFO) << "SvcExtensionProxyTest-begin SUB_Ext_Extension_proxy_GetFileHandle_0100"; try { string fileName = "1.tar"; + int32_t errCode = 0; EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); - UniqueFd fd = proxy_->GetFileHandle(fileName); + UniqueFd fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); - fd = proxy_->GetFileHandle(fileName); + fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); @@ -85,14 +86,14 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_GetFileHandle_0100, test EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); EXPECT_CALL(*messageParcelMock_, ReadBool()).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, ReadFileDescriptor()).WillOnce(Return(-1)); - fd = proxy_->GetFileHandle(fileName); + fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); EXPECT_CALL(*messageParcelMock_, ReadBool()).WillOnce(Return(false)); - fd = proxy_->GetFileHandle(fileName); + fd = proxy_->GetFileHandle(fileName, errCode); EXPECT_LT(fd, BError(BError::Codes::OK)); } catch (...) { EXPECT_TRUE(false); diff --git a/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp b/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp index 0205bbd69..6cdfe7061 100644 --- a/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp +++ b/tests/unittests/backup_tools/backup_tool/tools_op_restore_async_test.cpp @@ -197,7 +197,7 @@ HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0300, testing::ext::Tes fileInfo.fileName = "manage.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -227,7 +227,7 @@ HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0301, testing::ext::Tes fileInfo.fileName = "test.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); diff --git a/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp b/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp index 80d4fcaf5..a35d51072 100644 --- a/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp +++ b/tests/unittests/backup_tools/backup_tool/tools_op_restore_test.cpp @@ -279,7 +279,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0500, testing::ext::Te fileInfo.fileName = "manage.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -310,7 +310,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0501, testing::ext::Te fileInfo.fileName = "test.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -340,7 +340,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0502, testing::ext::Te fileInfo.fileName = "/test.json"; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); @@ -370,7 +370,7 @@ HWTEST_F(ToolsOpRestoreTest, tools_op_restore_OnFileReady_0503, testing::ext::Te fileInfo.fileName = " "; fileInfo.sn = 1; UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666)); - OnFileReady(ctx, fileInfo, move(fd)); + OnFileReady(ctx, fileInfo, move(fd), 0); } catch (BError &e) { EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode()); EXPECT_TRUE(true); diff --git a/tools/backup_tool/src/tools_op_restore.cpp b/tools/backup_tool/src/tools_op_restore.cpp index 37cb71219..ff51241ac 100644 --- a/tools/backup_tool/src/tools_op_restore.cpp +++ b/tools/backup_tool/src/tools_op_restore.cpp @@ -116,7 +116,7 @@ static string GenHelpMsg() "\t\t--bundle\t\t This parameter is bundleName."; } -static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd) +static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd, int32_t errCode) { printf("FileReady owner = %s, fileName = %s, sn = %u, fd = %d\n", fileInfo.owner.c_str(), fileInfo.fileName.c_str(), fileInfo.sn, fd.Get()); @@ -251,13 +251,13 @@ static int32_t InitRestoreSession(shared_ptr ctx) if (!ctx) { throw BError(BError::Codes::TOOL_INVAL_ARG, generic_category().message(errno)); } - ctx->session_ = BSessionRestore::Init( - BSessionRestore::Callbacks {.onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2), - .onBundleStarted = bind(OnBundleStarted, ctx, placeholders::_1, placeholders::_2), - .onBundleFinished = bind(OnBundleFinished, ctx, placeholders::_1, placeholders::_2), - .onAllBundlesFinished = bind(OnAllBundlesFinished, ctx, placeholders::_1), - .onResultReport = bind(OnResultReport, ctx, placeholders::_1), - .onBackupServiceDied = bind(OnBackupServiceDied, ctx)}); + ctx->session_ = BSessionRestore::Init(BSessionRestore::Callbacks { + .onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2, placeholders::_3), + .onBundleStarted = bind(OnBundleStarted, ctx, placeholders::_1, placeholders::_2), + .onBundleFinished = bind(OnBundleFinished, ctx, placeholders::_1, placeholders::_2), + .onAllBundlesFinished = bind(OnAllBundlesFinished, ctx, placeholders::_1), + .onResultReport = bind(OnResultReport, ctx, placeholders::_1), + .onBackupServiceDied = bind(OnBackupServiceDied, ctx)}); if (ctx->session_ == nullptr) { printf("Failed to init restore\n"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); diff --git a/tools/backup_tool/src/tools_op_restore_async.cpp b/tools/backup_tool/src/tools_op_restore_async.cpp index 93b4826c3..35c60c07a 100644 --- a/tools/backup_tool/src/tools_op_restore_async.cpp +++ b/tools/backup_tool/src/tools_op_restore_async.cpp @@ -96,7 +96,7 @@ static string GenHelpMsg() "simulates the application recovery scenario.\n"; } -static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd) +static void OnFileReady(shared_ptr ctx, const BFileInfo &fileInfo, UniqueFd fd, int32_t errCode) { printf("FileReady owner = %s, fileName = %s, sn = %u, fd = %d\n", fileInfo.owner.c_str(), fileInfo.fileName.c_str(), fileInfo.sn, fd.Get()); @@ -378,7 +378,7 @@ static int32_t InitArg(const string &pathCapFile, ctx->fileNums_[bundleNames[i]] = ToolsOp::GetFIleNums(bundleNames[i]); } ctx->session_ = BSessionRestoreAsync::Init(BSessionRestoreAsync::Callbacks { - .onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2), + .onFileReady = bind(OnFileReady, ctx, placeholders::_1, placeholders::_2, placeholders::_3), .onBundleStarted = bind(OnBundleStarted, ctx, placeholders::_1, placeholders::_2), .onBundleFinished = bind(OnBundleFinished, ctx, placeholders::_1, placeholders::_2), .onAllBundlesFinished = bind(OnAllBundlesFinished, ctx, placeholders::_1), diff --git a/utils/include/b_error/b_error.h b/utils/include/b_error/b_error.h index 123105ab8..d588cb76d 100644 --- a/utils/include/b_error/b_error.h +++ b/utils/include/b_error/b_error.h @@ -282,10 +282,18 @@ private: }; static inline const std::map sysErrnoCodeTable_ { + {EPERM, BackupErrorCode::E_IPCSS}, {EIO, BackupErrorCode::E_IO}, + {EBADF, BackupErrorCode::E_IO}, + {EACCES, BackupErrorCode::E_IO}, + {EFBIG, BackupErrorCode::E_IO}, {ENOMEM, BackupErrorCode::E_NOMEM}, - {ENOENT, BackupErrorCode::E_NOTEXIST}, - {EPERM, BackupErrorCode::E_PERM}, + {EMFILE, BackupErrorCode::E_NOMEM}, + {ENOENT, BackupErrorCode::E_INVAL}, + {ENOTDIR, BackupErrorCode::E_INVAL}, + {EISDIR, BackupErrorCode::E_INVAL}, + {ENAMETOOLONG, BackupErrorCode::E_INVAL}, + {ENOSPC, BackupErrorCode::E_NOSPC}, }; private: diff --git a/utils/src/b_error/b_error.cpp b/utils/src/b_error/b_error.cpp index 79e76761f..5d13b4ec6 100644 --- a/utils/src/b_error/b_error.cpp +++ b/utils/src/b_error/b_error.cpp @@ -68,10 +68,10 @@ int BError::GetCodeByErrno(int32_t errnoSys) if (errnoSys == 0) { return 0; } + HILOGE("Unknown code : %{public}d", errnoSys); if (sysErrnoCodeTable_.find(errnoSys) != sysErrnoCodeTable_.end()) { return sysErrnoCodeTable_.at(errnoSys); } - HILOGE("Unknown code : %{public}d", errnoSys); - return BackupErrorCode::E_IO; + return BackupErrorCode::E_UKERR; } } // namespace OHOS::FileManagement::Backup \ No newline at end of file -- Gitee