diff --git a/frameworks/native/backup_ext/src/untar_file.cpp b/frameworks/native/backup_ext/src/untar_file.cpp index aa87d0a210bbdd236aba6ff5a893712fc66b6e77..0eceb77654e578e01a9c35d288e635771ec49d83 100644 --- a/frameworks/native/backup_ext/src/untar_file.cpp +++ b/frameworks/native/backup_ext/src/untar_file.cpp @@ -559,8 +559,13 @@ ErrFileInfo UntarFile::CreateDir(string &path, mode_t mode) FILE *UntarFile::CreateFile(string &filePath) { - FILE *f = fopen(filePath.c_str(), "wb+"); - if (f != nullptr) { + FILE *f = nullptr; + char rpath[PATH_MAX] = {0}; + if (realpath(filePath.c_str(), rpath)) { + f = fopen(filePath.c_str(), "wb+"); + if (f == nullptr) { + HILOGE("Failed to create file %{public}s, err = %{public}d", GetAnonyPath(filePath).c_str(), errno); + } return f; } @@ -574,6 +579,10 @@ FILE *UntarFile::CreateFile(string &filePath) string path = filePath.substr(0, pos); if (ForceCreateDirectory(path)) { + if (!realpath(path.c_str(), rpath)) { + HILOGE("Failed to access path %{public}s, err = %{public}d", GetAnonyPath(path).c_str(), errno); + return nullptr; + } f = fopen(filePath.c_str(), "wb+"); if (f == nullptr) { HILOGE("Failed to create file %{public}s, err = %{public}d", GetAnonyPath(filePath).c_str(), errno); diff --git a/interfaces/common/src/sandbox_helper.cpp b/interfaces/common/src/sandbox_helper.cpp index 074c77016b1a3a10782c65d3f1a607ecf0564598..ac56b3dfa98f16024a44b744eaed8736c299fee3 100644 --- a/interfaces/common/src/sandbox_helper.cpp +++ b/interfaces/common/src/sandbox_helper.cpp @@ -251,7 +251,7 @@ static int32_t GetFileIdFromFileName(const std::string &fileName) return -EINVAL; } - return std::stoi(idStr); + return std::atoi(idStr.c_str()); } static int32_t GetBucketNum(const std::string &fileName) diff --git a/tests/mock/module_ipc/include/notify_work_service_mock.h b/tests/mock/module_ipc/include/notify_work_service_mock.h index b35ce88aa830bdf9149d8d004ba45057ab9a62bb..522a08e7cc36ff248c59cdf300f78014a87d9f87 100644 --- a/tests/mock/module_ipc/include/notify_work_service_mock.h +++ b/tests/mock/module_ipc/include/notify_work_service_mock.h @@ -31,7 +31,7 @@ public: static inline std::shared_ptr notify = nullptr; }; -class IPCSkeletonMock : public BNotifyWorkService { +class NotifyWorkServiceMock : public BNotifyWorkService { public: MOCK_METHOD(bool, NotifyBundleDetail, (BJsonUtil::BundleDetailInfo)); }; diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index fd96fa9600a58aeb710f6beb831d9df8f430ca4e..400061e878d30fcca9d20b220e3284d917623390 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -109,7 +109,6 @@ ohos_unittest("backup_service_test") { "${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/", ] @@ -124,6 +123,7 @@ ohos_unittest("backup_service_test") { external_deps = [ "ability_base:want", "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", @@ -183,7 +183,6 @@ ohos_unittest("backup_service_throw_test") { "${path_backup}/services/backup_sa/include", "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", "${path_backup}/tests/unittests/backup_api/backup_impl/include", - "${path_access_token}/interfaces/innerkits/accesstoken/include", "${path_backup_mock}/b_process", "${path_backup_mock}/module_ipc", ] @@ -199,6 +198,7 @@ ohos_unittest("backup_service_throw_test") { external_deps = [ "ability_base:want", "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", @@ -369,7 +369,6 @@ ohos_unittest("backup_restore_deps_manager_test") { "${path_backup}/services/backup_sa/include", "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", "${path_backup}/tests/unittests/backup_api/backup_impl/include", - "${path_access_token}/interfaces/innerkits/accesstoken/include", "${path_backup_mock}/b_process/", ] @@ -384,6 +383,7 @@ ohos_unittest("backup_restore_deps_manager_test") { external_deps = [ "ability_base:want", "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", @@ -430,7 +430,6 @@ ohos_unittest("backup_service_incremental_test") { "${path_backup_mock}/module_external/include", "${path_backup_mock}/module_ipc/include", "${path_backup_mock}/utils_mock/include", - "${path_access_token}/interfaces/innerkits/accesstoken/include", ] deps = [ @@ -444,6 +443,7 @@ ohos_unittest("backup_service_incremental_test") { external_deps = [ "ability_base:want", "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", @@ -501,7 +501,6 @@ ohos_unittest("backup_service_other_test") { "${path_backup_mock}/module_external/include", "${path_backup_mock}/module_ipc/include", "${path_backup_mock}/utils_mock/include", - "${path_access_token}/interfaces/innerkits/accesstoken/include", ] deps = [ @@ -515,6 +514,7 @@ ohos_unittest("backup_service_other_test") { external_deps = [ "ability_base:want", "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", diff --git a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp index ca02ebcaac18a7127db8b829d88914e209888725..757f571d1710b2818a09a36b114884102ef1199b 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -24,6 +24,7 @@ #include "b_jsonutil_mock.h" #include "b_sa_utils_mock.h" #include "ipc_skeleton_mock.h" +#include "notify_work_service_mock.h" #include "sa_backup_connection_mock.h" #include "service_reverse_proxy_mock.h" #include "svc_backup_connection_mock.h" @@ -149,6 +150,7 @@ public: static inline shared_ptr jdConfig = nullptr; static inline shared_ptr ability = nullptr; static inline shared_ptr depManager = nullptr; + static inline shared_ptr notify = nullptr; }; void ServiceTest::SetUpTestCase(void) @@ -183,6 +185,8 @@ void ServiceTest::SetUpTestCase(void) SystemAbilityMock::ability = ability; depManager = make_shared(); SvcRestoreDepsManagerMock::manager = depManager; + notify = make_shared(); + NotifyWorkServiceMock::notify = notify; } void ServiceTest::TearDownTestCase() @@ -217,6 +221,8 @@ void ServiceTest::TearDownTestCase() ability = nullptr; SvcRestoreDepsManagerMock::manager = nullptr; depManager = nullptr; + NotifyWorkServiceMock::notify = nullptr; + notify = nullptr; } /** @@ -637,6 +643,61 @@ HWTEST_F(ServiceTest, SUB_Service_OnBundleStarted_0100, TestSize.Level1) GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_OnBundleStarted_0100"; } +/** + * @tc.number: SUB_Service_GetRestoreBundleNames_0100 + * @tc.name: SUB_Service_GetRestoreBundleNames_0100 + * @tc.desc: 测试 GetRestoreBundleNames + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(ServiceTest, SUB_Service_GetRestoreBundleNames_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetRestoreBundleNames_0100"; + try { + vector bundleNames; + vector bundleInfos; + EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); + EXPECT_CALL(*bms, GetBundleInfos(_, _)).WillOnce(Return(bundleInfos)); + EXPECT_THROW(GetRestoreBundleNames(UniqueFd(-1), service->session_, bundleNames), BError); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetRestoreBundleNames."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetRestoreBundleNames_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: issueIAKC3I + */ +HWTEST_F(ServiceTest, SUB_Service_HandleExceptionOnAppendBundles_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_HandleExceptionOnAppendBundles_0100"; + try { + vector appendBundleNames { "bundleName" }; + vector restoreBundleNames; + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::UNDEFINED)); + HandleExceptionOnAppendBundles(service->session_, appendBundleNames, restoreBundleNames); + EXPECT_TRUE(true); + + restoreBundleNames.emplace_back("bundleName"); + restoreBundleNames.emplace_back("bundleName2"); + HandleExceptionOnAppendBundles(service->session_, appendBundleNames, restoreBundleNames); + EXPECT_TRUE(true); + } 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_AppendBundlesRestoreSession_0100 * @tc.name: SUB_Service_AppendBundlesRestoreSession_0100 @@ -664,7 +725,6 @@ HWTEST_F(ServiceTest, SUB_Service_AppendBundlesRestoreSession_0100, TestSize.Lev service->isOccupyingSession_.store(true); ret = service->AppendBundlesRestoreSession(UniqueFd(-1), bundleNames, bundleInfos, restoreType, userId); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG)); - service->isOccupyingSession_.store(false); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by AppendBundlesRestoreSession."; @@ -692,6 +752,8 @@ HWTEST_F(ServiceTest, SUB_Service_AppendBundlesRestoreSession_0200, TestSize.Lev RestoreTypeEnum restoreType = RESTORE_DATA_READDY; int32_t userId = DEFAULT_INVAL_VALUE; map> bundleNameDetailMap; + service->isOccupyingSession_.store(false); + service->session_ = sptr(new SvcSessionManager(wptr(service))); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)); @@ -742,6 +804,125 @@ HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0100, TestSize.Level1 GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SetCurrentSessProperties_0100"; } +/** + * @tc.number: SUB_Service_SetCurrentSessProperties_0200 + * @tc.name: SUB_Service_SetCurrentSessProperties_0200 + * @tc.desc: 测试 SetCurrentSessProperties + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SetCurrentSessProperties_0200"; + try { + ASSERT_TRUE(service != nullptr); + vector restoreBundleInfos = { + {.name = "bundleName", .appIndex = 0, .allToBackup = false, .versionName = ""} }; + vector restoreBundleNames; + map> bundleNameDetailMap; + map isClearDataFlags; + RestoreTypeEnum restoreType = RestoreTypeEnum::RESTORE_DATA_WAIT_SEND; + EXPECT_THROW(service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType), BError); + + restoreBundleNames.emplace_back("bundleName"); + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::UNDEFINED)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + EXPECT_TRUE(true); + + restoreBundleInfos[0].allToBackup = true; + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::UNDEFINED)); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(false)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + EXPECT_TRUE(true); + + restoreBundleInfos[0].allToBackup = false; + restoreBundleInfos[0].versionName = string(BConstants::DEFAULT_VERSION_NAME); + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverse::Scenario::UNDEFINED)); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(false)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SetCurrentSessProperties."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SetCurrentSessProperties_0200"; +} + +/** + * @tc.number: SUB_Service_SetCurrentSessProperties_0300 + * @tc.name: SUB_Service_SetCurrentSessProperties_0300 + * @tc.desc: 测试 SetCurrentSessProperties + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0300, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_SetCurrentSessProperties_0300"; + try { + ASSERT_TRUE(service != nullptr); + vector restoreBundleInfos = { + {.name = "bundleName", .appIndex = 0, .allToBackup = true, .extensionName = ""} }; + vector restoreBundleNames { "bundleName" }; + map> bundleNameDetailMap; + map isClearDataFlags; + RestoreTypeEnum restoreType = RestoreTypeEnum::RESTORE_DATA_WAIT_SEND; + + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); + EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + EXPECT_TRUE(true); + + restoreBundleInfos[0].extensionName = "extensionName"; + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + EXPECT_TRUE(true); + + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(true)).WillOnce(Return(false)); + EXPECT_CALL(*notify, NotifyBundleDetail(_)).WillOnce(Return(true)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) + .WillOnce(Return("bundleName")); + EXPECT_CALL(*jsonUtil, FindBundleInfoByName(_, _, _, _)).WillOnce(Return(false)).WillOnce(Return(true)); + service->SetCurrentSessProperties(restoreBundleInfos, restoreBundleNames, bundleNameDetailMap, + isClearDataFlags, restoreType); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by SetCurrentSessProperties."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_SetCurrentSessProperties_0300"; +} + /** * @tc.number: SUB_Service_AppendBundlesBackupSession_0100 * @tc.name: SUB_Service_AppendBundlesBackupSession_0100 @@ -946,7 +1127,7 @@ HWTEST_F(ServiceTest, SUB_Service_AppDone_0100, TestSize.Level1) EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("")); EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)).WillOnce(Return(false)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); ret = service->AppDone(errCode); EXPECT_EQ(ret, BError(BError::Codes::OK)); } catch (...) { @@ -988,6 +1169,7 @@ HWTEST_F(ServiceTest, SUB_Service_AppDone_0200, TestSize.Level1) EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(true)); EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(nullptr)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); ret = service->AppDone(errCode); EXPECT_NE(ret, BError(BError::Codes::OK)); } catch (...) { diff --git a/utils/src/b_jsonutil/b_jsonutil.cpp b/utils/src/b_jsonutil/b_jsonutil.cpp index c3cde0b611c047d2715a91e0ab866f9eea6ac7a2..bbcb23dd62c624fce71b96783b98cafba546d15b 100644 --- a/utils/src/b_jsonutil/b_jsonutil.cpp +++ b/utils/src/b_jsonutil/b_jsonutil.cpp @@ -45,7 +45,7 @@ BJsonUtil::BundleDetailInfo BJsonUtil::ParseBundleNameIndexStr(const std::string std::string bundleName = bundleNameStr.substr(0, hasPos); if (to_string(bundleNameStr.back()) != BUNDLE_INDEX_SPLICE) { std::string indexStr = bundleNameStr.substr(hasPos + 1); - int index = std::stoi(indexStr); + int index = std::atoi(indexStr.c_str()); bundleDetailInfo.bundleIndex = index; } else { bundleDetailInfo.bundleIndex = BUNDLE_INDEX_DEFAULT_VAL; @@ -85,7 +85,7 @@ std::map> BJsonUtil::Build std::string bundleNameSplit = bundleName.substr(0, pos); if (to_string(bundleName.back()) != BUNDLE_INDEX_SPLICE) { std::string indexSplit = bundleName.substr(pos + 1); - int index = std::stoi(indexSplit); + int index = std::atoi(indexSplit.c_str()); bundleIndex = index; } else { bundleIndex = BUNDLE_INDEX_DEFAULT_VAL; diff --git a/utils/src/b_ohos/startup/backup_para.cpp b/utils/src/b_ohos/startup/backup_para.cpp index 147544c7ce7895d0328b39a38d20d94029996a31..60ba27d74e55179847168d2143811e6c50d99ab8 100644 --- a/utils/src/b_ohos/startup/backup_para.cpp +++ b/utils/src/b_ohos/startup/backup_para.cpp @@ -93,7 +93,7 @@ tuple BackupPara::GetBackupDebugOverrideAccount() if (!getCfgParaValSucc) { return {false, 0}; } - return {true, stoi(value)}; + return {true, atoi(value.c_str())}; } return {false, 0}; }