From 765a9e257861615da31c0e0bb75e2bc40528a55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Fri, 27 Jun 2025 21:50:50 +0800 Subject: [PATCH 01/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../include/datashare_helper_mock.h | 158 +++++++++ .../include/datashare_result_set_mock.h | 49 +++ .../src/datashare_helper_mock.cpp | 100 ++++++ .../src/datashare_result_set_mock .cpp | 55 ++++ .../backup_sa/module_external/BUILD.gn | 5 +- .../storage_manager_service_test.cpp | 307 +++++++++++++++--- 6 files changed, 633 insertions(+), 41 deletions(-) create mode 100644 tests/mock/module_external/include/datashare_helper_mock.h create mode 100644 tests/mock/module_external/include/datashare_result_set_mock.h create mode 100644 tests/mock/module_external/src/datashare_helper_mock.cpp create mode 100644 tests/mock/module_external/src/datashare_result_set_mock .cpp diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h new file mode 100644 index 000000000..b67dda95c --- /dev/null +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -0,0 +1,158 @@ +/* + * Copyright (c) 202 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. + */ + +#ifndef DATASHARE_HELPER_MOCK_H +#define DATASHARE_HELPER_MOCK_H + +#include +#include "gmock/gmock.h" +#include "datashare_helper.h" +#include "datashare_helper_mock.h" + +namespace OHOS{ +using namespace DataShare; +using string = std::string; +namespace FileManageMent::Backup { +class IDataShareHelper { +public: + IDataShareHelper() = default; + virtual ~IDataShareHelper() = default; + virtual std::share_ptr Creator(const sptr &token, + const string &strUri, const string &extUri, const int waitTime, bool isSystem) = 0; + virtual std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, + std::vector &colums, DataShareBusinessError *businessError) = 0;; +public: + static inline std::shared_ptr idsh = nullptr; +}; + +class DataShareHelperImpl : public DataShareHelper { +public: + MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates& predicates, + std::vector &colums, DataShareBusinessError *businessError), (override)); + + MOCK_METHOD(bool, Release, (), (override)); + + MOCK_METHOD(std::vector, GetFileTypes, (Uri &uri, const string &mimeTypeFilter), (override)); + + MOCK_METHOD(int, OpenFile, (Uri &uri, const std::string &mode), (override)); + + MOCK_METHOD(int, OpenRawFile, (Uri &uri, const std::string &mode), (override)); + + MOCK_METHOD(int, Insert, (Uri &uri, const DataShareValuesBucket &value), (override)); + + MOCK_METHOD(int, InsertExt, (Uri &uri, const DataShareValuesBucket &value, std::string &result), (override)); + + MOCK_METHOD(int, Update, (Uri &uri, const DataSharePredicates &predicates, + const DataShareValuesBucket &value), (override)); + + MOCK_METHOD(int, BatchUpdate, (const UpdateOperations &operations, + std::vector &results), (override)); + + MOCK_METHOD(int, Delete, (Uri &uri, const DataSharePredicates &predicates), (override)); + + MOCK_METHOD(string, GetType, (Uri &uri), (override)); + + MOCK_METHOD(int, BatchInsert, (Uri &uri, const std::vector &values), (override)); + + MOCK_METHOD(int, ExecuteBatch, (const std::vector &statements, + ExecResultSet &result), (override)); + + MOCK_METHOD(int, RegisterObserver, (const Uri &uri, + const sptr &dataObserver), (override)); + + MOCK_METHOD(int, UnregisterObserver, (const Uri &uri, + const sptr &dataObserver), (override)); + + MOCK_METHOD(void, NotifyChange, (const Uri &uri), (override)); + + MOCK_METHOD(int, RegisterObserverExtProvider, (const Uri &uri, std::shared_ptr dataObserver, + bool isDescendants), (override)); + + MOCK_METHOD(int, UnregisterObserverExtProvider, (const Uri &uri, + std::shared_ptr dataObserver), (override)); + + MOCK_METHOD(void, NotifyChangeExtProvider, (const DataShareObserver::ChangeInfo &changeInfo), (override)); + + MOCK_METHOD(Uri, NormalizeUri, (Uri &uri), (override)); + + MOCK_METHOD(Uri, DenormalizeUri, (Uri &uri), (override)); + + MOCK_METHOD(int, AddQueryTemplate, (const std::string &uri, int64_t subscriberId, Template &tpl), (override)); + + MOCK_METHOD(int, DelQueryTemplate, (const std::string &uri, int64_t subscriberId), (override)); + + MOCK_METHOD(std::vector, Publish, (const Data &data, const std::string &bundleName), (override)); + + MOCK_METHOD(Data, GetPublishedData, (const std::string &bundleName, int &resultCode), (override)); + + MOCK_METHOD(std::vector, SubscribeRdbData, (const std::vector &uris, +<<<<<<< HEAD +<<<<<<< HEAD + const TemplateId &templateId, + const std::function &callback), (override)); +======= + const TemplateId &templateId, const std::function &callback), (override)); +>>>>>>> df18e2da (add ut for storage manager service) +======= + const TemplateId &templateId, + const std::function &callback), (override)); +>>>>>>> f9bba3bd (add ut) + + MOCK_METHOD(std::vector, UnsubscribeRdbData, (const std::vector &uris, + const TemplateId &templateId), (override)); + + MOCK_METHOD(std::vector, EnableRdbSubs, (const std::vector &uris, + const TemplateId &templateId), (override)); + + MOCK_METHOD(std::vector, DisableRdbSubs, (const std::vector &uris, + const TemplateId &templateId), (override)); + + MOCK_METHOD(std::vector, SubscribePublishedData, + (const std::vector &uris, int64_t subscriberId, + const std::function &callback), (override)); + + MOCK_METHOD(std::vector, UnsubscribePublishedData,(const std::vector &uris, + int64_t subscriberId), (override)); + + MOCK_METHOD(std::vector, EnablePubSubs, + (const std::vector &uris, int64_t subscriberId), (override)); + + MOCK_METHOD(std::vector, DisablePubSubs, + (const std::vector &uris, int64_t subscriberId), (override)); + + MOCK_METHOD(std::pair, InsertEx, + (Uri &uri, const DataShareValuesBucket &value), (override)); + + MOCK_METHOD(std::pair, UpdateEx, (Uri &uri, const DataSharePredicates &predicates, + const DataShareValuesBucket &value), (override)); + + MOCK_METHOD((std::pair), DeleteEx, + (Uri &uri, const DataSharePredicates &predicates), (override)); + + MOCK_METHOD(int32_t, UserDefineFunc, (MessageParcel &data, MessageParcel &reply, + MessageOption &option), (override)); +}; + +class DataShareHelperMock : public IDataShareHelper { +public: + MOCK_METHOD(std::share_ptr, Creator,(const sptr &token, + const string &strUri, const string &extUri, const int waitTime, bool isSystem)); + + MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates& predicates, + std::vector &colums, DataShareBusinessError *businessError)); +} +} // using namespace OHOS::FileManageMent::Backup +} // namespace OHOS +#endif diff --git a/tests/mock/module_external/include/datashare_result_set_mock.h b/tests/mock/module_external/include/datashare_result_set_mock.h new file mode 100644 index 000000000..42448c8c5 --- /dev/null +++ b/tests/mock/module_external/include/datashare_result_set_mock.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef DATASHARE_RESULT_SET_MOCK_H +#define DATASHARE_RESULT_SET_MOCK_H + +#include +#include "gmock/gmock.h" +#include "datashare_result_set.h" + +namespace OHOS{ +using namespace DataShare; +namespace FileManageMent::Backup { +class IDataShareResultSet { +public: + IDataShareResultSet() = default; + virtual ~IDataShareResultSet() = default; + virtual int GetRowCount(int &count) = 0; + virtual int GoToNextRow() = 0; + virtual int GetColumIndex(const std::string &columnName, int columnIndex) = 0; + virtual int GetInt(int columnIndex, int &value) = 0; + virtual int GetLong(int columnIndex, int64_t &value) = 0; +public: + static inline std::shared_ptr idrsr = nullptr; +}; + +class DataShareResultSetMock : public IDataShareResultSet { +public: + MOCK_METHOD(int, GetRowCount, (int &count), (override)) = 0; + MOCK_METHOD(int, GoToNextRow, ()); + MOCK_METHOD(int, GetColumIndex, (const std::string &columnName, int columnIndex));; + MOCK_METHOD(int, GetInt, (int columnIndex, int &value), (override)); + MOCK_METHOD(int, GetLong, (int columnIndex, int64_t &value), (override)); +} +} // using namespace OHOS::FileManageMent::Backup +} // namespace OHOS +#endif diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp new file mode 100644 index 000000000..d067557be --- /dev/null +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -0,0 +1,100 @@ +/* +<<<<<<< HEAD +<<<<<<< HEAD + * Copyright (c) 2025 Huawei Device Co., Ltd. +======= + * Copyright (c) 2024 Huawei Device Co., Ltd. +>>>>>>> df18e2da (add ut for storage manager service) +======= + * Copyright (c) 2025 Huawei Device Co., Ltd. +>>>>>>> 0cc1da75 (add ut) + * 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. + */ + +<<<<<<< HEAD +<<<<<<< HEAD +======= +#ifndef DATASHARE_HELPER_MOCK_H +#define DATASHARE_HELPER_MOCK_H + +#include +#include "gmock/gmock.h" +>>>>>>> df18e2da (add ut for storage manager service) +======= +>>>>>>> 0cc1da75 (add ut) +#include "datashare_helper.h" +#include "datashare_helper_mock.h" + +namespace OHOS{ +<<<<<<< HEAD +<<<<<<< HEAD +namespace DataShare { +using namespace std; +using namespace FileManageMent::Backup + +std:shared_ptr DataShareHelper::Creator(const sptr &token, + const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) +{ + GTEST_LOG(INFO) << "DataShareHelperMock Creator is OK"; + return IDataShareHelper::idsh->Creator(token, strUri, extUri, waitTime, isSystem); +} + +std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, + std::vector &colums, DataShareBusinessError *businessError) +{ + GTEST_LOG(INFO) << "DataShareHelperMock Query is OK"; + return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); +} + +======= +using namespace DataShare; +using string = std::string; +namespace FileManageMent::Backup { +class IDataShareHelper { +public: + IDataShareHelper() = default; + virtual ~IDataShareHelper() = default; + virtual std::share_ptr Creator(const sptr &token, + const string &strUri, const string &extUri, const int waitTime, bool isSystem) = 0; + virtual std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, + std::vector &colums, DataShareBusinessError *businessError) = 0;; +public: + static inline std::shared_ptr idsh = nullptr; +}; +======= +namespace DataShare { +using namespace std; +using namespace FileManageMent::Backup +>>>>>>> 0cc1da75 (add ut) + +std:shared_ptr DataShareHelper::Creator(const sptr &token, + const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) +{ + GTEST_LOG(INFO) << "DataShareHelperMock Creator is OK"; + return IDataShareHelper::idsh->Creator(token, strUri, extUri, waitTime, isSystem); +} +<<<<<<< HEAD +>>>>>>> df18e2da (add ut for storage manager service) +======= + +std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, + std::vector &colums, DataShareBusinessError *businessError) +{ + GTEST_LOG(INFO) << "DataShareHelperMock Query is OK"; + return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); +} + +>>>>>>> 0cc1da75 (add ut) +} // using namespace OHOS::FileManageMent::Backup +} // namespace OHOS +#endif diff --git a/tests/mock/module_external/src/datashare_result_set_mock .cpp b/tests/mock/module_external/src/datashare_result_set_mock .cpp new file mode 100644 index 000000000..40c865d4c --- /dev/null +++ b/tests/mock/module_external/src/datashare_result_set_mock .cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025 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 "datashare_result_set.h" +#include "datashare_result_set_mock.h" + +namespace OHOS{ +namespace DataShare { +using namespace std; +using namespace FileManageMent::Backup + +int GetRowCount(int &count) +{ + GTEST_LOG(INFO) << "DataShareResultSet GetRowCount is OK"; + return IDataShareResultSet::idrsr->GetRowCount(count); +} + +int GoToNextRow() +{ + GTEST_LOG(INFO) << "DataShareResultSet GoToNextRow is OK"; + return IDataShareResultSet::idrsr->GoToNextRow(); +} + +int GetColumIndex(const std::string &columnName, int &columnIndex) +{ + GTEST_LOG(INFO) << "DataShareResultSet GetColumIndex is OK"; + return IDataShareResultSet::idrsr->GetColumIndex(columnName, columnIndex); +} + +int GetInt(int columnIndex, int &value) +{ + GTEST_LOG(INFO) << "DataShareResultSet GetInt is OK"; + return IDataShareResultSet::idrsr->GetInt(columnIndex, value); +} + +int GetLong(int columnIndex, int64_t &value) +{ + GTEST_LOG(INFO) << "DataShareResultSet GetLong is OK"; + return IDataShareResultSet::idrsr->GetLong(columnIndex, value); +} +} +} + diff --git a/tests/unittests/backup_sa/module_external/BUILD.gn b/tests/unittests/backup_sa/module_external/BUILD.gn index f0f63b4d4..150f56cfd 100644 --- a/tests/unittests/backup_sa/module_external/BUILD.gn +++ b/tests/unittests/backup_sa/module_external/BUILD.gn @@ -72,11 +72,14 @@ ohos_unittest("storage_manager_service_test") { "${path_backup}/utils/include", "${path_backup}/utils/include/b_hilog", "${path_backup_mock}/utils_mock/include", + "${path_backup_mock}/module_external/include", ] sources = [ "${path_backup_mock}/utils_mock/src/b_jsonutil_mock.cpp", "${path_backup_mock}/utils_mock/src/b_sa_utils_mock.cpp", + "${path_backup_mock}/module_external/src/datashare_helper_mock.cpp", + "${path_backup_mock}/module_external/src/datashare_result_set_mock .cpp", "storage_manager_service_test.cpp", ] @@ -90,7 +93,7 @@ ohos_unittest("storage_manager_service_test") { defines = [ "LOG_TAG=\"app_file_service\"", - "LOG_DOMAIN=0xD200000", + "LOG_DOMAIN=0xD04303", "private = public", "protected = public", ] diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 5cf4c353e..b9a0f92f9 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -22,28 +22,110 @@ #include #include "file_uri.h" #include "sandbox_helper.h" +#include "b_jsonutil_mock.h" +#include "b_sa_utils_mock.h" +#include "if_system_ability_manager.h" +#include "iremote_stub.h" +#include "iservice_registry.h" +#include "module_external/bms_adapter.h" #include "module_external/storage_manager_service.h" #include "module_external/storage_manager_service.cpp" +#include "datashare_helper_mock.h" +#include "datashare_result_set_mock.h" +#include "directory_ex.h" namespace OHOS { const std::string CAMERA_BUNDLENAME = "file"; +const std::string CALENDAR_BUNDLENAME = "com.huawei.hmos.calendar"; using namespace std; using namespace testing; using namespace FileManagement::Backup; namespace fs = std::filesystem; + +class SystemAbilityManagerMock : public ISystemAbilityManager { +public: + MOCK_METHOD((sptr), AsObject, ()); + MOCK_METHOD((std::vector), ListSystemAbilities, (unsigned int)); + MOCK_METHOD((sptr), GetSystemAbility, (int32_t)); + MOCK_METHOD((sptr), CheckSystemAbility, (int32_t)); + MOCK_METHOD(int32_t, RemoveSystemAbility, (int32_t)); + MOCK_METHOD(int32_t, SubscribeSystemAbility, (int32_t, (const sptr&))); + MOCK_METHOD(int32_t, UnSubscribeSystemAbility, (int32_t, (const sptr&))); + MOCK_METHOD((sptr), GetSystemAbility, (int32_t, const std::string&)); + MOCK_METHOD(sptr, CheckSystemAbility, (int32_t, const std::string&)); + MOCK_METHOD(int32_t, AddOnDemandSystemAbilityInfo, (int32_t, const std::u16string&)); + MOCK_METHOD((sptr), CheckSystemAbility, (int32_t, bool&)); + MOCK_METHOD(int32_t, AddSystemAbility, (int32_t, (const sptr&), const SAExtraProp&)); + MOCK_METHOD(int32_t, AddSystemProcess, (const std::u16string&, (const sptr&))); + MOCK_METHOD((sptr), LoadSystemAbility, (int32_t, int32_t)); + MOCK_METHOD(int32_t, LoadSystemAbility, (int32_t, (const sptr&))); + MOCK_METHOD(int32_t, LoadSystemAbility, (int32_t, const std::string&, (const sptr&))); + MOCK_METHOD(int32_t, UnloadSystemAbility, (int32_t)); + MOCK_METHOD(int32_t, CancelUnloadSystemAbility, (int32_t)); + MOCK_METHOD(int32_t, UnloadAllIdleSystemAbility, ()); + MOCK_METHOD(int32_t, GetSystemProcessInfo, (int32_t, SystemProcessInfo&)); + MOCK_METHOD(int32_t, GetRunningSystemProcess, (std::list&)); + MOCK_METHOD(int32_t, SubscribeSystemProcess, (const sptr&)); + MOCK_METHOD(int32_t, SendStrategy, (int32_t, (std::vector&), int32_t, std::string&)); + MOCK_METHOD(int32_t, UnSubscribeSystemProcess, (const sptr&)); + MOCK_METHOD(int32_t, GetOnDemandReasonExtraData, (int64_t, MessageParcel&)); + MOCK_METHOD(int32_t, GetOnDemandPolicy, (int32_t, OnDemandPolicyType, (std::vector&))); + MOCK_METHOD(int32_t, UpdateOnDemandPolicy, (int32_t, OnDemandPolicyType, + (const std::vector&))); + MOCK_METHOD(int32_t, GetOnDemandSystemAbilityIds, (std::vector&)); + MOCK_METHOD(int32_t, GetExtensionSaIds, (const std::string&, std::vector&)); + MOCK_METHOD(int32_t, GetExtensionRunningSaList, (const std::string&, (std::vector>&))); + MOCK_METHOD(int32_t, GetRunningSaExtensionInfoList, (const std::string&, (std::vector&))); + MOCK_METHOD(int32_t, GetCommonEventExtraDataIdlist, (int32_t, (std::vector&), const std::string&)); +}; + +class BundleMgrMock : public IRemoteStub { +public: + MOCK_METHOD((sptr), AsObject, ()); + MOCK_METHOD(bool, GetBundleInfos, (const AppExecFwk::BundleFlag, (std::vector&), int32_t)); + MOCK_METHOD(ErrCode, GetCloneBundleInfo, (const std::string&, int32_t, int32_t, AppExecFwk::BundleInfo&, int32_t)); +}; + class StorageManagerServiceTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); void SetUp() override; void TearDown() override; + + static inline sptr bms = nullptr; + static inline sptr sam = nullptr; + static inline shared_ptr dsh = nullptr; + static inline shared_ptr dsrs = nullptr; + static inline shared_ptr dhelper = nullptr; + static inline shared_ptr dset = nullptr; }; -void StorageManagerServiceTest::SetUpTestCase(void) {} -void StorageManagerServiceTest::TearDownTestCase(void) {} +void StorageManagerServiceTest::SetUpTestCase(void) { + bms = sptr(new BundleMgrMock()); + sam = sptr(new SystemAbilityManagerMock()); + dsh = make_shared(); + DataShareHelperMock::idsh = dsh; + dsrs = make_shared(); + DataShareResultMock::idrs = dsrs; + dhelper = make_shared(); + dset = std::make_shared(); +} + +void StorageManagerServiceTest::TearDownTestCase(void) +{ + bms = nullptr; + sam = nullptr; +} + void StorageManagerServiceTest::SetUp(void) {} void StorageManagerServiceTest::TearDown(void) {} +sptr SystemAbilityManagerClient::GetSystemAbilityManager() +{ + return StorageManagerServiceTest::sam; +} + /** * @tc.name: Storage_Manager_ServiceTest_GetBundleStatsForIncrease_001 * @tc.desc: check the GetBundleStatsForIncrease function @@ -54,7 +136,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::vector bundleNames = {"com.example.app1", "com.example.app2"}; + std::vector bundleNames = {"com.example.app1", "com.huawei.hmos.calendar"}; std::vector incrementalBackTimes = {123456789}; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -73,7 +155,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::vector bundleNames = {"com.example.app1", "com.example.app2"}; + std::vector bundleNames = {"com.example.app1", "com.huawei.hmos.calendar"}; std::vector incrementalBackTimes = {123456789, 987654321}; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -92,7 +174,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::string bundleName = "testBundle"; + std::string bundleName = CALENDAR_BUNDLENAME; int64_t lastBackupTime = 123456789; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -113,7 +195,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcludesPath_001, testing::ext::TestSize.Level1) { - std::string bundleName = ""; + std::string bundleName = CALENDAR_BUNDLENAME; int64_t lastBackupTime = 123456789; uint32_t userId = 100; auto result = StorageManagerService::GetInstance().ReadIncludesExcludesPath(bundleName, lastBackupTime, userId); @@ -130,7 +212,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcl HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcludesPath_002, testing::ext::TestSize.Level1) { - std::string bundleName = "testBundle"; + std::string bundleName = CALENDAR_BUNDLENAME; int64_t lastBackupTime = 123456789; uint32_t userId = 100; // Assuming the file does not exist or cannot be opened @@ -148,7 +230,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcl HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_001, testing::ext::TestSize.Level1) { - std::string bundleName = CAMERA_BUNDLENAME; + std::string bundleName = CALENDAR_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {"data/storage/el1/base/" + DEFAULT_PATH_WITH_WILDCARD}; @@ -167,7 +249,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeF HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_002, testing::ext::TestSize.Level1) { - std::string bundleName = CAMERA_BUNDLENAME; + std::string bundleName = CALENDAR_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {NORMAL_SAND_PREFIX}; @@ -186,7 +268,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeF HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_003, testing::ext::TestSize.Level1) { - std::string bundleName = "testBundle"; + std::string bundleName = CALENDAR_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {}; @@ -206,7 +288,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ConvertSandboxRe testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::string bundleName = "com.example.app"; + std::string bundleName = CALENDAR_BUNDLENAME; std::string sandboxPathStr = NORMAL_SAND_PREFIX + "/path/to/file"; std::vector realPaths; std::map pathMap; @@ -250,7 +332,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc testing::ext::TestSize.Level1) { ofstream closedStatFile; - std::string bundleName = "testBundle"; + std::string bundleName = CALENDAR_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::map pathMap; @@ -270,7 +352,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc testing::ext::TestSize.Level1) { ofstream statFile; - std::string bundleName = "testBundle"; + std::string bundleName = CALENDAR_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::map pathMap; @@ -311,17 +393,6 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc } catch (const fs::filesystem_error& e) { std::cerr << "Filesystem error: " << e.what() << '\n'; } - - statFile.open("/system/etc/NOTICE.TXT", ios::out | ios::trunc); - EXPECT_FALSE(!statFile.is_open()) << "file can not open"; - std::string bundleName = "testBundle"; - BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, - .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; - std::map pathMap; - std::map excludesMap; - auto result = StorageManagerService::GetInstance().CheckIfDirForIncludes("/data/service", paras, pathMap, - statFile, excludesMap); - EXPECT_EQ(result, std::make_tuple(true, true)); } /** @@ -363,14 +434,19 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ExcludeFilter_00 HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageStatsByType_001, testing::ext::TestSize.Level1) { + int_32 userId = 100; + string basePath = "data/storage/el2/" + to_string(useId); + string path = basePath + "/base" + EXPECT_TRUE(OHOS::ForceCreateDirectory(path)); + StorageManager::StorageStats storageStats; - std::string type = "MEDIA_TYPE"; - int32_t userId = 100; + std::string type = MEDIA_TYPE; + EXPECT_CALL(*sam, GetSystemAbility(_)).WillRepeatedly(Return(bms)); + EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); + EXPECT_CALL(*dhelper, Query(_, _, _, _)).WillOnce(Return(dset)); + EXPECT_CALL(*dsrs, GetRowCount(_)).WillOnce(SetArgReferee<0>(100), Return(0)); int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); - EXPECT_EQ(result, E_ERR); - EXPECT_EQ(storageStats.video_, 0); - EXPECT_EQ(storageStats.image_, 0); - EXPECT_EQ(storageStats.file_, 0); + EXPECT_EQ(result, E_GETROWCOUNT); } /** @@ -383,13 +459,10 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt testing::ext::TestSize.Level1) { StorageManager::StorageStats storageStats; - std::string type = "FILE_TYPE"; + std::string type = FILE_TYPE; int32_t userId = 100; int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); - EXPECT_EQ(result, E_ERR); - EXPECT_EQ(storageStats.video_, 0); - EXPECT_EQ(storageStats.image_, 0); - EXPECT_EQ(storageStats.file_, 0); + EXPECT_EQ(result, 0); } /** @@ -402,13 +475,71 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt testing::ext::TestSize.Level1) { StorageManager::StorageStats storageStats; - std::string type = "OTHER_TYPE"; + std::string type = "other"; int32_t userId = 100; int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); EXPECT_EQ(result, E_ERR); - EXPECT_EQ(storageStats.video_, 0); - EXPECT_EQ(storageStats.image_, 0); - EXPECT_EQ(storageStats.file_, 0); +} + +<<<<<<< HEAD +<<<<<<< HEAD +======= +// /** +// * @tc.name: Storage_Manager_ServiceTest_GetUserStorageStatsByType_003 +// * @tc.desc: check the GetUserStorageStatsByType function +// * @tc.type: FUNC +// */ +// HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageStatsByType_003, +// testing::ext::TestSize.Level1) { +// StorageManager::StorageStats storageStats; +// sam = nullptr; +// int64_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); +// sanm = ; +// EXPECT_EQ(result, E_ERR); +// } + +>>>>>>> df18e2da (add ut for storage manager service) +======= +>>>>>>> f9bba3bd (add ut) +/** + * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_001 + * @tc.number: GetMediaStorageStats_001 + * @tc.desc: FUNC + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_001, + testing::ext::TestSize.Level1) { + StorageManager::StorageStats storageStats; + + EXPECT_CALL(*sam, GetSystemAbility(_)).WillOnce(Return(nullptr)).WillRepeatedly(Return(bms)); + int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); + EXPECT_EQ(result, E_REMOTE_IS_NULLPTR); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_002 + * @tc.number: GetMediaStorageStats_002 + * @tc.desc: FUNC + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_002, + testing::ext::TestSize.Level1) { + StorageManager::StorageStats storageStats; + EXPECT_CALL(*sam, GetSystemAbility(_)).WillOnce(Return(nullptr)).WillRepeatedly(Return(bms)); + int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); + EXPECT_EQ(result, E_MEDIALIBRARY_ERROR); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_002 + * @tc.number: GetMediaStorageStats_002 + * @tc.desc: FUNC + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_003, + testing::ext::TestSize.Level1) { + StorageManager::StorageStats storageStats; + EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); + EXPECT_CALL(*dhelper, Query(_, _, _, _)).WillOnce(Return(nullptr)); + int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); + EXPECT_EQ(result, E_QUERY); } /** @@ -438,7 +569,8 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaTypeAndS { auto resultSet = std::make_shared(); StorageManager::StorageStats storageStats; - StorageManagerService::GetInstance().GetMediaTypeAndSize(nullptr, storageStats); + EXPECT_CALL(*dsrs, GoToNextRow(_, _, _, _)).WillRepeatedly(Return(true)); + StorageManagerService::GetInstance().GetMediaTypeAndSize(resultSet, storageStats); EXPECT_EQ(storageStats.image_, 0); EXPECT_EQ(storageStats.audio_, 0); EXPECT_EQ(storageStats.video_, 0); @@ -493,4 +625,99 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_PathSortFunc_001 std::string path2 = "BBB"; EXPECT_TRUE(PathSortFunc(path1, path2)); } + +/** + * @tc.name: Storage_Manager_ServiceTest_GetBundleStatsTest_001 + * @tc.number: GetBundleStatsTest_001 + * @tc.desc: 测试 GetBundleInfosForLocalCapabilities 接口 + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: AR000IGCR7 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_001, testing::ext::TestSize.Level1) +{ + string bundleName = CALENDAR_BUNDLENAME; + StorageManager::StorageStats storageStats; + + bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, storageStats); + EXPECT_TRUE(result); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_DeduplicationPath_001 + * @tc.desc: DeduplicationPathTest_001 + * @tc.desc: 测试configPath为空时,不执行任何操作 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPath_001, + testing::ext::TestSize.Level1) +{ + std::vector configPaths; + StorageManagerService::GetInstance().DeduplicationPath(configPaths); + EXPECT_TRUE(result); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_DeduplicationPath_002 + * @tc.desc: DeduplicationPathTest_002 + * @tc.desc: 测试configPath不为空时,执行去重 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPath_002, + testing::ext::TestSize.Level1) +{ + std::vector configPaths = {"path1", "path2", "path3"}; + StorageManagerService::GetInstance().DeduplicationPath(configPaths); + EXPECT_TRUE(result); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_ScanExtensionPath_001 + * @tc.desc: ScanExtensionPathTest_001 + * @tc.desc: ScanExtensionPath 有效路径正确扫描 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPath_001, + testing::ext::TestSize.Level1) +{ + std::string bundleName = CALENDAR_BUNDLENAME; + BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, + .lastBackupTime = 123456789, .fileSizeSum = 0, .incFileSizeSum = 0}; + std::vector includes = {"path/to/include"}; + std::vector excludes = {"path/to/exclude"}; + std::map pathMap; + std::ofstream statFile("statfile.txt"); + + StorageManagerService::GetInstance().ScanExtensionPath(paras, includes, excludes, pathMap, statFile); + EXPECT_TRUE(pathMap.empty()); + EXPECT_TRUE(statFile.good()); + + statFile.close(); + remove(statfile.txt); + +} + +/** + * @tc.name: Storage_Manager_ServiceTest_AddOuterDirIntoFileStat_001 + * @tc.desc: AddOuterDirIntoFileStat_001 + * @tc.desc: AddOuterDirIntoFileStat 调用时正常返回 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoFileStat_001, + testing::ext::TestSize.Level1) +{ + std::string bundleName = CALENDAR_BUNDLENAME; + std::string dir = "/data/app/el1/100/base/" + bundleName +"/.backup" + BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, + .lastBackupTime = 123456789, .fileSizeSum = 0, .incFileSizeSum = 0}; + std::vector sandboxDir = {"path/to/sandboxDir"}; + std::map pathMap; + std::ofstream statFile("statfile.txt"); + + StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); + EXPECT_TRUE(true); + + dir = "" + StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); + EXPECT_TRUE(true); + + statFile.close(); + remove(statfile.txt); +} } \ No newline at end of file -- Gitee From 63b9428b4caf42b818857760cc47c4fcae974bee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 10:04:11 +0800 Subject: [PATCH 02/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../include/datashare_helper_mock.h | 30 +++------ .../include/datashare_result_set_mock.h | 12 ++-- .../src/datashare_helper_mock.cpp | 65 +------------------ .../src/datashare_result_set_mock .cpp | 9 ++- .../storage_manager_service_test.cpp | 56 +++++----------- 5 files changed, 41 insertions(+), 131 deletions(-) diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h index b67dda95c..949c70080 100644 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 202 Huawei Device Co., Ltd. + * Copyright (c) 2025 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,17 +21,16 @@ #include "datashare_helper.h" #include "datashare_helper_mock.h" -namespace OHOS{ -using namespace DataShare; -using string = std::string; +namespace OHOS { namespace FileManageMent::Backup { +using namespace DataShare; class IDataShareHelper { public: IDataShareHelper() = default; virtual ~IDataShareHelper() = default; - virtual std::share_ptr Creator(const sptr &token, + virtual std::shared_ptr Creator(const sptr &token, const string &strUri, const string &extUri, const int waitTime, bool isSystem) = 0; - virtual std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, + virtual std::shared_ptr Query(Uri &uri, const DataSharePredicates &predicates, std::vector &colums, DataShareBusinessError *businessError) = 0;; public: static inline std::shared_ptr idsh = nullptr; @@ -98,17 +97,8 @@ public: MOCK_METHOD(Data, GetPublishedData, (const std::string &bundleName, int &resultCode), (override)); MOCK_METHOD(std::vector, SubscribeRdbData, (const std::vector &uris, -<<<<<<< HEAD -<<<<<<< HEAD - const TemplateId &templateId, - const std::function &callback), (override)); -======= - const TemplateId &templateId, const std::function &callback), (override)); ->>>>>>> df18e2da (add ut for storage manager service) -======= const TemplateId &templateId, const std::function &callback), (override)); ->>>>>>> f9bba3bd (add ut) MOCK_METHOD(std::vector, UnsubscribeRdbData, (const std::vector &uris, const TemplateId &templateId), (override)); @@ -123,7 +113,7 @@ public: (const std::vector &uris, int64_t subscriberId, const std::function &callback), (override)); - MOCK_METHOD(std::vector, UnsubscribePublishedData,(const std::vector &uris, + MOCK_METHOD(std::vector, UnsubscribePublishedData, (const std::vector &uris, int64_t subscriberId), (override)); MOCK_METHOD(std::vector, EnablePubSubs, @@ -147,12 +137,12 @@ public: class DataShareHelperMock : public IDataShareHelper { public: - MOCK_METHOD(std::share_ptr, Creator,(const sptr &token, + MOCK_METHOD(std::shared_ptr, Creator, (const sptr &token, const string &strUri, const string &extUri, const int waitTime, bool isSystem)); - MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates& predicates, + MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates &predicates, std::vector &colums, DataShareBusinessError *businessError)); } -} // using namespace OHOS::FileManageMent::Backup -} // namespace OHOS +} +} // namespace OHOS::FileManagement::Backup #endif diff --git a/tests/mock/module_external/include/datashare_result_set_mock.h b/tests/mock/module_external/include/datashare_result_set_mock.h index 42448c8c5..3ade436a7 100644 --- a/tests/mock/module_external/include/datashare_result_set_mock.h +++ b/tests/mock/module_external/include/datashare_result_set_mock.h @@ -20,16 +20,16 @@ #include "gmock/gmock.h" #include "datashare_result_set.h" -namespace OHOS{ -using namespace DataShare; +namespace OHOS { namespace FileManageMent::Backup { +using namespace DataShare; class IDataShareResultSet { public: IDataShareResultSet() = default; virtual ~IDataShareResultSet() = default; virtual int GetRowCount(int &count) = 0; virtual int GoToNextRow() = 0; - virtual int GetColumIndex(const std::string &columnName, int columnIndex) = 0; + virtual int GetColumIndex(const std::string &columnName, int &columnIndex) = 0; virtual int GetInt(int columnIndex, int &value) = 0; virtual int GetLong(int columnIndex, int64_t &value) = 0; public: @@ -40,10 +40,10 @@ class DataShareResultSetMock : public IDataShareResultSet { public: MOCK_METHOD(int, GetRowCount, (int &count), (override)) = 0; MOCK_METHOD(int, GoToNextRow, ()); - MOCK_METHOD(int, GetColumIndex, (const std::string &columnName, int columnIndex));; + MOCK_METHOD(int, GetColumIndex, (const std::string &columnName, int &columnIndex));; MOCK_METHOD(int, GetInt, (int columnIndex, int &value), (override)); MOCK_METHOD(int, GetLong, (int columnIndex, int64_t &value), (override)); } -} // using namespace OHOS::FileManageMent::Backup -} // namespace OHOS +} +} // namespace OHOS::FileManagement::Backup #endif diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index d067557be..248b6430b 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -1,13 +1,5 @@ /* -<<<<<<< HEAD -<<<<<<< HEAD * Copyright (c) 2025 Huawei Device Co., Ltd. -======= - * Copyright (c) 2024 Huawei Device Co., Ltd. ->>>>>>> df18e2da (add ut for storage manager service) -======= - * Copyright (c) 2025 Huawei Device Co., Ltd. ->>>>>>> 0cc1da75 (add ut) * 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,26 +13,15 @@ * limitations under the License. */ -<<<<<<< HEAD -<<<<<<< HEAD -======= -#ifndef DATASHARE_HELPER_MOCK_H -#define DATASHARE_HELPER_MOCK_H - #include #include "gmock/gmock.h" ->>>>>>> df18e2da (add ut for storage manager service) -======= ->>>>>>> 0cc1da75 (add ut) #include "datashare_helper.h" #include "datashare_helper_mock.h" -namespace OHOS{ -<<<<<<< HEAD -<<<<<<< HEAD +namespace OHOS { namespace DataShare { using namespace std; -using namespace FileManageMent::Backup +using namespace FileManageMent::Backup; std:shared_ptr DataShareHelper::Creator(const sptr &token, const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) @@ -55,46 +36,6 @@ std::shared_ptr Query(Uri &uri,const DataSharePredicates &pr GTEST_LOG(INFO) << "DataShareHelperMock Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); } - -======= -using namespace DataShare; -using string = std::string; -namespace FileManageMent::Backup { -class IDataShareHelper { -public: - IDataShareHelper() = default; - virtual ~IDataShareHelper() = default; - virtual std::share_ptr Creator(const sptr &token, - const string &strUri, const string &extUri, const int waitTime, bool isSystem) = 0; - virtual std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError) = 0;; -public: - static inline std::shared_ptr idsh = nullptr; -}; -======= -namespace DataShare { -using namespace std; -using namespace FileManageMent::Backup ->>>>>>> 0cc1da75 (add ut) - -std:shared_ptr DataShareHelper::Creator(const sptr &token, - const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) -{ - GTEST_LOG(INFO) << "DataShareHelperMock Creator is OK"; - return IDataShareHelper::idsh->Creator(token, strUri, extUri, waitTime, isSystem); } -<<<<<<< HEAD ->>>>>>> df18e2da (add ut for storage manager service) -======= - -std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError) -{ - GTEST_LOG(INFO) << "DataShareHelperMock Query is OK"; - return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); -} - ->>>>>>> 0cc1da75 (add ut) -} // using namespace OHOS::FileManageMent::Backup -} // namespace OHOS +} // using namespace OHOS::DataShare #endif diff --git a/tests/mock/module_external/src/datashare_result_set_mock .cpp b/tests/mock/module_external/src/datashare_result_set_mock .cpp index 40c865d4c..d7e7b4995 100644 --- a/tests/mock/module_external/src/datashare_result_set_mock .cpp +++ b/tests/mock/module_external/src/datashare_result_set_mock .cpp @@ -16,10 +16,10 @@ #include "datashare_result_set.h" #include "datashare_result_set_mock.h" -namespace OHOS{ +namespace OHOS { namespace DataShare { using namespace std; -using namespace FileManageMent::Backup +using namespace FileManageMent::Backup; int GetRowCount(int &count) { @@ -50,6 +50,5 @@ int GetLong(int columnIndex, int64_t &value) GTEST_LOG(INFO) << "DataShareResultSet GetLong is OK"; return IDataShareResultSet::idrsr->GetLong(columnIndex, value); } -} -} - +} +} \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index b9a0f92f9..7605027f3 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -36,7 +36,7 @@ namespace OHOS { const std::string CAMERA_BUNDLENAME = "file"; -const std::string CALENDAR_BUNDLENAME = "com.huawei.hmos.calendar"; +const std::string MMS_BUNDLENAME = "com.ohos.mms"; using namespace std; using namespace testing; using namespace FileManagement::Backup; @@ -101,7 +101,8 @@ public: static inline shared_ptr dset = nullptr; }; -void StorageManagerServiceTest::SetUpTestCase(void) { +void StorageManagerServiceTest::SetUpTestCase(void) +{ bms = sptr(new BundleMgrMock()); sam = sptr(new SystemAbilityManagerMock()); dsh = make_shared(); @@ -136,7 +137,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::vector bundleNames = {"com.example.app1", "com.huawei.hmos.calendar"}; + std::vector bundleNames = {"com.example.app1", "com.example.app2"}; std::vector incrementalBackTimes = {123456789}; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -155,7 +156,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::vector bundleNames = {"com.example.app1", "com.huawei.hmos.calendar"}; + std::vector bundleNames = {"com.example.app1", "com.example.app2"}; std::vector incrementalBackTimes = {123456789, 987654321}; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -174,7 +175,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; int64_t lastBackupTime = 123456789; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -195,7 +196,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcludesPath_001, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; int64_t lastBackupTime = 123456789; uint32_t userId = 100; auto result = StorageManagerService::GetInstance().ReadIncludesExcludesPath(bundleName, lastBackupTime, userId); @@ -212,7 +213,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcl HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcludesPath_002, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; int64_t lastBackupTime = 123456789; uint32_t userId = 100; // Assuming the file does not exist or cannot be opened @@ -230,7 +231,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcl HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_001, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {"data/storage/el1/base/" + DEFAULT_PATH_WITH_WILDCARD}; @@ -249,7 +250,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeF HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_002, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {NORMAL_SAND_PREFIX}; @@ -268,7 +269,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeF HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_003, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {}; @@ -288,7 +289,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ConvertSandboxRe testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; std::string sandboxPathStr = NORMAL_SAND_PREFIX + "/path/to/file"; std::vector realPaths; std::map pathMap; @@ -332,7 +333,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc testing::ext::TestSize.Level1) { ofstream closedStatFile; - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::map pathMap; @@ -352,7 +353,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc testing::ext::TestSize.Level1) { ofstream statFile; - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::map pathMap; @@ -446,7 +447,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt EXPECT_CALL(*dhelper, Query(_, _, _, _)).WillOnce(Return(dset)); EXPECT_CALL(*dsrs, GetRowCount(_)).WillOnce(SetArgReferee<0>(100), Return(0)); int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); - EXPECT_EQ(result, E_GETROWCOUNT); + EXPECT_EQ(result, E_GETROWCOUNT); } /** @@ -481,26 +482,6 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt EXPECT_EQ(result, E_ERR); } -<<<<<<< HEAD -<<<<<<< HEAD -======= -// /** -// * @tc.name: Storage_Manager_ServiceTest_GetUserStorageStatsByType_003 -// * @tc.desc: check the GetUserStorageStatsByType function -// * @tc.type: FUNC -// */ -// HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageStatsByType_003, -// testing::ext::TestSize.Level1) { -// StorageManager::StorageStats storageStats; -// sam = nullptr; -// int64_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); -// sanm = ; -// EXPECT_EQ(result, E_ERR); -// } - ->>>>>>> df18e2da (add ut for storage manager service) -======= ->>>>>>> f9bba3bd (add ut) /** * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_001 * @tc.number: GetMediaStorageStats_001 @@ -636,7 +617,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_PathSortFunc_001 */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_001, testing::ext::TestSize.Level1) { - string bundleName = CALENDAR_BUNDLENAME; + string bundleName = MMS_BUNDLENAME; StorageManager::StorageStats storageStats; bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, storageStats); @@ -677,7 +658,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPat HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPath_001, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 123456789, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {"path/to/include"}; @@ -691,7 +672,6 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPat statFile.close(); remove(statfile.txt); - } /** @@ -702,7 +682,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPat HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoFileStat_001, testing::ext::TestSize.Level1) { - std::string bundleName = CALENDAR_BUNDLENAME; + std::string bundleName = MMS_BUNDLENAME; std::string dir = "/data/app/el1/100/base/" + bundleName +"/.backup" BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 123456789, .fileSizeSum = 0, .incFileSizeSum = 0}; -- Gitee From edc49a282256844664521a1733589695726b03a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 11:28:00 +0800 Subject: [PATCH 03/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- tests/mock/module_external/include/datashare_helper_mock.h | 2 +- tests/mock/module_external/src/datashare_helper_mock.cpp | 5 ++--- .../module_external/storage_manager_service_test.cpp | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h index 949c70080..0ca6c49b3 100644 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -40,7 +40,7 @@ class DataShareHelperImpl : public DataShareHelper { public: MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates& predicates, std::vector &colums, DataShareBusinessError *businessError), (override)); - + MOCK_METHOD(bool, Release, (), (override)); MOCK_METHOD(std::vector, GetFileTypes, (Uri &uri, const string &mimeTypeFilter), (override)); diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index 248b6430b..2f0d5dda3 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -30,12 +30,11 @@ std:shared_ptr DataShareHelper::Creator(const sptrCreator(token, strUri, extUri, waitTime, isSystem); } -std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, +std::shared_ptr Query(Uri &uri, const DataSharePredicates &predicates, std::vector &colums, DataShareBusinessError *businessError) { GTEST_LOG(INFO) << "DataShareHelperMock Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); } -} +} } // using namespace OHOS::DataShare -#endif diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 7605027f3..af08dc874 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -113,7 +113,7 @@ void StorageManagerServiceTest::SetUpTestCase(void) dset = std::make_shared(); } -void StorageManagerServiceTest::TearDownTestCase(void) +void StorageManagerServiceTest::TearDownTestCase(void) { bms = nullptr; sam = nullptr; @@ -619,7 +619,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_0 { string bundleName = MMS_BUNDLENAME; StorageManager::StorageStats storageStats; - + bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, storageStats); EXPECT_TRUE(result); } -- Gitee From 69196765b756360b0d1d97dd0088e6e6acd6a796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 11:28:00 +0800 Subject: [PATCH 04/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../mock/module_external/include/datashare_helper_mock.h | 2 +- .../module_external/include/datashare_result_set_mock.h | 7 ++++--- tests/mock/module_external/src/datashare_helper_mock.cpp | 9 ++++----- .../module_external/src/datashare_result_set_mock .cpp | 2 +- tests/unittests/backup_sa/module_external/BUILD.gn | 2 +- .../module_external/storage_manager_service_test.cpp | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h index 949c70080..0ca6c49b3 100644 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -40,7 +40,7 @@ class DataShareHelperImpl : public DataShareHelper { public: MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates& predicates, std::vector &colums, DataShareBusinessError *businessError), (override)); - + MOCK_METHOD(bool, Release, (), (override)); MOCK_METHOD(std::vector, GetFileTypes, (Uri &uri, const string &mimeTypeFilter), (override)); diff --git a/tests/mock/module_external/include/datashare_result_set_mock.h b/tests/mock/module_external/include/datashare_result_set_mock.h index 3ade436a7..368674c32 100644 --- a/tests/mock/module_external/include/datashare_result_set_mock.h +++ b/tests/mock/module_external/include/datashare_result_set_mock.h @@ -21,8 +21,9 @@ #include "datashare_result_set.h" namespace OHOS { -namespace FileManageMent::Backup { using namespace DataShare; +namespace FileManageMent::Backup { + class IDataShareResultSet { public: IDataShareResultSet() = default; @@ -38,12 +39,12 @@ public: class DataShareResultSetMock : public IDataShareResultSet { public: - MOCK_METHOD(int, GetRowCount, (int &count), (override)) = 0; + MOCK_METHOD(int, GetRowCount, (int &count), (override)); MOCK_METHOD(int, GoToNextRow, ()); MOCK_METHOD(int, GetColumIndex, (const std::string &columnName, int &columnIndex));; MOCK_METHOD(int, GetInt, (int columnIndex, int &value), (override)); MOCK_METHOD(int, GetLong, (int columnIndex, int64_t &value), (override)); -} +}; } } // namespace OHOS::FileManagement::Backup #endif diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index 248b6430b..27357c7b5 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -26,16 +26,15 @@ using namespace FileManageMent::Backup; std:shared_ptr DataShareHelper::Creator(const sptr &token, const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) { - GTEST_LOG(INFO) << "DataShareHelperMock Creator is OK"; + GTEST_LOG_(INFO) << "DataShareHelperMock Creator is OK"; return IDataShareHelper::idsh->Creator(token, strUri, extUri, waitTime, isSystem); } -std::shared_ptr Query(Uri &uri,const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError) +std::shared_ptr Query(Uri &uri, const DataSharePredicates &predicates, + std::vector &colums, DataShareBusinessError *businessError) { - GTEST_LOG(INFO) << "DataShareHelperMock Query is OK"; + GTEST_LOG_(INFO) << "DataShareHelperMock Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); } } } // using namespace OHOS::DataShare -#endif diff --git a/tests/mock/module_external/src/datashare_result_set_mock .cpp b/tests/mock/module_external/src/datashare_result_set_mock .cpp index d7e7b4995..ed0c0a87c 100644 --- a/tests/mock/module_external/src/datashare_result_set_mock .cpp +++ b/tests/mock/module_external/src/datashare_result_set_mock .cpp @@ -51,4 +51,4 @@ int GetLong(int columnIndex, int64_t &value) return IDataShareResultSet::idrsr->GetLong(columnIndex, value); } } -} \ No newline at end of file +}// namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_external/BUILD.gn b/tests/unittests/backup_sa/module_external/BUILD.gn index 150f56cfd..9d9079951 100644 --- a/tests/unittests/backup_sa/module_external/BUILD.gn +++ b/tests/unittests/backup_sa/module_external/BUILD.gn @@ -79,7 +79,7 @@ ohos_unittest("storage_manager_service_test") { "${path_backup_mock}/utils_mock/src/b_jsonutil_mock.cpp", "${path_backup_mock}/utils_mock/src/b_sa_utils_mock.cpp", "${path_backup_mock}/module_external/src/datashare_helper_mock.cpp", - "${path_backup_mock}/module_external/src/datashare_result_set_mock .cpp", + "${path_backup_mock}/module_external/src/datashare_result_set_mock.cpp", "storage_manager_service_test.cpp", ] diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 7605027f3..af08dc874 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -113,7 +113,7 @@ void StorageManagerServiceTest::SetUpTestCase(void) dset = std::make_shared(); } -void StorageManagerServiceTest::TearDownTestCase(void) +void StorageManagerServiceTest::TearDownTestCase(void) { bms = nullptr; sam = nullptr; @@ -619,7 +619,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_0 { string bundleName = MMS_BUNDLENAME; StorageManager::StorageStats storageStats; - + bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, storageStats); EXPECT_TRUE(result); } -- Gitee From 9c15c095cf6607595f11ce5d4a6a2b1edb0d1659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 11:28:00 +0800 Subject: [PATCH 05/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- tests/mock/module_external/src/datashare_helper_mock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index 27357c7b5..3b379a529 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -36,5 +36,5 @@ std::shared_ptr Query(Uri &uri, const DataSharePredicates &p GTEST_LOG_(INFO) << "DataShareHelperMock Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); } -} +} } // using namespace OHOS::DataShare -- Gitee From 749b72759aa91ef96dec945eb25f600aa4f854a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 12:40:33 +0800 Subject: [PATCH 06/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- tests/mock/module_external/src/datashare_helper_mock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index 3b379a529..27357c7b5 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -36,5 +36,5 @@ std::shared_ptr Query(Uri &uri, const DataSharePredicates &p GTEST_LOG_(INFO) << "DataShareHelperMock Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); } -} +} } // using namespace OHOS::DataShare -- Gitee From ee92ca33f87ac448d555527417db61270ff796dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 12:53:38 +0800 Subject: [PATCH 07/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../module_external/include/datashare_helper_mock.h | 2 +- .../src/datashare_result_set_mock .cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h index 0ca6c49b3..2b2f78d98 100644 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -22,8 +22,8 @@ #include "datashare_helper_mock.h" namespace OHOS { -namespace FileManageMent::Backup { using namespace DataShare; +namespace FileManageMent::Backup { class IDataShareHelper { public: IDataShareHelper() = default; diff --git a/tests/mock/module_external/src/datashare_result_set_mock .cpp b/tests/mock/module_external/src/datashare_result_set_mock .cpp index ed0c0a87c..2eacd8309 100644 --- a/tests/mock/module_external/src/datashare_result_set_mock .cpp +++ b/tests/mock/module_external/src/datashare_result_set_mock .cpp @@ -23,32 +23,32 @@ using namespace FileManageMent::Backup; int GetRowCount(int &count) { - GTEST_LOG(INFO) << "DataShareResultSet GetRowCount is OK"; + GTEST_LOG_(INFO) << "DataShareResultSet GetRowCount is OK"; return IDataShareResultSet::idrsr->GetRowCount(count); } int GoToNextRow() { - GTEST_LOG(INFO) << "DataShareResultSet GoToNextRow is OK"; + GTEST_LOG_(INFO) << "DataShareResultSet GoToNextRow is OK"; return IDataShareResultSet::idrsr->GoToNextRow(); } int GetColumIndex(const std::string &columnName, int &columnIndex) { - GTEST_LOG(INFO) << "DataShareResultSet GetColumIndex is OK"; + GTEST_LOG_(INFO) << "DataShareResultSet GetColumIndex is OK"; return IDataShareResultSet::idrsr->GetColumIndex(columnName, columnIndex); } int GetInt(int columnIndex, int &value) { - GTEST_LOG(INFO) << "DataShareResultSet GetInt is OK"; + GTEST_LOG_(INFO) << "DataShareResultSet GetInt is OK"; return IDataShareResultSet::idrsr->GetInt(columnIndex, value); } int GetLong(int columnIndex, int64_t &value) { - GTEST_LOG(INFO) << "DataShareResultSet GetLong is OK"; + GTEST_LOG_(INFO) << "DataShareResultSet GetLong is OK"; return IDataShareResultSet::idrsr->GetLong(columnIndex, value); } } -}// namespace OHOS::FileManagement::Backup \ No newline at end of file +} \ No newline at end of file -- Gitee From da79d865a93521181edc8d66297220ef84f5a217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 14:21:11 +0800 Subject: [PATCH 08/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../include/datashare_helper_mock.h | 27 +++++------ .../include/datashare_result_set_mock.h | 16 +++---- .../src/datashare_helper_mock.cpp | 13 ++---- .../src/datashare_result_set_mock .cpp | 10 ++-- .../storage_manager_service_test.cpp | 46 +++++++++---------- 5 files changed, 55 insertions(+), 57 deletions(-) diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h index 2b2f78d98..d10143a6c 100644 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -13,17 +13,17 @@ * limitations under the License. */ -#ifndef DATASHARE_HELPER_MOCK_H -#define DATASHARE_HELPER_MOCK_H +#ifndef OHOS_FILEMGMT_BACKUP_DATASHARE_HELPER_MOCK_H +#define OHOS_FILEMGMT_BACKUP_DATASHARE_HELPER_MOCK_H -#include +#include #include "gmock/gmock.h" #include "datashare_helper.h" -#include "datashare_helper_mock.h" +#include "datashare_result_set_mock.h" namespace OHOS { using namespace DataShare; -namespace FileManageMent::Backup { +namespace FileManagement::Backup { class IDataShareHelper { public: IDataShareHelper() = default; @@ -31,15 +31,16 @@ public: virtual std::shared_ptr Creator(const sptr &token, const string &strUri, const string &extUri, const int waitTime, bool isSystem) = 0; virtual std::shared_ptr Query(Uri &uri, const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError) = 0;; + std::vector &columns, DatashareBusinessError *businessError) = 0; public: static inline std::shared_ptr idsh = nullptr; }; class DataShareHelperImpl : public DataShareHelper { public: - MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates& predicates, - std::vector &colums, DataShareBusinessError *businessError), (override)); + MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, + const DataShare::DataSharePredicates& predicates, std::vector &columns, + DatashareBusinessError *businessError), (override)); MOCK_METHOD(bool, Release, (), (override)); @@ -98,7 +99,7 @@ public: MOCK_METHOD(std::vector, SubscribeRdbData, (const std::vector &uris, const TemplateId &templateId, - const std::function &callback), (override)); + const std::function &callback), (override)); MOCK_METHOD(std::vector, UnsubscribeRdbData, (const std::vector &uris, const TemplateId &templateId), (override)); @@ -111,7 +112,7 @@ public: MOCK_METHOD(std::vector, SubscribePublishedData, (const std::vector &uris, int64_t subscriberId, - const std::function &callback), (override)); + const std::function &callback), (override)); MOCK_METHOD(std::vector, UnsubscribePublishedData, (const std::vector &uris, int64_t subscriberId), (override)); @@ -122,10 +123,10 @@ public: MOCK_METHOD(std::vector, DisablePubSubs, (const std::vector &uris, int64_t subscriberId), (override)); - MOCK_METHOD(std::pair, InsertEx, + MOCK_METHOD((std::pair), InsertEx, (Uri &uri, const DataShareValuesBucket &value), (override)); - MOCK_METHOD(std::pair, UpdateEx, (Uri &uri, const DataSharePredicates &predicates, + MOCK_METHOD((std::pair), UpdateEx, (Uri &uri, const DataSharePredicates &predicates, const DataShareValuesBucket &value), (override)); MOCK_METHOD((std::pair), DeleteEx, @@ -142,7 +143,7 @@ public: MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates &predicates, std::vector &colums, DataShareBusinessError *businessError)); -} +}; } } // namespace OHOS::FileManagement::Backup #endif diff --git a/tests/mock/module_external/include/datashare_result_set_mock.h b/tests/mock/module_external/include/datashare_result_set_mock.h index 368674c32..93c306ef1 100644 --- a/tests/mock/module_external/include/datashare_result_set_mock.h +++ b/tests/mock/module_external/include/datashare_result_set_mock.h @@ -13,16 +13,16 @@ * limitations under the License. */ -#ifndef DATASHARE_RESULT_SET_MOCK_H -#define DATASHARE_RESULT_SET_MOCK_H +#ifndef OHOS_FILEMGMT_BACKUP_DATASHARE_RESULT_SET_MOCK_H +#define OHOS_FILEMGMT_BACKUP_DATASHARE_RESULT_SET_MOCK_H -#include +#include #include "gmock/gmock.h" #include "datashare_result_set.h" namespace OHOS { using namespace DataShare; -namespace FileManageMent::Backup { +namespace FileManagement::Backup { class IDataShareResultSet { public: @@ -30,21 +30,21 @@ public: virtual ~IDataShareResultSet() = default; virtual int GetRowCount(int &count) = 0; virtual int GoToNextRow() = 0; - virtual int GetColumIndex(const std::string &columnName, int &columnIndex) = 0; + virtual int GetColumnIndex(const std::string &columnName, int &columnIndex) = 0; virtual int GetInt(int columnIndex, int &value) = 0; virtual int GetLong(int columnIndex, int64_t &value) = 0; public: - static inline std::shared_ptr idrsr = nullptr; + static inline std::shared_ptr idsrs = nullptr; }; class DataShareResultSetMock : public IDataShareResultSet { public: MOCK_METHOD(int, GetRowCount, (int &count), (override)); MOCK_METHOD(int, GoToNextRow, ()); - MOCK_METHOD(int, GetColumIndex, (const std::string &columnName, int &columnIndex));; + MOCK_METHOD(int, GetColumnIndex, (const std::string &columnName, int &columnIndex)); MOCK_METHOD(int, GetInt, (int columnIndex, int &value), (override)); MOCK_METHOD(int, GetLong, (int columnIndex, int64_t &value), (override)); }; } -} // namespace OHOS::FileManagement::Backup +} #endif diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index 27357c7b5..c5fa42a2a 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -13,17 +13,14 @@ * limitations under the License. */ -#include -#include "gmock/gmock.h" #include "datashare_helper.h" -#include "datashare_helper_mock.h" namespace OHOS { namespace DataShare { using namespace std; -using namespace FileManageMent::Backup; +using namespace FileManagement::Backup; -std:shared_ptr DataShareHelper::Creator(const sptr &token, +std::shared_ptr DataShareHelper::Creator(const sptr &token, const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) { GTEST_LOG_(INFO) << "DataShareHelperMock Creator is OK"; @@ -31,10 +28,10 @@ std:shared_ptr DataShareHelper::Creator(const sptr Query(Uri &uri, const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError) + std::vector &colums, DataShareBusinessError *businessError) { - GTEST_LOG_(INFO) << "DataShareHelperMock Query is OK"; + GTEST_LOG_(INFO) << "DataShareResultSet Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); } } -} // using namespace OHOS::DataShare +} \ No newline at end of file diff --git a/tests/mock/module_external/src/datashare_result_set_mock .cpp b/tests/mock/module_external/src/datashare_result_set_mock .cpp index 2eacd8309..876da9b3b 100644 --- a/tests/mock/module_external/src/datashare_result_set_mock .cpp +++ b/tests/mock/module_external/src/datashare_result_set_mock .cpp @@ -24,31 +24,31 @@ using namespace FileManageMent::Backup; int GetRowCount(int &count) { GTEST_LOG_(INFO) << "DataShareResultSet GetRowCount is OK"; - return IDataShareResultSet::idrsr->GetRowCount(count); + return IDataShareResultSet::idsrs->GetRowCount(count); } int GoToNextRow() { GTEST_LOG_(INFO) << "DataShareResultSet GoToNextRow is OK"; - return IDataShareResultSet::idrsr->GoToNextRow(); + return IDataShareResultSet::idsrs->GoToNextRow(); } int GetColumIndex(const std::string &columnName, int &columnIndex) { GTEST_LOG_(INFO) << "DataShareResultSet GetColumIndex is OK"; - return IDataShareResultSet::idrsr->GetColumIndex(columnName, columnIndex); + return IDataShareResultSet::idsrs->GetColumIndex(columnName, columnIndex); } int GetInt(int columnIndex, int &value) { GTEST_LOG_(INFO) << "DataShareResultSet GetInt is OK"; - return IDataShareResultSet::idrsr->GetInt(columnIndex, value); + return IDataShareResultSet::idsrs->GetInt(columnIndex, value); } int GetLong(int columnIndex, int64_t &value) { GTEST_LOG_(INFO) << "DataShareResultSet GetLong is OK"; - return IDataShareResultSet::idrsr->GetLong(columnIndex, value); + return IDataShareResultSet::idsrs->GetLong(columnIndex, value); } } } \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index af08dc874..6448fd015 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -107,8 +107,8 @@ void StorageManagerServiceTest::SetUpTestCase(void) sam = sptr(new SystemAbilityManagerMock()); dsh = make_shared(); DataShareHelperMock::idsh = dsh; - dsrs = make_shared(); - DataShareResultMock::idrs = dsrs; + dsrs = make_shared(); + DataShareResultSetMock::idsrs = dsrs; dhelper = make_shared(); dset = std::make_shared(); } @@ -435,9 +435,9 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ExcludeFilter_00 HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageStatsByType_001, testing::ext::TestSize.Level1) { - int_32 userId = 100; - string basePath = "data/storage/el2/" + to_string(useId); - string path = basePath + "/base" + int32_t userId = 100; + string basePath = "/data/storage/el2/" + to_string(useId); + string path = basePath + "/base"; EXPECT_TRUE(OHOS::ForceCreateDirectory(path)); StorageManager::StorageStats storageStats; @@ -445,7 +445,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt EXPECT_CALL(*sam, GetSystemAbility(_)).WillRepeatedly(Return(bms)); EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); EXPECT_CALL(*dhelper, Query(_, _, _, _)).WillOnce(Return(dset)); - EXPECT_CALL(*dsrs, GetRowCount(_)).WillOnce(SetArgReferee<0>(100), Return(0)); + EXPECT_CALL(*dsrs, GetRowCount(_)).WillOnce(DoAll(SetArgReferee<0>(100), Return(0))); int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); EXPECT_EQ(result, E_GETROWCOUNT); } @@ -485,7 +485,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt /** * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_001 * @tc.number: GetMediaStorageStats_001 - * @tc.desc: FUNC + * @tc.desc: 测试返回E_MEDIALIBRARY_ERROR */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_001, testing::ext::TestSize.Level1) { @@ -499,12 +499,12 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageS /** * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_002 * @tc.number: GetMediaStorageStats_002 - * @tc.desc: FUNC + * @tc.desc: 测试返回E_MEDIALIBRARY_ERROR */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_002, testing::ext::TestSize.Level1) { StorageManager::StorageStats storageStats; - EXPECT_CALL(*sam, GetSystemAbility(_)).WillOnce(Return(nullptr)).WillRepeatedly(Return(bms)); + EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); EXPECT_EQ(result, E_MEDIALIBRARY_ERROR); } @@ -512,7 +512,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageS /** * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_002 * @tc.number: GetMediaStorageStats_002 - * @tc.desc: FUNC + * @tc.desc: 测试返回E_QUERY */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_003, testing::ext::TestSize.Level1) { @@ -550,7 +550,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaTypeAndS { auto resultSet = std::make_shared(); StorageManager::StorageStats storageStats; - EXPECT_CALL(*dsrs, GoToNextRow(_, _, _, _)).WillRepeatedly(Return(true)); + EXPECT_CALL(*dsrs, GoToNextRow()).WillRepeatedly(Return(true)); StorageManagerService::GetInstance().GetMediaTypeAndSize(resultSet, storageStats); EXPECT_EQ(storageStats.image_, 0); EXPECT_EQ(storageStats.audio_, 0); @@ -626,7 +626,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_0 /** * @tc.name: Storage_Manager_ServiceTest_DeduplicationPath_001 - * @tc.desc: DeduplicationPathTest_001 + * @tc.number: DeduplicationPathTest_001 * @tc.desc: 测试configPath为空时,不执行任何操作 */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPath_001, @@ -634,12 +634,12 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPat { std::vector configPaths; StorageManagerService::GetInstance().DeduplicationPath(configPaths); - EXPECT_TRUE(result); + EXPECT_TRUE(true); } /** * @tc.name: Storage_Manager_ServiceTest_DeduplicationPath_002 - * @tc.desc: DeduplicationPathTest_002 + * @tc.number: DeduplicationPathTest_002 * @tc.desc: 测试configPath不为空时,执行去重 */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPath_002, @@ -647,12 +647,12 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPat { std::vector configPaths = {"path1", "path2", "path3"}; StorageManagerService::GetInstance().DeduplicationPath(configPaths); - EXPECT_TRUE(result); + EXPECT_TRUE(true); } /** * @tc.name: Storage_Manager_ServiceTest_ScanExtensionPath_001 - * @tc.desc: ScanExtensionPathTest_001 + * @tc.number: ScanExtensionPathTest_001 * @tc.desc: ScanExtensionPath 有效路径正确扫描 */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPath_001, @@ -661,8 +661,8 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPat std::string bundleName = MMS_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 123456789, .fileSizeSum = 0, .incFileSizeSum = 0}; - std::vector includes = {"path/to/include"}; - std::vector excludes = {"path/to/exclude"}; + std::vector includes = {"/path/to/include"}; + std::vector excludes = {"/path/to/exclude"}; std::map pathMap; std::ofstream statFile("statfile.txt"); @@ -671,12 +671,12 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ScanExtensionPat EXPECT_TRUE(statFile.good()); statFile.close(); - remove(statfile.txt); + remove("statfile.txt"); } /** * @tc.name: Storage_Manager_ServiceTest_AddOuterDirIntoFileStat_001 - * @tc.desc: AddOuterDirIntoFileStat_001 + * @tc.number: AddOuterDirIntoFileStat_001 * @tc.desc: AddOuterDirIntoFileStat 调用时正常返回 */ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoFileStat_001, @@ -685,10 +685,10 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoF std::string bundleName = MMS_BUNDLENAME; std::string dir = "/data/app/el1/100/base/" + bundleName +"/.backup" BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, - .lastBackupTime = 123456789, .fileSizeSum = 0, .incFileSizeSum = 0}; - std::vector sandboxDir = {"path/to/sandboxDir"}; - std::map pathMap; + .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; + std::vector sandboxDir = {"/path/to/sandboxDir"}; std::ofstream statFile("statfile.txt"); + std::map excludesMap; StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); EXPECT_TRUE(true); -- Gitee From 08f3993cc8a20d5d5693b3960e3f3b64bfd503f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 15:23:38 +0800 Subject: [PATCH 09/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../mock/module_external/include/datashare_helper_mock.h | 2 +- tests/mock/module_external/src/datashare_helper_mock.cpp | 3 ++- ...result_set_mock .cpp => datashare_result_set_mock.cpp} | 0 tests/unittests/backup_sa/module_external/BUILD.gn | 2 +- .../module_external/storage_manager_service_test.cpp | 8 ++++---- 5 files changed, 8 insertions(+), 7 deletions(-) rename tests/mock/module_external/src/{datashare_result_set_mock .cpp => datashare_result_set_mock.cpp} (100%) diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h index d10143a6c..4db3d3b59 100644 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ b/tests/mock/module_external/include/datashare_helper_mock.h @@ -142,7 +142,7 @@ public: const string &strUri, const string &extUri, const int waitTime, bool isSystem)); MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError)); + std::vector &colums, DatashareBusinessError *businessError)); }; } } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index c5fa42a2a..8d8db51a7 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -14,6 +14,7 @@ */ #include "datashare_helper.h" +#include "datashare_helper_mock.h" namespace OHOS { namespace DataShare { @@ -28,7 +29,7 @@ std::shared_ptr DataShareHelper::Creator(const sptr Query(Uri &uri, const DataSharePredicates &predicates, - std::vector &colums, DataShareBusinessError *businessError) + std::vector &colums, DatashareBusinessError *businessError) { GTEST_LOG_(INFO) << "DataShareResultSet Query is OK"; return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); diff --git a/tests/mock/module_external/src/datashare_result_set_mock .cpp b/tests/mock/module_external/src/datashare_result_set_mock.cpp similarity index 100% rename from tests/mock/module_external/src/datashare_result_set_mock .cpp rename to tests/mock/module_external/src/datashare_result_set_mock.cpp diff --git a/tests/unittests/backup_sa/module_external/BUILD.gn b/tests/unittests/backup_sa/module_external/BUILD.gn index 9d9079951..d1ddd21eb 100644 --- a/tests/unittests/backup_sa/module_external/BUILD.gn +++ b/tests/unittests/backup_sa/module_external/BUILD.gn @@ -93,7 +93,7 @@ ohos_unittest("storage_manager_service_test") { defines = [ "LOG_TAG=\"app_file_service\"", - "LOG_DOMAIN=0xD04303", + "LOG_DOMAIN=0xD004303", "private = public", "protected = public", ] diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 6448fd015..44da8b719 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -436,7 +436,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt testing::ext::TestSize.Level1) { int32_t userId = 100; - string basePath = "/data/storage/el2/" + to_string(useId); + string basePath = "/data/storage/el2/" + to_string(userId); string path = basePath + "/base"; EXPECT_TRUE(OHOS::ForceCreateDirectory(path)); @@ -683,7 +683,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoF testing::ext::TestSize.Level1) { std::string bundleName = MMS_BUNDLENAME; - std::string dir = "/data/app/el1/100/base/" + bundleName +"/.backup" + std::string dir = "/data/app/el1/100/base/" + bundleName + "/.backup"; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector sandboxDir = {"/path/to/sandboxDir"}; @@ -693,11 +693,11 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoF StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); EXPECT_TRUE(true); - dir = "" + dir = ""; StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); EXPECT_TRUE(true); statFile.close(); - remove(statfile.txt); + remove("statfile.txt"); } } \ No newline at end of file -- Gitee From 4afc5eea94309a8d4baec4cfe1fd4641781adf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 15:41:12 +0800 Subject: [PATCH 10/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../module_external/src/datashare_result_set_mock.cpp | 8 ++++---- .../module_external/storage_manager_service_test.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/mock/module_external/src/datashare_result_set_mock.cpp b/tests/mock/module_external/src/datashare_result_set_mock.cpp index 876da9b3b..b01978b6c 100644 --- a/tests/mock/module_external/src/datashare_result_set_mock.cpp +++ b/tests/mock/module_external/src/datashare_result_set_mock.cpp @@ -19,7 +19,7 @@ namespace OHOS { namespace DataShare { using namespace std; -using namespace FileManageMent::Backup; +using namespace FileManagement::Backup; int GetRowCount(int &count) { @@ -33,10 +33,10 @@ int GoToNextRow() return IDataShareResultSet::idsrs->GoToNextRow(); } -int GetColumIndex(const std::string &columnName, int &columnIndex) +int GetColumnIndex(const std::string &columnName, int &columnIndex) { - GTEST_LOG_(INFO) << "DataShareResultSet GetColumIndex is OK"; - return IDataShareResultSet::idsrs->GetColumIndex(columnName, columnIndex); + GTEST_LOG_(INFO) << "DataShareResultSet GetColumnIndex is OK"; + return IDataShareResultSet::idsrs->GetColumnIndex(columnName, columnIndex); } int GetInt(int columnIndex, int &value) diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 44da8b719..a575bc321 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -686,7 +686,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoF std::string dir = "/data/app/el1/100/base/" + bundleName + "/.backup"; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; - std::vector sandboxDir = {"/path/to/sandboxDir"}; + std::string sandboxDir = "/path/to/sandboxDir"; std::ofstream statFile("statfile.txt"); std::map excludesMap; -- Gitee From 05d646eae3706aa1bff9d87233062f5e679ba5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 17:56:51 +0800 Subject: [PATCH 11/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../module_external/storage_manager_service_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index a575bc321..876197ec5 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -504,7 +504,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageS HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_002, testing::ext::TestSize.Level1) { StorageManager::StorageStats storageStats; - EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); + EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(nullptr)); int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); EXPECT_EQ(result, E_MEDIALIBRARY_ERROR); } @@ -618,9 +618,9 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_PathSortFunc_001 HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_001, testing::ext::TestSize.Level1) { string bundleName = MMS_BUNDLENAME; - StorageManager::StorageStats storageStats; + StorageManager::BundleStats bundleStats; - bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, storageStats); + bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, bundleStats); EXPECT_TRUE(result); } -- Gitee From c22cb529586e377c41c9f40a8f4c5e5b3d704d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Sat, 28 Jun 2025 18:16:23 +0800 Subject: [PATCH 12/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- tests/mock/module_external/src/datashare_helper_mock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp index 8d8db51a7..92bc1e4a8 100644 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ b/tests/mock/module_external/src/datashare_helper_mock.cpp @@ -22,7 +22,7 @@ using namespace std; using namespace FileManagement::Backup; std::shared_ptr DataShareHelper::Creator(const sptr &token, - const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) + const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) { GTEST_LOG_(INFO) << "DataShareHelperMock Creator is OK"; return IDataShareHelper::idsh->Creator(token, strUri, extUri, waitTime, isSystem); -- Gitee From 4f50f214f7ab09fd0bfff27fa3434c2caf5b3caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Wed, 2 Jul 2025 14:54:49 +0800 Subject: [PATCH 13/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../include/datashare_helper_mock.h | 149 --------- .../include/datashare_result_set_mock.h | 50 --- .../src/datashare_helper_mock.cpp | 38 --- .../src/datashare_result_set_mock.cpp | 54 ---- .../backup_sa/module_external/BUILD.gn | 5 +- .../storage_manager_service_test.cpp | 295 +++++++----------- 6 files changed, 117 insertions(+), 474 deletions(-) delete mode 100644 tests/mock/module_external/include/datashare_helper_mock.h delete mode 100644 tests/mock/module_external/include/datashare_result_set_mock.h delete mode 100644 tests/mock/module_external/src/datashare_helper_mock.cpp delete mode 100644 tests/mock/module_external/src/datashare_result_set_mock.cpp diff --git a/tests/mock/module_external/include/datashare_helper_mock.h b/tests/mock/module_external/include/datashare_helper_mock.h deleted file mode 100644 index 4db3d3b59..000000000 --- a/tests/mock/module_external/include/datashare_helper_mock.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2025 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. - */ - -#ifndef OHOS_FILEMGMT_BACKUP_DATASHARE_HELPER_MOCK_H -#define OHOS_FILEMGMT_BACKUP_DATASHARE_HELPER_MOCK_H - -#include -#include "gmock/gmock.h" -#include "datashare_helper.h" -#include "datashare_result_set_mock.h" - -namespace OHOS { -using namespace DataShare; -namespace FileManagement::Backup { -class IDataShareHelper { -public: - IDataShareHelper() = default; - virtual ~IDataShareHelper() = default; - virtual std::shared_ptr Creator(const sptr &token, - const string &strUri, const string &extUri, const int waitTime, bool isSystem) = 0; - virtual std::shared_ptr Query(Uri &uri, const DataSharePredicates &predicates, - std::vector &columns, DatashareBusinessError *businessError) = 0; -public: - static inline std::shared_ptr idsh = nullptr; -}; - -class DataShareHelperImpl : public DataShareHelper { -public: - MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, - const DataShare::DataSharePredicates& predicates, std::vector &columns, - DatashareBusinessError *businessError), (override)); - - MOCK_METHOD(bool, Release, (), (override)); - - MOCK_METHOD(std::vector, GetFileTypes, (Uri &uri, const string &mimeTypeFilter), (override)); - - MOCK_METHOD(int, OpenFile, (Uri &uri, const std::string &mode), (override)); - - MOCK_METHOD(int, OpenRawFile, (Uri &uri, const std::string &mode), (override)); - - MOCK_METHOD(int, Insert, (Uri &uri, const DataShareValuesBucket &value), (override)); - - MOCK_METHOD(int, InsertExt, (Uri &uri, const DataShareValuesBucket &value, std::string &result), (override)); - - MOCK_METHOD(int, Update, (Uri &uri, const DataSharePredicates &predicates, - const DataShareValuesBucket &value), (override)); - - MOCK_METHOD(int, BatchUpdate, (const UpdateOperations &operations, - std::vector &results), (override)); - - MOCK_METHOD(int, Delete, (Uri &uri, const DataSharePredicates &predicates), (override)); - - MOCK_METHOD(string, GetType, (Uri &uri), (override)); - - MOCK_METHOD(int, BatchInsert, (Uri &uri, const std::vector &values), (override)); - - MOCK_METHOD(int, ExecuteBatch, (const std::vector &statements, - ExecResultSet &result), (override)); - - MOCK_METHOD(int, RegisterObserver, (const Uri &uri, - const sptr &dataObserver), (override)); - - MOCK_METHOD(int, UnregisterObserver, (const Uri &uri, - const sptr &dataObserver), (override)); - - MOCK_METHOD(void, NotifyChange, (const Uri &uri), (override)); - - MOCK_METHOD(int, RegisterObserverExtProvider, (const Uri &uri, std::shared_ptr dataObserver, - bool isDescendants), (override)); - - MOCK_METHOD(int, UnregisterObserverExtProvider, (const Uri &uri, - std::shared_ptr dataObserver), (override)); - - MOCK_METHOD(void, NotifyChangeExtProvider, (const DataShareObserver::ChangeInfo &changeInfo), (override)); - - MOCK_METHOD(Uri, NormalizeUri, (Uri &uri), (override)); - - MOCK_METHOD(Uri, DenormalizeUri, (Uri &uri), (override)); - - MOCK_METHOD(int, AddQueryTemplate, (const std::string &uri, int64_t subscriberId, Template &tpl), (override)); - - MOCK_METHOD(int, DelQueryTemplate, (const std::string &uri, int64_t subscriberId), (override)); - - MOCK_METHOD(std::vector, Publish, (const Data &data, const std::string &bundleName), (override)); - - MOCK_METHOD(Data, GetPublishedData, (const std::string &bundleName, int &resultCode), (override)); - - MOCK_METHOD(std::vector, SubscribeRdbData, (const std::vector &uris, - const TemplateId &templateId, - const std::function &callback), (override)); - - MOCK_METHOD(std::vector, UnsubscribeRdbData, (const std::vector &uris, - const TemplateId &templateId), (override)); - - MOCK_METHOD(std::vector, EnableRdbSubs, (const std::vector &uris, - const TemplateId &templateId), (override)); - - MOCK_METHOD(std::vector, DisableRdbSubs, (const std::vector &uris, - const TemplateId &templateId), (override)); - - MOCK_METHOD(std::vector, SubscribePublishedData, - (const std::vector &uris, int64_t subscriberId, - const std::function &callback), (override)); - - MOCK_METHOD(std::vector, UnsubscribePublishedData, (const std::vector &uris, - int64_t subscriberId), (override)); - - MOCK_METHOD(std::vector, EnablePubSubs, - (const std::vector &uris, int64_t subscriberId), (override)); - - MOCK_METHOD(std::vector, DisablePubSubs, - (const std::vector &uris, int64_t subscriberId), (override)); - - MOCK_METHOD((std::pair), InsertEx, - (Uri &uri, const DataShareValuesBucket &value), (override)); - - MOCK_METHOD((std::pair), UpdateEx, (Uri &uri, const DataSharePredicates &predicates, - const DataShareValuesBucket &value), (override)); - - MOCK_METHOD((std::pair), DeleteEx, - (Uri &uri, const DataSharePredicates &predicates), (override)); - - MOCK_METHOD(int32_t, UserDefineFunc, (MessageParcel &data, MessageParcel &reply, - MessageOption &option), (override)); -}; - -class DataShareHelperMock : public IDataShareHelper { -public: - MOCK_METHOD(std::shared_ptr, Creator, (const sptr &token, - const string &strUri, const string &extUri, const int waitTime, bool isSystem)); - - MOCK_METHOD(std::shared_ptr, Query, (Uri &uri, const DataSharePredicates &predicates, - std::vector &colums, DatashareBusinessError *businessError)); -}; -} -} // namespace OHOS::FileManagement::Backup -#endif diff --git a/tests/mock/module_external/include/datashare_result_set_mock.h b/tests/mock/module_external/include/datashare_result_set_mock.h deleted file mode 100644 index 93c306ef1..000000000 --- a/tests/mock/module_external/include/datashare_result_set_mock.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2025 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. - */ - -#ifndef OHOS_FILEMGMT_BACKUP_DATASHARE_RESULT_SET_MOCK_H -#define OHOS_FILEMGMT_BACKUP_DATASHARE_RESULT_SET_MOCK_H - -#include -#include "gmock/gmock.h" -#include "datashare_result_set.h" - -namespace OHOS { -using namespace DataShare; -namespace FileManagement::Backup { - -class IDataShareResultSet { -public: - IDataShareResultSet() = default; - virtual ~IDataShareResultSet() = default; - virtual int GetRowCount(int &count) = 0; - virtual int GoToNextRow() = 0; - virtual int GetColumnIndex(const std::string &columnName, int &columnIndex) = 0; - virtual int GetInt(int columnIndex, int &value) = 0; - virtual int GetLong(int columnIndex, int64_t &value) = 0; -public: - static inline std::shared_ptr idsrs = nullptr; -}; - -class DataShareResultSetMock : public IDataShareResultSet { -public: - MOCK_METHOD(int, GetRowCount, (int &count), (override)); - MOCK_METHOD(int, GoToNextRow, ()); - MOCK_METHOD(int, GetColumnIndex, (const std::string &columnName, int &columnIndex)); - MOCK_METHOD(int, GetInt, (int columnIndex, int &value), (override)); - MOCK_METHOD(int, GetLong, (int columnIndex, int64_t &value), (override)); -}; -} -} -#endif diff --git a/tests/mock/module_external/src/datashare_helper_mock.cpp b/tests/mock/module_external/src/datashare_helper_mock.cpp deleted file mode 100644 index 92bc1e4a8..000000000 --- a/tests/mock/module_external/src/datashare_helper_mock.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2025 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 "datashare_helper.h" -#include "datashare_helper_mock.h" - -namespace OHOS { -namespace DataShare { -using namespace std; -using namespace FileManagement::Backup; - -std::shared_ptr DataShareHelper::Creator(const sptr &token, - const std::string &strUri, const std::string &extUri, const int waitTime, bool isSystem) -{ - GTEST_LOG_(INFO) << "DataShareHelperMock Creator is OK"; - return IDataShareHelper::idsh->Creator(token, strUri, extUri, waitTime, isSystem); -} - -std::shared_ptr Query(Uri &uri, const DataSharePredicates &predicates, - std::vector &colums, DatashareBusinessError *businessError) -{ - GTEST_LOG_(INFO) << "DataShareResultSet Query is OK"; - return IDataShareHelper::idsh->Query(uri, predicates, colums, businessError); -} -} -} \ No newline at end of file diff --git a/tests/mock/module_external/src/datashare_result_set_mock.cpp b/tests/mock/module_external/src/datashare_result_set_mock.cpp deleted file mode 100644 index b01978b6c..000000000 --- a/tests/mock/module_external/src/datashare_result_set_mock.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2025 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 "datashare_result_set.h" -#include "datashare_result_set_mock.h" - -namespace OHOS { -namespace DataShare { -using namespace std; -using namespace FileManagement::Backup; - -int GetRowCount(int &count) -{ - GTEST_LOG_(INFO) << "DataShareResultSet GetRowCount is OK"; - return IDataShareResultSet::idsrs->GetRowCount(count); -} - -int GoToNextRow() -{ - GTEST_LOG_(INFO) << "DataShareResultSet GoToNextRow is OK"; - return IDataShareResultSet::idsrs->GoToNextRow(); -} - -int GetColumnIndex(const std::string &columnName, int &columnIndex) -{ - GTEST_LOG_(INFO) << "DataShareResultSet GetColumnIndex is OK"; - return IDataShareResultSet::idsrs->GetColumnIndex(columnName, columnIndex); -} - -int GetInt(int columnIndex, int &value) -{ - GTEST_LOG_(INFO) << "DataShareResultSet GetInt is OK"; - return IDataShareResultSet::idsrs->GetInt(columnIndex, value); -} - -int GetLong(int columnIndex, int64_t &value) -{ - GTEST_LOG_(INFO) << "DataShareResultSet GetLong is OK"; - return IDataShareResultSet::idsrs->GetLong(columnIndex, value); -} -} -} \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_external/BUILD.gn b/tests/unittests/backup_sa/module_external/BUILD.gn index d1ddd21eb..f0f63b4d4 100644 --- a/tests/unittests/backup_sa/module_external/BUILD.gn +++ b/tests/unittests/backup_sa/module_external/BUILD.gn @@ -72,14 +72,11 @@ ohos_unittest("storage_manager_service_test") { "${path_backup}/utils/include", "${path_backup}/utils/include/b_hilog", "${path_backup_mock}/utils_mock/include", - "${path_backup_mock}/module_external/include", ] sources = [ "${path_backup_mock}/utils_mock/src/b_jsonutil_mock.cpp", "${path_backup_mock}/utils_mock/src/b_sa_utils_mock.cpp", - "${path_backup_mock}/module_external/src/datashare_helper_mock.cpp", - "${path_backup_mock}/module_external/src/datashare_result_set_mock.cpp", "storage_manager_service_test.cpp", ] @@ -93,7 +90,7 @@ ohos_unittest("storage_manager_service_test") { defines = [ "LOG_TAG=\"app_file_service\"", - "LOG_DOMAIN=0xD004303", + "LOG_DOMAIN=0xD200000", "private = public", "protected = public", ] diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 876197ec5..8fb8d9baf 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -22,17 +22,8 @@ #include #include "file_uri.h" #include "sandbox_helper.h" -#include "b_jsonutil_mock.h" -#include "b_sa_utils_mock.h" -#include "if_system_ability_manager.h" -#include "iremote_stub.h" -#include "iservice_registry.h" -#include "module_external/bms_adapter.h" #include "module_external/storage_manager_service.h" #include "module_external/storage_manager_service.cpp" -#include "datashare_helper_mock.h" -#include "datashare_result_set_mock.h" -#include "directory_ex.h" namespace OHOS { const std::string CAMERA_BUNDLENAME = "file"; @@ -41,92 +32,19 @@ using namespace std; using namespace testing; using namespace FileManagement::Backup; namespace fs = std::filesystem; - -class SystemAbilityManagerMock : public ISystemAbilityManager { -public: - MOCK_METHOD((sptr), AsObject, ()); - MOCK_METHOD((std::vector), ListSystemAbilities, (unsigned int)); - MOCK_METHOD((sptr), GetSystemAbility, (int32_t)); - MOCK_METHOD((sptr), CheckSystemAbility, (int32_t)); - MOCK_METHOD(int32_t, RemoveSystemAbility, (int32_t)); - MOCK_METHOD(int32_t, SubscribeSystemAbility, (int32_t, (const sptr&))); - MOCK_METHOD(int32_t, UnSubscribeSystemAbility, (int32_t, (const sptr&))); - MOCK_METHOD((sptr), GetSystemAbility, (int32_t, const std::string&)); - MOCK_METHOD(sptr, CheckSystemAbility, (int32_t, const std::string&)); - MOCK_METHOD(int32_t, AddOnDemandSystemAbilityInfo, (int32_t, const std::u16string&)); - MOCK_METHOD((sptr), CheckSystemAbility, (int32_t, bool&)); - MOCK_METHOD(int32_t, AddSystemAbility, (int32_t, (const sptr&), const SAExtraProp&)); - MOCK_METHOD(int32_t, AddSystemProcess, (const std::u16string&, (const sptr&))); - MOCK_METHOD((sptr), LoadSystemAbility, (int32_t, int32_t)); - MOCK_METHOD(int32_t, LoadSystemAbility, (int32_t, (const sptr&))); - MOCK_METHOD(int32_t, LoadSystemAbility, (int32_t, const std::string&, (const sptr&))); - MOCK_METHOD(int32_t, UnloadSystemAbility, (int32_t)); - MOCK_METHOD(int32_t, CancelUnloadSystemAbility, (int32_t)); - MOCK_METHOD(int32_t, UnloadAllIdleSystemAbility, ()); - MOCK_METHOD(int32_t, GetSystemProcessInfo, (int32_t, SystemProcessInfo&)); - MOCK_METHOD(int32_t, GetRunningSystemProcess, (std::list&)); - MOCK_METHOD(int32_t, SubscribeSystemProcess, (const sptr&)); - MOCK_METHOD(int32_t, SendStrategy, (int32_t, (std::vector&), int32_t, std::string&)); - MOCK_METHOD(int32_t, UnSubscribeSystemProcess, (const sptr&)); - MOCK_METHOD(int32_t, GetOnDemandReasonExtraData, (int64_t, MessageParcel&)); - MOCK_METHOD(int32_t, GetOnDemandPolicy, (int32_t, OnDemandPolicyType, (std::vector&))); - MOCK_METHOD(int32_t, UpdateOnDemandPolicy, (int32_t, OnDemandPolicyType, - (const std::vector&))); - MOCK_METHOD(int32_t, GetOnDemandSystemAbilityIds, (std::vector&)); - MOCK_METHOD(int32_t, GetExtensionSaIds, (const std::string&, std::vector&)); - MOCK_METHOD(int32_t, GetExtensionRunningSaList, (const std::string&, (std::vector>&))); - MOCK_METHOD(int32_t, GetRunningSaExtensionInfoList, (const std::string&, (std::vector&))); - MOCK_METHOD(int32_t, GetCommonEventExtraDataIdlist, (int32_t, (std::vector&), const std::string&)); -}; - -class BundleMgrMock : public IRemoteStub { -public: - MOCK_METHOD((sptr), AsObject, ()); - MOCK_METHOD(bool, GetBundleInfos, (const AppExecFwk::BundleFlag, (std::vector&), int32_t)); - MOCK_METHOD(ErrCode, GetCloneBundleInfo, (const std::string&, int32_t, int32_t, AppExecFwk::BundleInfo&, int32_t)); -}; - class StorageManagerServiceTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); void SetUp() override; void TearDown() override; - - static inline sptr bms = nullptr; - static inline sptr sam = nullptr; - static inline shared_ptr dsh = nullptr; - static inline shared_ptr dsrs = nullptr; - static inline shared_ptr dhelper = nullptr; - static inline shared_ptr dset = nullptr; }; -void StorageManagerServiceTest::SetUpTestCase(void) -{ - bms = sptr(new BundleMgrMock()); - sam = sptr(new SystemAbilityManagerMock()); - dsh = make_shared(); - DataShareHelperMock::idsh = dsh; - dsrs = make_shared(); - DataShareResultSetMock::idsrs = dsrs; - dhelper = make_shared(); - dset = std::make_shared(); -} - -void StorageManagerServiceTest::TearDownTestCase(void) -{ - bms = nullptr; - sam = nullptr; -} - +void StorageManagerServiceTest::SetUpTestCase(void) {} +void StorageManagerServiceTest::TearDownTestCase(void) {} void StorageManagerServiceTest::SetUp(void) {} void StorageManagerServiceTest::TearDown(void) {} -sptr SystemAbilityManagerClient::GetSystemAbilityManager() -{ - return StorageManagerServiceTest::sam; -} - /** * @tc.name: Storage_Manager_ServiceTest_GetBundleStatsForIncrease_001 * @tc.desc: check the GetBundleStatsForIncrease function @@ -175,7 +93,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = "testBundle"; int64_t lastBackupTime = 123456789; std::vector pkgFileSizes; std::vector incPkgFileSizes; @@ -196,7 +114,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStatsFo HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcludesPath_001, testing::ext::TestSize.Level1) { - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = ""; int64_t lastBackupTime = 123456789; uint32_t userId = 100; auto result = StorageManagerService::GetInstance().ReadIncludesExcludesPath(bundleName, lastBackupTime, userId); @@ -213,7 +131,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcl HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcludesPath_002, testing::ext::TestSize.Level1) { - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = "testBundle"; int64_t lastBackupTime = 123456789; uint32_t userId = 100; // Assuming the file does not exist or cannot be opened @@ -231,7 +149,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ReadIncludesExcl HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_001, testing::ext::TestSize.Level1) { - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = CAMERA_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {"data/storage/el1/base/" + DEFAULT_PATH_WITH_WILDCARD}; @@ -250,7 +168,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeF HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_002, testing::ext::TestSize.Level1) { - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = CAMERA_BUNDLENAME; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {NORMAL_SAND_PREFIX}; @@ -269,7 +187,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeF HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DealWithIncludeFiles_003, testing::ext::TestSize.Level1) { - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = "testBundle"; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::vector includes = {}; @@ -289,7 +207,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ConvertSandboxRe testing::ext::TestSize.Level1) { uint32_t userId = 100; - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = "com.example.app"; std::string sandboxPathStr = NORMAL_SAND_PREFIX + "/path/to/file"; std::vector realPaths; std::map pathMap; @@ -333,7 +251,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc testing::ext::TestSize.Level1) { ofstream closedStatFile; - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = "com.example.app"; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::map pathMap; @@ -353,7 +271,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_CheckIfDirForInc testing::ext::TestSize.Level1) { ofstream statFile; - std::string bundleName = MMS_BUNDLENAME; + std::string bundleName = "com.example.app"; BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; std::map pathMap; @@ -435,19 +353,14 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_ExcludeFilter_00 HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageStatsByType_001, testing::ext::TestSize.Level1) { - int32_t userId = 100; - string basePath = "/data/storage/el2/" + to_string(userId); - string path = basePath + "/base"; - EXPECT_TRUE(OHOS::ForceCreateDirectory(path)); - StorageManager::StorageStats storageStats; - std::string type = MEDIA_TYPE; - EXPECT_CALL(*sam, GetSystemAbility(_)).WillRepeatedly(Return(bms)); - EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); - EXPECT_CALL(*dhelper, Query(_, _, _, _)).WillOnce(Return(dset)); - EXPECT_CALL(*dsrs, GetRowCount(_)).WillOnce(DoAll(SetArgReferee<0>(100), Return(0))); + std::string type = "MEDIA_TYPE"; + int32_t userId = 100; int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); - EXPECT_EQ(result, E_GETROWCOUNT); + EXPECT_EQ(result, E_ERR); + EXPECT_EQ(storageStats.video_, 0); + EXPECT_EQ(storageStats.image_, 0); + EXPECT_EQ(storageStats.file_, 0); } /** @@ -464,6 +377,9 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt int32_t userId = 100; int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); EXPECT_EQ(result, 0); + EXPECT_GE(storageStats.video_, 0); + EXPECT_GE(storageStats.image_, 0); + EXPECT_GE(storageStats.file_, 0); } /** @@ -480,47 +396,9 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetUserStorageSt int32_t userId = 100; int64_t result = StorageManagerService::GetInstance().GetUserStorageStatsByType(userId, storageStats, type); EXPECT_EQ(result, E_ERR); -} - -/** - * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_001 - * @tc.number: GetMediaStorageStats_001 - * @tc.desc: 测试返回E_MEDIALIBRARY_ERROR - */ -HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_001, - testing::ext::TestSize.Level1) { - StorageManager::StorageStats storageStats; - - EXPECT_CALL(*sam, GetSystemAbility(_)).WillOnce(Return(nullptr)).WillRepeatedly(Return(bms)); - int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); - EXPECT_EQ(result, E_REMOTE_IS_NULLPTR); -} - -/** - * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_002 - * @tc.number: GetMediaStorageStats_002 - * @tc.desc: 测试返回E_MEDIALIBRARY_ERROR - */ -HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_002, - testing::ext::TestSize.Level1) { - StorageManager::StorageStats storageStats; - EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(nullptr)); - int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); - EXPECT_EQ(result, E_MEDIALIBRARY_ERROR); -} - -/** - * @tc.name: Storage_Manager_ServiceTest_GetMediaStorageStats_002 - * @tc.number: GetMediaStorageStats_002 - * @tc.desc: 测试返回E_QUERY - */ -HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaStorageStats_003, - testing::ext::TestSize.Level1) { - StorageManager::StorageStats storageStats; - EXPECT_CALL(*dsh, Creator(_, _, _, _, _)).WillRepeatedly(Return(dhelper)); - EXPECT_CALL(*dhelper, Query(_, _, _, _)).WillOnce(Return(nullptr)); - int32_t result = StorageManagerService::GetInstance().GetMediaStorageStats(storageStats); - EXPECT_EQ(result, E_QUERY); + EXPECT_GE(storageStats.video_, 0); + EXPECT_GE(storageStats.image_, 0); + EXPECT_GE(storageStats.file_, 0); } /** @@ -537,21 +415,10 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaTypeAndS EXPECT_EQ(storageStats.image_, 0); EXPECT_EQ(storageStats.audio_, 0); EXPECT_EQ(storageStats.video_, 0); -} -/** - * @tc.name: Storage_Manager_ServiceTest_GetMediaTypeAndSize_002 - * @tc.desc: check the GetMediaTypeAndSize function - * @tc.type: FUNC - * @tc.require: AR000IGCR7 - */ -HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetMediaTypeAndSize_002, - testing::ext::TestSize.Level1) -{ auto resultSet = std::make_shared(); - StorageManager::StorageStats storageStats; - EXPECT_CALL(*dsrs, GoToNextRow()).WillRepeatedly(Return(true)); StorageManagerService::GetInstance().GetMediaTypeAndSize(resultSet, storageStats); + EXPECT_EQ(storageStats.image_, 0); EXPECT_EQ(storageStats.audio_, 0); EXPECT_EQ(storageStats.video_, 0); @@ -607,23 +474,6 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_PathSortFunc_001 EXPECT_TRUE(PathSortFunc(path1, path2)); } -/** - * @tc.name: Storage_Manager_ServiceTest_GetBundleStatsTest_001 - * @tc.number: GetBundleStatsTest_001 - * @tc.desc: 测试 GetBundleInfosForLocalCapabilities 接口 - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: AR000IGCR7 - */ -HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_GetBundleStats_001, testing::ext::TestSize.Level1) -{ - string bundleName = MMS_BUNDLENAME; - StorageManager::BundleStats bundleStats; - - bool result = StorageManagerService::GetInstance().GetBundleStats(bundleName, bundleStats); - EXPECT_TRUE(result); -} - /** * @tc.name: Storage_Manager_ServiceTest_DeduplicationPath_001 * @tc.number: DeduplicationPathTest_001 @@ -634,7 +484,7 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPat { std::vector configPaths; StorageManagerService::GetInstance().DeduplicationPath(configPaths); - EXPECT_TRUE(true); + EXPECT_TRUE(configPaths.size() == 0); } /** @@ -645,9 +495,9 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPat HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_DeduplicationPath_002, testing::ext::TestSize.Level1) { - std::vector configPaths = {"path1", "path2", "path3"}; + std::vector configPaths = {"path1", "path2", "path2"}; StorageManagerService::GetInstance().DeduplicationPath(configPaths); - EXPECT_TRUE(true); + EXPECT_TRUE(configPaths.size() == 2); } /** @@ -691,13 +541,100 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddOuterDirIntoF std::map excludesMap; StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); - EXPECT_TRUE(true); + EXPECT_TRUE(excludesMap.empty()); dir = ""; StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, paras, sandboxDir, statFile, excludesMap); - EXPECT_TRUE(true); + EXPECT_TRUE(excludesMap.empty()); statFile.close(); remove("statfile.txt"); } + +/** + * @tc.name: Storage_Manager_ServiceTest_InsertStatFile_001 + * @tc.number: InsertStatFile_001 + * @tc.desc: 测试 InsertStatFile 函数在输入有效时是否正确插入文件信息 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_InsertStatFile_001, testing::ext::TestSize.Level1) +{ + std::string bundleName = MMS_BUNDLENAME; + std::string path = "/data/app/el1/100/base/" + bundleName + "/.backup"; + struct FileStat fileStat = {.isDir = true}; + std::ofstream statFile("test_stat_file.txt"); + std::map excludesMap; + BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, + .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; + + StorageManagerService::GetInstance().InsertStatFile(path, fileStat, statFile, excludesMap, paras); + EXPECT_TRUE(excludesMap.empty()); + statFile.close(); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_InsertStatFile_002 + * @tc.number: InsertStatFile_002 + * @tc.desc: 测试 InsertStatFile 函数路径在excludesMap中时是否正确排除文件信息 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_InsertStatFile_002, testing::ext::TestSize.Level1) +{ + std::string bundleName = MMS_BUNDLENAME; + std::string path = "/data/app/el1/100/base/" + bundleName + "/.backup"; + struct FileStat fileStat = {}; + std::ofstream statFile("test_stat_file.txt"); + std::map excludesMap = {{path, true}}; + BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, + .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; + + StorageManagerService::GetInstance().InsertStatFile(path, fileStat, statFile, excludesMap, paras); + EXPECT_TRUE(excludesMap.find(path) != excludesMap.end()); + statFile.close(); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_InsertStatFile_003 + * @tc.number: InsertStatFile_003 + * @tc.desc: 测试 InsertStatFile 函数路径在输入无效文件状态信息时的处理 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_InsertStatFile_003, testing::ext::TestSize.Level1) +{ + std::string bundleName = MMS_BUNDLENAME; + std::string path = "/invalid/path"; + struct FileStat fileStat = {}; + std::ofstream statFile("test_stat_file.txt"); + std::map excludesMap; + BundleStatsParas paras = {.userId = 100, .bundleName = bundleName, + .lastBackupTime = 0, .fileSizeSum = 0, .incFileSizeSum = 0}; + + StorageManagerService::GetInstance().InsertStatFile(path, fileStat, statFile, excludesMap, paras); + EXPECT_TRUE(excludesMap.empty()); + statFile.close(); +} + +/** + * @tc.name: Storage_Manager_ServiceTest_AddPathMapForPathWildCard_001 + * @tc.number: AddPathMapForPathWildCard_001 + * @tc.desc: 测试 AddPathMapForPathWildCard 函数返回值正常 + */ +HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddPathMapForPathWildCard_001, + testing::ext::TestSize.Level1) +{ + uint32_t userId = 100; + std::string name = MMS_BUNDLENAME; + std::string phyPath = "/data/app/el1/100/base/com.ohos.mms/.backup"; + std::map pathMap; + + bool result = StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, name, phyPath, pathMap); + EXPECT_TRUE(result, true); + + name = "com.example.app2"; + phyPath = "/data/app/el2/100/base/com.example.app2/.backup"; + pathMap.insert({phyPath, ".backup"}); + result = StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, name, phyPath, pathMap); + EXPECT_TRUE(result, true); + + phyPath = ""; + result = StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, name, phyPath, pathMap); + EXPECT_TRUE(result, false); +} } \ No newline at end of file -- Gitee From 2bb53d4567a0d757d0f04b283cd39fa39a8b2445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Wed, 2 Jul 2025 15:37:34 +0800 Subject: [PATCH 14/62] add ut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../module_external/storage_manager_service_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp index 8fb8d9baf..05fbbd72a 100644 --- a/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp +++ b/tests/unittests/backup_sa/module_external/storage_manager_service_test.cpp @@ -625,16 +625,16 @@ HWTEST_F(StorageManagerServiceTest, Storage_Manager_ServiceTest_AddPathMapForPat std::map pathMap; bool result = StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, name, phyPath, pathMap); - EXPECT_TRUE(result, true); + EXPECT_EQ(result, true); name = "com.example.app2"; phyPath = "/data/app/el2/100/base/com.example.app2/.backup"; pathMap.insert({phyPath, ".backup"}); result = StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, name, phyPath, pathMap); - EXPECT_TRUE(result, true); + EXPECT_EQ(result, true); phyPath = ""; result = StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, name, phyPath, pathMap); - EXPECT_TRUE(result, false); + EXPECT_EQ(result, false); } } \ No newline at end of file -- Gitee From b2f2adc91838a9514d8c2dcffffbc2de40ece3fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Sat, 28 Jun 2025 17:47:07 +0800 Subject: [PATCH 15/62] =?UTF-8?q?=E6=94=AF=E6=8C=81getCompatibilityInfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../native/backup_ext/include/ext_backup.h | 12 ++ .../native/backup_ext/include/ext_backup_js.h | 22 +++ .../native/backup_ext/include/ext_extension.h | 7 + .../native/backup_ext/src/ext_backup.cpp | 13 ++ .../native/backup_ext/src/ext_backup_js.cpp | 98 +++++++++++ .../backup_ext/src/sub_ext_extension.cpp | 63 +++++++ .../backup_ext/backup_extension_ability.js | 8 + services/backup_sa/IExtension.idl | 2 + .../backup_ext/include/ext_backup_js_mock.h | 3 + .../mock/backup_ext/include/ext_backup_mock.h | 4 + .../backup_ext/include/ext_extension_mock.h | 2 + .../backup_ext/src/ext_backup_js_mock.cpp | 17 ++ tests/mock/backup_ext/src/ext_backup_mock.cpp | 12 ++ .../backup_ext/src/ext_extension_mock.cpp | 6 + .../include/svc_extension_proxy_mock.h | 1 + .../module_ipc/svc_extension_proxy_mock.cpp | 6 + .../backup_impl/include/ext_extension_mock.h | 6 + .../backup_ext/ext_backup_js_test.cpp | 161 ++++++++++++++++++ utils/include/b_resources/b_constants.h | 2 + 19 files changed, 445 insertions(+) diff --git a/frameworks/native/backup_ext/include/ext_backup.h b/frameworks/native/backup_ext/include/ext_backup.h index c0599ba3e..b5fcd4665 100644 --- a/frameworks/native/backup_ext/include/ext_backup.h +++ b/frameworks/native/backup_ext/include/ext_backup.h @@ -185,6 +185,18 @@ public: * @brief Invoke the extended function of the APP */ virtual ErrCode InvokeAppExtMethod(ErrCode, const std::string); + + /** + * @brief Called do getBackupCompatibilityInfo. + */ + virtual ErrCode GetBackupCompatibilityInfo(std::function callbackEx, + std::string extInfo); + + /** + * @brief Called do getRestoreCompatibilityInfo. + */ + virtual ErrCode GetRestoreCompatibilityInfo(std::function callbackEx, + std::string extInfo); public: ExtBackup() = default; diff --git a/frameworks/native/backup_ext/include/ext_backup_js.h b/frameworks/native/backup_ext/include/ext_backup_js.h index f7f0c14f1..c80ad2f8f 100644 --- a/frameworks/native/backup_ext/include/ext_backup_js.h +++ b/frameworks/native/backup_ext/include/ext_backup_js.h @@ -145,6 +145,24 @@ public: */ ErrCode OnRelease(std::function callback, int32_t scenario) override; + /** + * @brief Call the app's GetBackupCompatibilityInfo + * + * @param callbackEx The callBackEx. + * @param extInfo The extInfo: json string. + */ + ErrCode GetBackupCompatibilityInfo(std::function callbackEx, + std::string extInfo) override; + + /** + * @brief Call the app's GetRestoreCompatibilityInfo + * + * @param callbackEx The callBackEx. + * @param extInfo The extInfo: json string. + */ + ErrCode GetRestoreCompatibilityInfo(std::function callbackEx, + std::string extInfo) override; + public: explicit ExtBackupJs(AbilityRuntime::JsRuntime &jsRuntime); ~ExtBackupJs(); @@ -161,6 +179,7 @@ private: std::function &argv)> ParseBackupExInfo(); std::function &argv)> ParseReleaseInfo(); + std::function &argv)> ParseCompatibilityInfo(); ErrCode CallJSRestoreEx(); ErrCode CallJSRestore(); @@ -182,6 +201,9 @@ private: std::atomic callExtDefaultFunc_ {false}; // extension default method, onBackup or onRestore std::atomic callJsExMethodDone_ {false}; int32_t scenario_ { 0 }; + + std::shared_ptr getComInfoCallbackEx_; + std::string extInfo_; }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 6d545f815..4a2abed45 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -65,6 +65,7 @@ public: ErrCode UpdateDfxInfo(int64_t uniqId, uint32_t extConnectSpend, const std::string &bundleName) override; ErrCode CleanBundleTempDir() override; ErrCode HandleOnRelease(int32_t scenario) override; + ErrCode HandleGetCompatibilityInfo(const string &extInfo, int32_t scenario, string &compatibilityInfo) override; public: explicit BackupExtExtension(const std::shared_ptr &extension, @@ -400,6 +401,7 @@ private: void SetAppResultReport(const std::string resultInfo, ErrCode errCode); void HandleExtOnRelease(); std::function OnReleaseCallback(wptr obj); + std::function GetComInfoCallback(wptr obj); private: pair> GetFileInfos(const vector &includes, const vector &excludes); TarMap GetIncrmentBigInfos(const vector &files); @@ -457,6 +459,11 @@ private: std::string appResultReportInfo_; ErrCode appResultReportErrCode_ { 0 }; std::mutex serviceCallReleaseLock_; + + std::mutex getCompatibilityInfoLock_; + std::condition_variable getCompatibilityInfoCon_; + std::atomic stopGetComInfo_ {false}; + std::string compatibilityInfo_; }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/src/ext_backup.cpp b/frameworks/native/backup_ext/src/ext_backup.cpp index 75a48cdcd..304936753 100644 --- a/frameworks/native/backup_ext/src/ext_backup.cpp +++ b/frameworks/native/backup_ext/src/ext_backup.cpp @@ -326,4 +326,17 @@ ErrCode ExtBackup::OnRelease(std::function callback, return ERR_OK; } +ErrCode ExtBackup::GetBackupCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + HILOGI("BackupExtensionAbility(base) GetBackupCompatibilityInfo."); + return ERR_OK; +} + +ErrCode ExtBackup::GetRestoreCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + HILOGI("BackupExtensionAbility(base) GetRestoreCompatibilityInfo."); + return ERR_OK; +} } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/src/ext_backup_js.cpp b/frameworks/native/backup_ext/src/ext_backup_js.cpp index f8b190796..34d25631d 100644 --- a/frameworks/native/backup_ext/src/ext_backup_js.cpp +++ b/frameworks/native/backup_ext/src/ext_backup_js.cpp @@ -1095,4 +1095,102 @@ void ExtBackupJs::InitTempPath(const std::string &bundleName) } } } + +ErrCode ExtBackupJs::GetBackupCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + HILOGI("BackupExtensionAbility(JS) GetBackupCompatibilityInfo begin."); + BExcepUltils::BAssert(jsObj_, BError::Codes::EXT_BROKEN_FRAMEWORK, + "The app does not provide the GetBackupCompatibilityInfo interface."); + extInfo_ = extInfo; + getComInfoCallbackEx_ = std::make_shared(callbackEx); + auto retParser = [jsRuntime {&jsRuntime_}, callbackInfoEx {getComInfoCallbackEx_}](napi_env env, + napi_value result) -> bool { + if (!CheckPromise(env, result)) { + string str; + bool isExceptionPending; + napi_is_exception_pending(env, &isExceptionPending); + HILOGI("napi exception pending = %{public}d.", isExceptionPending); + if (!callbackInfoEx) { + HILOGE("callbackInfoEx is nullptr"); + return false; + } + if (isExceptionPending) { + napi_value exception; + DealNapiException(env, exception, str); + napi_fatal_exception(env, exception); + callbackInfoEx->callbackParam(BError(BError::Codes::EXT_THROW_EXCEPTION), str); + } else { + callbackInfoEx->callbackParam(BError(BError::Codes::OK), str); + } + return true; + } + HILOGI("CheckPromise Js Method GetBackupCompatibilityInfo ok."); + return CallPromiseEx(*jsRuntime, result, callbackInfoEx.get()); + }; + auto errCode = CallJsMethod("getBackupCompatibilityInfo", jsRuntime_, jsObj_.get(), + ParseCompatibilityInfo(), retParser); + if (errCode != ERR_OK) { + HILOGE("CallJsMethod error, code:%{public}d.", errCode); + } + HILOGI("BackupExtensionAbility(JS) GetBackupCompatibilityInfo end."); + return errCode; +} + +ErrCode ExtBackupJs::GetRestoreCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + HILOGI("BackupExtensionAbility(JS) GetRestoreCompatibilityInfo begin."); + BExcepUltils::BAssert(jsObj_, BError::Codes::EXT_BROKEN_FRAMEWORK, + "The app does not provide the GetRestoreCompatibilityInfo interface."); + extInfo_ = extInfo; + getComInfoCallbackEx_ = std::make_shared(callbackEx); + auto retParser = [jsRuntime {&jsRuntime_}, callbackInfoEx {getComInfoCallbackEx_}](napi_env env, + napi_value result) -> bool { + if (!CheckPromise(env, result)) { + string str; + bool isExceptionPending; + napi_is_exception_pending(env, &isExceptionPending); + HILOGI("napi exception pending = %{public}d.", isExceptionPending); + if (!callbackInfoEx) { + HILOGE("callbackInfoEx is nullptr"); + return false; + } + if (isExceptionPending) { + napi_value exception; + DealNapiException(env, exception, str); + napi_fatal_exception(env, exception); + callbackInfoEx->callbackParam(BError(BError::Codes::EXT_THROW_EXCEPTION), str); + } else { + callbackInfoEx->callbackParam(BError(BError::Codes::OK), str); + } + return true; + } + HILOGI("CheckPromise Js Method GetRestoreCompatibilityInfo ok."); + return CallPromiseEx(*jsRuntime, result, callbackInfoEx.get()); + }; + auto errCode = CallJsMethod("getRestoreCompatibilityInfo", jsRuntime_, jsObj_.get(), + ParseCompatibilityInfo(), retParser); + if (errCode != ERR_OK) { + HILOGE("CallJsMethod error, code:%{public}d.", errCode); + } + HILOGI("BackupExtensionAbility(JS) GetRestoreCompatibilityInfo end."); + return errCode; +} + +std::function &argv)> ExtBackupJs::ParseCompatibilityInfo() +{ + auto getCompatibilityInfoFun = [extInfo(extInfo_)](napi_env env, vector &argv) -> bool { + napi_value extInfoValue = nullptr; + napi_create_object(env, &extInfoValue); + HILOGI("ParseCompatibilityInfo, extInfo is:%{public}s", GetAnonyString(extInfo).c_str()); + if (napi_create_string_utf8(env, extInfo.c_str(), extInfo.size(), &extInfoValue) != napi_ok) { + HILOGE("create napi string failed"); + return false; + } + argv.emplace_back(extInfoValue); + return true; + }; + return getCompatibilityInfoFun; +} } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 4cd89419b..621ec50b7 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -1884,4 +1884,67 @@ void BackupExtExtension::HandleExtOnRelease() StartOnReleaseTimeOutTimer(ptr); CallJsOnReleaseTask(ptr, scenario, true); } + +std::function BackupExtExtension::GetComInfoCallback(wptr obj) +{ + HILOGI("Begin get GetComInfoCallback"); + return [obj](ErrCode errCode, std::string compatibilityInfo) { + HILOGI("GetComInfoCallback: App getCompatibilityInfo end"); + auto extPtr = obj.promote(); + if (extPtr == nullptr) { + HILOGE("Ext extension handle have been released"); + return; + } + if (extPtr->extension_ == nullptr) { + HILOGE("Extension handle have been released"); + return; + } + if (extPtr->stopGetComInfo_.load()) { + HILOGE("App getCompatibilityInfo timeout"); + return; + } + HILOGI("GetCompatibilityInfo end, errCode: %{public}d, compatibilityInfo size is %{public}zu", + errCode, compatibilityInfo.size()); + std::unique_lock lock(extPtr->getCompatibilityInfoLock_); + extPtr->compatibilityInfo_ = compatibilityInfo; + extPtr->stopGetComInfo_.store(true); + extPtr->getCompatibilityInfoCon_.notify_all(); + }; +} + +ErrCode BackupExtExtension::HandleGetCompatibilityInfo(const string &extInfo, int32_t scenario, + string &compatibilityInfo) +{ + try { + HILOGI("Begin, scenario: %{public}d, extInfo size: %{public}zu", scenario, extInfo.size()); + VerifyCaller(); + auto ptr = wptr(this); + auto callback = GetComInfoCallback(ptr); + ErrCode ret = ERR_OK; + if (scenario == BConstants::ExtensionScenario::BACKUP) { + ret = extension_->GetBackupCompatibilityInfo(callback, extInfo); + } else if (scenario == BConstants::ExtensionScenario::RESTORE) { + ret = extension_->GetRestoreCompatibilityInfo(callback, extInfo); + } else { + return BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + } + if (ret != ERR_OK) { + HILOGE("Call GetCompatibilityInfo failed, ret = %{public}d", ret); + return ret; + } + HILOGI("wait GetCompatibilityInfo"); + compatibilityInfo = ""; + std::unique_lock lock(getCompatibilityInfoLock_); + auto isTimeout = getCompatibilityInfoCon_.wait_for(lock, + std::chrono::milliseconds(BConstants::APP_GETCOMINFO_MAX_TIMEOUT)); + if (isTimeout == std::cv_status::no_timeout) { + compatibilityInfo = compatibilityInfo_; + } + HILOGI("getCompatibilityInfo size: %{public}zu", compatibilityInfo.size()); + return ret; + } catch (...) { + HILOGE("Failed to HandleGetCompatibilityInfo"); + return BError(BError::Codes::EXT_BROKEN_IPC).GetCode(); + } +} } // namespace OHOS::FileManagement::Backup diff --git a/interfaces/api/js/napi/backup_ext/backup_extension_ability.js b/interfaces/api/js/napi/backup_ext/backup_extension_ability.js index a6d51a71b..92f4078e6 100644 --- a/interfaces/api/js/napi/backup_ext/backup_extension_ability.js +++ b/interfaces/api/js/napi/backup_ext/backup_extension_ability.js @@ -37,6 +37,14 @@ class BackupExtensionAbility { onRelease(scenario) { console.log(); } + + getBackupCompatibilityInfo(extInfo) { + console.log(); + } + + getRestoreCompatibilityInfo(extInfo) { + console.log(); + } } export default BackupExtensionAbility; \ No newline at end of file diff --git a/services/backup_sa/IExtension.idl b/services/backup_sa/IExtension.idl index eb1b0f34a..77725ada6 100644 --- a/services/backup_sa/IExtension.idl +++ b/services/backup_sa/IExtension.idl @@ -31,4 +31,6 @@ interface OHOS.FileManagement.Backup.IExtension{ [ipccode 14] void UpdateDfxInfo([in] long uniqId, [in] unsigned int extConnectSpend, [in] String bundleName); [ipccode 15] void CleanBundleTempDir(); [ipccode 16] void HandleOnRelease([in] int scenario); + [ipccode 17] void HandleGetCompatibilityInfo([in] String extInfo, [in] int scenario, + [out] String compatibilityInfo); } \ No newline at end of file diff --git a/tests/mock/backup_ext/include/ext_backup_js_mock.h b/tests/mock/backup_ext/include/ext_backup_js_mock.h index 5838cdaf7..fb59bfaa7 100644 --- a/tests/mock/backup_ext/include/ext_backup_js_mock.h +++ b/tests/mock/backup_ext/include/ext_backup_js_mock.h @@ -52,6 +52,9 @@ public: virtual void ExportJsContext() = 0; virtual ErrCode OnRelease(std::function, int32_t scenario) = 0; virtual std::function &argv) ParseReleaseInfo() = 0; + virtual ErrCode GetBackupCompatibilityInfo(std::function , std::string) = 0; + virtual ErrCode GetRestoreCompatibilityInfo(std::function , std::string) = 0; + virtual std::function &argv) ParseCompatibilityInfo() = 0; public: virtual bool GetProfileFromAbility(const OHOS::AppExecFwk::AbilityInfo &, const std::string &, std::vector &) const = 0; diff --git a/tests/mock/backup_ext/include/ext_backup_mock.h b/tests/mock/backup_ext/include/ext_backup_mock.h index bee304753..9687dcef1 100644 --- a/tests/mock/backup_ext/include/ext_backup_mock.h +++ b/tests/mock/backup_ext/include/ext_backup_mock.h @@ -53,6 +53,8 @@ public: virtual ErrCode GetParament(const AAFwk::Want &) = 0; virtual ErrCode OnProcess(std::function callback) = 0; virtual ErrCode OnRelease(std::function callback, int32_t scenario) = 0; + virtual ErrCode GetBackupCompatibilityInfo(std::function , std::string) = 0; + virtual ErrCode GetRestoreCompatibilityInfo(std::function , std::string) = 0; public: virtual std::unique_ptr LoadSystemModuleByEngine(napi_env, const std::string&, const napi_value*, size_t) = 0; @@ -99,6 +101,8 @@ public: MOCK_METHOD(ErrCode, GetParament, (const AAFwk::Want &)); MOCK_METHOD(napi_value, CreateExtBackupJsContext, (napi_env, std::shared_ptr)); MOCK_METHOD(ErrCode, OnRelease, (std::function, int32_t)); + MOCK_METHOD(ErrCode, GetBackupCompatibilityInfo, (std::function, std::string)); + MOCK_METHOD(ErrCode, GetRestoreCompatibilityInfo, (std::function, std::string)); public: MOCK_METHOD((std::unique_ptr), LoadSystemModuleByEngine, (napi_env, const std::string&, const napi_value*, size_t)); diff --git a/tests/mock/backup_ext/include/ext_extension_mock.h b/tests/mock/backup_ext/include/ext_extension_mock.h index a92a98bb1..a5817f2e0 100644 --- a/tests/mock/backup_ext/include/ext_extension_mock.h +++ b/tests/mock/backup_ext/include/ext_extension_mock.h @@ -68,6 +68,7 @@ public: virtual void WaitToSendFd(std::chrono::system_clock::time_point&, int&) = 0; virtual void RefreshTimeInfo(std::chrono::system_clock::time_point&, int&) = 0; virtual ErrCode HandleOnRelease(int32_t) = 0; + virtual ErrCode HandleGetCompatibilityInfo(const std::string &, int32_t, std::string &) = 0; public: BExtExtension() = default; virtual ~BExtExtension() = default; @@ -123,6 +124,7 @@ public: MOCK_METHOD(void, RefreshTimeInfo, ((std::chrono::system_clock::time_point&), int&)); MOCK_METHOD(ErrCode, CleanBundleTempDir, ()); MOCK_METHOD(ErrCode, HandleOnRelease, (int32_t)); + MOCK_METHOD(ErrCode, HandleGetCompatibilityInfo, (const std::string &, int32_t, std::string &)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_EXT_EXTENSION_MOCK_H \ No newline at end of file diff --git a/tests/mock/backup_ext/src/ext_backup_js_mock.cpp b/tests/mock/backup_ext/src/ext_backup_js_mock.cpp index 3d64f12e9..ea41e0363 100644 --- a/tests/mock/backup_ext/src/ext_backup_js_mock.cpp +++ b/tests/mock/backup_ext/src/ext_backup_js_mock.cpp @@ -108,4 +108,21 @@ ErrCode ExtBackupJs::OnRelease(function callback, int32_t { return BExtBackupJs::extBackupJs->OnRelease(callback, scenario); } + +ErrCode ExtBackupJs::GetBackupCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + return BExtBackupJs::extBackupJs->GetBackupCompatibilityInfo(callbackEx, extInfo); +} + +ErrCode ExtBackupJs::GetRestoreCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + return BExtBackupJs::extBackupJs->GetRestoreCompatibilityInfo(callbackEx, extInfo); +} + +std::function &argv)> ExtBackupJs::ParseCompatibilityInfo() +{ + return BExtBackupJs::extBackupJs->ParseCompatibilityInfo(); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/backup_ext/src/ext_backup_mock.cpp b/tests/mock/backup_ext/src/ext_backup_mock.cpp index 43f091594..16ab1e438 100644 --- a/tests/mock/backup_ext/src/ext_backup_mock.cpp +++ b/tests/mock/backup_ext/src/ext_backup_mock.cpp @@ -143,4 +143,16 @@ ErrCode ExtBackup::OnRelease(function callback, int3 { return BExtBackup::extBackup->OnRelease(callback, scenario); } + +ErrCode ExtBackup::GetBackupCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + return BExtBackup::extBackup->GetBackupCompatibilityInfo(callbackEx, extInfo); +} + +ErrCode ExtBackup::GetRestoreCompatibilityInfo(std::function callbackEx, + std::string extInfo) +{ + return BExtBackup::extBackup->GetRestoreCompatibilityInfo(callbackEx, extInfo); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/backup_ext/src/ext_extension_mock.cpp b/tests/mock/backup_ext/src/ext_extension_mock.cpp index b38cd0573..9765ccc0d 100644 --- a/tests/mock/backup_ext/src/ext_extension_mock.cpp +++ b/tests/mock/backup_ext/src/ext_extension_mock.cpp @@ -227,4 +227,10 @@ ErrCode BackupExtExtension::HandleOnRelease(int32_t scenario) { return BExtExtension::extExtension->HandleOnRelease(scenario); } + +ErrCode BackupExtExtension::HandleGetCompatibilityInfo(const std::string &extInfo, int32_t scenario, + std::string &compatibilityInfo) +{ + return BExtExtension::extExtension->HandleGetCompatibilityInfo(extInfo, scenario, compatibilityInfo); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h index eb5600d4f..ed98bfdd3 100644 --- a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h +++ b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h @@ -41,6 +41,7 @@ MOCK_METHOD(ErrCode, User0OnBackup, ()); MOCK_METHOD(ErrCode, UpdateDfxInfo, (int64_t, uint32_t, const std::string &)); MOCK_METHOD(ErrCode, CleanBundleTempDir, ()); MOCK_METHOD(ErrCode, HandleOnRelease, (int32_t)); +MOCK_METHOD(ErrCode, HandleGetCompatibilityInfo, (const std::string &, int32_t, std::string &)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_BACKUP_CONNECTION_MOCK_H \ No newline at end of file diff --git a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp index 00a120b78..75891ebe2 100644 --- a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp +++ b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp @@ -98,4 +98,10 @@ ErrCode ExtensionProxy::HandleOnRelease(int32_t scenario) { return 0; } + +ErrCode ExtensionProxy::HandleGetCompatibilityInfo(const std::string &extInfo, int32_t scenario, + std::string &compatibilityInfo) +{ + return 0; +} } // 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 79604825a..38411a68e 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 @@ -179,6 +179,12 @@ public: { return BError(BError::Codes::OK); }; + + ErrCode HandleGetCompatibilityInfo(const std::string &extInfo, int32_t scenario, + std::string &compatibilityInfo) override + { + return BError(BError::Codes::OK); + } private: int32_t nHandleBackupNum_ = 0; }; diff --git a/tests/unittests/backup_ext/ext_backup_js_test.cpp b/tests/unittests/backup_ext/ext_backup_js_test.cpp index df44d0ac8..0605fb56f 100644 --- a/tests/unittests/backup_ext/ext_backup_js_test.cpp +++ b/tests/unittests/backup_ext/ext_backup_js_test.cpp @@ -1666,4 +1666,165 @@ HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_OnRelease_0200, testing::ext::TestSi } GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_OnRelease_0200"; } + +/** + * @tc.number: SUB_backup_ext_js_GetBackupCompatibilityInfo_0100 + * @tc.name: SUB_backup_ext_js_GetBackupCompatibilityInfo_0100 + * @tc.desc: 测试 GetBackupCompatibilityInfo 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_GetBackupCompatibilityInfo_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_GetBackupCompatibilityInfo_0100"; + try { + std::string extInfo = ""; + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_is_exception_pending(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*napiMock, napi_send_cancelable_event(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + auto ret = extBackupJs->GetBackupCompatibilityInfo([](ErrCode, std::string){}, extInfo); + EXPECT_EQ(ret, EINVAL); + + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + 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, napi_send_cancelable_event(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + ret = extBackupJs->GetBackupCompatibilityInfo([](ErrCode, std::string){}, extInfo); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by GetBackupCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_GetBackupCompatibilityInfo_0100"; +} + +/** + * @tc.number: SUB_backup_ext_js_GetBackupCompatibilityInfo_0200 + * @tc.name: SUB_backup_ext_js_GetBackupCompatibilityInfo_0200 + * @tc.desc: 测试 GetBackupCompatibilityInfo 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_GetBackupCompatibilityInfo_0200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_GetBackupCompatibilityInfo_0200"; + try { + std::string extInfo = ""; + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + 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, napi_send_cancelable_event(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + auto ret = extBackupJs->GetBackupCompatibilityInfo([](ErrCode, std::string){}, extInfo); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by GetBackupCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_GetBackupCompatibilityInfo_0200"; +} + +/** + * @tc.number: SUB_backup_ext_js_GetRestoreCompatibilityInfo_0100 + * @tc.name: SUB_backup_ext_js_GetRestoreCompatibilityInfo_0100 + * @tc.desc: 测试 GetRestoreCompatibilityInfo 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_GetRestoreCompatibilityInfo_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_GetRestoreCompatibilityInfo_0100"; + try { + std::string extInfo = ""; + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + EXPECT_CALL(*napiMock, napi_is_exception_pending(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*napiMock, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*napiMock, napi_send_cancelable_event(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + auto ret = extBackupJs->GetRestoreCompatibilityInfo([](ErrCode, std::string){}, extInfo); + EXPECT_EQ(ret, EINVAL); + + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + 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, napi_send_cancelable_event(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + ret = extBackupJs->GetRestoreCompatibilityInfo([](ErrCode, std::string){}, extInfo); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by GetRestoreCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_GetRestoreCompatibilityInfo_0100"; +} + +/** + * @tc.number: SUB_backup_ext_js_GetRestoreCompatibilityInfo_0200 + * @tc.name: SUB_backup_ext_js_GetRestoreCompatibilityInfo_0200 + * @tc.desc: 测试 GetRestoreCompatibilityInfo 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_GetRestoreCompatibilityInfo_0200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_GetRestoreCompatibilityInfo_0200"; + try { + std::string extInfo = ""; + EXPECT_CALL(*extBackupMock, GetNapiEnv()).WillOnce(Return(nullptr)).WillOnce(Return(nullptr)); + 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, napi_send_cancelable_event(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + auto ret = extBackupJs->GetRestoreCompatibilityInfo([](ErrCode, std::string){}, extInfo); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by GetRestoreCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_GetRestoreCompatibilityInfo_0200"; +} + +/** + * @tc.number: SUB_backup_ext_js_ParseCompatibilityInfo_0100 + * @tc.name: SUB_backup_ext_js_ParseCompatibilityInfo_0100 + * @tc.desc: 测试 ParseCompatibilityInfo 各个分支成功与失败 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issuesIAFBOS + */ +HWTEST_F(ExtBackupJsTest, SUB_backup_ext_js_ParseCompatibilityInfo_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtBackupJsTest-begin SUB_backup_ext_js_ParseCompatibilityInfo_0100"; + try { + std::vector argv; + auto ext = extBackupJs->extInfo_; + extBackupJs->extInfo_ = "ext_info"; + EXPECT_CALL(*napiMock, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + auto ret = extBackupJs->ParseCompatibilityInfo()(nullptr, argv); + EXPECT_TRUE(ret); + + EXPECT_CALL(*napiMock, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_invalid_arg)); + ret = extBackupJs->ParseCompatibilityInfo()(nullptr, argv); + extBackupJs->extInfo_ = ext; + EXPECT_FALSE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtBackupJsTest-an exception occurred by ParseCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ExtBackupJsTest-end SUB_backup_ext_js_ParseCompatibilityInfo_0100"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 2687c38e0..6075332a4 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -103,6 +103,8 @@ constexpr int FIRST_CALL_APP_ON_PROCESS_MAX_TIMEOUT = 15000; // 首次调用应 constexpr int APP_ON_PROCESS_TIMEOUT_MAX_COUNT = 3; // 应用的onProcess接口超时的上限次数 constexpr int APP_ON_RELEASE_MAX_TIMEOUT = 5000; // 应用的onRelease接口最大超时时间为5秒 +// 应用的getBackupCompatibilityInfo/getRestoreCompatibilityInfo接口最大超时时间为1秒 +constexpr int APP_GETCOMINFO_MAX_TIMEOUT = 1000; // backup.para内配置项的名称,该配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 static inline std::string BACKUP_DEBUG_OVERRIDE_EXTENSION_CONFIG_KEY = "backup.debug.overrideExtensionConfig"; -- Gitee From 49085bbb06b84b06870d84826f8aab0a759ff31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Thu, 3 Jul 2025 21:45:31 +0800 Subject: [PATCH 16/62] add GetCompatibilityInfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../backup_ext/src/sub_ext_extension.cpp | 9 +- .../src/b_incremental_backup_session.cpp | 11 ++ .../src/b_incremental_restore_session.cpp | 11 ++ .../backup_kit_inner/src/b_session_backup.cpp | 11 ++ .../src/b_session_restore.cpp | 11 ++ .../impl/b_incremental_backup_session.h | 10 ++ .../impl/b_incremental_restore_session.h | 10 ++ .../backup_kit_inner/impl/b_session_backup.h | 10 ++ .../backup_kit_inner/impl/b_session_restore.h | 10 ++ .../js/backup/session_backup_n_exporter.cpp | 76 ++++++++++ .../js/backup/session_backup_n_exporter.h | 1 + .../session_incremental_backup_n_exporter.cpp | 77 ++++++++++ .../session_incremental_backup_n_exporter.h | 1 + .../js/backup/session_restore_n_exporter.cpp | 79 ++++++++++ .../js/backup/session_restore_n_exporter.h | 1 + services/backup_sa/IService.idl | 1 + .../backup_sa/include/module_ipc/service.h | 2 + .../src/module_external/bms_adapter.cpp | 40 ++--- .../backup_sa/src/module_ipc/sub_service.cpp | 47 ++++++ .../backup_ext/include/ext_backup_js_mock.h | 4 +- .../mock/backup_ext/include/ext_backup_mock.h | 4 +- .../backup_kit_inner/service_proxy_mock.cpp | 6 + .../mock/module_external/bms_adapter_mock.cpp | 16 +- tests/mock/module_ipc/service_mock.cpp | 6 + .../b_session_backup_test.cpp | 31 ++++ .../b_session_restore_test.cpp | 31 ++++ .../backup_impl/include/i_service_mock.h | 5 + .../module_ipc/service_incremental_test.cpp | 8 + .../module_ipc/service_other_test.cpp | 2 +- .../backup_sa/module_ipc/sub_service_test.cpp | 141 ++++++++++++++++++ .../session/b_incremental_session_test.cpp | 76 ++++++++++ .../backup_sa/session/service_proxy_mock.cpp | 6 + .../backup_sa/session/service_proxy_mock.h | 1 + .../b_json_entity_extension_config_test.cpp | 43 ++++++ utils/include/b_json/b_json_entity_caps.h | 9 +- .../b_json/b_json_entity_extension_config.h | 7 + .../b_json/b_json_entity_extension_config.cpp | 11 ++ 37 files changed, 789 insertions(+), 36 deletions(-) diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 621ec50b7..1da153964 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -1921,6 +1921,7 @@ ErrCode BackupExtExtension::HandleGetCompatibilityInfo(const string &extInfo, in auto ptr = wptr(this); auto callback = GetComInfoCallback(ptr); ErrCode ret = ERR_OK; + compatibilityInfo = ""; if (scenario == BConstants::ExtensionScenario::BACKUP) { ret = extension_->GetBackupCompatibilityInfo(callback, extInfo); } else if (scenario == BConstants::ExtensionScenario::RESTORE) { @@ -1933,11 +1934,11 @@ ErrCode BackupExtExtension::HandleGetCompatibilityInfo(const string &extInfo, in return ret; } HILOGI("wait GetCompatibilityInfo"); - compatibilityInfo = ""; std::unique_lock lock(getCompatibilityInfoLock_); - auto isTimeout = getCompatibilityInfoCon_.wait_for(lock, - std::chrono::milliseconds(BConstants::APP_GETCOMINFO_MAX_TIMEOUT)); - if (isTimeout == std::cv_status::no_timeout) { + auto noTimeout = getCompatibilityInfoCon_.wait_for(lock, + std::chrono::milliseconds(BConstants::APP_GETCOMINFO_MAX_TIMEOUT), + [this] { return this->stopGetComInfo_.load(); }); + if (noTimeout) { compatibilityInfo = compatibilityInfo_; } HILOGI("getCompatibilityInfo size: %{public}zu", compatibilityInfo.size()); diff --git a/frameworks/native/backup_kit_inner/src/b_incremental_backup_session.cpp b/frameworks/native/backup_kit_inner/src/b_incremental_backup_session.cpp index be5413d5d..9f6ef2247 100644 --- a/frameworks/native/backup_kit_inner/src/b_incremental_backup_session.cpp +++ b/frameworks/native/backup_kit_inner/src/b_incremental_backup_session.cpp @@ -215,4 +215,15 @@ ErrCode BIncrementalBackupSession::CleanBundleTempDir(const std::string &bundleN } return proxy->CleanBundleTempDir(bundleName); } + +ErrCode BIncrementalBackupSession::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + HILOGI("BIncrementalBackupSession::GetCompatibilityInfo"); + auto proxy = ServiceClient::GetInstance(); + if (proxy == nullptr) { + return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); + } + return proxy->GetCompatibilityInfo(bundleName, extInfo, compatInfo); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/frameworks/native/backup_kit_inner/src/b_incremental_restore_session.cpp b/frameworks/native/backup_kit_inner/src/b_incremental_restore_session.cpp index 78b92c231..23fc5385e 100644 --- a/frameworks/native/backup_kit_inner/src/b_incremental_restore_session.cpp +++ b/frameworks/native/backup_kit_inner/src/b_incremental_restore_session.cpp @@ -237,4 +237,15 @@ ErrCode BIncrementalRestoreSession::CleanBundleTempDir(const std::string &bundle } return proxy->CleanBundleTempDir(bundleName); } + +ErrCode BIncrementalRestoreSession::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + HILOGI("BIncrementalRestoreSession::GetCompatibilityInfo"); + auto proxy = ServiceClient::GetInstance(); + if (proxy == nullptr) { + return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); + } + return proxy->GetCompatibilityInfo(bundleName, extInfo, compatInfo); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/frameworks/native/backup_kit_inner/src/b_session_backup.cpp b/frameworks/native/backup_kit_inner/src/b_session_backup.cpp index 992125a31..ec93502a9 100644 --- a/frameworks/native/backup_kit_inner/src/b_session_backup.cpp +++ b/frameworks/native/backup_kit_inner/src/b_session_backup.cpp @@ -234,4 +234,15 @@ ErrCode BSessionBackup::CleanBundleTempDir(const std::string &bundleName) } return proxy->CleanBundleTempDir(bundleName); } + +ErrCode BSessionBackup::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + HILOGI("BSessionBackup::GetCompatibilityInfo"); + auto proxy = ServiceClient::GetInstance(); + if (proxy == nullptr) { + return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); + } + return proxy->GetCompatibilityInfo(bundleName, extInfo, compatInfo); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/frameworks/native/backup_kit_inner/src/b_session_restore.cpp b/frameworks/native/backup_kit_inner/src/b_session_restore.cpp index 34dfc57c3..e2215940c 100644 --- a/frameworks/native/backup_kit_inner/src/b_session_restore.cpp +++ b/frameworks/native/backup_kit_inner/src/b_session_restore.cpp @@ -215,4 +215,15 @@ ErrCode BSessionRestore::CleanBundleTempDir(const std::string &bundleName) } return proxy->CleanBundleTempDir(bundleName); } + +ErrCode BSessionRestore::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + HILOGI("BSessionRestore::GetCompatibilityInfo"); + auto proxy = ServiceClient::GetInstance(); + if (proxy == nullptr) { + return BError(BError::Codes::SDK_BROKEN_IPC, "Failed to get backup service").GetCode(); + } + return proxy->GetCompatibilityInfo(bundleName, extInfo, compatInfo); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_backup_session.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_backup_session.h index b32113789..d1bbec06e 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_backup_session.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_backup_session.h @@ -123,6 +123,16 @@ public: */ ErrCode CleanBundleTempDir(const std::string &bundleName); + /** + * @brief 获取备份或恢复的应用的兼容性信息 + * + * @param bundleName 应用名称 + * @param extInfo 导入给应用的信息 + * @param compatInfo 应用返回的兼容信息 + * @return ErrCode 规范错误码 + */ + ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo); + public: ~BIncrementalBackupSession(); diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_restore_session.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_restore_session.h index feaadb654..64855efab 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_restore_session.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_incremental_restore_session.h @@ -145,6 +145,16 @@ public: */ ErrCode CleanBundleTempDir(const std::string &bundleName); + /** + * @brief 获取备份或恢复的应用的兼容性信息 + * + * @param bundleName 应用名称 + * @param extInfo 导入给应用的信息 + * @param compatInfo 应用返回的兼容信息 + * @return ErrCode 规范错误码 + */ + ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo); + public: ~BIncrementalRestoreSession(); diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_backup.h b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_backup.h index 7f5cd583d..4382c0d08 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/b_session_backup.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/b_session_backup.h @@ -138,6 +138,16 @@ public: */ ErrCode CleanBundleTempDir(const std::string &bundleName); + /** + * @brief 获取备份或恢复的应用的兼容性信息 + * + * @param bundleName 应用名称 + * @param extInfo 导入给应用的信息 + * @param compatInfo 应用返回的兼容信息 + * @return ErrCode 规范错误码 + */ + ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo); + public: ~BSessionBackup(); 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 4dd41dc36..e637a1354 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 @@ -145,6 +145,16 @@ public: */ ErrCode CleanBundleTempDir(const std::string &bundleName); + /** + * @brief 获取备份或恢复的应用的兼容性信息 + * + * @param bundleName 应用名称 + * @param extInfo 导入给应用的信息 + * @param compatInfo 应用返回的兼容信息 + * @return ErrCode 规范错误码 + */ + ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo); + public: ~BSessionRestore(); diff --git a/interfaces/kits/js/backup/session_backup_n_exporter.cpp b/interfaces/kits/js/backup/session_backup_n_exporter.cpp index bcd5846fc..e1d5f6328 100644 --- a/interfaces/kits/js/backup/session_backup_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_backup_n_exporter.cpp @@ -712,6 +712,81 @@ napi_value SessionBackupNExporter::CleanBundleTempDir(napi_env env, napi_callbac return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; } +static NContextCBExec GetCompatibilityInfoCBExec(napi_env env, const NFuncArg &funcArg, string bundleName, + string extInfo, shared_ptr compatInfo) +{ + auto backupEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (!(backupEntity && (backupEntity->session))) { + HILOGE("Failed to get BackupSession entity."); + return nullptr; + } + return [entity {backupEntity}, bundleName, extInfo, compatInfo]() -> NError { + if (!(entity && (entity->session))) { + return NError(BError(BError::Codes::SDK_INVAL_ARG, "Backup session is nullptr").GetCode()); + } + return NError(entity->session->GetCompatibilityInfo(bundleName, extInfo, *compatInfo)); + }; +} + +static bool ParseCompatInfoParam(napi_env env, NFuncArg &funcArg, string &bundleName, string &extInfo) +{ + if (!funcArg.InitArgs(NARG_CNT::TWO)) { + HILOGE("Number of arguments unmatched"); + return false; + } + NVal jsBundleName(env, funcArg[NARG_POS::FIRST]); + auto [succ, bundleNamePtr, sizeStr] = jsBundleName.ToUTF8String(); + if (!succ) { + HILOGE("First arguments is not string."); + return false; + } + NVal jsExtInfo(env, funcArg[NARG_POS::SECOND]); + auto [succ1, extInfoPtr, sizeStr1] = jsExtInfo.ToUTF8String(); + if (!succ1) { + HILOGE("Second arguments is not string."); + return false; + } + bundleName = string(bundleNamePtr.get()); + extInfo = string(extInfoPtr.get()); + return true; +} + +napi_value SessionBackupNExporter::GetCompatibilityInfo(napi_env env, napi_callback_info cbinfo) +{ + HILOGI("Called SessionBackupNExporter::GetCompatibilityInfo 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); + string bundleName; + string extInfo; + if (!ParseCompatInfoParam(env, funcArg, bundleName, extInfo)) { + NError(E_PARAMS).ThrowErr(env); + return nullptr; + } + + auto compatInfo = std::make_shared(); + auto cbExec = GetCompatibilityInfoCBExec(env, funcArg, bundleName, extInfo, compatInfo); + if (cbExec == nullptr) { + NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get BackupSession entity.").GetCode()).ThrowErr(env); + return nullptr; + } + auto cbCompl = [compatInfo](napi_env env, NError err) -> NVal { + return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUTF8String(env, *compatInfo); + }; + + NVal thisVar(env, funcArg.GetThisVar()); + return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; +} + bool SessionBackupNExporter::Export() { HILOGD("called SessionBackupNExporter::Export begin"); @@ -722,6 +797,7 @@ bool SessionBackupNExporter::Export() NVal::DeclareNapiFunction("release", Release), NVal::DeclareNapiFunction("cancel", Cancel), NVal::DeclareNapiFunction("cleanBundleTempDir", CleanBundleTempDir), + NVal::DeclareNapiFunction("getCompatibilityInfo", GetCompatibilityInfo), }; auto [succ, classValue] = NClass::DefineClass(exports_.env_, className, Constructor, std::move(props)); diff --git a/interfaces/kits/js/backup/session_backup_n_exporter.h b/interfaces/kits/js/backup/session_backup_n_exporter.h index 708f3b9b7..92b0c8291 100644 --- a/interfaces/kits/js/backup/session_backup_n_exporter.h +++ b/interfaces/kits/js/backup/session_backup_n_exporter.h @@ -32,6 +32,7 @@ public: static napi_value Release(napi_env env, napi_callback_info cbinfo); static napi_value Cancel(napi_env env, napi_callback_info cbinfo); static napi_value CleanBundleTempDir(napi_env env, napi_callback_info cbinfo); + static napi_value GetCompatibilityInfo(napi_env env, napi_callback_info cbinfo); SessionBackupNExporter(napi_env env, napi_value exports); ~SessionBackupNExporter() override; 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 6c7c377fd..1cef934ed 100644 --- a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.cpp @@ -711,6 +711,82 @@ napi_value SessionIncrementalBackupNExporter::CleanBundleTempDir(napi_env env, n return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; } + +static NContextCBExec GetCompatibilityInfoCBExec(napi_env env, const NFuncArg &funcArg, string bundleName, + string extInfo, shared_ptr compatInfo) +{ + auto backupEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (!(backupEntity && (backupEntity->session))) { + HILOGE("Failed to get BackupSession entity."); + return nullptr; + } + return [entity {backupEntity}, bundleName, extInfo, compatInfo]() -> NError { + if (!(entity && (entity->session))) { + return NError(BError(BError::Codes::SDK_INVAL_ARG, "Backup session is nullptr").GetCode()); + } + return NError(entity->session->GetCompatibilityInfo(bundleName, extInfo, *compatInfo)); + }; +} + +static bool ParseCompatInfoParam(napi_env env, NFuncArg &funcArg, string &bundleName, string &extInfo) +{ + if (!funcArg.InitArgs(NARG_CNT::TWO)) { + HILOGE("Number of arguments unmatched"); + return false; + } + NVal jsBundleName(env, funcArg[NARG_POS::FIRST]); + auto [succ, bundleNamePtr, sizeStr] = jsBundleName.ToUTF8String(); + if (!succ) { + HILOGE("First arguments is not string."); + return false; + } + NVal jsExtInfo(env, funcArg[NARG_POS::SECOND]); + auto [succ1, extInfoPtr, sizeStr1] = jsExtInfo.ToUTF8String(); + if (!succ1) { + HILOGE("Second arguments is not string."); + return false; + } + bundleName = string(bundleNamePtr.get()); + extInfo = string(extInfoPtr.get()); + return true; +} + +napi_value SessionIncrementalBackupNExporter::GetCompatibilityInfo(napi_env env, napi_callback_info cbinfo) +{ + HILOGI("Called SessionIncrementalBackupNExporter::GetCompatibilityInfo 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); + string bundleName; + string extInfo; + if (!ParseCompatInfoParam(env, funcArg, bundleName, extInfo)) { + NError(E_PARAMS).ThrowErr(env); + return nullptr; + } + + auto compatInfo = std::make_shared(); + auto cbExec = GetCompatibilityInfoCBExec(env, funcArg, bundleName, extInfo, compatInfo); + if (cbExec == nullptr) { + NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get BackupSession entity.").GetCode()).ThrowErr(env); + return nullptr; + } + auto cbCompl = [compatInfo](napi_env env, NError err) -> NVal { + return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUTF8String(env, *compatInfo); + }; + + NVal thisVar(env, funcArg.GetThisVar()); + return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; +} + bool SessionIncrementalBackupNExporter::Export() { HILOGD("called SessionIncrementalBackupNExporter::Export begin"); @@ -721,6 +797,7 @@ bool SessionIncrementalBackupNExporter::Export() NVal::DeclareNapiFunction("release", Release), NVal::DeclareNapiFunction("cancel", Cancel), NVal::DeclareNapiFunction("cleanBundleTempDir", CleanBundleTempDir), + NVal::DeclareNapiFunction("getCompatibilityInfo", GetCompatibilityInfo), }; auto [succ, classValue] = NClass::DefineClass(exports_.env_, className, Constructor, std::move(props)); diff --git a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.h b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.h index 7f9547232..6ebba0c6f 100644 --- a/interfaces/kits/js/backup/session_incremental_backup_n_exporter.h +++ b/interfaces/kits/js/backup/session_incremental_backup_n_exporter.h @@ -32,6 +32,7 @@ public: static napi_value Release(napi_env env, napi_callback_info cbinfo); static napi_value Cancel(napi_env env, napi_callback_info cbinfo); static napi_value CleanBundleTempDir(napi_env env, napi_callback_info cbinfo); + static napi_value GetCompatibilityInfo(napi_env env, napi_callback_info cbinfo); SessionIncrementalBackupNExporter(napi_env env, napi_value exports); ~SessionIncrementalBackupNExporter() override; diff --git a/interfaces/kits/js/backup/session_restore_n_exporter.cpp b/interfaces/kits/js/backup/session_restore_n_exporter.cpp index b57a9b271..154012230 100644 --- a/interfaces/kits/js/backup/session_restore_n_exporter.cpp +++ b/interfaces/kits/js/backup/session_restore_n_exporter.cpp @@ -905,6 +905,84 @@ napi_value SessionRestoreNExporter::CleanBundleTempDir(napi_env env, napi_callba return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; } +static NContextCBExec GetCompatibilityInfoCBExec(napi_env env, const NFuncArg &funcArg, string bundleName, + string extInfo, shared_ptr compatInfo) +{ + auto restoreEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); + if (!(restoreEntity && (restoreEntity->sessionWhole || restoreEntity->sessionSheet))) { + HILOGE("Failed to get RestoreSession entity."); + return nullptr; + } + return [entity {restoreEntity}, bundleName, extInfo, compatInfo]() -> NError { + if (!(entity && (entity->sessionWhole || entity->sessionSheet))) { + return NError(BError(BError::Codes::SDK_INVAL_ARG, "restore session is nullptr").GetCode()); + } + if (entity->sessionWhole) { + return NError(entity->sessionWhole->GetCompatibilityInfo(bundleName, extInfo, *compatInfo)); + } + return NError(entity->sessionSheet->GetCompatibilityInfo(bundleName, extInfo, *compatInfo)); + }; +} + +static bool ParseCompatInfoParam(napi_env env, NFuncArg &funcArg, string &bundleName, string &extInfo) +{ + if (!funcArg.InitArgs(NARG_CNT::TWO)) { + HILOGE("Number of arguments unmatched"); + return false; + } + NVal jsBundleName(env, funcArg[NARG_POS::FIRST]); + auto [succ, bundleNamePtr, sizeStr] = jsBundleName.ToUTF8String(); + if (!succ) { + HILOGE("First arguments is not string."); + return false; + } + NVal jsExtInfo(env, funcArg[NARG_POS::SECOND]); + auto [succ1, extInfoPtr, sizeStr1] = jsExtInfo.ToUTF8String(); + if (!succ1) { + HILOGE("Second arguments is not string."); + return false; + } + bundleName = string(bundleNamePtr.get()); + extInfo = string(extInfoPtr.get()); + return true; +} + +napi_value SessionRestoreNExporter::GetCompatibilityInfo(napi_env env, napi_callback_info cbinfo) +{ + HILOGI("Called SessionRestore::GetCompatibilityInfo 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); + string bundleName; + string extInfo; + if (!ParseCompatInfoParam(env, funcArg, bundleName, extInfo)) { + NError(E_PARAMS).ThrowErr(env); + return nullptr; + } + + auto compatInfo = std::make_shared(); + auto cbExec = GetCompatibilityInfoCBExec(env, funcArg, bundleName, extInfo, compatInfo); + if (cbExec == nullptr) { + NError(BError(BError::Codes::SDK_INVAL_ARG, "Failed to get RestoreSession entity.").GetCode()).ThrowErr(env); + return nullptr; + } + auto cbCompl = [compatInfo](napi_env env, NError err) -> NVal { + return err ? NVal {env, err.GetNapiErr(env)} : NVal::CreateUTF8String(env, *compatInfo); + }; + + NVal thisVar(env, funcArg.GetThisVar()); + return NAsyncWorkPromise(env, thisVar).Schedule(className, cbExec, cbCompl).val_; +} + bool SessionRestoreNExporter::Export() { HILOGD("called SessionRestoreNExporter::Export begin"); @@ -916,6 +994,7 @@ bool SessionRestoreNExporter::Export() NVal::DeclareNapiFunction("release", Release), NVal::DeclareNapiFunction("cancel", Cancel), NVal::DeclareNapiFunction("cleanBundleTempDir", CleanBundleTempDir), + NVal::DeclareNapiFunction("getCompatibilityInfo", GetCompatibilityInfo), }; auto [succ, classValue] = NClass::DefineClass(exports_.env_, className, Constructor, std::move(props)); diff --git a/interfaces/kits/js/backup/session_restore_n_exporter.h b/interfaces/kits/js/backup/session_restore_n_exporter.h index 12a40fca8..8924a4dfc 100644 --- a/interfaces/kits/js/backup/session_restore_n_exporter.h +++ b/interfaces/kits/js/backup/session_restore_n_exporter.h @@ -36,6 +36,7 @@ public: static napi_value Release(napi_env env, napi_callback_info cbinfo); static napi_value Cancel(napi_env env, napi_callback_info cbinfo); static napi_value CleanBundleTempDir(napi_env env, napi_callback_info cbinfo); + static napi_value GetCompatibilityInfo(napi_env env, napi_callback_info cbinfo); SessionRestoreNExporter(napi_env env, napi_value exports); ~SessionRestoreNExporter() override; diff --git a/services/backup_sa/IService.idl b/services/backup_sa/IService.idl index 1fdf7524e..dda0fe4a0 100644 --- a/services/backup_sa/IService.idl +++ b/services/backup_sa/IService.idl @@ -76,4 +76,5 @@ interface OHOS.FileManagement.Backup.IService{ [ipccode 42] void GetExtOnRelease([out] boolean isExtOnRelease); [ipccode 43] void AppFileReadyWithoutFd([in]String fileName, [in] int appFileReadyErrCode); [ipccode 44] void AppIncrementalFileReadyWithoutFd([in] String fileName, [in] int appIncrementalFileReadyErrCode); + [ipccode 45] void GetCompatibilityInfo([in] String bundleName, [in] String extInfo, [out] String compatInfo); } \ No newline at end of file diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 4a56703c7..3e5052d5b 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -120,6 +120,8 @@ public: ErrCode CleanBundleTempDir(const std::string &bundleName) override; ErrCode HandleExtDisconnect(bool isIncBackup) override; ErrCode GetExtOnRelease(bool &isExtOnRelease) override; + ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) override; // 以下都是非IPC接口 public: diff --git a/services/backup_sa/src/module_external/bms_adapter.cpp b/services/backup_sa/src/module_external/bms_adapter.cpp index b5b2c0204..67eb26936 100644 --- a/services/backup_sa/src/module_external/bms_adapter.cpp +++ b/services/backup_sa/src/module_external/bms_adapter.cpp @@ -68,7 +68,7 @@ static sptr GetBundleManager() return iface_cast(bundleObj); } -static tuple GetAllowAndExtName( +static tuple GetAllowAndExtName( const vector &extensionInfos) { for (auto &&ext : extensionInfos) { @@ -84,9 +84,9 @@ static tuple GetAllowAndExtName BJsonCachedEntity cachedEntity(out[0], ext.bundleName); auto cache = cachedEntity.Structuralize(); return {cache.GetAllowToBackupRestore(), cache.GetFullBackupOnly(), ext.name, cache.GetRestoreDeps(), - cache.GetSupportScene(), cache.GetExtraInfo()}; + cache.GetSupportScene(), cache.GetExtraInfo(), cache.GetRequireCompatibility()}; } - return {false, false, "", "", "", Json::Value()}; + return {false, false, "", "", "", Json::Value(), false}; } static int64_t GetBundleStats(const string &bundleName, int32_t userId) @@ -135,7 +135,7 @@ vector BundleMgrAdapter::GetBundleInfos(const vecto HILOGE("Get current extension failed, bundleName:%{public}s", bundleName.c_str()); continue; } - auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = + auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo, requireCompatibility] = GetAllowAndExtName(bundleExtInfo.extensionInfos_); int64_t dataSize = 0; if (allToBackup) { @@ -143,7 +143,7 @@ vector BundleMgrAdapter::GetBundleInfos(const vecto } bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {bundleExtInfo.bundleInfo_.name, bundleExtInfo.bundleInfo_.appIndex, bundleExtInfo.bundleInfo_.versionCode, - bundleExtInfo.bundleInfo_.versionName, dataSize, 0, allToBackup, fullBackupOnly, + bundleExtInfo.bundleInfo_.versionName, dataSize, 0, allToBackup, fullBackupOnly, requireCompatibility, extName, restoreDeps, supportScene, extraInfo}); } HILOGI("End, bundleInfos size:%{public}zu", bundleInfos.size()); @@ -184,6 +184,7 @@ static bool GetBackupExtConfig(const vector &e backupPara.extraInfo = cache.GetExtraInfo(); backupPara.includes = cache.GetIncludes(); backupPara.excludes = cache.GetExcludes(); + backupPara.requireCompatibility = cache.GetRequireCompatibility(); return true; } return false; @@ -310,7 +311,8 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {bundleExtInfo.bundleInfo_.name, bundleExtInfo.bundleInfo_.appIndex, bundleExtInfo.bundleInfo_.versionCode, bundleExtInfo.bundleInfo_.versionName, 0, 0, backupPara.allToBackup, backupPara.fullBackupOnly, - backupPara.extensionName, backupPara.restoreDeps, backupPara.supportScene, backupPara.extraInfo}); + backupPara.requireCompatibility, backupPara.extensionName, backupPara.restoreDeps, backupPara.supportScene, + backupPara.extraInfo}); if (bundleExtInfo.bundleInfo_.appIndex > 0) { std::string bundleNameIndex = "+clone-" + std::to_string(bundleExtInfo.bundleInfo_.appIndex) + "+" + bundleExtInfo.bundleInfo_.name; @@ -349,12 +351,12 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement HILOGI("Unsupported applications, name : %{public}s", installedBundle.name.data()); continue; } - auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = + auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo, requireCompatibility] = GetAllowAndExtName(installedBundle.extensionInfos); if (!allToBackup) { bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.appIndex, installedBundle.versionCode, installedBundle.versionName, 0, 0, allToBackup, fullBackupOnly, - extName, restoreDeps, supportScene, extraInfo}); + requireCompatibility, extName, restoreDeps, supportScene, extraInfo}); continue; } auto it = std::find_if(extraIncreData.begin(), extraIncreData.end(), @@ -404,13 +406,13 @@ vector BundleMgrAdapter::GetFullBundleInfos(int32_t bundleNames.emplace_back(bundleNameIndexInfo); continue; } - auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = + auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo, requireCompatibility] = GetAllowAndExtName(installedBundle.extensionInfos); if (!allToBackup) { HILOGI("Not allToBackup, bundleName = %{public}s", installedBundle.name.data()); bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {installedBundle.name, installedBundle.appIndex, - installedBundle.versionCode, installedBundle.versionName, 0, 0, allToBackup, fullBackupOnly, extName, - restoreDeps, supportScene, extraInfo}); + installedBundle.versionCode, installedBundle.versionName, 0, 0, allToBackup, fullBackupOnly, + requireCompatibility, extName, restoreDeps, supportScene, extraInfo}); continue; } bundleNames.emplace_back(installedBundle.name); @@ -464,7 +466,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForSA() HILOGI("GetExtensionSaIds ret: %{public}d", ret); for (const auto &saId : saIds) { saBundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {std::to_string(saId), 0, 0, "", 0, 0, true, false, - "", "", "", ""}); + false, "", "", "", ""}); } return saBundleInfos; } @@ -493,7 +495,8 @@ void BundleMgrAdapter::GetBundleInfoForSA(std::string bundleName, std::vector BundleMgrAdapter::GetBundleInfosForLoca bundleNames.emplace_back(bundleNameIndexInfo); continue; } - auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = + auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo, requireCompatibility] = GetAllowAndExtName(installedBundle.extensionInfos); if (!allToBackup) { HILOGI("Not allToBackup, bundleName = %{public}s, appIndex = %{public}d", @@ -601,7 +604,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForLoca bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo { installedBundle.name, installedBundle.appIndex, installedBundle.versionCode, installedBundle.versionName, - 0, 0, allToBackup, fullBackupOnly, + 0, 0, allToBackup, fullBackupOnly, requireCompatibility, extName, restoreDeps, supportScene, extraInfo}); } auto bundleInfosIndex = GetBundleInfosForIndex(bundleNames, userId); @@ -625,7 +628,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForInde HILOGE("Get current extension failed, bundleName:%{public}s", bundleName.c_str()); continue; } - auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo] = + auto [allToBackup, fullBackupOnly, extName, restoreDeps, supportScene, extraInfo, requireCompatibility] = GetAllowAndExtName(bundleExtInfo.extensionInfos_); if (!allToBackup) { HILOGI("Not allToBackup, bundleName = %{public}s, appIndex = %{public}d", @@ -635,7 +638,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForInde bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo { bundleExtInfo.bundleInfo_.name, bundleExtInfo.bundleInfo_.appIndex, bundleExtInfo.bundleInfo_.versionCode, bundleExtInfo.bundleInfo_.versionName, - 0, 0, allToBackup, fullBackupOnly, + 0, 0, allToBackup, fullBackupOnly, requireCompatibility, extName, restoreDeps, supportScene, extraInfo}); } HILOGI("End, bundleInfos size:%{public}zu", bundleInfos.size()); @@ -699,7 +702,8 @@ std::vector BundleMgrAdapter::GetBundleInfosForAppe bundleInfos.emplace_back(BJsonEntityCaps::BundleInfo {bundleExtInfo.bundleInfo_.name, bundleExtInfo.bundleInfo_.appIndex, bundleExtInfo.bundleInfo_.versionCode, bundleExtInfo.bundleInfo_.versionName, 0, 0, backupPara.allToBackup, backupPara.fullBackupOnly, - backupPara.extensionName, backupPara.restoreDeps, backupPara.supportScene, backupPara.extraInfo}); + backupPara.requireCompatibility, backupPara.extensionName, backupPara.restoreDeps, backupPara.supportScene, + backupPara.extraInfo}); } for (const auto &info : incrementalDataList) { if (SAUtils::IsSABundleName(info.bundleName)) { diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 897c9bf15..d26e879c5 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -1532,4 +1532,51 @@ void Service::HandleOnReleaseAndDisconnect(sptr sessionPtr, c proxy->HandleOnRelease(static_cast(sessionPtr->GetScenario())); sessionConnection->DisconnectBackupExtAbility(); } + +ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + HILOGI("Service::GetCompatibilityInfo begin bundleName: %{public}s", bundleName.c_str()); + HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + ErrCode err = VerifyCaller(); + if (err != ERR_OK) { + HILOGE("VerifyCaller failed"); + return err; + } + if (SAUtils::IsSABundleName(bundleName)) { + HILOGE("SA not support"); + return BError(BError::Codes::SA_INVAL_ARG); + } + if (session_ == nullptr) { + HILOGE("session is empty or busy"); + return BError(BError::Codes::SA_INVAL_ARG); + } + sptr backupConnection; + err = TryToConnectExt(bundleName, backupConnection); + if (err != BError(BError::Codes::OK)) { + return err; + } + std::unique_lock lock(getBackupInfoSyncLock_); + getBackupInfoCondition_.wait_for(lock, std::chrono::seconds(CONNECT_WAIT_TIME_S)); + if (isConnectDied_.load()) { + HILOGE("backupConnection connect timeout"); + isConnectDied_.store(false); + return BError(BError::Codes::EXT_ABILITY_DIED); + } + session_->IncreaseSessionCnt(__PRETTY_FUNCTION__); + auto proxy = backupConnection->GetBackupExtProxy(); + if (!proxy) { + HILOGE("Extension backup Proxy is empty."); + backupConnection->DisconnectBackupExtAbility(); + session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); + return BError(BError::Codes::SA_INVAL_ARG); + } + err = proxy->HandleGetCompatibilityInfo(extInfo, static_cast(session_->GetScenario()), compatInfo); + if (err != BError(BError::Codes::OK)) { + HILOGE("HandleGetCompatibilityInfo failed"); + } + backupConnection->DisconnectBackupExtAbility(); + session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); + return err; +} } \ No newline at end of file diff --git a/tests/mock/backup_ext/include/ext_backup_js_mock.h b/tests/mock/backup_ext/include/ext_backup_js_mock.h index fb59bfaa7..e8cf5e60c 100644 --- a/tests/mock/backup_ext/include/ext_backup_js_mock.h +++ b/tests/mock/backup_ext/include/ext_backup_js_mock.h @@ -52,8 +52,8 @@ public: virtual void ExportJsContext() = 0; virtual ErrCode OnRelease(std::function, int32_t scenario) = 0; virtual std::function &argv) ParseReleaseInfo() = 0; - virtual ErrCode GetBackupCompatibilityInfo(std::function , std::string) = 0; - virtual ErrCode GetRestoreCompatibilityInfo(std::function , std::string) = 0; + virtual ErrCode GetBackupCompatibilityInfo(std::function, std::string) = 0; + virtual ErrCode GetRestoreCompatibilityInfo(std::function, std::string) = 0; virtual std::function &argv) ParseCompatibilityInfo() = 0; public: virtual bool GetProfileFromAbility(const OHOS::AppExecFwk::AbilityInfo &, const std::string &, diff --git a/tests/mock/backup_ext/include/ext_backup_mock.h b/tests/mock/backup_ext/include/ext_backup_mock.h index 9687dcef1..909d706b2 100644 --- a/tests/mock/backup_ext/include/ext_backup_mock.h +++ b/tests/mock/backup_ext/include/ext_backup_mock.h @@ -53,8 +53,8 @@ public: virtual ErrCode GetParament(const AAFwk::Want &) = 0; virtual ErrCode OnProcess(std::function callback) = 0; virtual ErrCode OnRelease(std::function callback, int32_t scenario) = 0; - virtual ErrCode GetBackupCompatibilityInfo(std::function , std::string) = 0; - virtual ErrCode GetRestoreCompatibilityInfo(std::function , std::string) = 0; + virtual ErrCode GetBackupCompatibilityInfo(std::function, std::string) = 0; + virtual ErrCode GetRestoreCompatibilityInfo(std::function, std::string) = 0; public: virtual std::unique_ptr LoadSystemModuleByEngine(napi_env, const std::string&, const napi_value*, size_t) = 0; diff --git a/tests/mock/backup_kit_inner/service_proxy_mock.cpp b/tests/mock/backup_kit_inner/service_proxy_mock.cpp index fe62af42e..e605bfbf5 100644 --- a/tests/mock/backup_kit_inner/service_proxy_mock.cpp +++ b/tests/mock/backup_kit_inner/service_proxy_mock.cpp @@ -286,4 +286,10 @@ ErrCode ServiceProxy::GetExtOnRelease(bool &isExtOnRelease) { return BError(BError::Codes::OK); } + +ErrCode ServiceProxy::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + return BError(BError::Codes::OK); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/mock/module_external/bms_adapter_mock.cpp b/tests/mock/module_external/bms_adapter_mock.cpp index 83f98eace..9694e08bc 100644 --- a/tests/mock/module_external/bms_adapter_mock.cpp +++ b/tests/mock/module_external/bms_adapter_mock.cpp @@ -32,7 +32,7 @@ vector BundleMgrAdapter::GetBundleInfos(const vecto { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -47,7 +47,7 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -57,7 +57,7 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -67,7 +67,7 @@ vector BundleMgrAdapter::GetFullBundleInfos(int32_t { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -87,7 +87,7 @@ vector BundleMgrAdapter::GetBundleInfosForAppend( { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -96,7 +96,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForLoca { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -106,7 +106,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForInde { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, false, "com.example.app2backup"}); return bundleInfos; } @@ -123,7 +123,7 @@ vector BundleMgrAdapter::GetBundleInfosForAppendBun { vector bundleInfos; bundleInfos.emplace_back( - BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, + BJsonEntityCaps::BundleInfo {"com.example.app2backup", 0, {}, {}, 0, 0, true, false, 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 ed5c558fe..ff713dbb0 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -450,4 +450,10 @@ ErrCode Service::GetExtOnRelease(bool &isExtOnRelease) { return BError(BError::Codes::OK); } + +ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + return BError(BError::Codes::OK); +} } // namespace OHOS::FileManagement::Backup 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 727593169..5c616fb12 100644 --- a/tests/moduletests/backup_kit_inner/b_session_backup_test.cpp +++ b/tests/moduletests/backup_kit_inner/b_session_backup_test.cpp @@ -509,4 +509,35 @@ HWTEST_F(BSessionBackupTest, SUB_backup_b_session_backup_1300, testing::ext::Tes } GTEST_LOG_(INFO) << "BSessionBackupTest-end SUB_backup_b_session_backup_1300"; } + +/** + * @tc.number: SUB_BSessionBackup_GetCompatibilityInfo_0000 + * @tc.name: SUB_BSessionBackup_GetCompatibilityInfo_0000 + * @tc.desc: 测试 GetCompatibilityInfo 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(BSessionBackupTest, SUB_BSessionBackup_GetCompatibilityInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BSessionBackupTest-begin SUB_BSessionBackup_GetCompatibilityInfo_0000"; + try { + ASSERT_TRUE(backupPtr_ != nullptr); + std::string bundleName = "com.example.app"; + std::string extInfo = ""; + std::string compatInfo = ""; + SetMockGetInstance(false); + auto err = backupPtr_->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, BError(BError::Codes::SDK_BROKEN_IPC).GetCode()); + + SetMockGetInstance(true); + err = backupPtr_->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BSessionBackupTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "BSessionBackupTest-end SUB_BSessionBackup_GetCompatibilityInfo_0000"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/moduletests/backup_kit_inner/b_session_restore_test.cpp b/tests/moduletests/backup_kit_inner/b_session_restore_test.cpp index cfac6d5a4..526da2354 100644 --- a/tests/moduletests/backup_kit_inner/b_session_restore_test.cpp +++ b/tests/moduletests/backup_kit_inner/b_session_restore_test.cpp @@ -545,4 +545,35 @@ HWTEST_F(BSessionRestoreTest, SUB_backup_b_session_restore_1200, testing::ext::T } GTEST_LOG_(INFO) << "BSessionRestoreTest-end SUB_backup_b_session_restore_1200"; } + +/** + * @tc.number: SUB_BSessionRestore_GetCompatibilityInfo_0000 + * @tc.name: SUB_BSessionRestore_GetCompatibilityInfo_0000 + * @tc.desc: 测试 GetCompatibilityInfo 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(BSessionRestoreTest, SUB_BSessionRestore_GetCompatibilityInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "BSessionRestoreTest-begin SUB_BSessionRestore_GetCompatibilityInfo_0000"; + try { + ASSERT_TRUE(restorePtr_ != nullptr); + std::string bundleName = "com.example.app"; + std::string extInfo = ""; + std::string compatInfo = ""; + SetMockGetInstance(false); + auto err = restorePtr_->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, BError(BError::Codes::SDK_BROKEN_IPC).GetCode()); + + SetMockGetInstance(true); + err = restorePtr_->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BSessionRestoreTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "BSessionRestoreTest-end SUB_BSessionRestore_GetCompatibilityInfo_0000"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file 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 7f2c4e24a..6745527d4 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 @@ -282,6 +282,11 @@ public: { return BError(BError::Codes::OK); }; + + ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo) + { + 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_sa/module_ipc/service_incremental_test.cpp b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp index 314bcd047..918949c97 100644 --- a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp @@ -81,6 +81,7 @@ public: virtual ErrCode GetExtOnRelease(bool&) = 0; virtual void SetExtOnRelease(const BundleName&, bool) = 0; virtual void RemoveExtOnRelease(const BundleName&) = 0; + virtual ErrCode GetCompatibilityInfo(const std::string&, const std::string&, std::string&) = 0; public: virtual bool UpdateToRestoreBundleMap(const string&, const string&) = 0; public: @@ -141,6 +142,7 @@ public: MOCK_METHOD(ErrCode, GetExtOnRelease, (bool&)); MOCK_METHOD(void, SetExtOnRelease, (const BundleName&, bool)); MOCK_METHOD(void, RemoveExtOnRelease, (const BundleName&)); + MOCK_METHOD(ErrCode, GetCompatibilityInfo, (const std::string&, const std::string&, std::string&)); public: MOCK_METHOD(bool, UpdateToRestoreBundleMap, (const string&, const string&)); }; @@ -478,6 +480,12 @@ void Service::RemoveExtOnRelease(const BundleName &bundleName) { return BService::serviceMock->RemoveExtOnRelease(bundleName); } + +ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + return BService::serviceMock->GetCompatibilityInfo(bundleName, extInfo, compatInfo); +} } // namespace OHOS::FileManagement::Backup namespace OHOS::FileManagement::Backup { 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 8dd2ecd81..57a64d87f 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -947,7 +947,7 @@ HWTEST_F(ServiceTest, SUB_Service_SetCurrentSessProperties_0100, TestSize.Level1 service->session_ = sptr(new SvcSessionManager(wptr(service))); service->SetCurrentSessProperties(info, isClearDataFlags, bundleNameIndexInfo); - info = BJsonEntityCaps::BundleInfo{BUNDLE_NAME, 0, {}, {}, 0, 0, true, false, BUNDLE_NAME}; + info = BJsonEntityCaps::BundleInfo {BUNDLE_NAME, 0, {}, {}, 0, 0, true, false, false, BUNDLE_NAME}; isClearDataFlags = {{BUNDLE_NAME, true}}; service->SetCurrentSessProperties(info, isClearDataFlags, bundleNameIndexInfo); } catch (...) { diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index 9c4d3fb16..161dfe7c5 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -2177,4 +2177,145 @@ HWTEST_F(ServiceTest, SUB_Service_GetExtOnRelease_0200, testing::ext::TestSize.L GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetExtOnRelease."; } GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetExtOnRelease_0200"; +} + +/** + * @tc.number: SUB_Service_GetCompatibilityInfo_0000 + * @tc.name: SUB_Service_GetCompatibilityInfo_0000 + * @tc.desc: 测试 GetCompatibilityInfo 的正常/异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetCompatibilityInfo_0000"; + try { + std::string bundleName = "com.ohos.test"; + std::string extInfo = ""; + std::string compatInfo = ""; + + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)) + .WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE)); + EXPECT_CALL(*token, VerifyAccessToken(_, _)) + .WillOnce(Return(Security::AccessToken::PermissionState::PERMISSION_DENIED)) + .WillRepeatedly(Return(Security::AccessToken::PermissionState::PERMISSION_GRANTED)); + EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) + .WillRepeatedly(Return(make_pair(true, DEBUG_ID + 1))); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); + + int res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); + + res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetCompatibilityInfo_0000"; +} + +/** + * @tc.number: SUB_Service_GetCompatibilityInfo_0100 + * @tc.name: SUB_Service_GetCompatibilityInfo_0100 + * @tc.desc: 测试 GetCompatibilityInfo 的正常/异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetCompatibilityInfo_0100"; + try { + std::string bundleName = "com.ohos.test"; + std::string extInfo = ""; + std::string compatInfo = ""; + + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)) + .WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE)); + EXPECT_CALL(*token, VerifyAccessToken(_, _)) + .WillRepeatedly(Return(Security::AccessToken::PermissionState::PERMISSION_GRANTED)); + EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) + .WillRepeatedly(Return(make_pair(true, DEBUG_ID + 1))); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillRepeatedly(Return(false)); + + auto session_ = service->session_; + service->session_ = nullptr; + int res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + service->session_ = session_; + + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(nullptr)); + EXPECT_CALL(*session, CreateBackupConnection(_)).WillOnce(Return(nullptr)); + res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetCompatibilityInfo_0100"; +} + +/** + * @tc.number: SUB_Service_GetCompatibilityInfo_0200 + * @tc.name: SUB_Service_GetCompatibilityInfo_0200 + * @tc.desc: 测试 GetCompatibilityInfo 的正常/异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0200, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_GetCompatibilityInfo_0200"; + try { + std::string bundleName = "com.ohos.test"; + std::string extInfo = ""; + std::string compatInfo = ""; + + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)) + .WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE)); + EXPECT_CALL(*token, VerifyAccessToken(_, _)) + .WillRepeatedly(Return(Security::AccessToken::PermissionState::PERMISSION_GRANTED)); + EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) + .WillRepeatedly(Return(make_pair(true, DEBUG_ID + 1))); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillRepeatedly(Return(false)); + + auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; + auto callConnected = [](const string &&bundleName) {}; + auto connectPtr = sptr(new SvcBackupConnection(callDied, callConnected, bundleName)); + EXPECT_CALL(*session, GetExtConnection(_)).WillRepeatedly(Return(wptr(connectPtr))); + EXPECT_CALL(*connect, IsExtAbilityConnected()).WillRepeatedly(Return(true)); + service->isConnectDied_ = true; + int res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::EXT_ABILITY_DIED).GetCode()); + + service->isConnectDied_ = false; + EXPECT_CALL(*connect, GetBackupExtProxy()) + .WillOnce(Return(nullptr)) + .WillRepeatedly(Return(svcProxy)); + EXPECT_CALL(*connect, DisconnectBackupExtAbility()).WillRepeatedly(Return(BError(BError::Codes::OK).GetCode())); + res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + + EXPECT_CALL(*svcProxy, HandleGetCompatibilityInfo(_, _, _)) + .WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); + res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + + EXPECT_CALL(*svcProxy, HandleGetCompatibilityInfo(_, _, _)) + .WillOnce(Return(BError(BError::Codes::OK).GetCode())); + res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(res, BError(BError::Codes::OK).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetCompatibilityInfo_0200"; } \ 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 6cfb25ca4..817879ecb 100644 --- a/tests/unittests/backup_sa/session/b_incremental_session_test.cpp +++ b/tests/unittests/backup_sa/session/b_incremental_session_test.cpp @@ -973,4 +973,80 @@ HWTEST_F(IncrementalSessionTest, SUB_b_incremental_session_test_2900, testing::e } GTEST_LOG_(INFO) << "IncrementalSessionTest-end SUB_b_incremental_session_test_2900"; } + +/** + * @tc.number: SUB_BIncrementalBackupSession_GetCompatibilityInfo_0000 + * @tc.name: SUB_BIncrementalBackupSession_GetCompatibilityInfo_0000 + * @tc.desc: 测试 GetCompatibilityInfo 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(IncrementalSessionTest, SUB_BIncrementalBackupSession_GetCompatibilityInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "IncrementalSessionTest-begin SUB_BIncrementalBackupSession_GetCompatibilityInfo_0000"; + try { + std::string bundleName = "com.example.app"; + std::string extInfo = ""; + std::string compatInfo = ""; + + ServiceClient::serviceProxy_ = nullptr; + ASSERT_TRUE(backupSession != nullptr); + auto err = backupSession->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, BError(BError::Codes::SDK_BROKEN_IPC).GetCode()); + + ServiceClient::serviceProxy_ = proxy; + EXPECT_CALL(*proxy, GetCompatibilityInfo(_, _, _)) + .WillOnce(Return(BError(BError::Codes::SDK_INVAL_ARG).GetCode())); + err = backupSession->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, BError(BError::Codes::SDK_INVAL_ARG).GetCode()); + + EXPECT_CALL(*proxy, GetCompatibilityInfo(_, _, _)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + err = backupSession->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, ERROR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "IncrementalSessionTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "IncrementalSessionTest-end SUB_BIncrementalBackupSession_GetCompatibilityInfo_0000"; +} + +/** + * @tc.number: SUB_BIncrementalStoreSession_GetCompatibilityInfo_0000 + * @tc.name: SUB_BIncrementalStoreSession_GetCompatibilityInfo_0000 + * @tc.desc: 测试 GetCompatibilityInfo 接口 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(IncrementalSessionTest, SUB_BIncrementalStoreSession_GetCompatibilityInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "IncrementalSessionTest-begin SUB_BIncrementalStoreSession_GetCompatibilityInfo_0000"; + try { + std::string bundleName = "com.example.app"; + std::string extInfo = ""; + std::string compatInfo = ""; + + ServiceClient::serviceProxy_ = nullptr; + ASSERT_TRUE(restoreSession != nullptr); + auto err = restoreSession->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, BError(BError::Codes::SDK_BROKEN_IPC).GetCode()); + + ServiceClient::serviceProxy_ = proxy; + EXPECT_CALL(*proxy, GetCompatibilityInfo(_, _, _)) + .WillOnce(Return(BError(BError::Codes::SDK_INVAL_ARG).GetCode())); + err = restoreSession->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, BError(BError::Codes::SDK_INVAL_ARG).GetCode()); + + EXPECT_CALL(*proxy, GetCompatibilityInfo(_, _, _)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + err = restoreSession->GetCompatibilityInfo(bundleName, extInfo, compatInfo); + EXPECT_EQ(err, ERROR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "IncrementalSessionTest-an exception occurred by GetCompatibilityInfo."; + } + GTEST_LOG_(INFO) << "IncrementalSessionTest-end SUB_BIncrementalStoreSession_GetCompatibilityInfo_0000"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/session/service_proxy_mock.cpp b/tests/unittests/backup_sa/session/service_proxy_mock.cpp index 19d658f02..f07378af4 100644 --- a/tests/unittests/backup_sa/session/service_proxy_mock.cpp +++ b/tests/unittests/backup_sa/session/service_proxy_mock.cpp @@ -260,4 +260,10 @@ ErrCode ServiceProxy::GetExtOnRelease(bool &isExtOnRelease) { return BError(BError::Codes::OK); } + +ErrCode ServiceProxy::GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, + std::string &compatInfo) +{ + return BError(BError::Codes::OK); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/session/service_proxy_mock.h b/tests/unittests/backup_sa/session/service_proxy_mock.h index b5675cf8e..40271c70d 100644 --- a/tests/unittests/backup_sa/session/service_proxy_mock.h +++ b/tests/unittests/backup_sa/session/service_proxy_mock.h @@ -77,6 +77,7 @@ public: MOCK_METHOD1(CleanBundleTempDir, ErrCode(const std::string &bundleName)); MOCK_METHOD1(HandleExtDisconnect, ErrCode(bool isIncBackup)); MOCK_METHOD1(GetExtOnRelease, ErrCode(bool &isExtOnRelease)); + MOCK_METHOD3(GetCompatibilityInfo, ErrCode(const std::string&, const std::string&, std::string&)); }; } // End of namespace OHOS::FileManagement::Backup #endif // TEST_UNITTEST_SERVICE_PROXY_MOCK_H diff --git a/tests/unittests/backup_utils/b_json/b_json_entity_extension_config_test.cpp b/tests/unittests/backup_utils/b_json/b_json_entity_extension_config_test.cpp index 3da3ab4c1..e91e5663f 100644 --- a/tests/unittests/backup_utils/b_json/b_json_entity_extension_config_test.cpp +++ b/tests/unittests/backup_utils/b_json/b_json_entity_extension_config_test.cpp @@ -1037,4 +1037,47 @@ HWTEST_F(BJsonEntityExtensionConfigTest, b_json_entity_extension_config_3700, te } GTEST_LOG_(INFO) << "BJsonEntityExtensionConfigTest-end b_json_entity_extension_config_3700"; } + +/** + * @tc.number: SUB_backup_b_json_entity_extension_config_3800 + * @tc.name: backup_b_json_entity_extension_config_3800 + * @tc.desc: 测试GetRequireCompatibility接口能否成功返回 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 2 + * @tc.require: NA + */ +HWTEST_F(BJsonEntityExtensionConfigTest, backup_b_json_entity_extension_config_3800, testing::ext::TestSize.Level2) +{ + GTEST_LOG_(INFO) << "BJsonEntityExtensionConfigTest-begin backup_b_json_entity_extension_config_3800"; + try { + string_view sv1 = R"({"":true})"; + BJsonCachedEntity cachedEntity1(sv1); + auto cache1 = cachedEntity1.Structuralize(); + bool ret = cache1.GetRequireCompatibility(); + EXPECT_FALSE(ret); + + string_view sv2 = R"({"requireCompatibility1":true})"; + BJsonCachedEntity cachedEntity2(sv2); + auto cache2 = cachedEntity2.Structuralize(); + ret = cache2.GetRequireCompatibility(); + EXPECT_FALSE(ret); + + string_view sv3 = R"({"requireCompatibility":123})"; + BJsonCachedEntity cachedEntity3(sv3); + auto cache3 = cachedEntity3.Structuralize(); + ret = cache3.GetRequireCompatibility(); + EXPECT_FALSE(ret); + + string_view sv4 = R"({"requireCompatibility":true})"; + BJsonCachedEntity cachedEntity4(sv4); + auto cache4 = cachedEntity4.Structuralize(); + ret = cache4.GetRequireCompatibility(); + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "BJsonEntityExtensionConfigTest-an exception occurred by GetRequireCompatibility."; + } + GTEST_LOG_(INFO) << "BJsonEntityExtensionConfigTest-end backup_b_json_entity_extension_config_3800"; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/include/b_json/b_json_entity_caps.h b/utils/include/b_json/b_json_entity_caps.h index 1321ecde5..eabbf02ad 100644 --- a/utils/include/b_json/b_json_entity_caps.h +++ b/utils/include/b_json/b_json_entity_caps.h @@ -31,6 +31,7 @@ public: int64_t increSpaceOccupied; bool allToBackup; bool fullBackupOnly; + bool requireCompatibility; std::string extensionName; std::string restoreDeps; std::string supportScene; @@ -39,6 +40,7 @@ public: struct BundleBackupConfigPara { bool allToBackup; bool fullBackupOnly; + bool requireCompatibility; std::string extensionName; std::string restoreDeps; std::string supportScene; @@ -84,6 +86,7 @@ public: } arrObj["allToBackup"] = item.allToBackup; arrObj["fullBackupOnly"] = item.fullBackupOnly; + arrObj["requireCompatibility"] = item.requireCompatibility; arrObj["extensionName"] = item.extensionName; arrObj["restoreDeps"] = item.restoreDeps; arrObj["supportScene"] = item.supportScene; @@ -233,6 +236,10 @@ public: if (item.isMember("fullBackupOnly") && item["fullBackupOnly"].isBool()) { fullBackupOnly = item["fullBackupOnly"].asBool(); } + bool requireCompatibility = false; + if (item.isMember("requireCompatibility") && item["requireCompatibility"].isBool()) { + requireCompatibility = item["requireCompatibility"].asBool(); + } int appIndex = 0; if (item.isMember("appIndex") && item["appIndex"].isInt()) { appIndex = item["appIndex"].asInt(); @@ -244,7 +251,7 @@ public: bundleInfos.emplace_back(BundleInfo {item["name"].asString(), appIndex, item["versionCode"].asInt64(), item["versionName"].asString(), item["spaceOccupied"].asInt64(), increSpaceOccupied, item["allToBackup"].asBool(), fullBackupOnly, - item["extensionName"].asString(), + requireCompatibility, item["extensionName"].asString(), restoreDeps, supportScene, extraInfo}); } return bundleInfos; diff --git a/utils/include/b_json/b_json_entity_extension_config.h b/utils/include/b_json/b_json_entity_extension_config.h index 80177038e..8523f2e93 100644 --- a/utils/include/b_json/b_json_entity_extension_config.h +++ b/utils/include/b_json/b_json_entity_extension_config.h @@ -76,6 +76,13 @@ public: */ Json::Value GetExtraInfo() const; + /** + * @brief 从JSon对象中获取兼容能力标志 + * + * @return 兼容标志: 应用是否要做兼容处理 + */ + bool GetRequireCompatibility() const; + public: std::string GetJSonSource(std::string_view jsonFromRealWorld, std::any option); diff --git a/utils/src/b_json/b_json_entity_extension_config.cpp b/utils/src/b_json/b_json_entity_extension_config.cpp index a6e639d51..6f17cf0da 100644 --- a/utils/src/b_json/b_json_entity_extension_config.cpp +++ b/utils/src/b_json/b_json_entity_extension_config.cpp @@ -179,4 +179,15 @@ string BJsonEntityExtensionConfig::GetRestoreDeps() const return obj_["restoreDeps"].asString(); } +bool BJsonEntityExtensionConfig::GetRequireCompatibility() const +{ + if (!obj_ || !obj_.isMember("requireCompatibility") || !obj_["requireCompatibility"].isBool()) { + HILOGD("Failed to get field requireCompatibility"); + return false; + } + + return obj_["requireCompatibility"].asBool(); +} + + } // namespace OHOS::FileManagement::Backup -- Gitee From 9261024110886a5247d3f9216e6792050176569a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Fri, 4 Jul 2025 16:50:27 +0800 Subject: [PATCH 17/62] =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- frameworks/native/backup_ext/include/ext_backup_js.h | 2 +- frameworks/native/backup_ext/include/ext_extension.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_backup_js.h b/frameworks/native/backup_ext/include/ext_backup_js.h index c80ad2f8f..6f87145cc 100644 --- a/frameworks/native/backup_ext/include/ext_backup_js.h +++ b/frameworks/native/backup_ext/include/ext_backup_js.h @@ -203,7 +203,7 @@ private: int32_t scenario_ { 0 }; std::shared_ptr getComInfoCallbackEx_; - std::string extInfo_; + std::string extInfo_ {}; }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 4a2abed45..cbc5b9c49 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -460,10 +460,10 @@ private: ErrCode appResultReportErrCode_ { 0 }; std::mutex serviceCallReleaseLock_; - std::mutex getCompatibilityInfoLock_; - std::condition_variable getCompatibilityInfoCon_; + std::mutex getCompatibilityInfoLock_ {}; + std::condition_variable getCompatibilityInfoCon_ {}; std::atomic stopGetComInfo_ {false}; - std::string compatibilityInfo_; + std::string compatibilityInfo_ {}; }; } // namespace OHOS::FileManagement::Backup -- Gitee From 74b1006f280140ff59956c5b359c01513f388cae Mon Sep 17 00:00:00 2001 From: lizhengxing Date: Fri, 4 Jul 2025 10:00:23 +0800 Subject: [PATCH 18/62] add ut subextension Signed-off-by: lizhengxing --- .../mock/backup_ext/include/ext_backup_mock.h | 2 + .../backup_ext/include/ext_extension_mock.h | 86 ++++------- tests/mock/backup_ext/src/ext_backup_mock.cpp | 5 + .../backup_ext/src/ext_extension_mock.cpp | 124 +++++---------- tests/unittests/backup_ext/BUILD.gn | 81 ++++++++++ .../backup_ext/ext_extension_sub_test.cpp | 144 ++++++++++++++++++ 6 files changed, 301 insertions(+), 141 deletions(-) create mode 100644 tests/unittests/backup_ext/ext_extension_sub_test.cpp diff --git a/tests/mock/backup_ext/include/ext_backup_mock.h b/tests/mock/backup_ext/include/ext_backup_mock.h index bee304753..6e966d6e5 100644 --- a/tests/mock/backup_ext/include/ext_backup_mock.h +++ b/tests/mock/backup_ext/include/ext_backup_mock.h @@ -53,6 +53,7 @@ public: virtual ErrCode GetParament(const AAFwk::Want &) = 0; virtual ErrCode OnProcess(std::function callback) = 0; virtual ErrCode OnRelease(std::function callback, int32_t scenario) = 0; + virtual void SetBackupExtExtension(const wptr &) = 0; public: virtual std::unique_ptr LoadSystemModuleByEngine(napi_env, const std::string&, const napi_value*, size_t) = 0; @@ -99,6 +100,7 @@ public: MOCK_METHOD(ErrCode, GetParament, (const AAFwk::Want &)); MOCK_METHOD(napi_value, CreateExtBackupJsContext, (napi_env, std::shared_ptr)); MOCK_METHOD(ErrCode, OnRelease, (std::function, int32_t)); + MOCK_METHOD(void, SetBackupExtExtension, (const wptr &)); public: MOCK_METHOD((std::unique_ptr), LoadSystemModuleByEngine, (napi_env, const std::string&, const napi_value*, size_t)); diff --git a/tests/mock/backup_ext/include/ext_extension_mock.h b/tests/mock/backup_ext/include/ext_extension_mock.h index a92a98bb1..bff5767cd 100644 --- a/tests/mock/backup_ext/include/ext_extension_mock.h +++ b/tests/mock/backup_ext/include/ext_extension_mock.h @@ -23,51 +23,46 @@ namespace OHOS::FileManagement::Backup { class BExtExtension { public: - virtual ErrCode GetIncrementalFileHandle(const string &) = 0; + virtual std::tuple GetIncrementalFileHandle(const string &) = 0; + virtual ErrCode GetIncrementalFileHandle(const string &fileName, int &fd, + int &reportFd, int32_t &fdErrCode) = 0; virtual UniqueFd GetFileHandle(const string &, int32_t &) = 0; virtual ErrCode HandleClear() = 0; - virtual ErrCode BigFileReady(sptr) = 0; + virtual ErrCode BigFileReady(TarMap &, sptr, int) = 0; virtual ErrCode PublishFile(const std::string &) = 0; virtual ErrCode PublishIncrementalFile(const string &) = 0; - virtual ErrCode HandleBackup() = 0; - virtual int DoBackup(const BJsonEntityExtensionConfig &) = 0; - virtual int DoRestore(const string &) = 0; + virtual ErrCode HandleBackup(bool) = 0; + virtual int DoBackup(TarMap &, TarMap &, map &, uint32_t, uint32_t) = 0; + virtual int DoRestore(const string &, const off_t) = 0; virtual int DoIncrementalRestore() = 0; virtual void AsyncTaskBackup(const string) = 0; virtual void AsyncTaskRestore(std::set, const std::vector) = 0; virtual void AsyncTaskIncrementalRestore() = 0; - virtual void AsyncTaskIncreRestoreSpecialVersion() = 0; - virtual void AsyncTaskRestoreForUpgrade() = 0; virtual void ExtClear() = 0; virtual void AsyncTaskIncrementalRestoreForUpgrade() = 0; virtual void DoClear() = 0; virtual void AppDone(ErrCode) = 0; virtual void AppResultReport(const std::string, BackupRestoreScenario, ErrCode) = 0; virtual void AsyncTaskOnBackup() = 0; - virtual ErrCode HandleRestore() = 0; - virtual void PreparaBackupFiles(UniqueFd, UniqueFd, std::vector&, - std::vector&, std::vector&) = 0; - virtual ErrCode HandleIncrementalBackup(UniqueFd, UniqueFd) = 0; - virtual ErrCode IncrementalOnBackup() = 0; - virtual tuple GetIncrementalBackupFileHandle() = 0; - virtual ErrCode IncrementalBigFileReady(const TarMap&, const std::vector&, + virtual ErrCode HandleRestore(bool) = 0; + virtual ErrCode IncrementalBigFileReady(TarMap&, const std::vector&, sptr) = 0; - virtual void AsyncTaskDoIncrementalBackup(UniqueFd, UniqueFd) = 0; - virtual void AsyncTaskOnIncrementalBackup() = 0; - virtual void IncrementalPacket(const std::vector&, TarMap&, sptr) = 0; - virtual int DoIncrementalBackup(const std::vector&, - const std::vector&, const std::vector&) = 0; - virtual void AppIncrementalDone(ErrCode) = 0; - virtual ErrCode GetBackupInfo(std::string&) = 0; - virtual ErrCode UpdateFdSendRate(std::string&, int32_t) = 0; - virtual std::function RestoreResultCallbackEx(wptr) = 0; - virtual std::function AppDoneCallbackEx(wptr) = 0; - virtual std::function IncRestoreResultCallbackEx(wptr) = 0; - virtual std::function HandleBackupEx(wptr) = 0; - virtual std::function HandleTaskBackupEx(wptr) = 0; - virtual void WaitToSendFd(std::chrono::system_clock::time_point&, int&) = 0; - virtual void RefreshTimeInfo(std::chrono::system_clock::time_point&, int&) = 0; - virtual ErrCode HandleOnRelease(int32_t) = 0; + virtual ErrCode GetFileHandleWithUniqueFd(const std::string &fileName, int32_t &errCode, int& fd) = 0; + virtual std::string GetBackupInfo() = 0; + virtual void UpdateOnStartTime() = 0; + virtual ErrCode IncrementalTarFileReady(const TarMap &bigFileInfo, const vector &srcFiles, + sptr proxy) = 0; + virtual void FillFileInfos(UniqueFd incrementalFd, UniqueFd manifestFd, vector &allFiles, + vector &smallFiles, vector &bigFiles) = 0; + virtual void ReportAppStatistic(const std::string &func, ErrCode errCode) = 0; + virtual ErrCode IncrementalAllFileReady(const TarMap &pkgInfo, const vector &srcFiles, + sptr proxy) = 0; + virtual void VerifyCaller() = 0; + virtual std::function ReportErrFileByProc(wptr obj, + BackupRestoreScenario scenario) = 0; + virtual void DoClearInner() = 0; + virtual void StartFwkTimer(bool &isFwkStart) = 0; + virtual ErrCode CleanBundleTempDir() = 0; public: BExtExtension() = default; virtual ~BExtExtension() = default; @@ -78,14 +73,15 @@ public: class ExtExtensionMock : public BExtExtension { public: MOCK_METHOD(UniqueFd, GetFileHandle, (const string &, int32_t &)); - MOCK_METHOD(std::tuple, GetIncrementalFileHandle, (const string &)); + MOCK_METHOD(ErrCode, GetIncrementalFileHandle, (const string &fileName, int &fd, + int &reportFd, int32_t &fdErrCode)); MOCK_METHOD(ErrCode, HandleClear, ()); - MOCK_METHOD(ErrCode, BigFileReady, (sptr)); + MOCK_METHOD(ErrCode, BigFileReady, (TarMap &, sptr, int)); MOCK_METHOD(ErrCode, PublishFile, (const std::string &)); MOCK_METHOD(ErrCode, PublishIncrementalFile, (const string &)); - MOCK_METHOD(ErrCode, HandleBackup, ()); - MOCK_METHOD(int, DoBackup, (const BJsonEntityExtensionConfig &)); - MOCK_METHOD(int, DoRestore, (const string &)); + MOCK_METHOD(ErrCode, HandleBackup, (bool)); + MOCK_METHOD(int, DoBackup, (TarMap &, TarMap &, (map &), uint32_t, uint32_t)); + MOCK_METHOD(int, DoRestore, (const string &, const off_t)); MOCK_METHOD(int, DoIncrementalRestore, ()); MOCK_METHOD(void, AsyncTaskBackup, (const string)); MOCK_METHOD(void, AsyncTaskRestore, (std::set, const std::vector)); @@ -98,31 +94,15 @@ public: MOCK_METHOD(void, AppDone, (ErrCode)); MOCK_METHOD(void, AppResultReport, (const std::string, BackupRestoreScenario, ErrCode)); MOCK_METHOD(void, AsyncTaskOnBackup, ()); - MOCK_METHOD(ErrCode, HandleRestore, ()); + MOCK_METHOD(ErrCode, HandleRestore, (bool)); MOCK_METHOD(void, FillFileInfos, (UniqueFd, UniqueFd, (std::vector&), (std::vector&), (std::vector&))); MOCK_METHOD(ErrCode, HandleIncrementalBackup, (UniqueFd, UniqueFd)); MOCK_METHOD(ErrCode, IncrementalOnBackup, ()); MOCK_METHOD((std::tuple), GetIncrementalBackupFileHandle, ()); - MOCK_METHOD(ErrCode, IncrementalBigFileReady, (const TarMap&, (const std::vector&), + MOCK_METHOD(ErrCode, IncrementalBigFileReady, (TarMap&, const std::vector&, sptr)); - MOCK_METHOD(void, AsyncTaskDoIncrementalBackup, (UniqueFd, UniqueFd)); - MOCK_METHOD(void, AsyncTaskOnIncrementalBackup, ()); - MOCK_METHOD(void, IncrementalPacket, ((const std::vector&), TarMap&, sptr)); - MOCK_METHOD(int, DoIncrementalBackup, ((const std::vector&), - (const std::vector&), (const std::vector&))); - MOCK_METHOD(void, AppIncrementalDone, (ErrCode)); - MOCK_METHOD(ErrCode, GetBackupInfo, (std::string&)); - MOCK_METHOD(ErrCode, UpdateFdSendRate, (std::string&, int32_t)); - MOCK_METHOD((std::function), RestoreResultCallbackEx, (wptr)); - MOCK_METHOD((std::function), AppDoneCallbackEx, (wptr)); - MOCK_METHOD((std::function), IncRestoreResultCallbackEx, (wptr)); - MOCK_METHOD((std::function), HandleBackupEx, (wptr)); - MOCK_METHOD((std::function), HandleTaskBackupEx, (wptr)); - MOCK_METHOD(void, WaitToSendFd, ((std::chrono::system_clock::time_point&), int&)); - MOCK_METHOD(void, RefreshTimeInfo, ((std::chrono::system_clock::time_point&), int&)); MOCK_METHOD(ErrCode, CleanBundleTempDir, ()); - MOCK_METHOD(ErrCode, HandleOnRelease, (int32_t)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_EXT_EXTENSION_MOCK_H \ No newline at end of file diff --git a/tests/mock/backup_ext/src/ext_backup_mock.cpp b/tests/mock/backup_ext/src/ext_backup_mock.cpp index 43f091594..9e76eb794 100644 --- a/tests/mock/backup_ext/src/ext_backup_mock.cpp +++ b/tests/mock/backup_ext/src/ext_backup_mock.cpp @@ -143,4 +143,9 @@ ErrCode ExtBackup::OnRelease(function callback, int3 { return BExtBackup::extBackup->OnRelease(callback, scenario); } + +void ExtBackup::SetBackupExtExtension(const wptr &extExtension) +{ + BExtBackup::extBackup->SetBackupExtExtension(extExtension); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/backup_ext/src/ext_extension_mock.cpp b/tests/mock/backup_ext/src/ext_extension_mock.cpp index b38cd0573..16b750556 100644 --- a/tests/mock/backup_ext/src/ext_extension_mock.cpp +++ b/tests/mock/backup_ext/src/ext_extension_mock.cpp @@ -27,9 +27,10 @@ UniqueFd BackupExtExtension::GetFileHandle(const string &fileName, int32_t &errC return BExtExtension::extExtension->GetFileHandle(fileName, errCode); } -ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) +ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName, + int &fd, int &reportFd, int32_t &fdErrCode) { - return BExtExtension::extExtension->GetIncrementalFileHandle(fileName); + return BExtExtension::extExtension->GetIncrementalFileHandle(fileName, fd, reportFd, fdErrCode); } ErrCode BackupExtExtension::HandleClear() @@ -37,9 +38,9 @@ ErrCode BackupExtExtension::HandleClear() return BExtExtension::extExtension->HandleClear(); } -ErrCode BackupExtExtension::BigFileReady(sptr proxy) +ErrCode BackupExtExtension::BigFileReady(TarMap &bigFileInfo, sptr proxy, int backupedFileSize) { - return BExtExtension::extExtension->BigFileReady(proxy); + return BExtExtension::extExtension->BigFileReady(bigFileInfo, proxy, backupedFileSize); } ErrCode BackupExtExtension::PublishFile(const std::string &fileName) @@ -52,19 +53,21 @@ ErrCode BackupExtExtension::PublishIncrementalFile(const string &fileName) return BExtExtension::extExtension->PublishIncrementalFile(fileName); } -ErrCode BackupExtExtension::HandleBackup() +ErrCode BackupExtExtension::HandleBackup(bool isClearData) { - return BExtExtension::extExtension->HandleBackup(); + return BExtExtension::extExtension->HandleBackup(isClearData); } -int BackupExtExtension::DoBackup(const BJsonEntityExtensionConfig &usrConfig) +int BackupExtExtension::DoBackup(TarMap &bigFileInfo, TarMap &bigFileInfoBackuped, + map &smallFiles, uint32_t includesNum, uint32_t excludesNum) { - return BExtExtension::extExtension->DoBackup(usrConfig); + return BExtExtension::extExtension->DoBackup(bigFileInfo, bigFileInfoBackuped, smallFiles, + includesNum, excludesNum); } -int BackupExtExtension::DoRestore(const string &fileName) +int BackupExtExtension::DoRestore(const string &fileName, const off_t fileSize) { - return BExtExtension::extExtension->DoRestore(fileName); + return BExtExtension::extExtension->DoRestore(fileName, fileSize); } int BackupExtExtension::DoIncrementalRestore() @@ -89,14 +92,6 @@ void BackupExtExtension::AsyncTaskIncreRestoreSpecialVersion() { } -void BackupExtExtension::AsyncTaskRestoreForUpgrade() -{ -} - -void BackupExtExtension::ExtClear() -{ -} - void BackupExtExtension::AsyncTaskIncrementalRestoreForUpgrade() { } @@ -118,103 +113,61 @@ void BackupExtExtension::AsyncTaskOnBackup() { } -ErrCode BackupExtExtension::HandleRestore() -{ - return BExtExtension::extExtension->HandleRestore(); -} - -void BackupExtExtension::PreparaBackupFiles(UniqueFd incrementalFd, - UniqueFd manifestFd, - vector &allFiles, - vector &smallFiles, - vector &bigFiles) -{ -} - -ErrCode BackupExtExtension::HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) -{ - return BExtExtension::extExtension->HandleIncrementalBackup(std::move(incrementalFd), std::move(manifestFd)); -} - -ErrCode BackupExtExtension::IncrementalOnBackup() -{ - return BExtExtension::extExtension->IncrementalOnBackup(); -} - -tuple BackupExtExtension::GetIncrementalBackupFileHandle() +ErrCode BackupExtExtension::HandleRestore(bool isClearData) { - return BExtExtension::extExtension->GetIncrementalBackupFileHandle(); + return BExtExtension::extExtension->HandleRestore(isClearData); } -ErrCode BackupExtExtension::IncrementalBigFileReady(const TarMap &pkgInfo, +ErrCode BackupExtExtension::IncrementalBigFileReady(TarMap &pkgInfo, const vector &bigInfos, sptr proxy) { return BExtExtension::extExtension->IncrementalBigFileReady(pkgInfo, bigInfos, proxy); } -void BackupExtExtension::AsyncTaskDoIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) +void BackupExtExtension::StartFwkTimer(bool &isFwkStart) { } -void BackupExtExtension::AsyncTaskOnIncrementalBackup() +ErrCode BackupExtExtension::GetFileHandleWithUniqueFd(const std::string &fileName, int32_t &errCode, int& fd) { + return BExtExtension::extExtension->GetFileHandleWithUniqueFd(fileName, errCode, fd); } -void BackupExtExtension::IncrementalPacket(const vector &, TarMap &, sptr) +void BackupExtExtension::FillFileInfos(UniqueFd incrementalFd, + UniqueFd manifestFd, + vector &allFiles, + vector &smallFiles, + vector &bigFiles) { } -int BackupExtExtension::DoIncrementalBackup(const vector &allFiles, - const vector &smallFiles, - const vector &bigFiles) +void BackupExtExtension::ReportAppStatistic(const std::string &func, ErrCode errCode) { - return BExtExtension::extExtension->DoIncrementalBackup(allFiles, smallFiles, bigFiles); } -void BackupExtExtension::AppIncrementalDone(ErrCode errCode) +void BackupExtExtension::UpdateOnStartTime() { } -ErrCode BackupExtExtension::GetBackupInfo(std::string &result) +ErrCode BackupExtExtension::IncrementalTarFileReady(const TarMap &bigFileInfo, + const vector &srcFiles, sptr proxy) { - return BExtExtension::extExtension->GetBackupInfo(result); + return BExtExtension::extExtension->IncrementalTarFileReady(bigFileInfo, srcFiles, proxy); } -ErrCode BackupExtExtension::UpdateFdSendRate(std::string &bundleName, int32_t sendRate) +ErrCode BackupExtExtension::IncrementalAllFileReady(const TarMap &pkgInfo, + const vector &srcFiles, sptr proxy) { - return BExtExtension::extExtension->UpdateFdSendRate(bundleName, sendRate); + return BExtExtension::extExtension->IncrementalAllFileReady(pkgInfo, srcFiles, proxy); } -std::function BackupExtExtension::RestoreResultCallbackEx(wptr obj) +std::function BackupExtExtension::ReportErrFileByProc(wptr obj, + BackupRestoreScenario scenario) { - return BExtExtension::extExtension->RestoreResultCallbackEx(obj); + return BExtExtension::extExtension->ReportErrFileByProc(obj, scenario); } -std::function BackupExtExtension::AppDoneCallbackEx(wptr obj) -{ - return BExtExtension::extExtension->AppDoneCallbackEx(obj); -} - -std::function BackupExtExtension::IncRestoreResultCallbackEx(wptr obj) -{ - return BExtExtension::extExtension->IncRestoreResultCallbackEx(obj); -} - -std::function BackupExtExtension::HandleBackupEx(wptr obj) -{ - return BExtExtension::extExtension->HandleBackupEx(obj); -} - -std::function BackupExtExtension::HandleTaskBackupEx(wptr obj) -{ - return BExtExtension::extExtension->HandleTaskBackupEx(obj); -} - -void BackupExtExtension::WaitToSendFd(std::chrono::system_clock::time_point &startTime, int &fdSendNum) -{ -} - -void BackupExtExtension::RefreshTimeInfo(std::chrono::system_clock::time_point &startTime, int &fdSendNum) +void BackupExtExtension::DoClearInner() { } @@ -222,9 +175,4 @@ ErrCode BackupExtExtension::CleanBundleTempDir() { return BExtExtension::extExtension->CleanBundleTempDir(); } - -ErrCode BackupExtExtension::HandleOnRelease(int32_t scenario) -{ - return BExtExtension::extExtension->HandleOnRelease(scenario); -} } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_ext/BUILD.gn b/tests/unittests/backup_ext/BUILD.gn index 1f2fccc23..6cdcee1cb 100644 --- a/tests/unittests/backup_ext/BUILD.gn +++ b/tests/unittests/backup_ext/BUILD.gn @@ -489,12 +489,93 @@ ohos_unittest("installd_un_tar_file_test") { use_exceptions = true } +ohos_unittest("ext_extension_sub_test") { + branch_protector_ret = "pac_ret" + sanitize = { + integer_overflow = true + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + blocklist = "${path_backup}/cfi_blocklist.txt" + } + + module_out_path = path_module_out_tests + + sources = [ + "${path_backup}/tests/mock/backup_ext/src/ext_backup_mock.cpp", + "${path_backup}/tests/mock/backup_ext/src/ext_extension_mock.cpp", + "${path_backup}/tests/mock/backup_kit_inner/service_proxy_mock.cpp", + "${path_backup}/tests/mock/utils_mock/src/utils_mock_global_variable.cpp", + "${path_backup}/tests/utils/src/test_manager.cpp", + "ext_extension_sub_test.cpp", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + include_dirs = [ + "${path_backup}/frameworks/native/backup_ext/include", + "${path_backup}/frameworks/native/backup_ext/src", + "${path_backup}/frameworks/native/backup_kit_inner/src", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${path_backup}/interfaces/common/include", + "${path_backup}/tests/mock/backup_ext/src", + "${path_backup}/tests/mock/backup_ext/include", + "${path_backup}/tests/mock/utils_mock/include", + "${path_backup}/tests/mock/backup_kit_inner", + "${path_backup}/tests/utils/include", + "${path_backup}/tests/utils_mock/include", + "${path_backup}/utils/include", + ] + + deps = [ + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/services/backup_sa:backup_sa_ipc_stub", + "${path_backup}/utils:backup_utils", + ] + + cflags = [ "--coverage" ] + ldflags = [ "--coverage" ] + cflags_cc = [ "--coverage" ] + + external_deps = [ + "ability_base:want", + "ability_runtime:ability_context_native", + "ability_runtime:abilitykit_native", + "ability_runtime:app_context", + "ability_runtime:appkit_native", + "ability_runtime:runtime", + "access_token:libaccesstoken_sdk", + "bundle_framework:appexecfwk_core", + "c_utils:utils", + "googletest:gmock_main", + "googletest:gtest_main", + "hilog:libhilog", + "hitrace:hitrace_meter", + "ipc:ipc_core", + "ipc:ipc_napi", + "jsoncpp:jsoncpp", + "napi:ace_napi", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} + group("backup_ext_test") { testonly = true if (!use_libfuzzer) { deps = [ ":ext_backup_js_test", ":ext_extension_test", + ":ext_extension_sub_test", ":installd_un_tar_file_test", ":tar_file_sub_test", ":tar_file_test", diff --git a/tests/unittests/backup_ext/ext_extension_sub_test.cpp b/tests/unittests/backup_ext/ext_extension_sub_test.cpp new file mode 100644 index 000000000..106e8e2e3 --- /dev/null +++ b/tests/unittests/backup_ext/ext_extension_sub_test.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2022-2025 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 +#include +#include +#include + +#include + +#include "b_error/b_error.h" +#include "b_error/b_excep_utils.h" +#include "ext_backup_mock.h" +#include "ext_extension_mock.h" + +#include "tar_file.cpp" +#include "sub_ext_extension.cpp" + +namespace OHOS::FileManagement::Backup { +using namespace std; +using namespace testing; + +namespace { +const string FILE_NAME = "1.txt"; +const string BUNDLE_NAME = "com.example.app2backup/"; +const string MANAGE_JSON = "manage.json"; +const string PATH = "/data/storage/el2/backup/test/"; +const string TAR_FILE = "1.tar"; +const string BUNDLE_BASE_DIR = "/data/storage/el2/base/"; +const string PATH_BUNDLE_BACKUP_HOME_EL1 = "/data/storage/el1/base/.backup"; +const string PATH_BUNDLE_BACKUP_HOME = "/data/storage/el2/base/.backup"; +} // namespace + +class ExtExtensionSubTest : public testing::Test { +public: + //所有测试用例执行之前执行 + static void SetUpTestCase(void); + //所有测试用例执行之后执行 + static void TearDownTestCase(void); + //每次测试用例执行之前执行 + void SetUp() {}; + //每次测试用例执行之后执行 + void TearDown() {}; + + static inline sptr extExtension = nullptr; + static inline shared_ptr extension = nullptr; + static inline shared_ptr extBackupMock = nullptr; +}; + +void ExtExtensionSubTest::SetUpTestCase(void) +{ + //创建测试路径 + string cmdMkdir = string("mkdir -p ") + PATH + BUNDLE_NAME; + system(cmdMkdir.c_str()); + + string cmdMkdir1 = string("mkdir -p ") + BUNDLE_BASE_DIR; + system(cmdMkdir1.c_str()); + + string cmdMkdir2 = string("mkdir -p ") + PATH_BUNDLE_BACKUP_HOME_EL1; + system(cmdMkdir2.c_str()); + + string cmdMkdir3 = string("mkdir -p ") + PATH_BUNDLE_BACKUP_HOME; + system(cmdMkdir3.c_str()); + //创建测试文件 + string touchFile = string("touch ") + PATH + BUNDLE_NAME + FILE_NAME; + system(touchFile.c_str()); + string touchFile2 = string("touch ") + PATH + BUNDLE_NAME + "2.txt"; + system(touchFile2.c_str()); + + extBackupMock = make_shared(); + ExtBackupMock::extBackup = extBackupMock; + + extExtension = sptr(new BackupExtExtension( + nullptr, BUNDLE_NAME)); + extension = make_shared(); + extExtension->extension_ = extension; +}; + +void ExtExtensionSubTest::TearDownTestCase(void) +{ + //删除测试文件夹和文件 + string rmDir = string("rm -r ") + PATH + BUNDLE_NAME; + system(rmDir.c_str()); + + rmDir = string("rm -r ") + BUNDLE_BASE_DIR; + system(rmDir.c_str()); + + rmDir = string("rm -r ") + PATH_BUNDLE_BACKUP_HOME_EL1; + system(rmDir.c_str()); + + rmDir = string("rm -r ") + PATH_BUNDLE_BACKUP_HOME; + system(rmDir.c_str()); + + extension = nullptr; + extExtension = nullptr; + ExtBackupMock::extBackup = nullptr; + extBackupMock = nullptr; +}; + +/** + * @tc.number: Ext_Extension_Sub_Test_0001 + * @tc.name: Ext_Extension_Sub_Test_0001 + * @tc.desc: 测试SetClearDataFlag + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_Test_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_Test_0001"; + try { + EXPECT_TRUE(extExtension != nullptr); + extExtension->SetClearDataFlag(true); + EXPECT_TRUE(extExtension->isClearData_ == true); + + extExtension->extension_ = nullptr; + extExtension->SetClearDataFlag(false); + EXPECT_TRUE(extExtension->isClearData_ == false); + + extExtension->extension_ = extension; + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_Test_0001"; +} +} \ No newline at end of file -- Gitee From 090ee43276636f8b20d5b6cf089b81da531a07ae Mon Sep 17 00:00:00 2001 From: Wannabe Date: Sat, 5 Jul 2025 14:57:22 +0800 Subject: [PATCH 19/62] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wannabe --- .../native/remote_file_share/src/remote_file_share.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp b/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp index 9cd4c0d28..65483cc16 100644 --- a/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp +++ b/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp @@ -670,7 +670,8 @@ static sptr GetStorageManager() int32_t count = 0; sptr storageManager = nullptr; - while (storageManager == nullptr && count++ < GET_CLIENT_RETRY_TIMES) { + while (storageManager == nullptr && count < GET_CLIENT_RETRY_TIMES) { + count++; auto storageObj = saMgr->GetSystemAbility(STORAGE_MANAGER_MANAGER_ID); if (storageObj == nullptr) { LOGE("Get starage manger failed."); -- Gitee From b1f7b60b4ddc8e4fc0b187614b0dd2731bcec0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Mon, 7 Jul 2025 20:10:47 +0800 Subject: [PATCH 20/62] =?UTF-8?q?onRelease=E5=BC=82=E5=B8=B8=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../native/backup_ext/include/ext_extension.h | 9 +- .../backup_ext/src/sub_ext_extension.cpp | 122 ++++++++---------- .../include/module_ipc/svc_session_manager.h | 2 + services/backup_sa/src/module_ipc/service.cpp | 2 +- .../src/module_ipc/service_incremental.cpp | 2 +- .../backup_sa/src/module_ipc/sub_service.cpp | 2 +- .../src/module_ipc/svc_session_manager.cpp | 19 ++- .../backup_ext/include/ext_backup_js_mock.h | 11 +- .../include/svc_session_manager_mock.h | 2 + .../src/svc_session_manager_mock.cpp | 4 + .../module_ipc/svc_session_manager_mock.cpp | 4 + .../svc_session_manager_throw_mock.cpp | 2 + .../svc_session_manager_throw_mock.h | 2 + tests/unittests/backup_ext/BUILD.gn | 1 + .../backup_ext/ext_extension_sub_test.cpp | 86 ++++++++++++ tests/unittests/backup_sa/module_ipc/BUILD.gn | 1 + .../module_ipc/service_incremental_test.cpp | 2 + .../backup_sa/module_ipc/sub_service_test.cpp | 1 + .../svc_session_manager_ex_test.cpp | 33 +++++ .../module_ipc/svc_session_manager_test.cpp | 1 + 20 files changed, 226 insertions(+), 82 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index cbc5b9c49..9dba03d38 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -91,7 +91,6 @@ public: reportOnProcessRetPool_.Stop(); doBackupPool_.Stop(); onReleaseTaskPool_.Stop(); - onReleaseTimeoutTimer_.Shutdown(); if (callJsOnProcessThread_.joinable()) { callJsOnProcessThread_.join(); } @@ -394,9 +393,6 @@ private: void UpdateTarStat(uint64_t tarFileSize); void HandleExtDisconnect(); - void StartOnReleaseTimeOutTimer(wptr obj); - void CloseOnReleaseTimeOutTimer(); - void CallJsOnReleaseTask(wptr obj, int32_t scenario, bool isNeedDisconnect); bool HandleGetExtOnRelease(); void SetAppResultReport(const std::string resultInfo, ErrCode errCode); void HandleExtOnRelease(); @@ -450,15 +446,14 @@ private: BackupRestoreScenario curScenario_ { BackupRestoreScenario::FULL_BACKUP }; OHOS::ThreadPool onReleaseTaskPool_; - Utils::Timer onReleaseTimeoutTimer_ {"onReleaseTimeoutTimer"}; - uint32_t onReleaseTimeoutTimerId_ { 0 }; std::atomic stopWaitOnRelease_ {false}; std::mutex onReleaseLock_; std::condition_variable execOnReleaseCon_; std::atomic needAppResultReport_ {false}; std::string appResultReportInfo_; ErrCode appResultReportErrCode_ { 0 }; - std::mutex serviceCallReleaseLock_; + std::mutex execOnReleaseLock_ {}; + std::atomic isOnReleased_ {false}; std::mutex getCompatibilityInfoLock_ {}; std::condition_variable getCompatibilityInfoCon_ {}; diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 1da153964..3f7af178c 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -1746,8 +1746,7 @@ std::function BackupExtExtension::OnReleaseCal HILOGE("App onRelease timeout"); return; } - std::unique_lock lock(extPtr->onReleaseLock_); - extPtr->CloseOnReleaseTimeOutTimer(); + std::unique_lock lock(extPtr->execOnReleaseLock_); extPtr->stopWaitOnRelease_.store(true); extPtr->execOnReleaseCon_.notify_all(); HILOGI("Extension onRelease end, errCode: %{public}d, errInfo: %{public}s", errCode, errMsg.c_str()); @@ -1759,14 +1758,30 @@ ErrCode BackupExtExtension::HandleOnRelease(int32_t scenario) try { HILOGI("HandleOnRelease Begin, scenario: %{public}d", scenario); VerifyCaller(); - auto ptr = wptr(this); - onReleaseTimeoutTimer_.Setup(); - StartOnReleaseTimeOutTimer(ptr); - // service主动release场景,等待onRelease完成或超时,备份/恢复完成场景不需等待 - CallJsOnReleaseTask(ptr, scenario, false); + std::unique_lock onReleaseLock(onReleaseLock_); + if (isOnReleased_.load()) { + HILOGE("onRelease done, not need to do again"); + return ERR_OK; + } + auto task = [obj {wptr(this)}, scenario]() { + auto extPtr = obj.promote(); + if (extPtr == nullptr || extPtr->extension_ == nullptr) { + HILOGE("Call js onRelease failed, extensionPtr is empty"); + return; + } + auto callback = extPtr->OnReleaseCallback(obj); + ErrCode ret = extPtr->extension_->OnRelease(callback, scenario); + if (ret != ERR_OK) { + HILOGE("Call onRelease failed, ret = %{public}d", ret); + } + }; + onReleaseTaskPool_.AddTask([task]() { task(); }); HILOGI("Wait onRelease to do"); - std::unique_lock lock(serviceCallReleaseLock_); - execOnReleaseCon_.wait(lock, [this] { return stopWaitOnRelease_.load(); }); + std::unique_lock lock(execOnReleaseLock_); + execOnReleaseCon_.wait_for(lock, std::chrono::milliseconds(BConstants::APP_ON_RELEASE_MAX_TIMEOUT), + [this] { return stopWaitOnRelease_.load(); }); + stopWaitOnRelease_.store(true); + isOnReleased_.store(true); return ERR_OK; } catch (...) { HILOGE("Failed to HandleOnRelease"); @@ -1808,60 +1823,6 @@ bool BackupExtExtension::HandleGetExtOnRelease() return isExtOnRelease; } -void BackupExtExtension::StartOnReleaseTimeOutTimer(wptr obj) -{ - HILOGI("StartOnReleaseTimeOutTimer begin"); - int timeout = BConstants::APP_ON_RELEASE_MAX_TIMEOUT; - auto timeoutCallback = [obj]() { - auto extPtr = obj.promote(); - if (extPtr == nullptr) { - HILOGE("Start Create timeout callback failed, extPtr is empty"); - return; - } - HILOGI("OnRelease time out, need to stop wait"); - std::unique_lock lock(extPtr->onReleaseLock_); - extPtr->stopWaitOnRelease_.store(true); - extPtr->execOnReleaseCon_.notify_all(); - extPtr->CloseOnReleaseTimeOutTimer(); - return; - }; - uint32_t timerId = onReleaseTimeoutTimer_.Register(timeoutCallback, timeout, true); - onReleaseTimeoutTimerId_ = timerId; -} - -void BackupExtExtension::CloseOnReleaseTimeOutTimer() -{ - HILOGI("CloseOnReleaseTimeOutTimer begin"); - onReleaseTimeoutTimer_.Unregister(onReleaseTimeoutTimerId_); -} - -void BackupExtExtension::CallJsOnReleaseTask(wptr obj, int32_t scenario, bool isNeedDisconnect) -{ - HILOGI("Begin CallJsOnReleaseTask, scenario: %{public}d", scenario); - auto task = [obj, scenario, isNeedDisconnect]() { - auto extPtr = obj.promote(); - if (extPtr == nullptr || extPtr->extension_ == nullptr) { - HILOGE("Call js onRelease failed, extensionPtr is empty"); - return; - } - auto callback = extPtr->OnReleaseCallback(obj); - ErrCode ret = extPtr->extension_->OnRelease(callback, scenario); - if (ret != ERR_OK) { - HILOGE("Call onRelease failed, ret = %{public}d", ret); - return; - } - std::unique_lock lock(extPtr->onReleaseLock_); - extPtr->execOnReleaseCon_.wait(lock, [extPtr] { return extPtr->stopWaitOnRelease_.load(); }); - if (extPtr->needAppResultReport_.load()) { - extPtr->AppResultReport(extPtr->appResultReportInfo_, extPtr->curScenario_, - extPtr->appResultReportErrCode_); - } else if (isNeedDisconnect) { - extPtr->HandleExtDisconnect(); - } - }; - onReleaseTaskPool_.AddTask([task]() { task(); }); -} - void BackupExtExtension::SetAppResultReport(const std::string resultInfo, ErrCode errCode) { HILOGI("SetAppResultReport begin"); @@ -1879,10 +1840,37 @@ void BackupExtExtension::HandleExtOnRelease() curScenario_ == BackupRestoreScenario::INCREMENTAL_BACKUP) { scenario = static_cast(BConstants::ExtensionScenario::BACKUP); } - auto ptr = wptr(this); - onReleaseTimeoutTimer_.Setup(); - StartOnReleaseTimeOutTimer(ptr); - CallJsOnReleaseTask(ptr, scenario, true); + auto task = [obj {wptr(this)}, scenario]() { + auto extPtr = obj.promote(); + if (extPtr == nullptr || extPtr->extension_ == nullptr) { + HILOGE("Call js onRelease failed, extensionPtr is empty"); + return; + } + { + std::unique_lock onReleaseLock(extPtr->onReleaseLock_); + if (extPtr->isOnReleased_.load()) { + HILOGE("onRelease done, not need to do again"); + return; + } + auto callback = extPtr->OnReleaseCallback(obj); + ErrCode ret = extPtr->extension_->OnRelease(callback, scenario); + if (ret != ERR_OK) { + HILOGE("Call onRelease failed, ret = %{public}d", ret); + return; + } + std::unique_lock lock(extPtr->execOnReleaseLock_); + extPtr->execOnReleaseCon_.wait_for(lock, std::chrono::milliseconds(BConstants::APP_ON_RELEASE_MAX_TIMEOUT), + [extPtr] { return extPtr->stopWaitOnRelease_.load(); }); + extPtr->stopWaitOnRelease_.store(true); + extPtr->isOnReleased_.store(true); + } + if (extPtr->needAppResultReport_.load()) { + extPtr->AppResultReport(extPtr->appResultReportInfo_, extPtr->curScenario_, + extPtr->appResultReportErrCode_); + } + extPtr->HandleExtDisconnect(); + }; + onReleaseTaskPool_.AddTask([task]() { task(); }); } std::function BackupExtExtension::GetComInfoCallback(wptr obj) 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 63ab2fecc..5b3bbbbed 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -577,6 +577,8 @@ public: void SetIsReadyLaunch(const std::string &bundleName); + void HandleOnRelease(sptr proxy); + private: /** * @brief 获取backup extension ability diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 8f02bc054..9a64d35c3 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1595,7 +1595,7 @@ ErrCode Service::ClearResidualBundleData(const std::string &bundleName) HILOGI("Current bundle will clean extension data, bundleName:%{public}s", bundleName.c_str()); ErrCode res = proxy->HandleClear(); if (backUpConnection->IsExtAbilityConnected()) { - proxy->HandleOnRelease(static_cast(session_->GetScenario())); + session_->HandleOnRelease(proxy); backUpConnection->DisconnectBackupExtAbility(); } ClearSessionAndSchedInfo(bundleName); diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 7a4a2af69..f223767e3 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -1020,7 +1020,7 @@ bool Service::CancelSessionClean(sptr session, std::string bu proxy->HandleClear(); session->StopFwkTimer(bundleName); session->StopExtTimer(bundleName); - proxy->HandleOnRelease(static_cast(session->GetScenario())); + session->HandleOnRelease(proxy); backUpConnection->DisconnectBackupExtAbility(); return true; } diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index d26e879c5..59cbdb35a 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -1529,7 +1529,7 @@ void Service::HandleOnReleaseAndDisconnect(sptr sessionPtr, c HILOGE("Extension backup Proxy is empty"); return; } - proxy->HandleOnRelease(static_cast(sessionPtr->GetScenario())); + sessionPtr->HandleOnRelease(proxy); sessionConnection->DisconnectBackupExtAbility(); } diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index 943cb4954..4dccce6be 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -1079,7 +1079,7 @@ ErrCode SvcSessionManager::ClearSessionData() if (impl_.restoreDataType != RestoreTypeEnum::RESTORE_DATA_READDY) { ret = proxy->HandleClear(); } - proxy->HandleOnRelease(static_cast(impl_.scenario)); + HandleOnRelease(proxy); backUpConnection->DisconnectBackupExtAbility(); } if (ret != BError(BError::Codes::OK)) { @@ -1245,7 +1245,7 @@ bool SvcSessionManager::CleanAndCheckIfNeedWait(ErrCode &ret, std::vectorHandleOnRelease(static_cast(impl_.scenario)); + HandleOnRelease(proxy); backUpConnection->DisconnectBackupExtAbility(); HILOGI("Disconnect extensionAbility, bundleName: %{public}s", it->first.c_str()); it = impl_.backupExtNameMap.erase(it); @@ -1317,4 +1317,19 @@ void SvcSessionManager::SetIsReadyLaunch(const std::string &bundleName) it->second.isReadyLaunch = true; HILOGE("SetIsReadyLaunch success, bundleName = %{public}s", bundleName.c_str()); } + +void SvcSessionManager::HandleOnRelease(sptr proxy) +{ + if (proxy == nullptr) { + HILOGE("HandleOnRelease error, proxy is empty"); + return; + } + if (impl_.scenario == IServiceReverseType::Scenario::UNDEFINED || + impl_.scenario == IServiceReverseType::Scenario::CLEAN) { + HILOGE("scenario is %{public}d, not need to HandleOnRelease", impl_.scenario); + return; + } + HILOGI("HandleOnRelease begin"); + proxy->HandleOnRelease(static_cast(impl_.scenario)); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/backup_ext/include/ext_backup_js_mock.h b/tests/mock/backup_ext/include/ext_backup_js_mock.h index e8cf5e60c..80b8e1690 100644 --- a/tests/mock/backup_ext/include/ext_backup_js_mock.h +++ b/tests/mock/backup_ext/include/ext_backup_js_mock.h @@ -50,11 +50,11 @@ public: virtual ErrCode CallJsOnBackupEx() = 0; virtual ErrCode CallJsOnBackup() = 0; virtual void ExportJsContext() = 0; - virtual ErrCode OnRelease(std::function, int32_t scenario) = 0; - virtual std::function &argv) ParseReleaseInfo() = 0; + virtual ErrCode OnRelease(std::function, int32_t) = 0; + virtual std::function &argv)> ParseReleaseInfo() = 0; virtual ErrCode GetBackupCompatibilityInfo(std::function, std::string) = 0; virtual ErrCode GetRestoreCompatibilityInfo(std::function, std::string) = 0; - virtual std::function &argv) ParseCompatibilityInfo() = 0; + virtual std::function &argv)> ParseCompatibilityInfo() = 0; public: virtual bool GetProfileFromAbility(const OHOS::AppExecFwk::AbilityInfo &, const std::string &, std::vector &) const = 0; @@ -88,6 +88,11 @@ public: MOCK_METHOD(ErrCode, CallJsOnBackupEx, ()); MOCK_METHOD(ErrCode, CallJsOnBackup, ()); MOCK_METHOD(void, ExportJsContext, ()); + MOCK_METHOD(ErrCode, OnRelease, (std::function, int32_t)); + MOCK_METHOD((std::function &argv)>), ParseReleaseInfo, ()); + MOCK_METHOD(ErrCode, GetBackupCompatibilityInfo, (std::function, std::string)); + MOCK_METHOD(ErrCode, GetRestoreCompatibilityInfo, (std::function, std::string)); + MOCK_METHOD((std::function &argv)>), ParseCompatibilityInfo, ()); public: MOCK_METHOD(bool, GetProfileFromAbility, (const OHOS::AppExecFwk::AbilityInfo&, const std::string&, std::vector&), (const)); diff --git a/tests/mock/module_ipc/include/svc_session_manager_mock.h b/tests/mock/module_ipc/include/svc_session_manager_mock.h index 99fc754ee..d5e982a60 100644 --- a/tests/mock/module_ipc/include/svc_session_manager_mock.h +++ b/tests/mock/module_ipc/include/svc_session_manager_mock.h @@ -63,6 +63,7 @@ public: virtual SvcSessionManager::Impl GetImpl() = 0; virtual std::string GetOldBackupVersion() = 0; virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; + virtual void HandleOnRelease(sptr proxy) = 0; public: BSvcSessionManager() = default; virtual ~BSvcSessionManager() = default; @@ -112,6 +113,7 @@ public: MOCK_METHOD(SvcSessionManager::Impl, GetImpl, ()); MOCK_METHOD(std::string, GetOldBackupVersion, ()); MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); + MOCK_METHOD(void, HandleOnRelease, (sptr)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_SESSION_MANAGER_MOCK_H diff --git a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp index 017a8e9b4..05413708f 100644 --- a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp @@ -306,4 +306,8 @@ std::string SvcSessionManager::GetOldBackupVersion() { return BSvcSessionManager::sessionManager->GetOldBackupVersion(); } + +void SvcSessionManager::HandleOnRelease(sptr proxy) +{ +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index ce966d257..26060dfcc 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -530,4 +530,8 @@ std::string SvcSessionManager::GetOldBackupVersion() void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t uniqId) { } + +void SvcSessionManager::HandleOnRelease(sptr proxy) +{ +} } // namespace OHOS::FileManagement::Backup 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 3ff137565..2fb2f741e 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -362,4 +362,6 @@ std::string SvcSessionManager::GetOldBackupVersion() { return BackupSvcSessionManager::session->GetOldBackupVersion(); } + +void SvcSessionManager::HandleOnRelease(sptr proxy) {} } // namespace OHOS::FileManagement::Backup 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 0c0df92f8..65fd948bd 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -99,6 +99,7 @@ public: virtual void SetOldBackupVersion(const std::string &backupVersion) = 0; virtual std::string GetOldBackupVersion() = 0; virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; + virtual void HandleOnRelease(sptr proxy) = 0; public: static inline std::shared_ptr session = nullptr; }; @@ -177,6 +178,7 @@ public: MOCK_METHOD(void, SetOldBackupVersion, (const std::string &)); MOCK_METHOD(std::string, GetOldBackupVersion, ()); MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); + MOCK_METHOD(void, HandleOnRelease, (sptr)); }; } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_ext/BUILD.gn b/tests/unittests/backup_ext/BUILD.gn index 6cdcee1cb..0e44de2a6 100644 --- a/tests/unittests/backup_ext/BUILD.gn +++ b/tests/unittests/backup_ext/BUILD.gn @@ -504,6 +504,7 @@ ohos_unittest("ext_extension_sub_test") { sources = [ "${path_backup}/tests/mock/backup_ext/src/ext_backup_mock.cpp", + "${path_backup}/tests/mock/backup_ext/src/ext_backup_js_mock.cpp", "${path_backup}/tests/mock/backup_ext/src/ext_extension_mock.cpp", "${path_backup}/tests/mock/backup_kit_inner/service_proxy_mock.cpp", "${path_backup}/tests/mock/utils_mock/src/utils_mock_global_variable.cpp", diff --git a/tests/unittests/backup_ext/ext_extension_sub_test.cpp b/tests/unittests/backup_ext/ext_extension_sub_test.cpp index ea5461cb8..243ed2505 100644 --- a/tests/unittests/backup_ext/ext_extension_sub_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_sub_test.cpp @@ -220,4 +220,90 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleGetCompatibilityInfo_Test_ } GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_HandleGetCompatibilityInfo_Test_0100"; } + +/** + * @tc.number: Ext_Extension_Sub_HandleOnRelease_Test_0100 + * @tc.name: Ext_Extension_Sub_HandleOnRelease_Test_0100 + * @tc.desc: 测试HandleOnRelease + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleOnRelease_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_HandleOnRelease_Test_0100"; + try { + int32_t scenario = 1; + bool isOnReleased = extExtension->isOnReleased_.load(); + extExtension->isOnReleased_.store(true); + auto ret = extExtension->HandleOnRelease(scenario); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + + extExtension->isOnReleased_.store(false); + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + ret = extExtension->HandleOnRelease(scenario); + extExtension->extension_ = ext; + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + + ret = extExtension->HandleOnRelease(scenario); + extExtension->isOnReleased_.store(isOnReleased); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_HandleOnRelease_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_HandleExtOnRelease_Test_0100 + * @tc.name: Ext_Extension_Sub_HandleExtOnRelease_Test_0100 + * @tc.desc: 测试HandleExtOnRelease + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleExtOnRelease_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_HandleExtOnRelease_Test_0100"; + try { + auto curScenario = extExtension->curScenario_; + extExtension->curScenario_ = BackupRestoreScenario::FULL_BACKUP; + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + extExtension->HandleExtOnRelease(); + EXPECT_TRUE(true); + + extExtension->curScenario_ = BackupRestoreScenario::FULL_RESTORE; + extExtension->HandleExtOnRelease(); + EXPECT_TRUE(true); + + extExtension->extension_ = ext; + EXPECT_NE(extExtension->extension_, nullptr); + bool isOnReleased = extExtension->isOnReleased_.load(); + extExtension->isOnReleased_.store(true); + extExtension->HandleExtOnRelease(); + EXPECT_TRUE(true); + + extExtension->isOnReleased_.store(false); + EXPECT_CALL(*extBackupMock, OnRelease(_, _)).WillOnce(Return(BError(BError::Codes::EXT_INVAL_ARG).GetCode())); + extExtension->HandleExtOnRelease(); + EXPECT_TRUE(true); + + EXPECT_CALL(*extBackupMock, OnRelease(_, _)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + extExtension->needAppResultReport_.store(false); + extExtension->HandleExtOnRelease(); + EXPECT_TRUE(true); + + extExtension->isOnReleased_.store(isOnReleased); + extExtension->curScenario_ = curScenario; + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_HandleExtOnRelease_Test_0100"; +} } \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index 676ad460b..3c8a43658 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -264,6 +264,7 @@ ohos_unittest("backup_service_session_test") { "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", "${path_backup}/tests/unittests/backup_api/backup_impl/include", "${path_backup_mock}/bundle_manager/include", + "${path_backup_mock}/module_ipc/include", ] deps = [ diff --git a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp index 918949c97..cfedb16ce 100644 --- a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp @@ -1917,6 +1917,8 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_CancelTask_0100, TestSiz EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::BACKUP)) .WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); EXPECT_CALL(*session, GetIsIncrementalBackup()).WillOnce(Return(true)); + EXPECT_CALL(*session, GetServiceReverseProxy()).WillRepeatedly(Return(srProxy)); + EXPECT_CALL(*srProxy, IncrementalRestoreOnBundleFinished(_, _)).WillRepeatedly(Return(0)); service->CancelTask("", service); EXPECT_TRUE(true); diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index 161dfe7c5..01c51ed5f 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -2304,6 +2304,7 @@ HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0200, testing::ext::TestS res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + EXPECT_CALL(*session, GetScenario()).WillRepeatedly(Return(IServiceReverseType::Scenario::RESTORE)); EXPECT_CALL(*svcProxy, HandleGetCompatibilityInfo(_, _, _)) .WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); 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 index 8fb3a0735..5392951f5 100644 --- 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 @@ -293,4 +293,37 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_CleanAndCheckIfNeedWait_03 GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by CleanAndCheckIfNeedWait."; } GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_CleanAndCheckIfNeedWait_0300"; +} + +/** + * @tc.number: SUB_backup_sa_session_HandleOnRelease_0100 + * @tc.name: SUB_backup_sa_session_HandleOnRelease_0100 + * @tc.desc: 测试 HandleOnRelease + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_HandleOnRelease_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_HandleOnRelease_0100"; + try { + sptr svcProxy = nullptr; + sessionManagerPtr_->HandleOnRelease(svcProxy); + + svcProxy = sptr(new SvcExtensionProxyMock()); + EXPECT_NE(svcProxy, nullptr); + sessionManagerPtr_->impl_.scenario = IServiceReverseType::Scenario::UNDEFINED; + sessionManagerPtr_->HandleOnRelease(svcProxy); + + sessionManagerPtr_->impl_.scenario = IServiceReverseType::Scenario::CLEAN; + sessionManagerPtr_->HandleOnRelease(svcProxy); + + sessionManagerPtr_->impl_.scenario = IServiceReverseType::Scenario::BACKUP; + sessionManagerPtr_->HandleOnRelease(svcProxy); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by HandleOnRelease."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_HandleOnRelease_0100"; } \ 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 bd61dd570..2802450cf 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 @@ -24,6 +24,7 @@ #include "module_ipc/service.h" #include "module_ipc/svc_session_manager.h" #include "service_reverse_mock.h" +#include "svc_extension_proxy_mock.h" #include "test_manager.h" namespace OHOS::FileManagement::Backup { -- Gitee From d0c827083e25cb13b06de87bccbc8f55649f5470 Mon Sep 17 00:00:00 2001 From: "yaoruozi1@huawei.com" Date: Mon, 7 Jul 2025 21:03:40 +0800 Subject: [PATCH 21/62] modify extension fuzz Signed-off-by: yaoruozi1@huawei.com --- interfaces/common/include/sandbox_helper.h | 1 + interfaces/common/src/sandbox_helper.cpp | 6 ++ .../backupext_fuzzer/backupext_fuzzer.cpp | 73 +++++++++++++++---- test/fuzztest/backupsaanother_fuzzer/BUILD.gn | 3 + .../backupsaanother_fuzzer.cpp | 2 + 5 files changed, 70 insertions(+), 15 deletions(-) diff --git a/interfaces/common/include/sandbox_helper.h b/interfaces/common/include/sandbox_helper.h index cf2d1c4af..ce5fcefd6 100644 --- a/interfaces/common/include/sandbox_helper.h +++ b/interfaces/common/include/sandbox_helper.h @@ -44,6 +44,7 @@ public: static void GetNetworkIdFromUri(const std::string &fileUri, std::string &networkId); static std::string GetLowerDir(std::string &lowerPathHead, const std::string &userId, const std::string &bundleName, const std::string &networkId); + static void ClearBackupSandboxPathMap(); }; } // namespace AppFileService } // namespace OHOS diff --git a/interfaces/common/src/sandbox_helper.cpp b/interfaces/common/src/sandbox_helper.cpp index 8c00e7f4a..0536ab7fd 100644 --- a/interfaces/common/src/sandbox_helper.cpp +++ b/interfaces/common/src/sandbox_helper.cpp @@ -552,6 +552,12 @@ bool SandboxHelper::CheckValidPath(const std::string &filePath) return true; } + +void SandboxHelper::ClearBackupSandboxPathMap() +{ + lock_guard lock(mapMutex_); + backupSandboxPathMap_.clear(); +} } // namespace AppFileService } // namespace OHOS diff --git a/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp b/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp index 2d7559fca..a100e64fa 100644 --- a/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp +++ b/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp @@ -138,40 +138,49 @@ bool SetCreatorFuzzTest(shared_ptr backup, const uint8_t *data, size_ return true; } -bool CmdGetFileHandleFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdGetFileHandleFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { MessageParcel msg; MessageParcel reply; MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_GET_FILE_HANDLE_WITH_UNIQUE_FD); msg.WriteString(string(reinterpret_cast(data), size)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdHandleClearFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdHandleClearFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { MessageParcel msg; MessageParcel reply; MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_HANDLE_CLEAR); msg.WriteBuffer(data, size); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdHandleUser0BackupFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdHandleUser0BackupFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { MessageParcel msg; MessageParcel reply; MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_USER0_ON_BACKUP); msg.WriteBuffer(data, size); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdHandleBackupFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdHandleBackupFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { if (data == nullptr || size < sizeof(bool)) { return true; @@ -182,22 +191,28 @@ bool CmdHandleBackupFuzzTest(shared_ptr extension, const uin MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_HANDLE_BACKUP); msg.WriteBool(*reinterpret_cast(data)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdPublishFileFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdPublishFileFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { MessageParcel msg; MessageParcel reply; MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_PUBLISH_FILE); msg.WriteString(string(reinterpret_cast(data), size)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdHandleRestoreFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdHandleRestoreFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { if (data == nullptr || size < sizeof(bool)) { return true; @@ -208,33 +223,42 @@ bool CmdHandleRestoreFuzzTest(shared_ptr extension, const ui MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_HANDLE_RESTORE); msg.WriteBool(*reinterpret_cast(data)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdGetIncrementalFileHandleFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdGetIncrementalFileHandleFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { MessageParcel msg; MessageParcel reply; MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_GET_INCREMENTAL_FILE_HANDLE); msg.WriteString(string(reinterpret_cast(data), size)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdPublishIncrementalFileFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdPublishIncrementalFileFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { MessageParcel msg; MessageParcel reply; MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_PUBLISH_INCREMENTAL_FILE); msg.WriteString(string(reinterpret_cast(data), size)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdHandleIncrementalBackupFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdHandleIncrementalBackupFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { if (data == nullptr || size < sizeof(int) + sizeof(int)) { return true; @@ -249,11 +273,14 @@ bool CmdHandleIncrementalBackupFuzzTest(shared_ptr extension uint32_t code = static_cast(IExtensionIpcCode::COMMAND_HANDLE_INCREMENTAL_BACKUP); msg.WriteFileDescriptor(incrementalFd); msg.WriteFileDescriptor(manifestFd); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdIncrementalOnBackupFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool CmdIncrementalOnBackupFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { if (data == nullptr || size < sizeof(bool)) { return true; @@ -264,11 +291,14 @@ bool CmdIncrementalOnBackupFuzzTest(shared_ptr extension, co MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_INCREMENTAL_ON_BACKUP); msg.WriteBool(*reinterpret_cast(data)); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool CmdGetIncrementalBackupFileHandleFuzzTest(shared_ptr extension, +bool CmdGetIncrementalBackupFileHandleFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { @@ -277,13 +307,16 @@ bool CmdGetIncrementalBackupFileHandleFuzzTest(shared_ptr ex MessageOption option; uint32_t code = static_cast(IExtensionIpcCode::COMMAND_GET_INCREMENTAL_BACKUP_FILE_HANDLE); msg.WriteBuffer(data, size); + if (extension == nullptr) { + return false; + } extension->OnRemoteRequest(code, msg, reply, option); return true; } -bool OnRemoteRequestFuzzTest(shared_ptr extension, const uint8_t *data, size_t size) +bool OnRemoteRequestFuzzTest(OHOS::sptr extension, const uint8_t *data, size_t size) { - uint32_t codeMax = 15; + uint32_t codeMax = 17; for (uint32_t code = 1; code < codeMax; code++) { MessageParcel datas; MessageParcel reply; @@ -292,7 +325,16 @@ bool OnRemoteRequestFuzzTest(shared_ptr extension, const ui datas.WriteInterfaceToken(ExtensionStub::GetDescriptor()); datas.WriteBuffer(reinterpret_cast(data), size); datas.RewindRead(0); - extension->OnRemoteRequest(code, datas, reply, option); + if (extension == nullptr) { + return false; + } + try { + extension->OnRemoteRequest(code, datas, reply, option); + } catch (OHOS::FileManagement::Backup::BError &err) { + // filter Backup error + } catch (...) { + // filter other error + } } return true; } @@ -303,7 +345,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { /* Run your code on data */ auto extBackup = std::make_shared(); - auto extension = std::make_shared(extBackup, ""); + auto extension = OHOS::sptr( + new OHOS::FileManagement::Backup::BackupExtExtension(extBackup, "")); OHOS::InitFuzzTest(extBackup, data, size); OHOS::OnCommandFuzzTest(extBackup, data, size); diff --git a/test/fuzztest/backupsaanother_fuzzer/BUILD.gn b/test/fuzztest/backupsaanother_fuzzer/BUILD.gn index 764660d8d..36412f43b 100644 --- a/test/fuzztest/backupsaanother_fuzzer/BUILD.gn +++ b/test/fuzztest/backupsaanother_fuzzer/BUILD.gn @@ -39,6 +39,7 @@ ohos_fuzztest("BackupSaAnotherFuzzTest") { deps = [ "${app_file_service_path}/services/backup_sa:backup_sa", "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", "${path_backup}/utils:backup_utils", ] @@ -59,5 +60,7 @@ ohos_fuzztest("BackupSaAnotherFuzzTest") { "LOG_TAG=\"app_file_service\"", "LOG_DOMAIN=0xD004303", ] + + use_exceptions = true } ############################################################################### diff --git a/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp b/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp index a202ce4b6..8c3ae92d8 100644 --- a/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp +++ b/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp @@ -23,6 +23,7 @@ #include #include "message_parcel.h" +#include "sandbox_helper.h" #include "service.h" #include "service_proxy.h" #include "service_reverse.h" @@ -160,6 +161,7 @@ bool CmdGetLocalCapabilitiesIncrementalFuzzTest(const uint8_t *data, size_t size sptr service(new Service(SERVICE_ID)); uint32_t code = static_cast(IServiceIpcCode::COMMAND_GET_LOCAL_CAPABILITIES_INCREMENTAL); service->OnRemoteRequest(code, datas, reply, option); + OHOS::AppFileService::SandboxHelper::ClearBackupSandboxPathMap(); service = nullptr; return true; } -- Gitee From 1053ee4a491550eb9ac1ce4a205925bafd1696cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Tue, 8 Jul 2025 16:42:18 +0800 Subject: [PATCH 22/62] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=81=A2=E5=A4=8DonRes?= =?UTF-8?q?tore=E5=90=8E=E8=87=AA=E6=9D=80=E5=9C=BA=E6=99=AF=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../native/backup_ext/include/ext_extension.h | 5 +- .../native/backup_ext/src/ext_extension.cpp | 6 +- .../backup_ext/src/sub_ext_extension.cpp | 44 ++++------- services/backup_sa/IService.idl | 3 +- .../backup_sa/include/module_ipc/service.h | 2 +- services/backup_sa/src/module_ipc/service.cpp | 6 -- .../backup_sa/src/module_ipc/sub_service.cpp | 45 +++++++---- .../backup_kit_inner/service_proxy_mock.cpp | 2 +- tests/mock/module_ipc/service_mock.cpp | 2 +- .../backup_ext/ext_extension_sub_test.cpp | 10 +-- .../module_ipc/service_incremental_test.cpp | 8 +- .../module_ipc/service_other_test.cpp | 74 ++++++++++++++----- .../backup_sa/module_ipc/sub_service_test.cpp | 4 - .../backup_sa/session/service_proxy_mock.cpp | 2 +- .../backup_sa/session/service_proxy_mock.h | 3 +- 15 files changed, 122 insertions(+), 94 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 9dba03d38..ac4246976 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -392,10 +392,9 @@ private: map MatchFiles(map files, vector endExcludes); void UpdateTarStat(uint64_t tarFileSize); - void HandleExtDisconnect(); + void HandleExtDisconnect(bool isAppResultReport, ErrCode errCode); bool HandleGetExtOnRelease(); - void SetAppResultReport(const std::string resultInfo, ErrCode errCode); - void HandleExtOnRelease(); + void HandleExtOnRelease(bool isAppResultReport, ErrCode errCode); std::function OnReleaseCallback(wptr obj); std::function GetComInfoCallback(wptr obj); private: diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index ee46dd698..ec7f43d14 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -1864,7 +1864,7 @@ void BackupExtExtension::AppDone(ErrCode errCode) HILOGE("Failed to notify the app done. err = %{public}d", ret); } if (HandleGetExtOnRelease()) { - HandleExtOnRelease(); + HandleExtOnRelease(false, errCode); } } @@ -1878,6 +1878,10 @@ void BackupExtExtension::AppResultReport(const std::string restoreRetInfo, if (ret != ERR_OK) { HILOGE("Failed notify app restoreResultReport, errCode: %{public}d", ret); } + if (curScenario_ == BackupRestoreScenario::FULL_RESTORE || + curScenario_ == BackupRestoreScenario::INCREMENTAL_RESTORE) { + HandleExtOnRelease(true, errCode); + } } void BackupExtExtension::StartExtTimer(bool &isExtStart) diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 3f7af178c..fb11fea1b 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -271,7 +271,7 @@ std::function BackupExtExtension::OnRestoreCallback( std::string errInfo; BJsonUtil::BuildExtensionErrInfo(errInfo, errCode, errMsg); extensionPtr->ReportAppStatistic("OnRestoreCallback", errCode); - extensionPtr->SetAppResultReport(errInfo, errCode); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::FULL_RESTORE, errCode); } extensionPtr->DoClear(); }; @@ -311,7 +311,7 @@ std::function BackupExtExtension::OnRestoreExCallbac if (restoreRetInfo.size()) { HILOGI("Will notify restore result report"); extensionPtr->ReportAppStatistic("OnRestoreExCallback1", errCode); - extensionPtr->SetAppResultReport(restoreRetInfo, errCode); + extensionPtr->AppResultReport(restoreRetInfo, BackupRestoreScenario::FULL_RESTORE); } return; } @@ -322,7 +322,7 @@ std::function BackupExtExtension::OnRestoreExCallbac std::string errInfo; BJsonUtil::BuildExtensionErrInfo(errInfo, errCode, restoreRetInfo); extensionPtr->ReportAppStatistic("OnRestoreExCallback2", errCode); - extensionPtr->SetAppResultReport(errInfo, errCode); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::FULL_RESTORE, errCode); extensionPtr->DoClear(); } }; @@ -377,7 +377,7 @@ std::function BackupExtExtension::IncreOnRestoreExCa if (errCode == ERR_OK) { if (restoreRetInfo.size()) { extensionPtr->ReportAppStatistic("IncreOnRestoreExCallback1", errCode); - extensionPtr->SetAppResultReport(restoreRetInfo, errCode); + extensionPtr->AppResultReport(restoreRetInfo, BackupRestoreScenario::INCREMENTAL_RESTORE); } return; } @@ -388,7 +388,7 @@ std::function BackupExtExtension::IncreOnRestoreExCa std::string errInfo; BJsonUtil::BuildExtensionErrInfo(errInfo, errCode, restoreRetInfo); extensionPtr->ReportAppStatistic("IncreOnRestoreExCallback2", errCode); - extensionPtr->SetAppResultReport(errInfo, errCode); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::INCREMENTAL_RESTORE, errCode); extensionPtr->DoClear(); } }; @@ -425,7 +425,7 @@ std::function BackupExtExtension::IncreOnRestoreCall std::string errInfo; BJsonUtil::BuildExtensionErrInfo(errInfo, errCode, errMsg); extensionPtr->ReportAppStatistic("IncreOnRestoreCallback", errCode); - extensionPtr->SetAppResultReport(errInfo, errCode); + extensionPtr->AppResultReport(errInfo, BackupRestoreScenario::INCREMENTAL_RESTORE, errCode); } extensionPtr->DoClear(); }; @@ -836,7 +836,7 @@ void BackupExtExtension::AppIncrementalDone(ErrCode errCode) HILOGE("Failed to notify the app done. err = %{public}d", ret); } if (HandleGetExtOnRelease()) { - HandleExtOnRelease(); + HandleExtOnRelease(false, errCode); } } @@ -1789,19 +1789,16 @@ ErrCode BackupExtExtension::HandleOnRelease(int32_t scenario) } } -void BackupExtExtension::HandleExtDisconnect() +void BackupExtExtension::HandleExtDisconnect(bool isAppResultReport, ErrCode errCode) { - HILOGI("Begin, curScenario:%{public}d", curScenario_); + HILOGI("Begin, scenario:%{public}d, isAppResultReport:%{public}d, errCode:%{public}d", curScenario_, + isAppResultReport, errCode); auto proxy = ServiceClient::GetInstance(); if (proxy == nullptr) { HILOGE("Failed to obtain the ServiceClient handle"); return; } - bool isIncBackup = true; - if (curScenario_ == BackupRestoreScenario::FULL_BACKUP || curScenario_ == BackupRestoreScenario::FULL_RESTORE) { - isIncBackup = false; - } - auto ret = proxy->HandleExtDisconnect(isIncBackup); + auto ret = proxy->HandleExtDisconnect(curScenario_, isAppResultReport, errCode); if (ret != ERR_OK) { HILOGE("Failed to HandleExtDisconnect. err = %{public}d", ret); } @@ -1823,16 +1820,7 @@ bool BackupExtExtension::HandleGetExtOnRelease() return isExtOnRelease; } -void BackupExtExtension::SetAppResultReport(const std::string resultInfo, ErrCode errCode) -{ - HILOGI("SetAppResultReport begin"); - needAppResultReport_.store(true); - appResultReportInfo_ = resultInfo; - appResultReportErrCode_ = errCode; - HandleExtOnRelease(); -} - -void BackupExtExtension::HandleExtOnRelease() +void BackupExtExtension::HandleExtOnRelease(bool isAppResultReport, ErrCode errCode) { HILOGI("HandleExtOnRelease begin"); int32_t scenario = static_cast(BConstants::ExtensionScenario::RESTORE); @@ -1840,7 +1828,7 @@ void BackupExtExtension::HandleExtOnRelease() curScenario_ == BackupRestoreScenario::INCREMENTAL_BACKUP) { scenario = static_cast(BConstants::ExtensionScenario::BACKUP); } - auto task = [obj {wptr(this)}, scenario]() { + auto task = [obj {wptr(this)}, scenario, isAppResultReport, errCode]() { auto extPtr = obj.promote(); if (extPtr == nullptr || extPtr->extension_ == nullptr) { HILOGE("Call js onRelease failed, extensionPtr is empty"); @@ -1864,11 +1852,7 @@ void BackupExtExtension::HandleExtOnRelease() extPtr->stopWaitOnRelease_.store(true); extPtr->isOnReleased_.store(true); } - if (extPtr->needAppResultReport_.load()) { - extPtr->AppResultReport(extPtr->appResultReportInfo_, extPtr->curScenario_, - extPtr->appResultReportErrCode_); - } - extPtr->HandleExtDisconnect(); + extPtr->HandleExtDisconnect(isAppResultReport, errCode); }; onReleaseTaskPool_.AddTask([task]() { task(); }); } diff --git a/services/backup_sa/IService.idl b/services/backup_sa/IService.idl index dda0fe4a0..f4714cb80 100644 --- a/services/backup_sa/IService.idl +++ b/services/backup_sa/IService.idl @@ -72,7 +72,8 @@ interface OHOS.FileManagement.Backup.IService{ [in] int serviceResultReportErrCode); [ipccode 38] void GetBackupDataSize([in] boolean isPreciseScan,[in] BIncrementalData[] bundleNameList); [ipccode 40] void CleanBundleTempDir([in] String bundleName); - [ipccode 41] void HandleExtDisconnect([in] boolean isIncBackup); + [ipccode 41] void HandleExtDisconnect([in] BackupRestoreScenario scenario, [in] boolean isAppResultReport, + [in] int appErrCode); [ipccode 42] void GetExtOnRelease([out] boolean isExtOnRelease); [ipccode 43] void AppFileReadyWithoutFd([in]String fileName, [in] int appFileReadyErrCode); [ipccode 44] void AppIncrementalFileReadyWithoutFd([in] String fileName, [in] int appIncrementalFileReadyErrCode); diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 3e5052d5b..8bb77e1ad 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -118,7 +118,7 @@ public: ErrCode GetBackupDataSize(bool isPreciseScan, const std::vector& bundleNameList) override; ErrCode CleanBundleTempDir(const std::string &bundleName) override; - ErrCode HandleExtDisconnect(bool isIncBackup) override; + ErrCode HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) override; ErrCode GetExtOnRelease(bool &isExtOnRelease) override; ErrCode GetCompatibilityInfo(const std::string &bundleName, const std::string &extInfo, std::string &compatInfo) override; diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 9a64d35c3..a1bbe1bce 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -982,22 +982,16 @@ ErrCode Service::ServiceResultReport(const std::string& restoreRetInfo, BackupRe ErrCode ret = VerifyCallerAndGetCallerName(callerName); if (ret != ERR_OK) { HILOGE("Result report fail, bundleName:%{public}s, ret:%{public}d", callerName.c_str(), ret); - HandleCurBundleEndWork(callerName, sennario); CallOnBundleEndByScenario(callerName, sennario, ret); - OnAllBundlesFinished(BError(BError::Codes::OK)); return ret; } SendEndAppGalleryNotify(callerName); if (sennario == BackupRestoreScenario::FULL_RESTORE) { UpdateHandleCnt(errCode); - HandleCurBundleEndWork(callerName, sennario); session_->GetServiceReverseProxy()->RestoreOnResultReport(restoreRetInfo, callerName, errCode); - OnAllBundlesFinished(BError(BError::Codes::OK)); } else if (sennario == BackupRestoreScenario::INCREMENTAL_RESTORE) { UpdateHandleCnt(errCode); - HandleCurBundleEndWork(callerName, sennario); session_->GetServiceReverseProxy()->IncrementalRestoreOnResultReport(restoreRetInfo, callerName, errCode); - OnAllBundlesFinished(BError(BError::Codes::OK)); } else if (sennario == BackupRestoreScenario::FULL_BACKUP) { session_->GetServiceReverseProxy()->BackupOnResultReport(restoreRetInfo, callerName); } else if (sennario == BackupRestoreScenario::INCREMENTAL_BACKUP) { diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 59cbdb35a..ad86f20e8 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -1446,29 +1446,44 @@ ErrCode Service::CleanBundleTempDir(const string &bundleName) return BError(BError::Codes::OK); } -ErrCode Service::HandleExtDisconnect(bool isIncBackup) +ErrCode Service::HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) { - HILOGI("begin, isIncBackup: %{public}d", isIncBackup); + HILOGI("begin, scenario: %{public}d, isAppResultReport:%{public}d, errCode:%{public}d", scenario, + isAppResultReport, errCode); std::string callerName; auto ret = VerifyCallerAndGetCallerName(callerName); if (ret != ERR_OK) { HILOGE("HandleExtDisconnect VerifyCaller failed, get bundle failed, ret:%{public}d", ret); + if (isAppResultReport) { + HandleCurBundleEndWork(callerName, scenario); + OnAllBundlesFinished(BError(BError::Codes::OK)); + } return ret; } - std::shared_ptr mutexPtr = GetExtensionMutex(callerName); - if (mutexPtr == nullptr) { - HILOGE("extension mutex ptr is nullptr, bundleName:%{public}s", callerName.c_str()); - return BError(BError::Codes::SA_INVAL_ARG); - } - std::lock_guard lock(mutexPtr->callbackMutex); - ret = HandleCurAppDone(ret, callerName, isIncBackup); - if (ret != ERR_OK) { - HILOGE("Handle current app done error, bundleName:%{public}s", callerName.c_str()); - return ret; + if (isAppResultReport && (scenario == BackupRestoreScenario::FULL_RESTORE || + scenario == BackupRestoreScenario::INCREMENTAL_RESTORE)) { + HandleCurBundleEndWork(callerName, scenario); + OnAllBundlesFinished(BError(BError::Codes::OK)); + } else if (!isAppResultReport) { + bool isIncBackup = true; + if (scenario == BackupRestoreScenario::FULL_BACKUP || scenario == BackupRestoreScenario::FULL_RESTORE) { + isIncBackup = false; + } + std::shared_ptr mutexPtr = GetExtensionMutex(callerName); + if (mutexPtr == nullptr) { + HILOGE("extension mutex ptr is nullptr, bundleName:%{public}s", callerName.c_str()); + return BError(BError::Codes::SA_INVAL_ARG); + } + std::lock_guard lock(mutexPtr->callbackMutex); + ret = HandleCurAppDone(errCode, callerName, isIncBackup); + if (ret != ERR_OK) { + HILOGE("Handle current app done error, bundleName:%{public}s", callerName.c_str()); + return ret; + } + RemoveExtensionMutex(callerName); + RemoveExtOnRelease(callerName); + OnAllBundlesFinished(BError(BError::Codes::OK)); } - RemoveExtensionMutex(callerName); - RemoveExtOnRelease(callerName); - OnAllBundlesFinished(BError(BError::Codes::OK)); return ret; } diff --git a/tests/mock/backup_kit_inner/service_proxy_mock.cpp b/tests/mock/backup_kit_inner/service_proxy_mock.cpp index e605bfbf5..9173e3148 100644 --- a/tests/mock/backup_kit_inner/service_proxy_mock.cpp +++ b/tests/mock/backup_kit_inner/service_proxy_mock.cpp @@ -277,7 +277,7 @@ ErrCode ServiceProxy::CleanBundleTempDir(const std::string& bundleName) return BError(BError::Codes::OK); } -ErrCode ServiceProxy::HandleExtDisconnect(bool isIncBackup) +ErrCode ServiceProxy::HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) { return BError(BError::Codes::OK); } diff --git a/tests/mock/module_ipc/service_mock.cpp b/tests/mock/module_ipc/service_mock.cpp index ff713dbb0..61afc65f2 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -441,7 +441,7 @@ bool Service::GetScanningInfo(wptr obj, size_t scannedSize, string &sca void Service::SetScanningInfo(string &scanning, string name) {} -ErrCode Service::HandleExtDisconnect(bool isIncBackup) +ErrCode Service::HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) { return BError(BError::Codes::OK); } diff --git a/tests/unittests/backup_ext/ext_extension_sub_test.cpp b/tests/unittests/backup_ext/ext_extension_sub_test.cpp index 243ed2505..2cc8137db 100644 --- a/tests/unittests/backup_ext/ext_extension_sub_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_sub_test.cpp @@ -274,28 +274,28 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleExtOnRelease_Test_0100, te extExtension->curScenario_ = BackupRestoreScenario::FULL_BACKUP; auto ext = extExtension->extension_; extExtension->extension_ = nullptr; - extExtension->HandleExtOnRelease(); + extExtension->HandleExtOnRelease(false, BError(BError::Codes::OK).GetCode()); EXPECT_TRUE(true); extExtension->curScenario_ = BackupRestoreScenario::FULL_RESTORE; - extExtension->HandleExtOnRelease(); + extExtension->HandleExtOnRelease(false, BError(BError::Codes::OK).GetCode()); EXPECT_TRUE(true); extExtension->extension_ = ext; EXPECT_NE(extExtension->extension_, nullptr); bool isOnReleased = extExtension->isOnReleased_.load(); extExtension->isOnReleased_.store(true); - extExtension->HandleExtOnRelease(); + extExtension->HandleExtOnRelease(false, BError(BError::Codes::OK).GetCode()); EXPECT_TRUE(true); extExtension->isOnReleased_.store(false); EXPECT_CALL(*extBackupMock, OnRelease(_, _)).WillOnce(Return(BError(BError::Codes::EXT_INVAL_ARG).GetCode())); - extExtension->HandleExtOnRelease(); + extExtension->HandleExtOnRelease(false, BError(BError::Codes::OK).GetCode()); EXPECT_TRUE(true); EXPECT_CALL(*extBackupMock, OnRelease(_, _)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); extExtension->needAppResultReport_.store(false); - extExtension->HandleExtOnRelease(); + extExtension->HandleExtOnRelease(false, BError(BError::Codes::OK).GetCode()); EXPECT_TRUE(true); extExtension->isOnReleased_.store(isOnReleased); diff --git a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp index cfedb16ce..ce96dcb76 100644 --- a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp @@ -77,7 +77,7 @@ public: virtual UniqueFd GetLocalCapabilitiesForBundleInfos() = 0; virtual ErrCode GetBackupDataSize(bool, const std::vector&) = 0; virtual ErrCode CleanBundleTempDir(const std::string& bundleName) = 0; - virtual ErrCode HandleExtDisconnect(bool) = 0; + virtual ErrCode HandleExtDisconnect(BackupRestoreScenario, bool, ErrCode) = 0; virtual ErrCode GetExtOnRelease(bool&) = 0; virtual void SetExtOnRelease(const BundleName&, bool) = 0; virtual void RemoveExtOnRelease(const BundleName&) = 0; @@ -138,7 +138,7 @@ public: MOCK_METHOD(UniqueFd, GetLocalCapabilitiesForBundleInfos, ()); MOCK_METHOD(ErrCode, GetBackupDataSize, (bool, const std::vector&)); MOCK_METHOD(ErrCode, CleanBundleTempDir, (const std::string&)); - MOCK_METHOD(ErrCode, HandleExtDisconnect, (bool)); + MOCK_METHOD(ErrCode, HandleExtDisconnect, (BackupRestoreScenario, bool, ErrCode)); MOCK_METHOD(ErrCode, GetExtOnRelease, (bool&)); MOCK_METHOD(void, SetExtOnRelease, (const BundleName&, bool)); MOCK_METHOD(void, RemoveExtOnRelease, (const BundleName&)); @@ -461,9 +461,9 @@ ErrCode Service::CleanBundleTempDir(const std::string& bundleName) return BService::serviceMock->CleanBundleTempDir(bundleName); } -ErrCode Service::HandleExtDisconnect(bool isIncBackup) +ErrCode Service::HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) { - return BService::serviceMock->HandleExtDisconnect(isIncBackup); + return BService::serviceMock->HandleExtDisconnect(scenario, isAppResultReport, errCode); } ErrCode Service::GetExtOnRelease(bool &isExtOnRelease) 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 57a64d87f..c99367281 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -2615,12 +2615,22 @@ HWTEST_F(ServiceTest, SUB_Service_HandleExtDisconnect_0000, testing::ext::TestSi { GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_HandleExtDisconnect_0000"; try { - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(1)); - EXPECT_CALL(*param, GetBackupDebugOverrideAccount()).WillOnce(Return(make_pair(false, -1))); - EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - auto ret = service->HandleExtDisconnect(true); + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_RESTORE; + bool isAppResultReport = false; + ErrCode appErrCode = BError(BError::Codes::OK).GetCode(); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(1)); + EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) + .WillRepeatedly(Return(make_pair(false, -1))); + EXPECT_CALL(*skeleton, GetCallingUid()).WillRepeatedly(Return(BConstants::SYSTEM_UID)); + auto ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); + EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + + isAppResultReport = true; + EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); } catch (...) { EXPECT_TRUE(false); @@ -2642,12 +2652,21 @@ HWTEST_F(ServiceTest, SUB_Service_HandleExtDisconnect_0100, testing::ext::TestSi { GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_HandleExtDisconnect_0100"; try { - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); - EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("")); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(nullptr)); - auto ret = service->HandleExtDisconnect(true); + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_RESTORE; + bool isAppResultReport = false; + ErrCode appErrCode = BError(BError::Codes::OK).GetCode(); + std::string bundleName = "test"; + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(0)); + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillRepeatedly(Return("test")); + EXPECT_CALL(*session, GetExtConnection(_)).WillRepeatedly(Return(nullptr)); + auto ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); + EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + + service->backupExtMutexMap_[bundleName] = nullptr; + ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); + service->backupExtMutexMap_.clear(); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); } catch (...) { EXPECT_TRUE(false); @@ -2669,13 +2688,16 @@ HWTEST_F(ServiceTest, SUB_Service_HandleExtDisconnect_0200, testing::ext::TestSi { GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_HandleExtDisconnect_0200"; try { + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_BACKUP; + bool isAppResultReport = false; + ErrCode appErrCode = BError(BError::Codes::OK).GetCode(); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("")); EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(nullptr)); - auto ret = service->HandleExtDisconnect(true); + auto ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); } catch (...) { EXPECT_TRUE(false); @@ -2697,10 +2719,23 @@ HWTEST_F(ServiceTest, SUB_Service_HandleExtDisconnect_0300, testing::ext::TestSi { GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_HandleExtDisconnect_0300"; try { - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); - EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("")); + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_RESTORE; + bool isAppResultReport = true; + ErrCode appErrCode = BError(BError::Codes::OK).GetCode(); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(0)); + EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillRepeatedly(Return("")); + EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillRepeatedly(Return(false)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillRepeatedly(Return(false)); + auto ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + + scenario = BackupRestoreScenario::FULL_RESTORE; + ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + + isAppResultReport = false; EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, HandleClear()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); @@ -2708,10 +2743,9 @@ HWTEST_F(ServiceTest, SUB_Service_HandleExtDisconnect_0300, testing::ext::TestSi EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); EXPECT_CALL(*connect, DisconnectBackupExtAbility()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, GetScenario()).WillRepeatedly(Return(IServiceReverseType::Scenario::UNDEFINED)); EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillOnce(Return(false)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); - auto ret = service->HandleExtDisconnect(true); + ret = service->HandleExtDisconnect(scenario, isAppResultReport, appErrCode); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); } catch (...) { EXPECT_TRUE(false); diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index 01c51ed5f..da25a5f8e 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -72,9 +72,7 @@ HWTEST_F(ServiceTest, SUB_Service_ServiceResultReport_0000, TestSize.Level1) EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("")); EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)); EXPECT_CALL(*srProxy, RestoreOnResultReport(_, _, _)).WillOnce(Return(0)); - EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); auto ret = service->ServiceResultReport("", BackupRestoreScenario::FULL_RESTORE, 0); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); @@ -84,9 +82,7 @@ HWTEST_F(ServiceTest, SUB_Service_ServiceResultReport_0000, TestSize.Level1) EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("")); EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)); EXPECT_CALL(*srProxy, IncrementalRestoreOnResultReport(_, _, _)).WillOnce(Return(0)); - EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); ret = service->ServiceResultReport("", BackupRestoreScenario::INCREMENTAL_RESTORE, 0); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); diff --git a/tests/unittests/backup_sa/session/service_proxy_mock.cpp b/tests/unittests/backup_sa/session/service_proxy_mock.cpp index f07378af4..98a32f108 100644 --- a/tests/unittests/backup_sa/session/service_proxy_mock.cpp +++ b/tests/unittests/backup_sa/session/service_proxy_mock.cpp @@ -251,7 +251,7 @@ ErrCode ServiceProxy::CleanBundleTempDir(const std::string& bundleName) return BError(BError::Codes::OK); } -ErrCode ServiceProxy::HandleExtDisconnect(bool isIncBackup) +ErrCode ServiceProxy::HandleExtDisconnect(BackupRestoreScenario scenario, bool isAppResultReport, ErrCode errCode) { return BError(BError::Codes::OK); } diff --git a/tests/unittests/backup_sa/session/service_proxy_mock.h b/tests/unittests/backup_sa/session/service_proxy_mock.h index 40271c70d..ee25369bf 100644 --- a/tests/unittests/backup_sa/session/service_proxy_mock.h +++ b/tests/unittests/backup_sa/session/service_proxy_mock.h @@ -75,7 +75,8 @@ public: ErrCode(int32_t, const std::vector &, int32_t, int32_t)); MOCK_METHOD2(GetBackupDataSize, ErrCode(bool isPreciseScan, const std::vector &bundleNameList)); MOCK_METHOD1(CleanBundleTempDir, ErrCode(const std::string &bundleName)); - MOCK_METHOD1(HandleExtDisconnect, ErrCode(bool isIncBackup)); + MOCK_METHOD3(HandleExtDisconnect, ErrCode(BackupRestoreScenario scenario, bool isAppResultReport, + ErrCode errCode)); MOCK_METHOD1(GetExtOnRelease, ErrCode(bool &isExtOnRelease)); MOCK_METHOD3(GetCompatibilityInfo, ErrCode(const std::string&, const std::string&, std::string&)); }; -- Gitee From 56f546b8571595ffb9d9238486f006322e399860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Thu, 10 Jul 2025 20:04:41 +0800 Subject: [PATCH 23/62] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E8=87=AA=E6=9D=80=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../include/module_ipc/svc_session_manager.h | 5 ++ services/backup_sa/src/module_ipc/service.cpp | 4 + .../backup_sa/src/module_ipc/sub_service.cpp | 4 +- .../src/module_ipc/svc_session_manager.cpp | 31 ++++++++ .../include/svc_session_manager_mock.h | 4 + .../src/svc_session_manager_mock.cpp | 9 +++ .../module_ipc/svc_session_manager_mock.cpp | 9 +++ .../svc_session_manager_throw_mock.cpp | 9 +++ .../svc_session_manager_throw_mock.h | 4 + .../backup_sa/module_ipc/service_test.cpp | 8 ++ .../svc_session_manager_ex_test.cpp | 76 +++++++++++++++++++ 11 files changed, 162 insertions(+), 1 deletion(-) 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 5b3bbbbed..d9a40dd69 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -74,6 +74,7 @@ struct BackupExtInfo { bool isClearData {true}; bool isInPublishFile {false}; bool isReadyLaunch {false}; + bool isRestoreEnd {false}; }; class Service; @@ -579,6 +580,10 @@ public: void HandleOnRelease(sptr proxy); + void SetIsRestoreEnd(const std::string &bundleName); + + bool GetIsRestoreEnd(const std::string &bundleName); + private: /** * @brief 获取backup extension ability diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index a1bbe1bce..bb16e729b 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -985,6 +985,10 @@ ErrCode Service::ServiceResultReport(const std::string& restoreRetInfo, BackupRe CallOnBundleEndByScenario(callerName, sennario, ret); return ret; } + if (errCode == ERR_OK && (sennario == BackupRestoreScenario::INCREMENTAL_RESTORE || + sennario == BackupRestoreScenario::FULL_RESTORE)) { + session_->SetIsRestoreEnd(callerName); + } SendEndAppGalleryNotify(callerName); if (sennario == BackupRestoreScenario::FULL_RESTORE) { UpdateHandleCnt(errCode); diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index ad86f20e8..7c83fd08f 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -687,7 +687,9 @@ void Service::ExtConnectDied(const string &callName) ClearSessionAndSchedInfo(callName); } /* Notice Client Ext Ability Process Died */ - NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + if (!session_->GetIsRestoreEnd(callName)) { + NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + } } catch (...) { HILOGE("Unexpected exception, bundleName: %{public}s", callName.c_str()); SendEndAppGalleryNotify(callName); diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index 4dccce6be..07545697b 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -1332,4 +1332,35 @@ void SvcSessionManager::HandleOnRelease(sptr proxy) HILOGI("HandleOnRelease begin"); proxy->HandleOnRelease(static_cast(impl_.scenario)); } + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ + unique_lock lock(lock_); + if (!impl_.clientToken) { + HILOGE("No caller token was specified, bundleName:%{public}s", bundleName.c_str()); + return; + } + auto [findBundleSuc, it] = GetBackupExtNameMap(bundleName); + if (!findBundleSuc) { + HILOGE("BackupExtNameMap can not find bundle %{public}s", bundleName.c_str()); + return; + } + it->second.isRestoreEnd = true; + HILOGI("SetIsRestoreEnd success, bundleName = %{public}s", bundleName.c_str()); +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + shared_lock lock(lock_); + if (!impl_.clientToken) { + HILOGE("No caller token was specified, bundleName:%{public}s", bundleName.c_str()); + return false; + } + auto [findBundleSuc, it] = GetBackupExtNameMap(bundleName); + if (!findBundleSuc) { + HILOGE("BackupExtNameMap can not find bundle %{public}s", bundleName.c_str()); + return false; + } + return it->second.isRestoreEnd; +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/include/svc_session_manager_mock.h b/tests/mock/module_ipc/include/svc_session_manager_mock.h index d5e982a60..4c4a3a19b 100644 --- a/tests/mock/module_ipc/include/svc_session_manager_mock.h +++ b/tests/mock/module_ipc/include/svc_session_manager_mock.h @@ -64,6 +64,8 @@ public: virtual std::string GetOldBackupVersion() = 0; virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; virtual void HandleOnRelease(sptr proxy) = 0; + virtual void SetIsRestoreEnd(const std::string &bundleName) = 0; + virtual bool GetIsRestoreEnd(const std::string &bundleName) = 0; public: BSvcSessionManager() = default; virtual ~BSvcSessionManager() = default; @@ -114,6 +116,8 @@ public: MOCK_METHOD(std::string, GetOldBackupVersion, ()); MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); MOCK_METHOD(void, HandleOnRelease, (sptr)); + MOCK_METHOD(void, SetIsRestoreEnd, (const std::string &)); + MOCK_METHOD(bool, GetIsRestoreEnd, (const std::string &)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_SESSION_MANAGER_MOCK_H diff --git a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp index 05413708f..ab02cc68d 100644 --- a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp @@ -310,4 +310,13 @@ std::string SvcSessionManager::GetOldBackupVersion() void SvcSessionManager::HandleOnRelease(sptr proxy) { } + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + return false; +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index 26060dfcc..c1862dc6c 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -534,4 +534,13 @@ void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t un void SvcSessionManager::HandleOnRelease(sptr proxy) { } + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + return false; +} } // namespace OHOS::FileManagement::Backup 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 2fb2f741e..e144e43d4 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -364,4 +364,13 @@ std::string SvcSessionManager::GetOldBackupVersion() } void SvcSessionManager::HandleOnRelease(sptr proxy) {} + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + return false; +} } // namespace OHOS::FileManagement::Backup 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 65fd948bd..f183a662a 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -100,6 +100,8 @@ public: virtual std::string GetOldBackupVersion() = 0; virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; virtual void HandleOnRelease(sptr proxy) = 0; + virtual void SetIsRestoreEnd(const std::string &bundleName) = 0; + virtual bool GetIsRestoreEnd(const std::string &bundleName) = 0; public: static inline std::shared_ptr session = nullptr; }; @@ -179,6 +181,8 @@ public: MOCK_METHOD(std::string, GetOldBackupVersion, ()); MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); MOCK_METHOD(void, HandleOnRelease, (sptr)); + MOCK_METHOD(void, SetIsRestoreEnd, (const std::string &)); + MOCK_METHOD(bool, GetIsRestoreEnd, (const std::string &)); }; } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_sa/module_ipc/service_test.cpp b/tests/unittests/backup_sa/module_ipc/service_test.cpp index 710c128c6..d47502656 100644 --- a/tests/unittests/backup_sa/module_ipc/service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_test.cpp @@ -575,6 +575,12 @@ HWTEST_F(ServiceTest, SUB_Service_ServiceResultReport_0000, testing::ext::TestSi ret = servicePtr_->ServiceResultReport("test", static_cast(1000), 0); EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::INCREMENTAL_BACKUP, 1); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::FULL_RESTORE, 1); + EXPECT_EQ(ret, BError(BError::Codes::OK)); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ServiceResultReport."; @@ -2053,6 +2059,8 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0100, testing::ext::TestSize.Le servicePtr_->ExtConnectDied(callName); extInfo.backUpConnection->isConnected_.store(true); servicePtr_->ExtConnectDied(callName); + extInfo.isRestoreEnd = true; + servicePtr_->ExtConnectDied(callName); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ExtConnectDied."; 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 index 5392951f5..1206bf28d 100644 --- 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 @@ -326,4 +326,80 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_HandleOnRelease_0100, test GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by HandleOnRelease."; } GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_HandleOnRelease_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_SetIsRestoreEnd_0100 + * @tc.name: SUB_backup_sa_session_SetIsRestoreEnd_0100 + * @tc.desc: 测试 SetIsRestoreEnd + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_SetIsRestoreEnd_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_SetIsRestoreEnd_0100"; + try { + std::string bundleName = "com.test.bundleName"; + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->impl_.backupExtNameMap.clear(); + sessionManagerPtr_->SetIsRestoreEnd(bundleName); + EXPECT_EQ(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + sessionManagerPtr_->SetIsRestoreEnd(bundleName); + EXPECT_EQ(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + + BackupExtInfo backupInfo {}; + sessionManagerPtr_->impl_.backupExtNameMap[bundleName] = backupInfo; + EXPECT_NE(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + sessionManagerPtr_->SetIsRestoreEnd(bundleName); + bool ret = sessionManagerPtr_->impl_.backupExtNameMap[bundleName].isRestoreEnd; + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by SetIsRestoreEnd."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_SetIsRestoreEnd_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetIsRestoreEnd_0100 + * @tc.name: SUB_backup_sa_session_GetIsRestoreEnd_0100 + * @tc.desc: 测试 GetIsRestoreEnd + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetIsRestoreEnd_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetIsRestoreEnd_0100"; + try { + std::string bundleName = "com.test.bundleName"; + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->impl_.backupExtNameMap.clear(); + auto ret = sessionManagerPtr_->GetIsRestoreEnd(bundleName); + EXPECT_FALSE(ret); + + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + ret = sessionManagerPtr_->GetIsRestoreEnd(bundleName); + EXPECT_FALSE(ret); + + BackupExtInfo backupInfo {}; + backupInfo.isRestoreEnd = true; + sessionManagerPtr_->impl_.backupExtNameMap[bundleName] = backupInfo; + EXPECT_NE(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + ret = sessionManagerPtr_->GetIsRestoreEnd(bundleName); + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetIsRestoreEnd."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetIsRestoreEnd_0100"; } \ No newline at end of file -- Gitee From d43462104df202b883050c4f98f21e7933879a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Fri, 11 Jul 2025 10:31:57 +0800 Subject: [PATCH 24/62] fuzzer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- test/fuzztest/backupsa_fuzzer/BUILD.gn | 2 ++ test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/fuzztest/backupsa_fuzzer/BUILD.gn b/test/fuzztest/backupsa_fuzzer/BUILD.gn index be88b3013..bce672d81 100644 --- a/test/fuzztest/backupsa_fuzzer/BUILD.gn +++ b/test/fuzztest/backupsa_fuzzer/BUILD.gn @@ -57,5 +57,7 @@ ohos_fuzztest("BackupSaFuzzTest") { "LOG_TAG=\"app_file_service\"", "LOG_DOMAIN=0xD004303", ] + + use_exceptions = true } ############################################################################### diff --git a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp index 2f4141076..7f4e7a156 100644 --- a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp +++ b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp @@ -56,6 +56,12 @@ bool BackupSaFuzzTest(const uint8_t *data, size_t size) /* Fuzzer entry point */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) { - OHOS::BackupSaFuzzTest(data, dataSize); + try { + OHOS::BackupSaFuzzTest(data, dataSize); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + // filter other error + } return 0; } \ No newline at end of file -- Gitee From 16adeafe69a60f486a0150cca8c17c06468a5be1 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 14 Jul 2025 10:20:22 +0800 Subject: [PATCH 25/62] backup to restore. Signed-off-by: BrainL Change-Id: I9cc162534bfba5fa0797ec1befebdc7b5c10ea34 --- services/backup_sa/src/module_ipc/service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index bb16e729b..f578df62f 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1156,7 +1156,7 @@ void Service::StartCurBundleBackupOrRestore(const std::string &bundleName) proxy->GetFileHandleWithUniqueFd(fileName, errCode, fdCode); UniqueFd fd(fdCode); bool fdFlag = fd < 0 ? true : false; - fdFlag ? session_->GetServiceReverseProxy()->BackupOnFileReadyWithoutFd(bundleName, fileName, errCode) : + fdFlag ? session_->GetServiceReverseProxy()->RestoreOnFileReadyWithoutFd(bundleName, fileName, errCode) : session_->GetServiceReverseProxy()->RestoreOnFileReady(bundleName, fileName, move(fd), errCode); FileReadyRadarReport(bundleName, fileName, errCode, scenario); } -- Gitee From 8dd03d07f9e2f5d73180c36d968076575d5326a9 Mon Sep 17 00:00:00 2001 From: lizhengxing Date: Fri, 11 Jul 2025 18:53:56 +0800 Subject: [PATCH 26/62] add ut sub extension2 Signed-off-by: lizhengxing --- .../backup_ext/include/ext_extension_mock.h | 16 + .../backup_ext/src/ext_extension_mock.cpp | 16 + tests/unittests/backup_ext/BUILD.gn | 2 + .../backup_ext/ext_extension_sub_test.cpp | 324 +++++++++++++++++- 4 files changed, 345 insertions(+), 13 deletions(-) diff --git a/tests/mock/backup_ext/include/ext_extension_mock.h b/tests/mock/backup_ext/include/ext_extension_mock.h index bff5767cd..6f2058470 100644 --- a/tests/mock/backup_ext/include/ext_extension_mock.h +++ b/tests/mock/backup_ext/include/ext_extension_mock.h @@ -63,6 +63,7 @@ public: virtual void DoClearInner() = 0; virtual void StartFwkTimer(bool &isFwkStart) = 0; virtual ErrCode CleanBundleTempDir() = 0; + virtual void AsyncTaskIncreRestoreSpecialVersion() = 0; public: BExtExtension() = default; virtual ~BExtExtension() = default; @@ -103,6 +104,21 @@ public: MOCK_METHOD(ErrCode, IncrementalBigFileReady, (TarMap&, const std::vector&, sptr)); MOCK_METHOD(ErrCode, CleanBundleTempDir, ()); + MOCK_METHOD((std::tuple), GetIncrementalFileHandle, + (const string &)); + MOCK_METHOD(ErrCode, GetFileHandleWithUniqueFd, (const std::string &, int32_t &, int&)); + MOCK_METHOD(std::string, GetBackupInfo, ()); + MOCK_METHOD(void, UpdateOnStartTime, ()); + MOCK_METHOD(ErrCode, IncrementalTarFileReady, (const TarMap &, const vector &, + sptr)); + MOCK_METHOD(void, ReportAppStatistic, (const std::string &, ErrCode)); + MOCK_METHOD(ErrCode, IncrementalAllFileReady, (const TarMap &, const vector &, + sptr)); + MOCK_METHOD(void, VerifyCaller, ()); + MOCK_METHOD((std::function), ReportErrFileByProc, (wptr, + BackupRestoreScenario)); + MOCK_METHOD(void, DoClearInner, ()); + MOCK_METHOD(void, StartFwkTimer, (bool &)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_EXT_EXTENSION_MOCK_H \ No newline at end of file diff --git a/tests/mock/backup_ext/src/ext_extension_mock.cpp b/tests/mock/backup_ext/src/ext_extension_mock.cpp index 16b750556..d409d47a4 100644 --- a/tests/mock/backup_ext/src/ext_extension_mock.cpp +++ b/tests/mock/backup_ext/src/ext_extension_mock.cpp @@ -20,6 +20,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; void BackupExtExtension::VerifyCaller() { + BExtExtension::extExtension->VerifyCaller(); } UniqueFd BackupExtExtension::GetFileHandle(const string &fileName, int32_t &errCode) @@ -77,40 +78,49 @@ int BackupExtExtension::DoIncrementalRestore() void BackupExtExtension::AsyncTaskBackup(const string config) { + BExtExtension::extExtension->AsyncTaskBackup(config); } void BackupExtExtension::AsyncTaskRestore(std::set fileSet, const std::vector extManageInfo) { + BExtExtension::extExtension->AsyncTaskRestore(fileSet, extManageInfo); } void BackupExtExtension::AsyncTaskIncrementalRestore() { + BExtExtension::extExtension->AsyncTaskIncrementalRestore(); } void BackupExtExtension::AsyncTaskIncreRestoreSpecialVersion() { + BExtExtension::extExtension->AsyncTaskIncreRestoreSpecialVersion(); } void BackupExtExtension::AsyncTaskIncrementalRestoreForUpgrade() { + BExtExtension::extExtension->AsyncTaskIncrementalRestoreForUpgrade(); } void BackupExtExtension::DoClear() { + BExtExtension::extExtension->DoClear(); } void BackupExtExtension::AppDone(ErrCode errCode) { + BExtExtension::extExtension->AppDone(errCode); } void BackupExtExtension::AppResultReport(const std::string restoreRetInfo, BackupRestoreScenario scenario, ErrCode errCode) { + BExtExtension::extExtension->AppResultReport(restoreRetInfo, scenario, errCode); } void BackupExtExtension::AsyncTaskOnBackup() { + BExtExtension::extExtension->AsyncTaskOnBackup(); } ErrCode BackupExtExtension::HandleRestore(bool isClearData) @@ -126,6 +136,7 @@ ErrCode BackupExtExtension::IncrementalBigFileReady(TarMap &pkgInfo, void BackupExtExtension::StartFwkTimer(bool &isFwkStart) { + BExtExtension::extExtension->StartFwkTimer(isFwkStart); } ErrCode BackupExtExtension::GetFileHandleWithUniqueFd(const std::string &fileName, int32_t &errCode, int& fd) @@ -139,14 +150,18 @@ void BackupExtExtension::FillFileInfos(UniqueFd incrementalFd, vector &smallFiles, vector &bigFiles) { + BExtExtension::extExtension->FillFileInfos(move(incrementalFd), move(manifestFd), allFiles, + smallFiles, bigFiles); } void BackupExtExtension::ReportAppStatistic(const std::string &func, ErrCode errCode) { + BExtExtension::extExtension->ReportAppStatistic(func, errCode); } void BackupExtExtension::UpdateOnStartTime() { + BExtExtension::extExtension->UpdateOnStartTime(); } ErrCode BackupExtExtension::IncrementalTarFileReady(const TarMap &bigFileInfo, @@ -169,6 +184,7 @@ std::function BackupExtExtension::ReportErrFileByProc(wp void BackupExtExtension::DoClearInner() { + BExtExtension::extExtension->DoClearInner(); } ErrCode BackupExtExtension::CleanBundleTempDir() diff --git a/tests/unittests/backup_ext/BUILD.gn b/tests/unittests/backup_ext/BUILD.gn index 0e44de2a6..ed59b5e9a 100644 --- a/tests/unittests/backup_ext/BUILD.gn +++ b/tests/unittests/backup_ext/BUILD.gn @@ -509,6 +509,8 @@ ohos_unittest("ext_extension_sub_test") { "${path_backup}/tests/mock/backup_kit_inner/service_proxy_mock.cpp", "${path_backup}/tests/mock/utils_mock/src/utils_mock_global_variable.cpp", "${path_backup}/tests/utils/src/test_manager.cpp", + "${path_backup}/frameworks/native/backup_ext/src/tar_file.cpp", + "${path_backup}/frameworks/native/backup_ext/src/untar_file.cpp", "ext_extension_sub_test.cpp", ] diff --git a/tests/unittests/backup_ext/ext_extension_sub_test.cpp b/tests/unittests/backup_ext/ext_extension_sub_test.cpp index 2cc8137db..9a3c76695 100644 --- a/tests/unittests/backup_ext/ext_extension_sub_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_sub_test.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ +#include #include #include #include @@ -20,7 +21,6 @@ #include #include #include -#include #include @@ -28,8 +28,9 @@ #include "b_error/b_excep_utils.h" #include "ext_backup_mock.h" #include "ext_extension_mock.h" +#include "tar_file.h" +#include "untar_file.h" -#include "tar_file.cpp" #include "sub_ext_extension.cpp" namespace OHOS::FileManagement::Backup { @@ -61,6 +62,7 @@ public: static inline sptr extExtension = nullptr; static inline shared_ptr extension = nullptr; static inline shared_ptr extBackupMock = nullptr; + static inline shared_ptr extExtensionMock = nullptr; }; void ExtExtensionSubTest::SetUpTestCase(void) @@ -82,10 +84,15 @@ void ExtExtensionSubTest::SetUpTestCase(void) system(touchFile.c_str()); string touchFile2 = string("touch ") + PATH + BUNDLE_NAME + "2.txt"; system(touchFile2.c_str()); + string touchFile3 = string("touch ") + PATH + BUNDLE_NAME + TAR_FILE; + system(touchFile3.c_str()); extBackupMock = make_shared(); ExtBackupMock::extBackup = extBackupMock; + extExtensionMock = make_shared(); + ExtExtensionMock::extExtension = extExtensionMock; + extExtension = sptr(new BackupExtExtension( nullptr, BUNDLE_NAME)); extension = make_shared(); @@ -98,35 +105,34 @@ void ExtExtensionSubTest::TearDownTestCase(void) string rmDir = string("rm -r ") + PATH + BUNDLE_NAME; system(rmDir.c_str()); - rmDir = string("rm -r ") + BUNDLE_BASE_DIR; - system(rmDir.c_str()); - - rmDir = string("rm -r ") + PATH_BUNDLE_BACKUP_HOME_EL1; + rmDir = string("rm -r ") + "/data/storage/el2/"; system(rmDir.c_str()); - rmDir = string("rm -r ") + PATH_BUNDLE_BACKUP_HOME; + rmDir = string("rm -r ") + "/data/storage/el1/"; system(rmDir.c_str()); extension = nullptr; extExtension = nullptr; ExtBackupMock::extBackup = nullptr; extBackupMock = nullptr; + ExtExtensionMock::extExtension = nullptr; + extExtensionMock = nullptr; }; /** - * @tc.number: Ext_Extension_Sub_Test_0001 - * @tc.name: Ext_Extension_Sub_Test_0001 + * @tc.number: Ext_Extension_Sub_SetClearDataFlag_Test_0100 + * @tc.name: Ext_Extension_Sub_SetClearDataFlag_Test_0100 * @tc.desc: 测试SetClearDataFlag * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 1 * @tc.require: I9P3Y3 */ -HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_Test_0001, testing::ext::TestSize.Level1) +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_SetClearDataFlag_Test_0100, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_Test_0001"; + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_SetClearDataFlag_Test_0100"; try { - EXPECT_TRUE(extExtension != nullptr); + ASSERT_TRUE(extExtension != nullptr); extExtension->SetClearDataFlag(true); EXPECT_TRUE(extExtension->isClearData_ == true); @@ -139,7 +145,295 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_Test_0001, testing::ext::TestSiz EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; } - GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_Test_0001"; + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_SetClearDataFlag_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_HandleIncrementalBackup_Test_0100 + * @tc.name: Ext_Extension_Sub_HandleIncrementalBackup_Test_0100 + * @tc.desc: 测试HandleIncrementalBackup + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleIncrementalBackup_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_HandleIncrementalBackup_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + string incrementalFile = PATH + BUNDLE_NAME + "2.txt"; + int incrementalFd = open(incrementalFile.data(), O_RDWR | O_TRUNC, S_IRWXU); + EXPECT_GT(incrementalFd, 0); + string manifestFile = PATH + BUNDLE_NAME + FILE_NAME; + int manifestFd = open(manifestFile.data(), O_RDWR | O_TRUNC, S_IRWXU); + EXPECT_GT(manifestFd, 0); + + EXPECT_EQ(extExtension->HandleIncrementalBackup(incrementalFd, manifestFd), BError::E_FORBID); + close(incrementalFd); + close(manifestFd); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_HandleIncrementalBackup_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IncrementalOnBackup_Test_0100 + * @tc.name: Ext_Extension_Sub_IncrementalOnBackup_Test_0100 + * @tc.desc: 测试IncrementalOnBackup + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IncrementalOnBackup_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IncrementalOnBackup_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + EXPECT_EQ(extExtension->IncrementalOnBackup(false), BError::E_FORBID); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IncrementalOnBackup_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_WaitToSendFd_Test_0100 + * @tc.name: Ext_Extension_Sub_WaitToSendFd_Test_0100 + * @tc.desc: 测试WaitToSendFd + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_WaitToSendFd_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_WaitToSendFd_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto startTime = std::chrono::system_clock::now(); + int fdSendNum = 61; + extExtension->WaitToSendFd(startTime, fdSendNum); + EXPECT_EQ(fdSendNum, 0); + fdSendNum = 1; + extExtension->WaitToSendFd(startTime, fdSendNum); + EXPECT_EQ(fdSendNum, 1); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_WaitToSendFd_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_RefreshTimeInfo_Test_0100 + * @tc.name: Ext_Extension_Sub_RefreshTimeInfo_Test_0100 + * @tc.desc: 测试RefreshTimeInfo + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_RefreshTimeInfo_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_RefreshTimeInfo_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto startTime = std::chrono::system_clock::now(); + int fdSendNum = 1; + extExtension->RefreshTimeInfo(startTime, fdSendNum); + EXPECT_EQ(fdSendNum, 1); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_RefreshTimeInfo_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_GetBundlePath_Test_0100 + * @tc.name: Ext_Extension_Sub_GetBundlePath_Test_0100 + * @tc.desc: 测试GetBundlePath + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_GetBundlePath_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_GetBundlePath_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); + auto ret = extExtension->GetBundlePath(); + EXPECT_EQ(ret, path); + + extExtension->bundleName_ = BConstants::BUNDLE_FILE_MANAGER; + path = string(BConstants::PATH_FILEMANAGE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); + ret = extExtension->GetBundlePath(); + EXPECT_EQ(ret, path); + + extExtension->bundleName_ = BConstants::BUNDLE_MEDIAL_DATA; + path = string(BConstants::PATH_MEDIALDATA_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); + ret = extExtension->GetBundlePath(); + EXPECT_EQ(ret, path); + extExtension->bundleName_ = BUNDLE_NAME; + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_GetBundlePath_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_CheckRstoreFileInfos_Test_0100 + * @tc.name: Ext_Extension_Sub_CheckRstoreFileInfos_Test_0100 + * @tc.desc: 测试CheckRstoreFileInfos + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_CheckRstoreFileInfos_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_CheckRstoreFileInfos_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + tuple> result; + string tarName = PATH_BUNDLE_BACKUP_HOME + "/part0.tar"; + string untarPath = PATH_BUNDLE_BACKUP_HOME; + + result = extExtension->CheckRestoreFileInfos(); + EXPECT_EQ(std::get<0>(result), true); + + auto [err, fileInfos, errInfos] = UntarFile::GetInstance().UnPacket(tarName, untarPath); + extExtension->endFileInfos_[tarName] = 1; + extExtension->endFileInfos_.merge(fileInfos); + + result = extExtension->CheckRestoreFileInfos(); + EXPECT_EQ(std::get<0>(result), false); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_CheckRstoreFileInfos_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_OnRestoreCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_OnRestoreCallback_Test_0100 + * @tc.desc: 测试OnRestoreCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_OnRestoreCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_OnRestoreCallback_Test_0100"; + try { + ErrCode errCode = 0; + string errMsg = ""; + + ASSERT_TRUE(extExtension != nullptr); + extExtension->SetClearDataFlag(false); + std::function restoreCallBack = extExtension->OnRestoreCallback(nullptr); + restoreCallBack(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + errMsg = "err"; + extExtension->isExecAppDone_.store(true); + restoreCallBack = extExtension->OnRestoreCallback(extExtension); + restoreCallBack(errCode, errMsg); + extExtension->isExecAppDone_.store(false); + EXPECT_EQ(errMsg, "err"); + + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_OnRestoreCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_OnRestoreExCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_OnRestoreExCallback_Test_0100 + * @tc.desc: 测试OnRestoreExCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_OnRestoreExCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_OnRestoreExCallback_Test_0100"; + try { + ErrCode errCode = 0; + string restoreRetInfo = ""; + + ASSERT_TRUE(extExtension != nullptr); + extExtension->SetClearDataFlag(false); + std::function restoreCallBack = extExtension->OnRestoreExCallback(nullptr); + restoreCallBack(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, ""); + + restoreRetInfo = ""; + restoreCallBack = extExtension->OnRestoreExCallback(extExtension); + extExtension->extension_ = nullptr; + restoreCallBack(errCode, restoreRetInfo); + extExtension->extension_ = extension; + EXPECT_EQ(restoreRetInfo, ""); + + restoreRetInfo = "err"; + extExtension->isExecAppDone_.store(true); + restoreCallBack = extExtension->OnRestoreExCallback(extExtension); + restoreCallBack(errCode, restoreRetInfo); + extExtension->isExecAppDone_.store(false); + EXPECT_EQ(restoreRetInfo, "err"); + + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_OnRestoreExCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_AppDoneCallbackEx_Test_0100 + * @tc.name: Ext_Extension_Sub_AppDoneCallbackEx_Test_0100 + * @tc.desc: 测试AppDoneCallbackEx + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_AppDoneCallbackEx_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_AppDoneCallbackEx_Test_0100"; + try { + ErrCode errCode = 0; + string errMessage = ""; + + ASSERT_TRUE(extExtension != nullptr); + extExtension->SetClearDataFlag(false); + std::function restoreCallBack = extExtension->AppDoneCallbackEx(nullptr); + restoreCallBack(errCode, errMessage); + EXPECT_EQ(errMessage, ""); + + restoreCallBack = extExtension->AppDoneCallbackEx(extExtension); + restoreCallBack(errCode, errMessage); + extExtension->extension_ = extension; + EXPECT_EQ(errMessage, ""); + + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_AppDoneCallbackEx_Test_0100"; } /** @@ -155,6 +449,7 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_GetComInfoCallback_Test_0100, te { GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_GetComInfoCallback_Test_0100"; try { + ASSERT_TRUE(extExtension != nullptr); std::string compatibilityInfo = "test"; extExtension->GetComInfoCallback(nullptr)(BError(BError::Codes::OK).GetCode(), compatibilityInfo); EXPECT_NE(extExtension->compatibilityInfo_, compatibilityInfo); @@ -196,6 +491,7 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleGetCompatibilityInfo_Test_ { GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_HandleGetCompatibilityInfo_Test_0100"; try { + ASSERT_TRUE(extExtension != nullptr); std::string extInfo = "test"; std::string compatibilityInfo = ""; int32_t scenario = BConstants::ExtensionScenario::BACKUP; @@ -234,6 +530,7 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleOnRelease_Test_0100, testi { GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_HandleOnRelease_Test_0100"; try { + ASSERT_TRUE(extExtension != nullptr); int32_t scenario = 1; bool isOnReleased = extExtension->isOnReleased_.load(); extExtension->isOnReleased_.store(true); @@ -270,6 +567,7 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleExtOnRelease_Test_0100, te { GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_HandleExtOnRelease_Test_0100"; try { + ASSERT_TRUE(extExtension != nullptr); auto curScenario = extExtension->curScenario_; extExtension->curScenario_ = BackupRestoreScenario::FULL_BACKUP; auto ext = extExtension->extension_; -- Gitee From 91b804a68383239eec3332a778f8c8d4de20f656 Mon Sep 17 00:00:00 2001 From: wuyunxun Date: Tue, 15 Jul 2025 17:50:35 +0800 Subject: [PATCH 27/62] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wuyunxun Change-Id: I2cc242a282ac2450f50ffa4f84dd065cba56861b --- .../native/backup_ext/src/ext_backup_ani.cpp | 14 ++++++++++++-- .../kits/ani/file_share/src/ani_file_share.cpp | 1 - 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frameworks/native/backup_ext/src/ext_backup_ani.cpp b/frameworks/native/backup_ext/src/ext_backup_ani.cpp index ffb67e5a4..bc3d52d8e 100644 --- a/frameworks/native/backup_ext/src/ext_backup_ani.cpp +++ b/frameworks/native/backup_ext/src/ext_backup_ani.cpp @@ -76,7 +76,12 @@ void ExtBackupAni::Init(const std::shared_ptr &r ErrCode ExtBackupAni::CallEtsOnBackup() { ani_vm *vm = nullptr; - if (ANI_OK != stsRuntime_.GetAniEnv()->GetVM(&vm)) { + auto aniEnv = stsRuntime_.GetAniEnv(); + if (aniEnv == nullptr) { + HILOGE("aniEnv null"); + return EINVAL; + } + if (ANI_OK != aniEnv->GetVM(&vm)) { return EINVAL; } ani_env *env = nullptr; @@ -103,7 +108,12 @@ ErrCode ExtBackupAni::CallEtsOnBackup() ErrCode ExtBackupAni::CallEtsOnRestore() { ani_vm *vm = nullptr; - if (ANI_OK != stsRuntime_.GetAniEnv()->GetVM(&vm)) { + auto aniEnv = stsRuntime_.GetAniEnv(); + if (aniEnv == nullptr) { + HILOGE("aniEnv null"); + return EINVAL; + } + if (ANI_OK != aniEnv->GetVM(&vm)) { return EINVAL; } ani_env *env = nullptr; diff --git a/interfaces/kits/ani/file_share/src/ani_file_share.cpp b/interfaces/kits/ani/file_share/src/ani_file_share.cpp index 0c20eb40d..614aabd4c 100644 --- a/interfaces/kits/ani/file_share/src/ani_file_share.cpp +++ b/interfaces/kits/ani/file_share/src/ani_file_share.cpp @@ -199,7 +199,6 @@ static int InsertByDatashare(const DataShareValuesBucket &valuesBucket, bool isA dataShareHelper = DataShare::DataShareHelper::Creator(remote->AsObject(), MEDIALIBRARY_DATA_URI); if (!dataShareHelper) { LOGE("%{public}s: connect to datashare failed!", __func__); - delete remote; return ret; } string uriStr = MEDIA_GRANT_URI_PERMISSION; -- Gitee From 02fd84f60b1c7ee73bd9afa2852db230910d362c Mon Sep 17 00:00:00 2001 From: dinghao Date: Wed, 16 Jul 2025 16:43:42 +0800 Subject: [PATCH 28/62] add backupSa fuzz Signed-off-by: dinghao --- test/fuzztest/BUILD.gn | 12 +- .../backupsaappend_fuzzer.cpp | 243 ------------- .../BUILD.gn | 66 ++++ ...kupsaappendbundlesbackupsession_fuzzer.cpp | 82 +++++ ...ackupsaappendbundlesbackupsession_fuzzer.h | 21 ++ .../corpus/init} | 9 +- .../project.xml | 25 ++ .../BUILD.gn | 66 ++++ ...undlesincrementalbackupsession_fuzzer.cpp} | 224 +----------- ...ndbundlesincrementalbackupsession_fuzzer.h | 21 ++ .../corpus/init | 2 +- .../project.xml | 2 +- .../BUILD.gn | 66 ++++ .../backupsaappincrementaldone_fuzzer.cpp | 71 ++++ .../backupsaappincrementaldone_fuzzer.h | 21 ++ .../corpus/init | 2 +- .../project.xml | 2 +- .../BUILD.gn | 66 ++++ ...backupsaappincrementalfileready_fuzzer.cpp | 77 ++++ .../backupsaappincrementalfileready_fuzzer.h | 21 ++ .../corpus/init | 16 + .../project.xml | 25 ++ .../BUILD.gn | 14 +- .../backupsagetfilehandle_fuzzer.cpp | 71 ++++ .../backupsagetfilehandle_fuzzer.h | 21 ++ .../backupsagetfilehandle_fuzzer/corpus/init | 16 + .../backupsagetfilehandle_fuzzer/project.xml | 25 ++ .../BUILD.gn | 66 ++++ ...ackupsagetincrementalfilehandle_fuzzer.cpp | 72 ++++ .../backupsagetincrementalfilehandle_fuzzer.h | 21 ++ .../corpus/init | 16 + .../project.xml | 25 ++ .../BUILD.gn | 70 ++++ ...getincrementallocalcapabilities_fuzzer.cpp | 335 ++++++++++++++++++ ...sagetincrementallocalcapabilities_fuzzer.h | 21 ++ .../corpus/init | 16 + .../project.xml | 25 ++ .../BUILD.gn | 66 ++++ ...psainitincrementalbackupsession_fuzzer.cpp | 67 ++++ ...kupsainitincrementalbackupsession_fuzzer.h | 21 ++ .../corpus/init | 16 + .../project.xml | 25 ++ .../BUILD.gn | 66 ++++ .../backupsapublishincrementalfile_fuzzer.cpp | 77 ++++ .../backupsapublishincrementalfile_fuzzer.h | 21 ++ .../corpus/init | 16 + .../project.xml | 25 ++ .../BUILD.gn | 8 +- .../backupsarelease_fuzzer.cpp | 67 ++++ .../backupsarelease_fuzzer.h} | 8 +- .../backupsarelease_fuzzer/corpus/init | 16 + .../backupsarelease_fuzzer/project.xml | 25 ++ 52 files changed, 1994 insertions(+), 484 deletions(-) delete mode 100644 test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.h rename test/fuzztest/{backupsaanother_fuzzer/backupsaanother_fuzzer.h => backupsaappendbundlesbackupsession_fuzzer/corpus/init} (76%) create mode 100644 test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/project.xml create mode 100644 test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/BUILD.gn rename test/fuzztest/{backupsaanother_fuzzer/backupsaanother_fuzzer.cpp => backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.cpp} (30%) create mode 100644 test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.h rename test/fuzztest/{backupsaappend_fuzzer => backupsaappendbundlesincrementalbackupsession_fuzzer}/corpus/init (92%) rename test/fuzztest/{backupsaanother_fuzzer => backupsaappendbundlesincrementalbackupsession_fuzzer}/project.xml (95%) create mode 100644 test/fuzztest/backupsaappincrementaldone_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsaappincrementaldone_fuzzer/backupsaappincrementaldone_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappincrementaldone_fuzzer/backupsaappincrementaldone_fuzzer.h rename test/fuzztest/{backupsaanother_fuzzer => backupsaappincrementaldone_fuzzer}/corpus/init (92%) rename test/fuzztest/{backupsaappend_fuzzer => backupsaappincrementaldone_fuzzer}/project.xml (95%) create mode 100644 test/fuzztest/backupsaappincrementalfileready_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsaappincrementalfileready_fuzzer/backupsaappincrementalfileready_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappincrementalfileready_fuzzer/backupsaappincrementalfileready_fuzzer.h create mode 100644 test/fuzztest/backupsaappincrementalfileready_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsaappincrementalfileready_fuzzer/project.xml rename test/fuzztest/{backupsaappend_fuzzer => backupsagetfilehandle_fuzzer}/BUILD.gn (86%) create mode 100644 test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.cpp create mode 100644 test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.h create mode 100644 test/fuzztest/backupsagetfilehandle_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsagetfilehandle_fuzzer/project.xml create mode 100644 test/fuzztest/backupsagetincrementalfilehandle_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.cpp create mode 100644 test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.h create mode 100644 test/fuzztest/backupsagetincrementalfilehandle_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsagetincrementalfilehandle_fuzzer/project.xml create mode 100644 test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp create mode 100644 test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.h create mode 100644 test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/project.xml create mode 100644 test/fuzztest/backupsainitincrementalbackupsession_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.cpp create mode 100644 test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.h create mode 100644 test/fuzztest/backupsainitincrementalbackupsession_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsainitincrementalbackupsession_fuzzer/project.xml create mode 100644 test/fuzztest/backupsapublishincrementalfile_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.cpp create mode 100644 test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.h create mode 100644 test/fuzztest/backupsapublishincrementalfile_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsapublishincrementalfile_fuzzer/project.xml rename test/fuzztest/{backupsaanother_fuzzer => backupsarelease_fuzzer}/BUILD.gn (91%) create mode 100644 test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.cpp rename test/fuzztest/{backupsaappend_fuzzer/backupsaappend_fuzzer.h => backupsarelease_fuzzer/backupsarelease_fuzzer.h} (77%) create mode 100644 test/fuzztest/backupsarelease_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsarelease_fuzzer/project.xml diff --git a/test/fuzztest/BUILD.gn b/test/fuzztest/BUILD.gn index 1c4a33aca..94ef49b85 100644 --- a/test/fuzztest/BUILD.gn +++ b/test/fuzztest/BUILD.gn @@ -18,8 +18,16 @@ group("fuzztest") { # deps file "backupext_fuzzer:BackupExtFuzzTest", "backupsa_fuzzer:BackupSaFuzzTest", - "backupsaanother_fuzzer:BackupSaAnotherFuzzTest", - "backupsaappend_fuzzer:BackupSaAppendFuzzTest", + "backupsaappendbundlesbackupsession_fuzzer:BackupSaAppendBundlesBackupSessionFuzzTest", + "backupsaappendbundlesincrementalbackupsession_fuzzer:BackupSaAppendBundlesIncrementalBackupSessionFuzzTest", + "backupsaappincrementaldone_fuzzer:BackupSaAppIncrementalDoneFuzzTest", + "backupsaappincrementalfileready_fuzzer:BackupSaAppIncrementalFileReadyFuzzTest", + "backupsagetfilehandle_fuzzer:BackupSaGetFileHandleFuzzTest", + "backupsagetincrementalfilehandle_fuzzer:BackupSaGetIncrementalFileHandleFuzzTest", + "backupsagetincrementallocalcapabilities_fuzzer:BackupSaGetIncrementalLocalCapabilitiesFuzzTest", + "backupsainitincrementalbackupsession_fuzzer:BackupSaInitIncrementalBackupSessionFuzzTest", + "backupsapublishincrementalfile_fuzzer:BackupSaPublishIncrementalFileFuzzTest", + "backupsarelease_fuzzer:BackupSaReleaseFuzzTest", "backupservicestub_fuzzer:BackupServiceStubFuzzTest", "fileshare_fuzzer:FileShareFuzzTest", "remotefileshare_fuzzer:RemoteFileShareFuzzTest", diff --git a/test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.cpp b/test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.cpp deleted file mode 100644 index 9a6e46113..000000000 --- a/test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.cpp +++ /dev/null @@ -1,243 +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 "backupsaappend_fuzzer.h" - -#include -#include -#include -#include -#include - -#include "message_parcel.h" -#include "service.h" -#include "service_proxy.h" -#include "service_reverse.h" -#include "service_stub.h" -#include "securec.h" -#include "system_ability.h" - -using namespace std; -using namespace OHOS::FileManagement::Backup; - -namespace OHOS { -constexpr int32_t SERVICE_ID = 5203; - -bool CmdInitRestoreSessionFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_INIT_RESTORE_SESSION), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdInitBackupSessionFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_INIT_BACKUP_SESSION), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdPublishFileFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - if (size > 0) { - int pos = (size + 1) >> 1; - std::string fileName(reinterpret_cast(data), pos); - std::string bundleName(reinterpret_cast(data + pos), size - pos); - uint32_t sn = 0; - if (size > sizeof(uint32_t)) { - sn = *(reinterpret_cast(data)); - } - BFileInfo fileInfo(fileName, bundleName, sn); - datas.WriteParcelable(&fileInfo); - } - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_PUBLISH_FILE), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdGetLocalCapabilitiesFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_GET_LOCAL_CAPABILITIES); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - -bool CmdAppFileReadyFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - std::string fileName(reinterpret_cast(data), size); - datas.WriteString(fileName); - - int fd = -1; - if (size >= sizeof(int)) { - fd = *(reinterpret_cast(data)); - } - datas.WriteFileDescriptor(UniqueFd(fd)); - - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_APP_FILE_READY); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - -bool CmdAppDoneFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - if (size >= sizeof(bool)) { - datas.WriteBool(*(reinterpret_cast(data))); - } - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_APP_DONE), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdStartFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_START), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdFinishFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_FINISH), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdAppendBundlesRestoreSessionFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - - size_t len = sizeof(int); - if (size >= len) { - int fd = *(reinterpret_cast(data)); - datas.WriteFileDescriptor(UniqueFd(fd)); - } - - if (size > 0) { - vector bundleNames; - for (size_t i = 0; i < size; i++) { - string param(reinterpret_cast(data), size); - string name = param + to_string(i); - bundleNames.push_back(name); - } - datas.WriteStringVector(bundleNames); - } - - if (size >= len + sizeof(int32_t)) { - int32_t type = static_cast(*(reinterpret_cast(data + len))); - datas.WriteInt32(type); - len += sizeof(int32_t); - } - - if (size >= len + sizeof(int32_t)) { - int32_t userId = static_cast(*(reinterpret_cast(data + len))); - datas.WriteInt32(userId); - } - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_APPEND_BUNDLES_RESTORE_SESSION_DATA), - datas, reply, option); - service = nullptr; - return true; -} -} // namespace OHOS - -/* Fuzzer entry point */ -extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - /* Run your code on data */ - OHOS::CmdInitRestoreSessionFuzzTest(data, size); - OHOS::CmdInitBackupSessionFuzzTest(data, size); - OHOS::CmdPublishFileFuzzTest(data, size); - OHOS::CmdGetLocalCapabilitiesFuzzTest(data, size); - OHOS::CmdAppFileReadyFuzzTest(data, size); - OHOS::CmdAppDoneFuzzTest(data, size); - OHOS::CmdStartFuzzTest(data, size); - OHOS::CmdFinishFuzzTest(data, size); - OHOS::CmdAppendBundlesRestoreSessionFuzzTest(data, size); - return 0; -} \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/BUILD.gn b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/BUILD.gn new file mode 100644 index 000000000..652bfdfa6 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/BUILD.gn @@ -0,0 +1,66 @@ +# Copyright (c) 2022-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaAppendBundlesBackupSessionFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsaappendbundlesbackupsession_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/utils:backup_utils", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp new file mode 100644 index 000000000..9eea23fc6 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2025 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 "backupsaappendbundlesbackupsession_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdAppendBundlesBackupSessionFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + if (size > 0) { + vector bundleNames; + for (size_t i = 0; i < size; i++) { + string param(reinterpret_cast(data), size); + string name = param + to_string(i); + bundleNames.push_back(name); + } + datas.WriteStringVector(bundleNames); + } + + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_APPEND_BUNDLES_BACKUP_SESSION); + try { + service->OnRemoteRequest(code, datas, reply, option); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdAppendBundlesBackupSessionFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.h b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.h new file mode 100644 index 000000000..ba3b72aa2 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAAPPENDBUNDLEBACKUPSESSION_FUZZER_H +#define BACKUPSAAPPENDBUNDLEBACKUPSESSION_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsaappendbundlesbackupsession_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.h b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/corpus/init similarity index 76% rename from test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.h rename to test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/corpus/init index f89e351e6..f46fe5351 100644 --- a/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.h +++ b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/corpus/init @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 @@ -13,9 +13,4 @@ * limitations under the License. */ -#ifndef BACKUPSAANOTHER_FUZZER_H -#define BACKUPSAANOTHER_FUZZER_H - -#define FUZZ_PROJECT_NAME "backupsaanother_fuzzer" - -#endif \ No newline at end of file +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/project.xml b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/project.xml new file mode 100644 index 000000000..0c2ea469a --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/BUILD.gn b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/BUILD.gn new file mode 100644 index 000000000..cf1c5dbb5 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/BUILD.gn @@ -0,0 +1,66 @@ +# Copyright (c) 2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaAppendBundlesIncrementalBackupSessionFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsaappendbundlesincrementalbackupsession_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/utils:backup_utils", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.cpp similarity index 30% rename from test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp rename to test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.cpp index 8c3ae92d8..5d4c9cbfb 100644 --- a/test/fuzztest/backupsaanother_fuzzer/backupsaanother_fuzzer.cpp +++ b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "backupsaanother_fuzzer.h" +#include "backupsaappendbundlesincrementalbackupsession_fuzzer.h" #include #include @@ -37,72 +37,6 @@ using namespace OHOS::FileManagement::Backup; namespace OHOS { constexpr int32_t SERVICE_ID = 5203; -bool CmdGetFileHandleFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - int pos = (size + 1) >> 1; - if (size > 0) { - std::string param(string(reinterpret_cast(data), pos)); - datas.WriteString(param); - } - - if (size > 1) { - std::string param(string(reinterpret_cast(data + pos), size - pos)); - datas.WriteString(param); - } - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_GET_FILE_HANDLE), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdAppendBundlesBackupSessionFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - if (size > 0) { - vector bundleNames; - for (size_t i = 0; i < size; i++) { - string param(reinterpret_cast(data), size); - string name = param + to_string(i); - bundleNames.push_back(name); - } - datas.WriteStringVector(bundleNames); - } - - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_APPEND_BUNDLES_BACKUP_SESSION); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - -bool CmdReleaseFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_RELEASE); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - void GetBundleNamesData(const uint8_t *data, size_t size, vector &bundleNames) { int minLen = sizeof(int64_t) + sizeof(int) + sizeof(int32_t); @@ -144,44 +78,6 @@ void WriteParcelableVector(const std::vector &parcelableVector, Parcel &data) return; } -bool CmdGetLocalCapabilitiesIncrementalFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - if (size >= sizeof(int32_t)) { - vector bundleNames; - GetBundleNamesData(data, size, bundleNames); - WriteParcelableVector(bundleNames, datas); - } - - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_GET_LOCAL_CAPABILITIES_INCREMENTAL); - service->OnRemoteRequest(code, datas, reply, option); - OHOS::AppFileService::SandboxHelper::ClearBackupSandboxPathMap(); - service = nullptr; - return true; -} - -bool CmdInitIncrementalBackupSessionFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - datas.WriteBuffer(data, size); - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_INIT_INCREMENTAL_BACKUP_SESSION); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - bool CmdAppendBundlesIncrementalBackupSessionFuzzTest(const uint8_t *data, size_t size) { MessageParcel datas; @@ -199,105 +95,6 @@ bool CmdAppendBundlesIncrementalBackupSessionFuzzTest(const uint8_t *data, size_ uint32_t code = static_cast( IServiceIpcCode::COMMAND_APPEND_BUNDLES_INCREMENTAL_BACKUP_SESSION); service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - -bool CmdPublishIncrementalFileFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - if (size > 0) { - int pos = (size + 1) >> 1; - std::string fileName(reinterpret_cast(data), pos); - std::string bundleName(reinterpret_cast(data + pos), size - pos); - uint32_t sn = 0; - if (size > sizeof(uint32_t)) { - sn = *(reinterpret_cast(data)); - } - BFileInfo fileInfo(fileName, bundleName, sn); - datas.WriteParcelable(&fileInfo); - } - - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_PUBLISH_INCREMENTAL_FILE); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - -bool CmdAppIncrementalFileReadyFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - std::string fileName(reinterpret_cast(data), size); - datas.WriteString(fileName); - if (size >= sizeof(int)) { - int fd = *(reinterpret_cast(data)); - datas.WriteFileDescriptor(UniqueFd(fd)); - } - - if (size >= sizeof(int) + sizeof(int)) { - int manifestId = *(reinterpret_cast(data + sizeof(int))); - datas.WriteFileDescriptor(UniqueFd(manifestId)); - } - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - uint32_t code = static_cast(IServiceIpcCode::COMMAND_APP_INCREMENTAL_FILE_READY); - service->OnRemoteRequest(code, datas, reply, option); - service = nullptr; - return true; -} - -bool CmdAppIncrementalDoneFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - if (size >= sizeof(int32_t)) { - datas.WriteInt32(*(reinterpret_cast(data))); - } - - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_APP_INCREMENTAL_DONE), - datas, reply, option); - service = nullptr; - return true; -} - -bool CmdGetIncrementalFileHandleFuzzTest(const uint8_t *data, size_t size) -{ - MessageParcel datas; - datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); - int pos = (size + 1) >> 1; - if (size > 0) { - string param(reinterpret_cast(data), pos); - datas.WriteString(param); - } - - if (size > 1) { - string param(reinterpret_cast(data + pos), size - pos); - datas.WriteString(param); - } - - datas.RewindRead(0); - MessageParcel reply; - MessageOption option; - - sptr service(new Service(SERVICE_ID)); - service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_GET_INCREMENTAL_FILE_HANDLE), - datas, reply, option); - service = nullptr; return true; } } // namespace OHOS @@ -305,15 +102,12 @@ bool CmdGetIncrementalFileHandleFuzzTest(const uint8_t *data, size_t size) /* Fuzzer entry point */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - OHOS::CmdGetFileHandleFuzzTest(data, size); - OHOS::CmdAppendBundlesBackupSessionFuzzTest(data, size); - OHOS::CmdReleaseFuzzTest(data, size); - OHOS::CmdGetLocalCapabilitiesIncrementalFuzzTest(data, size); - OHOS::CmdInitIncrementalBackupSessionFuzzTest(data, size); - OHOS::CmdPublishIncrementalFileFuzzTest(data, size); - OHOS::CmdAppIncrementalFileReadyFuzzTest(data, size); - OHOS::CmdAppIncrementalDoneFuzzTest(data, size); - OHOS::CmdGetIncrementalFileHandleFuzzTest(data, size); - OHOS::CmdAppendBundlesIncrementalBackupSessionFuzzTest(data, size); + try { + OHOS::CmdAppendBundlesIncrementalBackupSessionFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } return 0; } \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.h b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.h new file mode 100644 index 000000000..b354ba6e5 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/backupsaappendbundlesincrementalbackupsession_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAAPPENDBUNDLESINCREMENTALBACKUPSESSION_FUZZER_H +#define BACKUPSAAPPENDBUNDLESINCREMENTALBACKUPSESSION_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsaappendbundlesincrementalbackupsession_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsaappend_fuzzer/corpus/init b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/corpus/init similarity index 92% rename from test/fuzztest/backupsaappend_fuzzer/corpus/init rename to test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/corpus/init index 6198079a2..7ade8a0fa 100644 --- a/test/fuzztest/backupsaappend_fuzzer/corpus/init +++ b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/corpus/init @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 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 diff --git a/test/fuzztest/backupsaanother_fuzzer/project.xml b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/project.xml similarity index 95% rename from test/fuzztest/backupsaanother_fuzzer/project.xml rename to test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/project.xml index 7133b2b92..66e1dcac4 100644 --- a/test/fuzztest/backupsaanother_fuzzer/project.xml +++ b/test/fuzztest/backupsaappendbundlesincrementalbackupsession_fuzzer/project.xml @@ -1,5 +1,5 @@ - + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsaappend_fuzzer/BUILD.gn b/test/fuzztest/backupsagetfilehandle_fuzzer/BUILD.gn similarity index 86% rename from test/fuzztest/backupsaappend_fuzzer/BUILD.gn rename to test/fuzztest/backupsagetfilehandle_fuzzer/BUILD.gn index 410ead2a2..20f539837 100644 --- a/test/fuzztest/backupsaappend_fuzzer/BUILD.gn +++ b/test/fuzztest/backupsagetfilehandle_fuzzer/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2024 Huawei Device Co., Ltd. +# Copyright (c) 2025 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -18,10 +18,10 @@ import("//foundation/filemanagement/app_file_service/app_file_service.gni") import("//foundation/filemanagement/app_file_service/backup.gni") ##############################fuzztest########################################## -ohos_fuzztest("BackupSaAppendFuzzTest") { +ohos_fuzztest("BackupSaGetFileHandleFuzzTest") { module_out_path = "app_file_service/app_file_service" fuzz_config_file = - "${app_file_service_path}/test/fuzztest/backupsaappend_fuzzer" + "${app_file_service_path}/test/fuzztest/backupsagetfilehandle_fuzzer" include_dirs = [ "${app_file_service_path}/services/backup_sa/include/module_ipc", "${app_file_service_path}/services/backup_sa/include", @@ -34,14 +34,17 @@ ohos_fuzztest("BackupSaAppendFuzzTest") { "-Wno-unused-variable", "-fno-omit-frame-pointer", ] - sources = [ "backupsaappend_fuzzer.cpp" ] + sources = [ "backupsagetfilehandle_fuzzer.cpp" ] deps = [ "${app_file_service_path}/services/backup_sa:backup_sa", "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", "${path_backup}/utils:backup_utils", ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ "ability_runtime:ability_manager", "ability_runtime:abilitykit_native", @@ -56,7 +59,8 @@ ohos_fuzztest("BackupSaAppendFuzzTest") { defines = [ "LOG_TAG=\"app_file_service\"", "LOG_DOMAIN=0xD004303", - "private=public", ] + + use_exceptions = true } ############################################################################### diff --git a/test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.cpp b/test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.cpp new file mode 100644 index 000000000..e77e7dfe3 --- /dev/null +++ b/test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025 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 "backupsagetfilehandle_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdGetFileHandleFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + int len = size >> 1; + std::string bundleName(string(reinterpret_cast(data), len)); + datas.WriteString(bundleName); + std::string filePath(string(reinterpret_cast(data + len), len)); + datas.WriteString(filePath); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_GET_FILE_HANDLE), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdGetFileHandleFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.h b/test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.h new file mode 100644 index 000000000..aa579532b --- /dev/null +++ b/test/fuzztest/backupsagetfilehandle_fuzzer/backupsagetfilehandle_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAGETFILEHANDLE_FUZZER_H +#define BACKUPSAGETFILEHANDLE_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsagetfilehandle_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsagetfilehandle_fuzzer/corpus/init b/test/fuzztest/backupsagetfilehandle_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsagetfilehandle_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsagetfilehandle_fuzzer/project.xml b/test/fuzztest/backupsagetfilehandle_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsagetfilehandle_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/BUILD.gn b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/BUILD.gn new file mode 100644 index 000000000..1e0ebaa3b --- /dev/null +++ b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/BUILD.gn @@ -0,0 +1,66 @@ +# Copyright (c) 2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaGetIncrementalFileHandleFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsagetincrementalfilehandle_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsagetincrementalfilehandle_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/utils:backup_utils", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.cpp b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.cpp new file mode 100644 index 000000000..47d4fdf91 --- /dev/null +++ b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025 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 "backupsagetincrementalfilehandle_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdGetIncrementalFileHandleFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + datas.WriteString(bundleName); + string filePath(reinterpret_cast(data + len), len); + datas.WriteString(filePath); + + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_GET_INCREMENTAL_FILE_HANDLE), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdGetIncrementalFileHandleFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.h b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.h new file mode 100644 index 000000000..e81764900 --- /dev/null +++ b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/backupsagetincrementalfilehandle_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAINCREMENTALFILEHANDLE_FUZZER_H +#define BACKUPSAINCREMENTALFILEHANDLE_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsagetincrementalfilehandle_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/corpus/init b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/project.xml b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsagetincrementalfilehandle_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/BUILD.gn b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/BUILD.gn new file mode 100644 index 000000000..87fd0b5f0 --- /dev/null +++ b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/BUILD.gn @@ -0,0 +1,70 @@ +# Copyright (c) 2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaGetIncrementalLocalCapabilitiesFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsagetincrementallocalcapabilities_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/utils:backup_utils", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_consumer", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "storage_service:storage_manager_sa_proxy", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private = public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp new file mode 100644 index 000000000..226d8255b --- /dev/null +++ b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2025 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 "backupsagetincrementallocalcapabilities_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "directory_ex.h" +#include "message_parcel.h" +#include "module_external/storage_manager_service.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +template +T TypeCast(const uint8_t *data, int *pos = nullptr) +{ + if (pos) { + *pos += sizeof(T); + } + return *(reinterpret_cast(data)); +} + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; +constexpr int32_t NEED_CREATE_THREE_STRING_NUM = 3; + +void GetBundleNamesData(const uint8_t *data, size_t size, vector &bundleNames) +{ + int minLen = sizeof(int64_t) + sizeof(int) + sizeof(int32_t); + if (size < minLen + 1) { + return; + } + FuzzedDataProvider fdp(data, size); + uint8_t loop = fdp.ConsumeIntegral(); + size--; + if (loop == 0 || (minLen * loop) > size) { + return; + } + int blob = (size / loop); + int len = (blob - minLen) >> 1; + for (size_t i = 0, pos = 1; i < loop; i++, pos += blob) { + int64_t nTime = fdp.ConsumeIntegral(); + int fd = fdp.ConsumeIntegral(); + int32_t priority = fdp.ConsumeIntegral(); + string name(reinterpret_cast(data + pos + minLen), len); + string parameters(reinterpret_cast(data + pos + len + minLen), len); + BIncrementalData incrementaData(name, nTime, fd, parameters, priority); + bundleNames.push_back(incrementaData); + } +} + +template +void WriteParcelableVector(const std::vector &parcelableVector, Parcel &data) +{ + if (!data.WriteUint32(parcelableVector.size())) { + return; + } + + for (const auto &parcelable : parcelableVector) { + if (!data.WriteParcelable(&parcelable)) { + return; + } + } + + return; +} + +bool CmdGetLocalCapabilitiesIncrementalFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + if (size >= sizeof(int32_t)) { + vector bundleNames; + GetBundleNamesData(data, size, bundleNames); + WriteParcelableVector(bundleNames, datas); + } + + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_GET_LOCAL_CAPABILITIES_INCREMENTAL); + service->OnRemoteRequest(code, datas, reply, option); + return true; +} + +bool GetStorageRecognizeSandboxPathEl1FuzzTest(const uint8_t *data, size_t size) +{ + uint32_t userId = 100; + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + string sandBoxSubpath(reinterpret_cast(data + len), len); + string fullPath = BASE_EL1 + DEFAULT_PATH_WITH_WILDCARD + sandBoxSubpath; + std::vector phyIncludes; + std::map pathMap; + StorageManagerService::GetInstance().RecognizeSandboxWildCard(userId, bundleName, fullPath, phyIncludes, pathMap); + return true; +} + +bool CmdExcludeFilter(const uint8_t *data, size_t size) +{ + int len = size / NEED_CREATE_THREE_STRING_NUM; + string dirPath(reinterpret_cast(data), len); + string pathVal1(reinterpret_cast(data + len), len); + string pathVal2(reinterpret_cast(data + len * 2), len); + std::map excludesMap; + excludesMap.insert(std::make_pair(pathVal1, true)); + excludesMap.insert(std::make_pair(pathVal2, false)); + StorageManagerService::GetInstance().ExcludeFilter(excludesMap, dirPath); + return true; +} + +bool GetStorageRecognizeSandboxPathEl2FuzzTest(const uint8_t *data, size_t size) +{ + uint32_t userId = 100; + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + string sandBoxSubpath(reinterpret_cast(data + len), len); + string fullPath = BASE_EL2 + DEFAULT_PATH_WITH_WILDCARD + sandBoxSubpath; + std::vector phyIncludes; + std::map pathMap; + StorageManagerService::GetInstance().RecognizeSandboxWildCard(userId, bundleName, fullPath, phyIncludes, pathMap); + return true; +} + +bool CmdGetMediaType(const uint8_t *data, size_t size) +{ + (void)data; + std::shared_ptr resultSet = std::make_shared(); + StorageManager::StorageStats storageStats = {}; + StorageManagerService::GetInstance().GetMediaTypeAndSize(resultSet, storageStats); + return true; +} + +bool CmdGetFileStorageStats(const uint8_t *data, size_t size) +{ + (void)data; + int32_t userId = 100; + StorageManager::StorageStats storageStats = {}; + StorageManagerService::GetInstance().GetFileStorageStats(userId, storageStats); + return true; +} + + +bool CmdInitQuotaMounts(const uint8_t *data, size_t size) +{ + (void)data; + StorageManagerService::GetInstance().InitialiseQuotaMounts(); + return true; +} +bool CmdExcludePathMap(const uint8_t *data, size_t size) +{ + string excludePath(reinterpret_cast(data), size); + std::map excludesMap; + StorageManagerService::GetInstance().SetExcludePathMap(excludePath, excludesMap); + return true; +} + +bool CmdConvertSandbxRealPath(const uint8_t *data, size_t size) +{ + uint32_t userId = 100; + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + string sandBoxSubpath(reinterpret_cast(data + len), len); + string fullSandBoxPath = NORMAL_SAND_PREFIX + sandBoxSubpath; + std::vector realPaths; + std::map pathMap; + StorageManagerService::GetInstance().ConvertSandboxRealPath(userId, bundleName, fullSandBoxPath, + realPaths, pathMap); + + string fullSandBoxFilePath = FILE_SAND_PREFIX + sandBoxSubpath; + StorageManagerService::GetInstance().ConvertSandboxRealPath(userId, bundleName, fullSandBoxFilePath, + realPaths, pathMap); + + string fullSandBoxMediaPath = MEDIA_SAND_PREFIX + sandBoxSubpath; + StorageManagerService::GetInstance().ConvertSandboxRealPath(userId, bundleName, fullSandBoxMediaPath, + realPaths, pathMap); + + string fullSandBoxMediaCloudPath = MEDIA_CLOUD_SAND_PREFIX + sandBoxSubpath; + StorageManagerService::GetInstance().ConvertSandboxRealPath(userId, bundleName, fullSandBoxMediaCloudPath, + realPaths, pathMap); + return true; +} + +bool CmdAddQuterDirInfoFileStateFuzzTest(const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int64_t)) { + return false; + } + int64_t lastBackupTime = *(reinterpret_cast(data)); + int len = (size - sizeof(int64_t)) / NEED_CREATE_THREE_STRING_NUM; + string dir(reinterpret_cast(data), len); + string bundleName(reinterpret_cast(data + len), len); + BundleStatsParas bundleStatsParas = {100, bundleName, lastBackupTime, 0, 0}; + string sanboxDir(reinterpret_cast(data + len * 2), len); + std::ofstream statFile; + std::map excludesMap; + StorageManagerService::GetInstance().AddOuterDirIntoFileStat(dir, bundleStatsParas, sanboxDir, + statFile, excludesMap); + return true; +} + +bool CmdPhysicalToSanboxPath(const uint8_t *data, size_t size) +{ + int len = size / NEED_CREATE_THREE_STRING_NUM; + string dir(reinterpret_cast(data), len); + string sandBodDir(reinterpret_cast(data + len), len); + string path(reinterpret_cast(data + len * 2), len); + StorageManagerService::GetInstance().PhysicalToSandboxPath(dir, sandBodDir, path); + return true; +} + +bool CmdAddPathMapForPathWildCard(const uint8_t *data, size_t size) +{ + uint32_t userId = 100; + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + string phyPath(reinterpret_cast(data + len), len); + std::map pathMap; + StorageManagerService::GetInstance().AddPathMapForPathWildCard(userId, bundleName, phyPath, pathMap); + return true; +} + +bool CheckIfDirForIncludesFuzzTest(const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int64_t) * NEED_CREATE_THREE_STRING_NUM) { + return false; + } + int pos = 0; + string bundleName = "com.example.test"; + BundleStatsParas paras = { + .userId = 100, + .lastBackupTime = TypeCast(data, &pos), + .fileSizeSum = TypeCast(data + pos, &pos), + .incFileSizeSum = TypeCast(data + pos, &pos), + .bundleName = bundleName + }; + + string path(reinterpret_cast(data + pos), size - pos); + map pathMap; + map execludePathMap; + string dir = BACKUP_PATH_PREFIX + std::to_string(paras.userId) + BACKUP_PATH_SURFFIX + bundleName + + FILE_SEPARATOR_CHAR; + string filePath = dir + BACKUP_STAT_SYMBOL + std::to_string(0); + ofstream statFile; + ForceCreateDirectory(dir); + statFile.open(filePath, std::ios::out | std::ios::trunc); + if (!statFile.is_open()) { + return false; + } + statFile << VER_10_LINE1 << std::endl; + statFile << VER_10_LINE2 << std::endl; + StorageManagerService::GetInstance().CheckIfDirForIncludes(path, paras, pathMap, statFile, execludePathMap); + StorageManagerService::GetInstance().GetIncludesFileStats(path, paras, pathMap, statFile, execludePathMap); + FileStat fileStat; + fileStat.filePath = path; + StorageManagerService::GetInstance().WriteFileList(statFile, fileStat, paras); + StorageManagerService::GetInstance().AddOuterDirIntoFileStat("/data/test", paras, "/data/test", statFile, + execludePathMap); + StorageManagerService::GetInstance().InsertStatFile(path, fileStat, statFile, execludePathMap, paras); + return true; +} + +bool GetPathWildCardFuzzTest(const uint8_t *data, size_t size) +{ + uint32_t userId = 100; + string bundleName(reinterpret_cast(data), size); + string includeWildCard = "/data/test/" + WILDCARD_DEFAULT_INCLUDE; + std::vector includePathList; + std::map pathMap; + StorageManagerService::GetInstance().GetPathWildCard(userId, bundleName, includeWildCard, includePathList, pathMap); + return true; +} + +bool CmdCheckOverLongPath(const uint8_t *data, size_t size) +{ + string filePath(reinterpret_cast(data), size); + StorageManagerService::GetInstance().CheckOverLongPath(filePath); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdGetLocalCapabilitiesIncrementalFuzzTest(data, size); + OHOS::GetStorageRecognizeSandboxPathEl1FuzzTest(data, size); + OHOS::GetStorageRecognizeSandboxPathEl2FuzzTest(data, size); + OHOS::CmdExcludeFilter(data, size); + OHOS::CmdGetMediaType(data, size); + OHOS::CmdGetFileStorageStats(data, size); + OHOS::CmdInitQuotaMounts(data, size); + OHOS::CmdExcludePathMap(data, size); + OHOS::CmdConvertSandbxRealPath(data, size); + OHOS::CmdAddQuterDirInfoFileStateFuzzTest(data, size); + OHOS::CmdPhysicalToSanboxPath(data, size); + OHOS::CmdAddPathMapForPathWildCard(data, size); + OHOS::CheckIfDirForIncludesFuzzTest(data, size); + OHOS::GetPathWildCardFuzzTest(data, size); + OHOS::CmdCheckOverLongPath(data, size); + OHOS::AppFileService::SandboxHelper::ClearBackupSandboxPathMap(); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.h b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.h new file mode 100644 index 000000000..e7cc07408 --- /dev/null +++ b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAGETINCREMENTALLOCALCAPABILITIES_FUZZER_H +#define BACKUPSAGETINCREMENTALLOCALCAPABILITIES_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsagetincrementallocalcapabilities_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/corpus/init b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/project.xml b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/BUILD.gn b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/BUILD.gn new file mode 100644 index 000000000..cc95ecc27 --- /dev/null +++ b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/BUILD.gn @@ -0,0 +1,66 @@ +# Copyright (c) 2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaInitIncrementalBackupSessionFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsainitincrementalbackupsession_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsainitincrementalbackupsession_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/utils:backup_utils", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.cpp b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.cpp new file mode 100644 index 000000000..3e96b2a68 --- /dev/null +++ b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2025 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 "backupsainitincrementalbackupsession_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdInitIncrementalBackupSessionFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_INIT_INCREMENTAL_BACKUP_SESSION); + service->OnRemoteRequest(code, datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdInitIncrementalBackupSessionFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.h b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.h new file mode 100644 index 000000000..e02194a52 --- /dev/null +++ b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/backupsainitincrementalbackupsession_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAINITINCREMENTALBACKUPSESSION_FUZZER_H +#define BACKUPSAINITINCREMENTALBACKUPSESSION_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsainitincrementalbackupsession_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/corpus/init b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/project.xml b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsainitincrementalbackupsession_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsapublishincrementalfile_fuzzer/BUILD.gn b/test/fuzztest/backupsapublishincrementalfile_fuzzer/BUILD.gn new file mode 100644 index 000000000..c3a3e0469 --- /dev/null +++ b/test/fuzztest/backupsapublishincrementalfile_fuzzer/BUILD.gn @@ -0,0 +1,66 @@ +# Copyright (c) 2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaPublishIncrementalFileFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsapublishincrementalfile_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsapublishincrementalfile_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/utils:backup_utils", + ] + + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.cpp b/test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.cpp new file mode 100644 index 000000000..273545989 --- /dev/null +++ b/test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 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 "backupsapublishincrementalfile_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdPublishIncrementalFileFuzzTest(const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(uint32_t)) { + return false; + } + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + uint32_t sn = *(reinterpret_cast(data)); + int len = (size - sizeof(uint32_t)) >> 1; + std::string fileName(reinterpret_cast(data + sizeof(uint32_t)), len); + std::string bundleName(reinterpret_cast(data + sizeof(uint32_t) + len), len); + + BFileInfo fileInfo(fileName, bundleName, sn); + datas.WriteParcelable(&fileInfo); + + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_PUBLISH_INCREMENTAL_FILE); + service->OnRemoteRequest(code, datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdPublishIncrementalFileFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.h b/test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.h new file mode 100644 index 000000000..d919c77c8 --- /dev/null +++ b/test/fuzztest/backupsapublishincrementalfile_fuzzer/backupsapublishincrementalfile_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAPUBLISHINCREMENTALFILE_FUZZER_H +#define BACKUPSAPUBLISHINCREMENTALFILE_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsapublishincrementalfile_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsapublishincrementalfile_fuzzer/corpus/init b/test/fuzztest/backupsapublishincrementalfile_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsapublishincrementalfile_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsapublishincrementalfile_fuzzer/project.xml b/test/fuzztest/backupsapublishincrementalfile_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsapublishincrementalfile_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsaanother_fuzzer/BUILD.gn b/test/fuzztest/backupsarelease_fuzzer/BUILD.gn similarity index 91% rename from test/fuzztest/backupsaanother_fuzzer/BUILD.gn rename to test/fuzztest/backupsarelease_fuzzer/BUILD.gn index 36412f43b..e2b375306 100644 --- a/test/fuzztest/backupsaanother_fuzzer/BUILD.gn +++ b/test/fuzztest/backupsarelease_fuzzer/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright (c) 2024 Huawei Device Co., Ltd. +# Copyright (c) 2022-2025 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -18,10 +18,10 @@ import("//foundation/filemanagement/app_file_service/app_file_service.gni") import("//foundation/filemanagement/app_file_service/backup.gni") ##############################fuzztest########################################## -ohos_fuzztest("BackupSaAnotherFuzzTest") { +ohos_fuzztest("BackupSaReleaseFuzzTest") { module_out_path = "app_file_service/app_file_service" fuzz_config_file = - "${app_file_service_path}/test/fuzztest/backupsaanother_fuzzer" + "${app_file_service_path}/test/fuzztest/backupsarelease_fuzzer" include_dirs = [ "${app_file_service_path}/services/backup_sa/include/module_ipc", "${app_file_service_path}/services/backup_sa/include", @@ -34,7 +34,7 @@ ohos_fuzztest("BackupSaAnotherFuzzTest") { "-Wno-unused-variable", "-fno-omit-frame-pointer", ] - sources = [ "backupsaanother_fuzzer.cpp" ] + sources = [ "backupsarelease_fuzzer.cpp" ] deps = [ "${app_file_service_path}/services/backup_sa:backup_sa", diff --git a/test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.cpp b/test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.cpp new file mode 100644 index 000000000..f683bf7d8 --- /dev/null +++ b/test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2025 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 "backupsarelease_fuzzer.h" + +#include +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "sandbox_helper.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdReleaseFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_RELEASE); + service->OnRemoteRequest(code, datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + try { + OHOS::CmdReleaseFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.h b/test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.h similarity index 77% rename from test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.h rename to test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.h index 8ddfc2126..f24a31b22 100644 --- a/test/fuzztest/backupsaappend_fuzzer/backupsaappend_fuzzer.h +++ b/test/fuzztest/backupsarelease_fuzzer/backupsarelease_fuzzer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 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 @@ -13,9 +13,9 @@ * limitations under the License. */ -#ifndef BACKUPSAAPPEND_FUZZER_H -#define BACKUPSAAPPEND_FUZZER_H +#ifndef BACKUPSARELEASE_FUZZER_H +#define BACKUPSARELEASE_FUZZER_H -#define FUZZ_PROJECT_NAME "backupsaappend_fuzzer" +#define FUZZ_PROJECT_NAME "backupsarelease_fuzzer" #endif \ No newline at end of file diff --git a/test/fuzztest/backupsarelease_fuzzer/corpus/init b/test/fuzztest/backupsarelease_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsarelease_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsarelease_fuzzer/project.xml b/test/fuzztest/backupsarelease_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsarelease_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + -- Gitee From 5544d7fb7dc73f7b02a0cbe60198ba8c4872ae90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Thu, 17 Jul 2025 19:09:21 +0800 Subject: [PATCH 29/62] add ut sub extension3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../backup_ext/include/ext_extension_mock.h | 3 + .../backup_ext/src/ext_extension_mock.cpp | 5 + .../backup_ext/ext_extension_sub_test.cpp | 707 ++++++++++++++++++ utils/include/b_resources/b_constants.h | 2 +- 4 files changed, 716 insertions(+), 1 deletion(-) diff --git a/tests/mock/backup_ext/include/ext_extension_mock.h b/tests/mock/backup_ext/include/ext_extension_mock.h index 6f2058470..f1230365c 100644 --- a/tests/mock/backup_ext/include/ext_extension_mock.h +++ b/tests/mock/backup_ext/include/ext_extension_mock.h @@ -64,6 +64,7 @@ public: virtual void StartFwkTimer(bool &isFwkStart) = 0; virtual ErrCode CleanBundleTempDir() = 0; virtual void AsyncTaskIncreRestoreSpecialVersion() = 0; + virtual void GetTarIncludes(const std::string &, std::unordered_map &) = 0; public: BExtExtension() = default; virtual ~BExtExtension() = default; @@ -119,6 +120,8 @@ public: BackupRestoreScenario)); MOCK_METHOD(void, DoClearInner, ()); MOCK_METHOD(void, StartFwkTimer, (bool &)); + MOCK_METHOD(void, GetTarIncludes, (const std::string &, + (std::unordered_map &))); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_EXT_EXTENSION_MOCK_H \ No newline at end of file diff --git a/tests/mock/backup_ext/src/ext_extension_mock.cpp b/tests/mock/backup_ext/src/ext_extension_mock.cpp index d409d47a4..712ce158d 100644 --- a/tests/mock/backup_ext/src/ext_extension_mock.cpp +++ b/tests/mock/backup_ext/src/ext_extension_mock.cpp @@ -191,4 +191,9 @@ ErrCode BackupExtExtension::CleanBundleTempDir() { return BExtExtension::extExtension->CleanBundleTempDir(); } + +void BackupExtExtension::GetTarIncludes(const string &tarName, unordered_map &infos) +{ + BExtExtension::extExtension->GetTarIncludes(tarName, infos); +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_ext/ext_extension_sub_test.cpp b/tests/unittests/backup_ext/ext_extension_sub_test.cpp index 9a3c76695..284cf4744 100644 --- a/tests/unittests/backup_ext/ext_extension_sub_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_sub_test.cpp @@ -506,6 +506,7 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleGetCompatibilityInfo_Test_ ret = extExtension->HandleGetCompatibilityInfo(extInfo, scenario, compatibilityInfo); EXPECT_EQ(ret, BError(BError::Codes::EXT_INVAL_ARG).GetCode()); + scenario = BConstants::ExtensionScenario::BACKUP; EXPECT_CALL(*extBackupMock, GetBackupCompatibilityInfo(_, _)) .WillOnce(Return(BError(BError::Codes::EXT_INVAL_ARG).GetCode())); ret = extExtension->HandleGetCompatibilityInfo(extInfo, scenario, compatibilityInfo); @@ -604,4 +605,710 @@ HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_HandleExtOnRelease_Test_0100, te } GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_HandleExtOnRelease_Test_0100"; } + +/** + * @tc.number: Ext_Extension_Sub_PreDealExcludes_Test_0100 + * @tc.name: Ext_Extension_Sub_PreDealExcludes_Test_0100 + * @tc.desc: 测试PreDealExcludes + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_PreDealExcludes_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_PreDealExcludes_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + std::vector excludes {"test1", "test2/", ""}; + extExtension->PreDealExcludes(excludes); + EXPECT_EQ(excludes.size(), 2); + EXPECT_EQ(excludes[0], "test1"); + EXPECT_EQ(excludes[1], "/test2/*"); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_PreDealExcludes_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_DoBackupBigFiles_Test_0100 + * @tc.name: Ext_Extension_Sub_DoBackupBigFiles_Test_0100 + * @tc.desc: 测试DoBackupBigFiles + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_DoBackupBigFiles_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_DoBackupBigFiles_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + TarMap tarMap {}; + uint32_t backupedFileSize = 0; + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + auto ret = extExtension->DoBackupBigFiles(tarMap, backupedFileSize); + extExtension->extension_ = ext; + EXPECT_EQ(ret, EPERM); + + EXPECT_CALL(*extBackupMock, GetExtensionAction()).WillOnce(Return(BConstants::ExtensionAction::INVALID)); + ret = extExtension->DoBackupBigFiles(tarMap, backupedFileSize); + EXPECT_EQ(ret, EPERM); + + EXPECT_CALL(*extBackupMock, GetExtensionAction()).WillOnce(Return(BConstants::ExtensionAction::BACKUP)); + EXPECT_CALL(*extExtensionMock, BigFileReady(_, _, _)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + ret = extExtension->DoBackupBigFiles(tarMap, backupedFileSize); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_DoBackupBigFiles_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_MatchFiles_Test_0100 + * @tc.name: Ext_Extension_Sub_MatchFiles_Test_0100 + * @tc.desc: 测试MatchFiles + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_MatchFiles_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_MatchFiles_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + std::map files = {{"", 1}, {"test2.log", 2}, {"test3.txt", 3}, {"test4", 4}}; + std::vector endExcludes {}; + std::map ret = extExtension->MatchFiles(files, endExcludes); + EXPECT_EQ(ret.size(), 4); + + endExcludes = {"*.txt"}; + ret = extExtension->MatchFiles(files, endExcludes); + EXPECT_EQ(ret.size(), 3); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_MatchFiles_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IfCloudSpecialRestore_Test_0100 + * @tc.name: Ext_Extension_Sub_IfCloudSpecialRestore_Test_0100 + * @tc.desc: 测试IfCloudSpecialRestore + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IfCloudSpecialRestore_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IfCloudSpecialRestore_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + std::string tarName = "test"; + auto ret = extExtension->IfCloudSpecialRestore(tarName); + EXPECT_FALSE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IfCloudSpecialRestore_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_CompareFiles_Test_0100 + * @tc.name: Ext_Extension_Sub_CompareFiles_Test_0100 + * @tc.desc: 测试CompareFiles + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_CompareFiles_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_CompareFiles_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + string actualPath1 = PATH + BUNDLE_NAME + FILE_NAME; + string actualPath2 = PATH + BUNDLE_NAME + "2.txt"; + ReportFileInfo fileInfo1, fileInfo2, fileInfo3, fileInfo4, fileInfo5; + fileInfo1.filePath = ""; + fileInfo2.filePath = "test2"; + fileInfo2.isIncremental = true; + fileInfo2.isDir = true; + fileInfo3.filePath = actualPath1; + fileInfo3.isIncremental = true; + fileInfo4.filePath = actualPath2; + fileInfo4.isIncremental = true; + fileInfo4.size = BConstants::BIG_FILE_BOUNDARY + 1; + fileInfo5.filePath = "test5"; + fileInfo5.isIncremental = true; + unordered_map localFilesInfo {{"test1", fileInfo1}, {"test2", fileInfo2}, + {actualPath1, fileInfo3}, {actualPath2, fileInfo4}, {"test5", fileInfo5}}; + unordered_map cloudFiles {{"test5", fileInfo5}}; + vector allFiles, smallFiles, bigFiles; + extExtension->CompareFiles(allFiles, smallFiles, bigFiles, cloudFiles, localFilesInfo); + EXPECT_EQ(allFiles.size(), 4); + EXPECT_EQ(smallFiles.size(), 2); + EXPECT_EQ(bigFiles.size(), 1); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_CompareFiles_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_ReportOnProcessResultCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_ReportOnProcessResultCallback_Test_0100 + * @tc.desc: 测试ReportOnProcessResultCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_ReportOnProcessResultCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_ReportOnProcessResultCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_BACKUP; + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string processInfo = ""; + extExtension->ReportOnProcessResultCallback(nullptr, scenario)(errCode, processInfo); + + auto ptr = wptr(extExtension); + extExtension->onProcessTimeout_.store(true); + extExtension->ReportOnProcessResultCallback(ptr, scenario)(errCode, processInfo); + EXPECT_FALSE(extExtension->onProcessTimeout_.load()); + + extExtension->onProcessTimeoutCnt_.store(1); + extExtension->ReportOnProcessResultCallback(ptr, scenario)(errCode, processInfo); + EXPECT_EQ(extExtension->onProcessTimeoutCnt_.load(), 0); + + extExtension->onProcessTimeoutCnt_.store(0); + processInfo = "test"; + extExtension->ReportOnProcessResultCallback(ptr, scenario)(errCode, processInfo); + EXPECT_EQ(extExtension->onProcessTimeoutCnt_.load(), 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_ReportOnProcessResultCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_UpdateFileStat_Test_0100 + * @tc.name: Ext_Extension_Sub_UpdateFileStat_Test_0100 + * @tc.desc: 测试UpdateFileStat + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_UpdateFileStat_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_UpdateFileStat_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + string actualPath = PATH + BUNDLE_NAME + FILE_NAME; + extExtension->UpdateFileStat(actualPath, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_UpdateFileStat_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IfAllowToBackupRestore_Test_0100 + * @tc.name: Ext_Extension_Sub_IfAllowToBackupRestore_Test_0100 + * @tc.desc: 测试IfAllowToBackupRestore + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IfAllowToBackupRestore_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IfAllowToBackupRestore_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto extension = extExtension->extension_; + extExtension->extension_ = nullptr; + auto ret = extExtension->IfAllowToBackupRestore(); + EXPECT_FALSE(ret); + + extExtension->extension_ = extension; + string usrConfig = "{\"allowToBackupRestore\":false}"; + EXPECT_CALL(*extBackupMock, GetUsrConfig()).WillOnce(Return(usrConfig)); + ret = extExtension->IfAllowToBackupRestore(); + EXPECT_FALSE(ret); + + usrConfig = "{\"allowToBackupRestore\":true}"; + EXPECT_CALL(*extBackupMock, GetUsrConfig()).WillOnce(Return(usrConfig)); + ret = extExtension->IfAllowToBackupRestore(); + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IfAllowToBackupRestore_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_SetStagingPathProperties_Test_0100 + * @tc.name: Ext_Extension_Sub_SetStagingPathProperties_Test_0100 + * @tc.desc: 测试SetStagingPathProperties + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_SetStagingPathProperties_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_SetStagingPathProperties_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto ret = extExtension->SetStagingPathProperties(); + EXPECT_TRUE(ret); + + string dirAct = string("rm -r ") + BUNDLE_BASE_DIR; + system(dirAct.c_str()); + ret = extExtension->SetStagingPathProperties(); + dirAct = string("mkdir -p ") + BUNDLE_BASE_DIR; + system(dirAct.c_str()); + EXPECT_FALSE(ret); + + dirAct = string("rm -r ") + PATH_BUNDLE_BACKUP_HOME; + system(dirAct.c_str()); + ret = extExtension->SetStagingPathProperties(); + dirAct = string("mkdir -p ") + PATH_BUNDLE_BACKUP_HOME; + system(dirAct.c_str()); + EXPECT_FALSE(ret); + + dirAct = string("rm -r ") + PATH_BUNDLE_BACKUP_HOME_EL1; + system(dirAct.c_str()); + ret = extExtension->SetStagingPathProperties(); + dirAct = string("mkdir -p ") + PATH_BUNDLE_BACKUP_HOME_EL1; + system(dirAct.c_str()); + EXPECT_FALSE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_SetStagingPathProperties_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_UpdateFdSendRate_Test_0100 + * @tc.name: Ext_Extension_Sub_UpdateFdSendRate_Test_0100 + * @tc.desc: 测试UpdateFdSendRate + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_UpdateFdSendRate_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_UpdateFdSendRate_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto ret = extExtension->UpdateFdSendRate(BUNDLE_NAME, 0); + EXPECT_EQ(extExtension->sendRate_, 0); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + + ret = extExtension->UpdateFdSendRate(BUNDLE_NAME, 10); + EXPECT_EQ(extExtension->sendRate_, 10); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_UpdateFdSendRate_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_GetBackupInfo_Test_0100 + * @tc.name: Ext_Extension_Sub_GetBackupInfo_Test_0100 + * @tc.desc: 测试GetBackupInfo + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_GetBackupInfo_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_GetBackupInfo_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + string result = ""; + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + auto ret = extExtension->GetBackupInfo(result); + EXPECT_EQ(ret, BError(BError::Codes::EXT_INVAL_ARG).GetCode()); + + extExtension->extension_ = ext; + EXPECT_CALL(*extBackupMock, GetBackupInfo(_)).WillOnce(Return(BError(BError::Codes::EXT_INVAL_ARG).GetCode())); + ret = extExtension->GetBackupInfo(result); + EXPECT_EQ(ret, BError(BError::Codes::EXT_INVAL_ARG).GetCode()); + + EXPECT_CALL(*extBackupMock, GetBackupInfo(_)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + ret = extExtension->GetBackupInfo(result); + EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_GetBackupInfo_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_SyncCallJsOnProcessTask_Test_0100 + * @tc.name: Ext_Extension_Sub_SyncCallJsOnProcessTask_Test_0100 + * @tc.desc: 测试SyncCallJsOnProcessTask + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_SyncCallJsOnProcessTask_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_SyncCallJsOnProcessTask_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_BACKUP; + extExtension->stopCallJsOnProcess_.store(true); + extExtension->SyncCallJsOnProcessTask(obj, scenario); + EXPECT_TRUE(extExtension->stopCallJsOnProcess_.load()); + + extExtension->stopCallJsOnProcess_.store(false); + extExtension->SyncCallJsOnProcessTask(nullptr, scenario); + EXPECT_FALSE(extExtension->stopCallJsOnProcess_.load()); + + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + extExtension->SyncCallJsOnProcessTask(obj, scenario); + EXPECT_FALSE(extExtension->stopCallJsOnProcess_.load()); + + extExtension->extension_ = ext; + EXPECT_CALL(*extBackupMock, OnProcess(_)).WillOnce(Return(BError(BError::Codes::EXT_INVAL_ARG).GetCode())); + extExtension->SyncCallJsOnProcessTask(obj, scenario); + EXPECT_FALSE(extExtension->stopCallJsOnProcess_.load()); + + EXPECT_CALL(*extBackupMock, OnProcess(_)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + extExtension->SyncCallJsOnProcessTask(obj, scenario); + EXPECT_FALSE(extExtension->stopCallJsOnProcess_.load()); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_SyncCallJsOnProcessTask_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IncreOnRestoreExCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_IncreOnRestoreExCallback_Test_0100 + * @tc.desc: 测试IncreOnRestoreExCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IncreOnRestoreExCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IncreOnRestoreExCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string restoreRetInfo = ""; + extExtension->IncreOnRestoreExCallback(nullptr)(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, ""); + + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + extExtension->IncreOnRestoreExCallback(obj)(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, ""); + + extExtension->extension_ = ext; + extExtension->isExecAppDone_.store(true); + extExtension->IncreOnRestoreExCallback(obj)(errCode, restoreRetInfo); + EXPECT_TRUE(extExtension->isExecAppDone_.load()); + + extExtension->isExecAppDone_.store(false); + restoreRetInfo = "test"; + extExtension->IncreOnRestoreExCallback(obj)(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, "test"); + + restoreRetInfo = ""; + extExtension->IncreOnRestoreExCallback(obj)(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, ""); + + errCode = BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + extExtension->IncreOnRestoreExCallback(obj)(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, ""); + + restoreRetInfo = "test"; + extExtension->IncreOnRestoreExCallback(obj)(errCode, restoreRetInfo); + EXPECT_EQ(restoreRetInfo, "test"); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IncreOnRestoreExCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IncreOnRestoreCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_IncreOnRestoreCallback_Test_0100 + * @tc.desc: 测试IncreOnRestoreCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IncreOnRestoreCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IncreOnRestoreCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string errMsg = ""; + extExtension->IncreOnRestoreCallback(nullptr)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + extExtension->isExecAppDone_.store(true); + extExtension->IncreOnRestoreCallback(obj)(errCode, errMsg); + EXPECT_TRUE(extExtension->isExecAppDone_.load()); + + extExtension->isExecAppDone_.store(false); + errMsg = "test"; + extExtension->IncreOnRestoreCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errMsg = ""; + extExtension->IncreOnRestoreCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + errCode = BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + extExtension->IncreOnRestoreCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IncreOnRestoreCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_OnBackupCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_OnBackupCallback_Test_0100 + * @tc.desc: 测试OnBackupCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_OnBackupCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_OnBackupCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string errMsg = ""; + extExtension->OnBackupCallback(nullptr)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + extExtension->OnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + extExtension->extension_ = ext; + extExtension->isExecAppDone_.store(true); + extExtension->OnBackupCallback(obj)(errCode, errMsg); + EXPECT_TRUE(extExtension->isExecAppDone_.load()); + + extExtension->isExecAppDone_.store(false); + errMsg = "test"; + string usrConfig = "{\"allowToBackupRestore\":true}"; + EXPECT_CALL(*extBackupMock, GetUsrConfig()).WillOnce(Return(usrConfig)); + extExtension->OnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errCode = BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + extExtension->OnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errMsg = ""; + extExtension->OnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_OnBackupCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_OnBackupExCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_OnBackupExCallback_Test_0100 + * @tc.desc: 测试OnBackupExCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_OnBackupExCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_OnBackupExCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string errMsg = ""; + extExtension->OnBackupExCallback(nullptr)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + extExtension->OnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + extExtension->extension_ = ext; + extExtension->isExecAppDone_.store(true); + extExtension->OnBackupExCallback(obj)(errCode, errMsg); + EXPECT_TRUE(extExtension->isExecAppDone_.load()); + + extExtension->isExecAppDone_.store(false); + errMsg = "test"; + string usrConfig = "{\"allowToBackupRestore\":true}"; + EXPECT_CALL(*extBackupMock, GetUsrConfig()).WillOnce(Return(usrConfig)); + extExtension->OnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errMsg = ""; + extExtension->OnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + errCode = BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + extExtension->OnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + errMsg = "test"; + extExtension->OnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_OnBackupExCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IncOnBackupCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_IncOnBackupCallback_Test_0100 + * @tc.desc: 测试IncOnBackupCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IncOnBackupCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IncOnBackupCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string errMsg = ""; + extExtension->IncOnBackupCallback(nullptr)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + extExtension->isExecAppDone_.store(true); + extExtension->IncOnBackupCallback(obj)(errCode, errMsg); + EXPECT_TRUE(extExtension->isExecAppDone_.load()); + + extExtension->isExecAppDone_.store(false); + errMsg = "test"; + extExtension->IncOnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errCode = BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + extExtension->IncOnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errMsg = ""; + extExtension->IncOnBackupCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IncOnBackupCallback_Test_0100"; +} + +/** + * @tc.number: Ext_Extension_Sub_IncOnBackupExCallback_Test_0100 + * @tc.name: Ext_Extension_Sub_IncOnBackupExCallback_Test_0100 + * @tc.desc: 测试IncOnBackupExCallback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I9P3Y3 + */ +HWTEST_F(ExtExtensionSubTest, Ext_Extension_Sub_IncOnBackupExCallback_Test_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExtExtensionSubTest-begin Ext_Extension_Sub_IncOnBackupExCallback_Test_0100"; + try { + ASSERT_TRUE(extExtension != nullptr); + auto obj = wptr(extExtension); + ErrCode errCode = BError(BError::Codes::OK).GetCode(); + string errMsg = ""; + extExtension->IncOnBackupExCallback(nullptr)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + auto ext = extExtension->extension_; + extExtension->extension_ = nullptr; + extExtension->IncOnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + extExtension->extension_ = ext; + extExtension->isExecAppDone_.store(true); + extExtension->IncOnBackupExCallback(obj)(errCode, errMsg); + EXPECT_TRUE(extExtension->isExecAppDone_.load()); + + extExtension->isExecAppDone_.store(false); + errMsg = "test"; + extExtension->IncOnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + + errMsg = ""; + extExtension->IncOnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + errCode = BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + extExtension->IncOnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, ""); + + errMsg = "test"; + extExtension->IncOnBackupExCallback(obj)(errCode, errMsg); + EXPECT_EQ(errMsg, "test"); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ExtExtensionSubTest-an exception occurred by construction."; + } + GTEST_LOG_(INFO) << "ExtExtensionSubTest-end Ext_Extension_Sub_IncOnBackupExCallback_Test_0100"; +} } \ No newline at end of file diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 6075332a4..a3db60af9 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -222,7 +222,7 @@ static inline std::vector DEFAULT_VERSION_NAMES_VEC = { DEFAULT_VERSION_NAME, DEFAULT_VERSION_NAME_CLONE, DEFAULT_VERSION_NAME_CLONE_2, DEFAULT_VERSION_NAME_CLONE_3, DEFAULT_VERSION_NAME_PC, DEFAULT_VERSION_NAME_CLOUD, }; -static inline std::string BACKUP_VERSION = R"({"backupVersion" : "18.0"})"; +static inline std::string BACKUP_VERSION = R"({"backupVersion" : "20.0"})"; // 应用默认备份的目录,其均为相对根路径的路径。为避免模糊匹配,务必以斜线为结尾。 static inline std::array PATHES_TO_BACKUP = { -- Gitee From 0fb51576fcc1a7572e154055ff01651c00ed80c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Thu, 24 Jul 2025 15:01:15 +0800 Subject: [PATCH 30/62] =?UTF-8?q?=E4=BC=98=E5=8C=96appendBundles=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E5=AF=BC=E8=87=B4clean=E5=BC=82=E5=B8=B8=E5=9C=BA?= =?UTF-8?q?=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../backup_sa/include/module_ipc/service.h | 1 + .../backup_sa/src/module_ipc/sub_service.cpp | 19 ++++-- .../src/module_sched/sched_scheduler.cpp | 2 + tests/mock/module_ipc/service_mock.cpp | 2 + .../module_ipc/sched_scheduler_test.cpp | 2 + .../backup_sa/module_ipc/sub_service_test.cpp | 59 +++++++++++++++---- 6 files changed, 68 insertions(+), 17 deletions(-) diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 8bb77e1ad..5735f3f55 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -338,6 +338,7 @@ public: ErrCode SendIncrementalFileHandle(const std::string &bundleName, const std::string &fileName); void SetExtOnRelease(const BundleName &bundleName, bool isOnRelease); void RemoveExtOnRelease(const BundleName &bundleName); + void DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd); public: explicit Service(int32_t saID, bool runOnCreate = false) : SystemAbility(saID, runOnCreate) { diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 7c83fd08f..d308767ee 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -684,17 +684,17 @@ void Service::ExtConnectDied(const string &callName) /* Clear Session before notice client finish event */ HILOGE("Current bundle launch extension failed, bundleName:%{public}s", callName.c_str()); SendEndAppGalleryNotify(callName); + bool isRestoreEnd = session_->GetIsRestoreEnd(callName); ClearSessionAndSchedInfo(callName); - } - /* Notice Client Ext Ability Process Died */ - if (!session_->GetIsRestoreEnd(callName)) { - NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + /* Notice Client Ext Ability Process Died */ + DoNoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); } } catch (...) { HILOGE("Unexpected exception, bundleName: %{public}s", callName.c_str()); SendEndAppGalleryNotify(callName); + bool isRestoreEnd = session_->GetIsRestoreEnd(callName); ClearSessionAndSchedInfo(callName); - NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + DoNoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); } RemoveExtensionMutex(callName); } @@ -704,7 +704,9 @@ void Service::OnBackupExtensionDied(const string &&bundleName, bool isCleanCalle HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); if (isCleanCalled) { HILOGE("Backup <%{public}s> Extension Process second Died", bundleName.c_str()); + bool isRestoreEnd = session_->GetIsRestoreEnd(bundleName); ClearSessionAndSchedInfo(bundleName); + DoNoticeClientFinish(bundleName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); OnAllBundlesFinished(BError(BError::Codes::OK)); return; } @@ -1596,4 +1598,11 @@ ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std:: session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return err; } + +void Service::DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd) +{ + if (!isRestoreEnd) { + NoticeClientFinish(bundleName, errCode); + } +} } \ No newline at end of file diff --git a/services/backup_sa/src/module_sched/sched_scheduler.cpp b/services/backup_sa/src/module_sched/sched_scheduler.cpp index ebdf00c28..70971f291 100644 --- a/services/backup_sa/src/module_sched/sched_scheduler.cpp +++ b/services/backup_sa/src/module_sched/sched_scheduler.cpp @@ -239,7 +239,9 @@ void SchedScheduler::StartExecuteBundleTask(const std::string &bundleName, BCons } } else if (action == BConstants::ServiceSchedAction::CLEAN) { HILOGI("Current bundle %{public}s process is cleaning", bundleName.data()); + bool isRestoreEnd = sessionPtr_->GetIsRestoreEnd(bundleName); ErrCode res = reversePtr_->ClearResidualBundleData(bundleName); + reversePtr_->DoNoticeClientFinish(bundleName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); IServiceReverseType::Scenario scenario = sessionPtr_->GetScenario(); ExtDiedClearFailRadarReport(bundleName, scenario, res); } diff --git a/tests/mock/module_ipc/service_mock.cpp b/tests/mock/module_ipc/service_mock.cpp index 61afc65f2..c07e58304 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -456,4 +456,6 @@ ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std:: { return BError(BError::Codes::OK); } + +void Service::DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd) {} } // namespace OHOS::FileManagement::Backup 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 f5dc79c0d..f30119c96 100644 --- a/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp @@ -165,6 +165,8 @@ HWTEST_F(SchedSchedulerTest, SUB_Service_ExecutingQueueTasks_0100, testing::ext: schedPtr_->ExecutingQueueTasks(BUNDLE_NAME); sessionManagerPtr_->SetServiceSchedAction(BUNDLE_NAME, BConstants::ServiceSchedAction::RUNNING); schedPtr_->ExecutingQueueTasks(BUNDLE_NAME); + sessionManagerPtr_->SetServiceSchedAction(BUNDLE_NAME, BConstants::ServiceSchedAction::CLEAN); + schedPtr_->ExecutingQueueTasks(BUNDLE_NAME); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "SchedSchedulerTest-an exception occurred by ExecutingQueueTasks."; diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index da25a5f8e..cb6051d3f 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -338,9 +338,11 @@ HWTEST_F(ServiceTest, SUB_Service_OnBackupExtensionDied_0000, TestSize.Level1) GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_OnBackupExtensionDied_0000"; try { service->isOccupyingSession_ = false; - EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) + .WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)).WillOnce(Return(false)); + EXPECT_CALL(*session, GetIsRestoreEnd(_)).WillOnce(Return(true)); service->OnBackupExtensionDied("", true); EXPECT_TRUE(true); @@ -376,8 +378,8 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0000, TestSize.Level1) try { string callName; service->isOccupyingSession_ = false; - EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); + EXPECT_CALL(*session, StopFwkTimer(_)).WillRepeatedly(Return(true)); + EXPECT_CALL(*session, StopExtTimer(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(nullptr)); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) @@ -387,9 +389,7 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0000, TestSize.Level1) service->ExtConnectDied(callName); EXPECT_TRUE(true); - EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + EXPECT_CALL(*session, GetExtConnection(_)).WillRepeatedly(Return(connect)); EXPECT_CALL(*connect, IsExtAbilityConnected()).WillOnce(Return(false)); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) @@ -399,16 +399,22 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0000, TestSize.Level1) service->ExtConnectDied(callName); EXPECT_TRUE(true); - EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); EXPECT_CALL(*connect, IsExtAbilityConnected()).WillOnce(Return(true)); EXPECT_CALL(*connect, DisconnectBackupExtAbility()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) .WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); - EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillRepeatedly(Return(true)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillRepeatedly(Return(false)); + service->ExtConnectDied(callName); + EXPECT_TRUE(true); + + EXPECT_CALL(*connect, IsExtAbilityConnected()).WillRepeatedly(Return(false)); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillRepeatedly(Return(false)); + EXPECT_CALL(*session, GetClearDataFlag(_)).WillRepeatedly(Return(true)); + EXPECT_CALL(*session, GetScenario()).WillRepeatedly(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, UpdateDfxInfo(_, _)).WillRepeatedly(Return()); + EXPECT_CALL(*session, GetIsRestoreEnd(_)).WillOnce(Return(true)); service->ExtConnectDied(callName); EXPECT_TRUE(true); } catch (...) { @@ -2315,4 +2321,33 @@ HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0200, testing::ext::TestS GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetCompatibilityInfo."; } GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetCompatibilityInfo_0200"; +} + +/** + * @tc.number: SUB_Service_DoNoticeClientFinish_0000 + * @tc.name: SUB_Service_DoNoticeClientFinish_0000 + * @tc.desc: 测试 DoNoticeClientFinish 的正常/异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(ServiceTest, SUB_Service_DoNoticeClientFinish_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_DoNoticeClientFinish_0000"; + try { + std::string bundleName = "com.ohos.test"; + ErrCode err = BError(BError::Codes::SA_INVAL_ARG).GetCode(); + service->DoNoticeClientFinish(bundleName, err, true); + EXPECT_TRUE(true); + + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + service->DoNoticeClientFinish(bundleName, err, false); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by DoNoticeClientFinish."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_DoNoticeClientFinish_0000"; } \ No newline at end of file -- Gitee From 476ccfb2db6dcb2b6d4faac7784d315fb6cfc8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Fri, 25 Jul 2025 12:20:09 +0800 Subject: [PATCH 31/62] try to dispose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- services/backup_sa/src/module_ipc/service.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index f578df62f..2130d6952 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1430,14 +1430,14 @@ void Service::TryToClearDispose(const BundleName &bundleName) HILOGI("EndRestore, code=%{public}d, bundleName=%{public}s, userId=%{public}d", disposeErr, bundle.c_str(), userId); if (disposeErr == DisposeErr::OK) { + if (!disposal_->DeleteFromDisposalConfigFile(bundleName)) { + HILOGE("DeleteFromDisposalConfigFile Failed, bundleName=%{public}s", bundleName.c_str()); + } break; } ++att; HILOGI("Try to clear dispose, num = %{public}d", att); } - if (!disposal_->DeleteFromDisposalConfigFile(bundleName)) { - HILOGE("DeleteFromDisposalConfigFile Failed, bundleName=%{public}s", bundleName.c_str()); - } } void Service::SendErrAppGalleryNotify() -- Gitee From 54aa65d2f88e1434642270bf34a7f779f713291b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Fri, 25 Jul 2025 17:06:52 +0800 Subject: [PATCH 32/62] try to dispose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- services/backup_sa/src/module_ipc/service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 2130d6952..50e1bd611 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1431,7 +1431,7 @@ void Service::TryToClearDispose(const BundleName &bundleName) userId); if (disposeErr == DisposeErr::OK) { if (!disposal_->DeleteFromDisposalConfigFile(bundleName)) { - HILOGE("DeleteFromDisposalConfigFile Failed, bundleName=%{public}s", bundleName.c_str()); + HILOGE("DeleteFromDisposalConfigFile Failed, bundleName=%{public}s", bundleName.c_str()); } break; } -- Gitee From 44daf92094bf43a783d3ac9f0e91506a455239a9 Mon Sep 17 00:00:00 2001 From: linan24 Date: Thu, 24 Jul 2025 15:32:13 +0800 Subject: [PATCH 33/62] afs rom optimization Signed-off-by: linan24 --- frameworks/native/backup_ext/BUILD.gn | 3 +- .../native/backup_kit_inner/BUILD.gn | 4 +- interfaces/kits/js/BUILD.gn | 1 - services/backup_sa/BUILD.gn | 98 +++++++++++++++++-- .../include/svc_extension_proxy_mock.h | 8 +- .../module_ipc/service_reverse_proxy_mock.cpp | 24 +++++ tests/unittests/backup_sa/module_ipc/BUILD.gn | 2 +- utils/BUILD.gn | 1 - utils/include/b_radar/radar_app_statistic.h | 10 -- utils/include/b_radar/radar_const.h | 56 ----------- utils/include/b_radar/radar_const_inner.h | 80 +++++++++++++++ utils/src/b_radar/radar_app_statistic.cpp | 11 +++ utils/src/b_radar/radar_total_statistic.cpp | 1 + 13 files changed, 215 insertions(+), 84 deletions(-) create mode 100644 utils/include/b_radar/radar_const_inner.h diff --git a/frameworks/native/backup_ext/BUILD.gn b/frameworks/native/backup_ext/BUILD.gn index 85d6d2369..14208017d 100644 --- a/frameworks/native/backup_ext/BUILD.gn +++ b/frameworks/native/backup_ext/BUILD.gn @@ -52,7 +52,7 @@ ohos_shared_library("backup_extension_ability_native") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", - "${path_backup}/services/backup_sa:backup_sa_ipc_stub", + "${path_backup}/services/backup_sa:backup_extension_stub_idl", "${path_backup}/utils:backup_utils", ] @@ -85,6 +85,7 @@ ohos_shared_library("backup_extension_ability_native") { "-fno-unwind-tables", "-fno-asynchronous-unwind-tables", "-Os", + "-fvisibility=hidden", ] use_exceptions = true diff --git a/interfaces/inner_api/native/backup_kit_inner/BUILD.gn b/interfaces/inner_api/native/backup_kit_inner/BUILD.gn index 70593df50..94bc2549c 100644 --- a/interfaces/inner_api/native/backup_kit_inner/BUILD.gn +++ b/interfaces/inner_api/native/backup_kit_inner/BUILD.gn @@ -78,7 +78,9 @@ ohos_shared_library("backup_kit_inner") { ] deps = [ - "${path_backup}/services/backup_sa:backup_sa_ipc", + "${path_backup}/services/backup_sa:backup_extension_stub_idl", + "${path_backup}/services/backup_sa:backup_reverse_stub_idl", + "${path_backup}/services/backup_sa:backup_service_proxy_idl", "${path_backup}/utils:backup_utils", ] diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index 3a96c145c..c0c812f55 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -157,7 +157,6 @@ ohos_shared_library("backup") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", - "${path_backup}/services/backup_sa:backup_sa_ipc", "${path_backup}/utils:backup_utils", ] diff --git a/services/backup_sa/BUILD.gn b/services/backup_sa/BUILD.gn index 4f0cab5c4..a8e928cbf 100644 --- a/services/backup_sa/BUILD.gn +++ b/services/backup_sa/BUILD.gn @@ -68,27 +68,31 @@ ohos_source_set("backup_sa_ipc") { "${target_gen_dir}/", ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + "-fvisibility=hidden", + ] + part_name = "app_file_service" subsystem_name = "filemanagement" } -ohos_source_set("backup_sa_ipc_type") { +ohos_source_set("backup_extension_stub_idl") { sanitize = { cfi = true cfi_cross_dso = true debug = false } - output_values = get_target_outputs(":backup_idl") - - sources = [] - - sources += filter_include(output_values, [ "*_type.cpp" ]) - + sources = [ + "${target_gen_dir}/extension_stub.cpp" + ] public_configs = [ ":public_idl_config" ] - deps = [ ":backup_idl" ] - external_deps = [ "c_utils:utils", "hilog:libhilog", @@ -97,14 +101,88 @@ ohos_source_set("backup_sa_ipc_type") { "safwk:system_ability_fwk", "samgr:samgr_proxy", ] - include_dirs = [ ".", "${target_gen_dir}/", ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + ] + part_name = "app_file_service" + subsystem_name = "filemanagement" +} +ohos_source_set("backup_reverse_stub_idl") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + sources = [ + "${target_gen_dir}/service_reverse_stub.cpp" + ] + public_configs = [ ":public_idl_config" ] + deps = [ ":backup_idl" ] + external_deps = [ + "c_utils:utils", + "hilog:libhilog", + "hitrace:hitrace_meter", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] + include_dirs = [ + ".", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${target_gen_dir}/", + ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + ] part_name = "app_file_service" + subsystem_name = "filemanagement" +} +ohos_source_set("backup_service_proxy_idl") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + sources = [ + "${target_gen_dir}/service_proxy.cpp" + ] + public_configs = [ ":public_idl_config" ] + deps = [ ":backup_idl" ] + external_deps = [ + "c_utils:utils", + "hilog:libhilog", + "hitrace:hitrace_meter", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] + include_dirs = [ + ".", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${target_gen_dir}/", + ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + ] + part_name = "app_file_service" subsystem_name = "filemanagement" } diff --git a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h index ed98bfdd3..22a484e0e 100644 --- a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h +++ b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h @@ -18,12 +18,14 @@ #include -#include "extension_proxy.h" +#include +#include "iextension.h" namespace OHOS::FileManagement::Backup { -class SvcExtensionProxyMock : public ExtensionProxy { +class SvcExtensionProxyMock : public IRemoteProxy { public: - SvcExtensionProxyMock() : ExtensionProxy(nullptr) {}; + SvcExtensionProxyMock() : IRemoteProxy(nullptr) {}; + virtual ~SvcExtensionProxyMock() = default; public: MOCK_METHOD(ErrCode, GetFileHandleWithUniqueFd, (const std::string &, int32_t &, int32_t &)); MOCK_METHOD(ErrCode, HandleClear, ()); diff --git a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp index 800d74399..7e03f557d 100644 --- a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp +++ b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp @@ -175,4 +175,28 @@ ErrCode ServiceReverseProxy::IncrementalRestoreOnProcessInfo(const std::string & { return BError(BError::Codes::OK); } + +ErrCode ServiceReverseProxy::IncrementalSaBackupOnFileReady(const std::string &bundleName, const std::string &fileName, + int fd, int32_t errCode) +{ + return BError(BError::Codes::OK); +} + +ErrCode ServiceReverseProxy::IncrementalBackupOnFileReadyWithoutFd(const std::string &bundleName, + const std::string &fileName, int32_t errCode) +{ + return BError(BError::Codes::OK); +} + +ErrCode ServiceReverseProxy::BackupOnFileReadyWithoutFd(const std::string &bundleName, const std::string &fileName, + int32_t errCode) +{ + return BError(BError::Codes::OK); +} + +ErrCode ServiceReverseProxy::RestoreOnFileReadyWithoutFd(const std::string &bundleName, const std::string &fileName, + int32_t errCode) +{ + return BError(BError::Codes::OK); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index 3c8a43658..46f62e8b6 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -39,7 +39,7 @@ ohos_unittest("module_ipc_test") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", - "${path_backup}/services/backup_sa:backup_sa_ipc_stub", + "${path_backup}/services/backup_sa:backup_sa_ipc", "${path_backup}/tests/utils:backup_test_utils", "${path_backup}/utils:backup_utils", ] diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 90f31d3e6..f154e214b 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -116,7 +116,6 @@ ohos_shared_library("backup_utils") { deps = [ ":backup_cxx_cppdeps", "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", - "${path_backup}/services/backup_sa:backup_sa_ipc_type", ] cflags_cc = [ diff --git a/utils/include/b_radar/radar_app_statistic.h b/utils/include/b_radar/radar_app_statistic.h index 9a84969ff..ca81a26be 100644 --- a/utils/include/b_radar/radar_app_statistic.h +++ b/utils/include/b_radar/radar_app_statistic.h @@ -42,16 +42,6 @@ enum FileType : uint8_t { OTHER, }; -const std::unordered_map FileTypeDef = { - {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, {"db", TXT}, {"db-compare", TXT}, - {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, - {"raw", PIC}, - {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, - {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, - {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, - {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} -}; - constexpr uint64_t ONE_MB = 1024 * 1024; constexpr uint64_t TWO_MB = 2 * ONE_MB; constexpr uint64_t TEN_MB = 10 * ONE_MB; diff --git a/utils/include/b_radar/radar_const.h b/utils/include/b_radar/radar_const.h index f4c730c44..6ebf347da 100644 --- a/utils/include/b_radar/radar_const.h +++ b/utils/include/b_radar/radar_const.h @@ -127,61 +127,5 @@ struct RadarError { std::string errMsg_ = ""; }; -constexpr int32_t DEFAULT_STAGE = 1; -constexpr int32_t STAGE_RES_IDLE = 0; -constexpr int32_t STAGE_RES_SUCCESS = 1; -constexpr int32_t STAGE_RES_FAIL = 2; -constexpr int32_t STAGE_RES_CANCEL = 3; - -constexpr char DOMAIN[] = "APP_FILE_SVC"; -const std::string DOMAIN_NAME = "APP_FILE_SVC"; -const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; -const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; - -const std::string ORG_PKG = "ORG_PKG"; -const std::string FUNC = "FUNC"; -const std::string BIZ_SCENE = "BIZ_SCENE"; -const std::string BIZ_STAGE = "BIZ_STAGE"; -const std::string STAGE_RES = "STAGE_RES"; -const std::string CONCURRENT_ID = "CONCURRENT_ID"; -const std::string ERROR_CODE = "ERROR_CODE"; -const std::string ERROR_MSG = "ERROR_MSG"; - -const std::string HOST_PKG = "HOST_PKG"; -const std::string APP_CALLER = "APP_CALLER"; -const std::string MODE = "MODE"; -const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; -const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; -const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; -const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; -const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; -const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; -const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; -const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; -const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; -const std::string DIR_DEPTH = "DIR_DEPTH"; -const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; -const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; -const std::string GET_EXT_INFO_SPEND = "GET_EXT_INFO_SPEND"; - -const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; -const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; -const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; -const std::string TAR_SPEND = "TAR_SPEND"; -const std::string HASH_SPEND = "HASH_SPEND"; -const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; -const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; - -const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; -const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; -const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; -const std::string UNTAR_SPEND = "UNTAR_SPEND"; -const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; - -const std::string GET_BUNDLE_INFO_SPEND = "GET_BUNDLE_INFO_SPEND"; -const std::string TOTAL_SPEND = "TOTAL_SPEND"; -const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; -const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; - } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_H diff --git a/utils/include/b_radar/radar_const_inner.h b/utils/include/b_radar/radar_const_inner.h new file mode 100644 index 000000000..6e19570c5 --- /dev/null +++ b/utils/include/b_radar/radar_const_inner.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H +#define OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H + +#include + +namespace OHOS::FileManagement::Backup { + +constexpr int32_t DEFAULT_STAGE = 1; +constexpr int32_t STAGE_RES_IDLE = 0; +constexpr int32_t STAGE_RES_SUCCESS = 1; +constexpr int32_t STAGE_RES_FAIL = 2; +constexpr int32_t STAGE_RES_CANCEL = 3; + +constexpr char DOMAIN[] = "APP_FILE_SVC"; +const std::string DOMAIN_NAME = "APP_FILE_SVC"; +const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; +const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; + +const std::string ORG_PKG = "ORG_PKG"; +const std::string FUNC = "FUNC"; +const std::string BIZ_SCENE = "BIZ_SCENE"; +const std::string BIZ_STAGE = "BIZ_STAGE"; +const std::string STAGE_RES = "STAGE_RES"; +const std::string CONCURRENT_ID = "CONCURRENT_ID"; +const std::string ERROR_CODE = "ERROR_CODE"; +const std::string ERROR_MSG = "ERROR_MSG"; + +const std::string HOST_PKG = "HOST_PKG"; +const std::string APP_CALLER = "APP_CALLER"; +const std::string MODE = "MODE"; +const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; +const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; +const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; +const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; +const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; +const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; +const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; +const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; +const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; +const std::string DIR_DEPTH = "DIR_DEPTH"; +const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; +const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; +const std::string GET_EXT_INFO_SPEND = "GET_EXT_INFO_SPEND"; + +const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; +const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; +const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; +const std::string TAR_SPEND = "TAR_SPEND"; +const std::string HASH_SPEND = "HASH_SPEND"; +const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; +const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; + +const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; +const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; +const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; +const std::string UNTAR_SPEND = "UNTAR_SPEND"; +const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; + +const std::string GET_BUNDLE_INFO_SPEND = "GET_BUNDLE_INFO_SPEND"; +const std::string TOTAL_SPEND = "TOTAL_SPEND"; +const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; +const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; + +} // namespace OHOS::FileManagement::Backup +#endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H diff --git a/utils/src/b_radar/radar_app_statistic.cpp b/utils/src/b_radar/radar_app_statistic.cpp index 9d37a82db..804b0682f 100644 --- a/utils/src/b_radar/radar_app_statistic.cpp +++ b/utils/src/b_radar/radar_app_statistic.cpp @@ -14,11 +14,22 @@ */ #include "b_radar/radar_app_statistic.h" +#include "b_radar/radar_const_inner.h" #include "filemgmt_libhilog.h" #include "hisysevent.h" namespace OHOS::FileManagement::Backup { +const std::unordered_map FileTypeDef = { + {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, {"db", TXT}, {"db-compare", TXT}, + {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, + {"raw", PIC}, + {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, + {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, + {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, + {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} +}; + std::string FileStatList::ToJsonString() { std::string result = "["; diff --git a/utils/src/b_radar/radar_total_statistic.cpp b/utils/src/b_radar/radar_total_statistic.cpp index ca143af9a..87035f4a5 100644 --- a/utils/src/b_radar/radar_total_statistic.cpp +++ b/utils/src/b_radar/radar_total_statistic.cpp @@ -14,6 +14,7 @@ */ #include "b_radar/radar_total_statistic.h" +#include "b_radar/radar_const_inner.h" #include "b_utils/b_time.h" #include "filemgmt_libhilog.h" #include "hisysevent.h" -- Gitee From a4a034d820d2132bd880de121d9f45d84d2489a8 Mon Sep 17 00:00:00 2001 From: oh_ci Date: Mon, 28 Jul 2025 08:01:14 +0000 Subject: [PATCH 34/62] =?UTF-8?q?=E5=9B=9E=E9=80=80=20'Pull=20Request=20!1?= =?UTF-8?q?763=20:=20afs=20rom=20optimization'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frameworks/native/backup_ext/BUILD.gn | 3 +- .../native/backup_kit_inner/BUILD.gn | 4 +- interfaces/kits/js/BUILD.gn | 1 + services/backup_sa/BUILD.gn | 98 ++----------------- .../include/svc_extension_proxy_mock.h | 8 +- .../module_ipc/service_reverse_proxy_mock.cpp | 24 ----- tests/unittests/backup_sa/module_ipc/BUILD.gn | 2 +- utils/BUILD.gn | 1 + utils/include/b_radar/radar_app_statistic.h | 10 ++ utils/include/b_radar/radar_const.h | 56 +++++++++++ utils/include/b_radar/radar_const_inner.h | 80 --------------- utils/src/b_radar/radar_app_statistic.cpp | 11 --- utils/src/b_radar/radar_total_statistic.cpp | 1 - 13 files changed, 84 insertions(+), 215 deletions(-) delete mode 100644 utils/include/b_radar/radar_const_inner.h diff --git a/frameworks/native/backup_ext/BUILD.gn b/frameworks/native/backup_ext/BUILD.gn index 14208017d..85d6d2369 100644 --- a/frameworks/native/backup_ext/BUILD.gn +++ b/frameworks/native/backup_ext/BUILD.gn @@ -52,7 +52,7 @@ ohos_shared_library("backup_extension_ability_native") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", - "${path_backup}/services/backup_sa:backup_extension_stub_idl", + "${path_backup}/services/backup_sa:backup_sa_ipc_stub", "${path_backup}/utils:backup_utils", ] @@ -85,7 +85,6 @@ ohos_shared_library("backup_extension_ability_native") { "-fno-unwind-tables", "-fno-asynchronous-unwind-tables", "-Os", - "-fvisibility=hidden", ] use_exceptions = true diff --git a/interfaces/inner_api/native/backup_kit_inner/BUILD.gn b/interfaces/inner_api/native/backup_kit_inner/BUILD.gn index 94bc2549c..70593df50 100644 --- a/interfaces/inner_api/native/backup_kit_inner/BUILD.gn +++ b/interfaces/inner_api/native/backup_kit_inner/BUILD.gn @@ -78,9 +78,7 @@ ohos_shared_library("backup_kit_inner") { ] deps = [ - "${path_backup}/services/backup_sa:backup_extension_stub_idl", - "${path_backup}/services/backup_sa:backup_reverse_stub_idl", - "${path_backup}/services/backup_sa:backup_service_proxy_idl", + "${path_backup}/services/backup_sa:backup_sa_ipc", "${path_backup}/utils:backup_utils", ] diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index c0c812f55..3a96c145c 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -157,6 +157,7 @@ ohos_shared_library("backup") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/services/backup_sa:backup_sa_ipc", "${path_backup}/utils:backup_utils", ] diff --git a/services/backup_sa/BUILD.gn b/services/backup_sa/BUILD.gn index a8e928cbf..4f0cab5c4 100644 --- a/services/backup_sa/BUILD.gn +++ b/services/backup_sa/BUILD.gn @@ -68,100 +68,27 @@ ohos_source_set("backup_sa_ipc") { "${target_gen_dir}/", ] - cflags_cc = [ - "-fdata-sections", - "-ffunction-sections", - "-fno-unwind-tables", - "-fno-asynchronous-unwind-tables", - "-Os", - "-fvisibility=hidden", - ] - part_name = "app_file_service" subsystem_name = "filemanagement" } -ohos_source_set("backup_extension_stub_idl") { +ohos_source_set("backup_sa_ipc_type") { sanitize = { cfi = true cfi_cross_dso = true debug = false } - sources = [ - "${target_gen_dir}/extension_stub.cpp" - ] - public_configs = [ ":public_idl_config" ] - deps = [ ":backup_idl" ] - external_deps = [ - "c_utils:utils", - "hilog:libhilog", - "hitrace:hitrace_meter", - "ipc:ipc_core", - "safwk:system_ability_fwk", - "samgr:samgr_proxy", - ] - include_dirs = [ - ".", - "${target_gen_dir}/", - ] - cflags_cc = [ - "-fdata-sections", - "-ffunction-sections", - "-fno-unwind-tables", - "-fno-asynchronous-unwind-tables", - "-Os", - ] - part_name = "app_file_service" - subsystem_name = "filemanagement" -} + output_values = get_target_outputs(":backup_idl") -ohos_source_set("backup_reverse_stub_idl") { - sanitize = { - cfi = true - cfi_cross_dso = true - debug = false - } - sources = [ - "${target_gen_dir}/service_reverse_stub.cpp" - ] - public_configs = [ ":public_idl_config" ] - deps = [ ":backup_idl" ] - external_deps = [ - "c_utils:utils", - "hilog:libhilog", - "hitrace:hitrace_meter", - "ipc:ipc_core", - "safwk:system_ability_fwk", - "samgr:samgr_proxy", - ] - include_dirs = [ - ".", - "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", - "${target_gen_dir}/", - ] - cflags_cc = [ - "-fdata-sections", - "-ffunction-sections", - "-fno-unwind-tables", - "-fno-asynchronous-unwind-tables", - "-Os", - ] - part_name = "app_file_service" - subsystem_name = "filemanagement" -} + sources = [] + + sources += filter_include(output_values, [ "*_type.cpp" ]) -ohos_source_set("backup_service_proxy_idl") { - sanitize = { - cfi = true - cfi_cross_dso = true - debug = false - } - sources = [ - "${target_gen_dir}/service_proxy.cpp" - ] public_configs = [ ":public_idl_config" ] + deps = [ ":backup_idl" ] + external_deps = [ "c_utils:utils", "hilog:libhilog", @@ -170,19 +97,14 @@ ohos_source_set("backup_service_proxy_idl") { "safwk:system_ability_fwk", "samgr:samgr_proxy", ] + include_dirs = [ ".", - "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", "${target_gen_dir}/", ] - cflags_cc = [ - "-fdata-sections", - "-ffunction-sections", - "-fno-unwind-tables", - "-fno-asynchronous-unwind-tables", - "-Os", - ] + part_name = "app_file_service" + subsystem_name = "filemanagement" } diff --git a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h index 22a484e0e..ed98bfdd3 100644 --- a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h +++ b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h @@ -18,14 +18,12 @@ #include -#include -#include "iextension.h" +#include "extension_proxy.h" namespace OHOS::FileManagement::Backup { -class SvcExtensionProxyMock : public IRemoteProxy { +class SvcExtensionProxyMock : public ExtensionProxy { public: - SvcExtensionProxyMock() : IRemoteProxy(nullptr) {}; - virtual ~SvcExtensionProxyMock() = default; + SvcExtensionProxyMock() : ExtensionProxy(nullptr) {}; public: MOCK_METHOD(ErrCode, GetFileHandleWithUniqueFd, (const std::string &, int32_t &, int32_t &)); MOCK_METHOD(ErrCode, HandleClear, ()); diff --git a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp index 7e03f557d..800d74399 100644 --- a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp +++ b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp @@ -175,28 +175,4 @@ ErrCode ServiceReverseProxy::IncrementalRestoreOnProcessInfo(const std::string & { return BError(BError::Codes::OK); } - -ErrCode ServiceReverseProxy::IncrementalSaBackupOnFileReady(const std::string &bundleName, const std::string &fileName, - int fd, int32_t errCode) -{ - return BError(BError::Codes::OK); -} - -ErrCode ServiceReverseProxy::IncrementalBackupOnFileReadyWithoutFd(const std::string &bundleName, - const std::string &fileName, int32_t errCode) -{ - return BError(BError::Codes::OK); -} - -ErrCode ServiceReverseProxy::BackupOnFileReadyWithoutFd(const std::string &bundleName, const std::string &fileName, - int32_t errCode) -{ - return BError(BError::Codes::OK); -} - -ErrCode ServiceReverseProxy::RestoreOnFileReadyWithoutFd(const std::string &bundleName, const std::string &fileName, - int32_t errCode) -{ - return BError(BError::Codes::OK); -} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index 46f62e8b6..3c8a43658 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -39,7 +39,7 @@ ohos_unittest("module_ipc_test") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", - "${path_backup}/services/backup_sa:backup_sa_ipc", + "${path_backup}/services/backup_sa:backup_sa_ipc_stub", "${path_backup}/tests/utils:backup_test_utils", "${path_backup}/utils:backup_utils", ] diff --git a/utils/BUILD.gn b/utils/BUILD.gn index f154e214b..90f31d3e6 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -116,6 +116,7 @@ ohos_shared_library("backup_utils") { deps = [ ":backup_cxx_cppdeps", "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", + "${path_backup}/services/backup_sa:backup_sa_ipc_type", ] cflags_cc = [ diff --git a/utils/include/b_radar/radar_app_statistic.h b/utils/include/b_radar/radar_app_statistic.h index ca81a26be..9a84969ff 100644 --- a/utils/include/b_radar/radar_app_statistic.h +++ b/utils/include/b_radar/radar_app_statistic.h @@ -42,6 +42,16 @@ enum FileType : uint8_t { OTHER, }; +const std::unordered_map FileTypeDef = { + {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, {"db", TXT}, {"db-compare", TXT}, + {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, + {"raw", PIC}, + {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, + {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, + {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, + {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} +}; + constexpr uint64_t ONE_MB = 1024 * 1024; constexpr uint64_t TWO_MB = 2 * ONE_MB; constexpr uint64_t TEN_MB = 10 * ONE_MB; diff --git a/utils/include/b_radar/radar_const.h b/utils/include/b_radar/radar_const.h index 6ebf347da..f4c730c44 100644 --- a/utils/include/b_radar/radar_const.h +++ b/utils/include/b_radar/radar_const.h @@ -127,5 +127,61 @@ struct RadarError { std::string errMsg_ = ""; }; +constexpr int32_t DEFAULT_STAGE = 1; +constexpr int32_t STAGE_RES_IDLE = 0; +constexpr int32_t STAGE_RES_SUCCESS = 1; +constexpr int32_t STAGE_RES_FAIL = 2; +constexpr int32_t STAGE_RES_CANCEL = 3; + +constexpr char DOMAIN[] = "APP_FILE_SVC"; +const std::string DOMAIN_NAME = "APP_FILE_SVC"; +const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; +const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; + +const std::string ORG_PKG = "ORG_PKG"; +const std::string FUNC = "FUNC"; +const std::string BIZ_SCENE = "BIZ_SCENE"; +const std::string BIZ_STAGE = "BIZ_STAGE"; +const std::string STAGE_RES = "STAGE_RES"; +const std::string CONCURRENT_ID = "CONCURRENT_ID"; +const std::string ERROR_CODE = "ERROR_CODE"; +const std::string ERROR_MSG = "ERROR_MSG"; + +const std::string HOST_PKG = "HOST_PKG"; +const std::string APP_CALLER = "APP_CALLER"; +const std::string MODE = "MODE"; +const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; +const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; +const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; +const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; +const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; +const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; +const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; +const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; +const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; +const std::string DIR_DEPTH = "DIR_DEPTH"; +const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; +const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; +const std::string GET_EXT_INFO_SPEND = "GET_EXT_INFO_SPEND"; + +const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; +const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; +const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; +const std::string TAR_SPEND = "TAR_SPEND"; +const std::string HASH_SPEND = "HASH_SPEND"; +const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; +const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; + +const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; +const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; +const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; +const std::string UNTAR_SPEND = "UNTAR_SPEND"; +const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; + +const std::string GET_BUNDLE_INFO_SPEND = "GET_BUNDLE_INFO_SPEND"; +const std::string TOTAL_SPEND = "TOTAL_SPEND"; +const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; +const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; + } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_H diff --git a/utils/include/b_radar/radar_const_inner.h b/utils/include/b_radar/radar_const_inner.h deleted file mode 100644 index 6e19570c5..000000000 --- a/utils/include/b_radar/radar_const_inner.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2025 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. - */ - -#ifndef OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H -#define OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H - -#include - -namespace OHOS::FileManagement::Backup { - -constexpr int32_t DEFAULT_STAGE = 1; -constexpr int32_t STAGE_RES_IDLE = 0; -constexpr int32_t STAGE_RES_SUCCESS = 1; -constexpr int32_t STAGE_RES_FAIL = 2; -constexpr int32_t STAGE_RES_CANCEL = 3; - -constexpr char DOMAIN[] = "APP_FILE_SVC"; -const std::string DOMAIN_NAME = "APP_FILE_SVC"; -const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; -const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; - -const std::string ORG_PKG = "ORG_PKG"; -const std::string FUNC = "FUNC"; -const std::string BIZ_SCENE = "BIZ_SCENE"; -const std::string BIZ_STAGE = "BIZ_STAGE"; -const std::string STAGE_RES = "STAGE_RES"; -const std::string CONCURRENT_ID = "CONCURRENT_ID"; -const std::string ERROR_CODE = "ERROR_CODE"; -const std::string ERROR_MSG = "ERROR_MSG"; - -const std::string HOST_PKG = "HOST_PKG"; -const std::string APP_CALLER = "APP_CALLER"; -const std::string MODE = "MODE"; -const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; -const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; -const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; -const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; -const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; -const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; -const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; -const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; -const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; -const std::string DIR_DEPTH = "DIR_DEPTH"; -const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; -const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; -const std::string GET_EXT_INFO_SPEND = "GET_EXT_INFO_SPEND"; - -const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; -const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; -const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; -const std::string TAR_SPEND = "TAR_SPEND"; -const std::string HASH_SPEND = "HASH_SPEND"; -const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; -const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; - -const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; -const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; -const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; -const std::string UNTAR_SPEND = "UNTAR_SPEND"; -const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; - -const std::string GET_BUNDLE_INFO_SPEND = "GET_BUNDLE_INFO_SPEND"; -const std::string TOTAL_SPEND = "TOTAL_SPEND"; -const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; -const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; - -} // namespace OHOS::FileManagement::Backup -#endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H diff --git a/utils/src/b_radar/radar_app_statistic.cpp b/utils/src/b_radar/radar_app_statistic.cpp index 804b0682f..9d37a82db 100644 --- a/utils/src/b_radar/radar_app_statistic.cpp +++ b/utils/src/b_radar/radar_app_statistic.cpp @@ -14,22 +14,11 @@ */ #include "b_radar/radar_app_statistic.h" -#include "b_radar/radar_const_inner.h" #include "filemgmt_libhilog.h" #include "hisysevent.h" namespace OHOS::FileManagement::Backup { -const std::unordered_map FileTypeDef = { - {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, {"db", TXT}, {"db-compare", TXT}, - {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, - {"raw", PIC}, - {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, - {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, - {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, - {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} -}; - std::string FileStatList::ToJsonString() { std::string result = "["; diff --git a/utils/src/b_radar/radar_total_statistic.cpp b/utils/src/b_radar/radar_total_statistic.cpp index 87035f4a5..ca143af9a 100644 --- a/utils/src/b_radar/radar_total_statistic.cpp +++ b/utils/src/b_radar/radar_total_statistic.cpp @@ -14,7 +14,6 @@ */ #include "b_radar/radar_total_statistic.h" -#include "b_radar/radar_const_inner.h" #include "b_utils/b_time.h" #include "filemgmt_libhilog.h" #include "hisysevent.h" -- Gitee From 35112f332887e69df6b27761040f05bf1cf40010 Mon Sep 17 00:00:00 2001 From: linan24 Date: Tue, 29 Jul 2025 12:02:55 +0800 Subject: [PATCH 35/62] afs rom optimization Signed-off-by: linan24 --- frameworks/native/backup_ext/BUILD.gn | 3 +- .../native/backup_kit_inner/BUILD.gn | 4 +- interfaces/kits/js/BUILD.gn | 1 - services/backup_sa/BUILD.gn | 98 +++++++++++++++++-- .../include/svc_extension_proxy_mock.h | 8 +- .../module_ipc/service_reverse_proxy_mock.cpp | 24 +++++ tests/unittests/backup_sa/module_ipc/BUILD.gn | 2 +- utils/BUILD.gn | 2 +- utils/include/b_radar/radar_app_statistic.h | 10 -- utils/include/b_radar/radar_const.h | 56 ----------- utils/include/b_radar/radar_const_inner.h | 80 +++++++++++++++ utils/src/b_radar/radar_app_statistic.cpp | 11 +++ utils/src/b_radar/radar_total_statistic.cpp | 1 + 13 files changed, 216 insertions(+), 84 deletions(-) create mode 100644 utils/include/b_radar/radar_const_inner.h diff --git a/frameworks/native/backup_ext/BUILD.gn b/frameworks/native/backup_ext/BUILD.gn index 85d6d2369..14208017d 100644 --- a/frameworks/native/backup_ext/BUILD.gn +++ b/frameworks/native/backup_ext/BUILD.gn @@ -52,7 +52,7 @@ ohos_shared_library("backup_extension_ability_native") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", - "${path_backup}/services/backup_sa:backup_sa_ipc_stub", + "${path_backup}/services/backup_sa:backup_extension_stub_idl", "${path_backup}/utils:backup_utils", ] @@ -85,6 +85,7 @@ ohos_shared_library("backup_extension_ability_native") { "-fno-unwind-tables", "-fno-asynchronous-unwind-tables", "-Os", + "-fvisibility=hidden", ] use_exceptions = true diff --git a/interfaces/inner_api/native/backup_kit_inner/BUILD.gn b/interfaces/inner_api/native/backup_kit_inner/BUILD.gn index 70593df50..94bc2549c 100644 --- a/interfaces/inner_api/native/backup_kit_inner/BUILD.gn +++ b/interfaces/inner_api/native/backup_kit_inner/BUILD.gn @@ -78,7 +78,9 @@ ohos_shared_library("backup_kit_inner") { ] deps = [ - "${path_backup}/services/backup_sa:backup_sa_ipc", + "${path_backup}/services/backup_sa:backup_extension_stub_idl", + "${path_backup}/services/backup_sa:backup_reverse_stub_idl", + "${path_backup}/services/backup_sa:backup_service_proxy_idl", "${path_backup}/utils:backup_utils", ] diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index 3a96c145c..c0c812f55 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -157,7 +157,6 @@ ohos_shared_library("backup") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", - "${path_backup}/services/backup_sa:backup_sa_ipc", "${path_backup}/utils:backup_utils", ] diff --git a/services/backup_sa/BUILD.gn b/services/backup_sa/BUILD.gn index 4f0cab5c4..a8e928cbf 100644 --- a/services/backup_sa/BUILD.gn +++ b/services/backup_sa/BUILD.gn @@ -68,27 +68,31 @@ ohos_source_set("backup_sa_ipc") { "${target_gen_dir}/", ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + "-fvisibility=hidden", + ] + part_name = "app_file_service" subsystem_name = "filemanagement" } -ohos_source_set("backup_sa_ipc_type") { +ohos_source_set("backup_extension_stub_idl") { sanitize = { cfi = true cfi_cross_dso = true debug = false } - output_values = get_target_outputs(":backup_idl") - - sources = [] - - sources += filter_include(output_values, [ "*_type.cpp" ]) - + sources = [ + "${target_gen_dir}/extension_stub.cpp" + ] public_configs = [ ":public_idl_config" ] - deps = [ ":backup_idl" ] - external_deps = [ "c_utils:utils", "hilog:libhilog", @@ -97,14 +101,88 @@ ohos_source_set("backup_sa_ipc_type") { "safwk:system_ability_fwk", "samgr:samgr_proxy", ] - include_dirs = [ ".", "${target_gen_dir}/", ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + ] + part_name = "app_file_service" + subsystem_name = "filemanagement" +} +ohos_source_set("backup_reverse_stub_idl") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + sources = [ + "${target_gen_dir}/service_reverse_stub.cpp" + ] + public_configs = [ ":public_idl_config" ] + deps = [ ":backup_idl" ] + external_deps = [ + "c_utils:utils", + "hilog:libhilog", + "hitrace:hitrace_meter", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] + include_dirs = [ + ".", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${target_gen_dir}/", + ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + ] part_name = "app_file_service" + subsystem_name = "filemanagement" +} +ohos_source_set("backup_service_proxy_idl") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + sources = [ + "${target_gen_dir}/service_proxy.cpp" + ] + public_configs = [ ":public_idl_config" ] + deps = [ ":backup_idl" ] + external_deps = [ + "c_utils:utils", + "hilog:libhilog", + "hitrace:hitrace_meter", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] + include_dirs = [ + ".", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", + "${target_gen_dir}/", + ] + cflags_cc = [ + "-fdata-sections", + "-ffunction-sections", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-Os", + ] + part_name = "app_file_service" subsystem_name = "filemanagement" } diff --git a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h index ed98bfdd3..22a484e0e 100644 --- a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h +++ b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h @@ -18,12 +18,14 @@ #include -#include "extension_proxy.h" +#include +#include "iextension.h" namespace OHOS::FileManagement::Backup { -class SvcExtensionProxyMock : public ExtensionProxy { +class SvcExtensionProxyMock : public IRemoteProxy { public: - SvcExtensionProxyMock() : ExtensionProxy(nullptr) {}; + SvcExtensionProxyMock() : IRemoteProxy(nullptr) {}; + virtual ~SvcExtensionProxyMock() = default; public: MOCK_METHOD(ErrCode, GetFileHandleWithUniqueFd, (const std::string &, int32_t &, int32_t &)); MOCK_METHOD(ErrCode, HandleClear, ()); diff --git a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp index 800d74399..7e03f557d 100644 --- a/tests/mock/module_ipc/service_reverse_proxy_mock.cpp +++ b/tests/mock/module_ipc/service_reverse_proxy_mock.cpp @@ -175,4 +175,28 @@ ErrCode ServiceReverseProxy::IncrementalRestoreOnProcessInfo(const std::string & { return BError(BError::Codes::OK); } + +ErrCode ServiceReverseProxy::IncrementalSaBackupOnFileReady(const std::string &bundleName, const std::string &fileName, + int fd, int32_t errCode) +{ + return BError(BError::Codes::OK); +} + +ErrCode ServiceReverseProxy::IncrementalBackupOnFileReadyWithoutFd(const std::string &bundleName, + const std::string &fileName, int32_t errCode) +{ + return BError(BError::Codes::OK); +} + +ErrCode ServiceReverseProxy::BackupOnFileReadyWithoutFd(const std::string &bundleName, const std::string &fileName, + int32_t errCode) +{ + return BError(BError::Codes::OK); +} + +ErrCode ServiceReverseProxy::RestoreOnFileReadyWithoutFd(const std::string &bundleName, const std::string &fileName, + int32_t errCode) +{ + return BError(BError::Codes::OK); +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index 3c8a43658..46f62e8b6 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -39,7 +39,7 @@ ohos_unittest("module_ipc_test") { deps = [ "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", - "${path_backup}/services/backup_sa:backup_sa_ipc_stub", + "${path_backup}/services/backup_sa:backup_sa_ipc", "${path_backup}/tests/utils:backup_test_utils", "${path_backup}/utils:backup_utils", ] diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 90f31d3e6..d1fa5170b 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -116,7 +116,7 @@ ohos_shared_library("backup_utils") { deps = [ ":backup_cxx_cppdeps", "${path_backup}/interfaces/innerkits/native:sandbox_helper_native", - "${path_backup}/services/backup_sa:backup_sa_ipc_type", + "${path_backup}/services/backup_sa:backup_idl", ] cflags_cc = [ diff --git a/utils/include/b_radar/radar_app_statistic.h b/utils/include/b_radar/radar_app_statistic.h index 9a84969ff..ca81a26be 100644 --- a/utils/include/b_radar/radar_app_statistic.h +++ b/utils/include/b_radar/radar_app_statistic.h @@ -42,16 +42,6 @@ enum FileType : uint8_t { OTHER, }; -const std::unordered_map FileTypeDef = { - {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, {"db", TXT}, {"db-compare", TXT}, - {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, - {"raw", PIC}, - {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, - {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, - {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, - {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} -}; - constexpr uint64_t ONE_MB = 1024 * 1024; constexpr uint64_t TWO_MB = 2 * ONE_MB; constexpr uint64_t TEN_MB = 10 * ONE_MB; diff --git a/utils/include/b_radar/radar_const.h b/utils/include/b_radar/radar_const.h index f4c730c44..6ebf347da 100644 --- a/utils/include/b_radar/radar_const.h +++ b/utils/include/b_radar/radar_const.h @@ -127,61 +127,5 @@ struct RadarError { std::string errMsg_ = ""; }; -constexpr int32_t DEFAULT_STAGE = 1; -constexpr int32_t STAGE_RES_IDLE = 0; -constexpr int32_t STAGE_RES_SUCCESS = 1; -constexpr int32_t STAGE_RES_FAIL = 2; -constexpr int32_t STAGE_RES_CANCEL = 3; - -constexpr char DOMAIN[] = "APP_FILE_SVC"; -const std::string DOMAIN_NAME = "APP_FILE_SVC"; -const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; -const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; - -const std::string ORG_PKG = "ORG_PKG"; -const std::string FUNC = "FUNC"; -const std::string BIZ_SCENE = "BIZ_SCENE"; -const std::string BIZ_STAGE = "BIZ_STAGE"; -const std::string STAGE_RES = "STAGE_RES"; -const std::string CONCURRENT_ID = "CONCURRENT_ID"; -const std::string ERROR_CODE = "ERROR_CODE"; -const std::string ERROR_MSG = "ERROR_MSG"; - -const std::string HOST_PKG = "HOST_PKG"; -const std::string APP_CALLER = "APP_CALLER"; -const std::string MODE = "MODE"; -const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; -const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; -const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; -const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; -const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; -const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; -const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; -const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; -const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; -const std::string DIR_DEPTH = "DIR_DEPTH"; -const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; -const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; -const std::string GET_EXT_INFO_SPEND = "GET_EXT_INFO_SPEND"; - -const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; -const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; -const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; -const std::string TAR_SPEND = "TAR_SPEND"; -const std::string HASH_SPEND = "HASH_SPEND"; -const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; -const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; - -const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; -const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; -const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; -const std::string UNTAR_SPEND = "UNTAR_SPEND"; -const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; - -const std::string GET_BUNDLE_INFO_SPEND = "GET_BUNDLE_INFO_SPEND"; -const std::string TOTAL_SPEND = "TOTAL_SPEND"; -const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; -const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; - } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_H diff --git a/utils/include/b_radar/radar_const_inner.h b/utils/include/b_radar/radar_const_inner.h new file mode 100644 index 000000000..6e19570c5 --- /dev/null +++ b/utils/include/b_radar/radar_const_inner.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H +#define OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H + +#include + +namespace OHOS::FileManagement::Backup { + +constexpr int32_t DEFAULT_STAGE = 1; +constexpr int32_t STAGE_RES_IDLE = 0; +constexpr int32_t STAGE_RES_SUCCESS = 1; +constexpr int32_t STAGE_RES_FAIL = 2; +constexpr int32_t STAGE_RES_CANCEL = 3; + +constexpr char DOMAIN[] = "APP_FILE_SVC"; +const std::string DOMAIN_NAME = "APP_FILE_SVC"; +const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; +const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; + +const std::string ORG_PKG = "ORG_PKG"; +const std::string FUNC = "FUNC"; +const std::string BIZ_SCENE = "BIZ_SCENE"; +const std::string BIZ_STAGE = "BIZ_STAGE"; +const std::string STAGE_RES = "STAGE_RES"; +const std::string CONCURRENT_ID = "CONCURRENT_ID"; +const std::string ERROR_CODE = "ERROR_CODE"; +const std::string ERROR_MSG = "ERROR_MSG"; + +const std::string HOST_PKG = "HOST_PKG"; +const std::string APP_CALLER = "APP_CALLER"; +const std::string MODE = "MODE"; +const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; +const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; +const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; +const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; +const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; +const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; +const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; +const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; +const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; +const std::string DIR_DEPTH = "DIR_DEPTH"; +const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; +const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; +const std::string GET_EXT_INFO_SPEND = "GET_EXT_INFO_SPEND"; + +const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; +const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; +const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; +const std::string TAR_SPEND = "TAR_SPEND"; +const std::string HASH_SPEND = "HASH_SPEND"; +const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; +const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; + +const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; +const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; +const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; +const std::string UNTAR_SPEND = "UNTAR_SPEND"; +const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; + +const std::string GET_BUNDLE_INFO_SPEND = "GET_BUNDLE_INFO_SPEND"; +const std::string TOTAL_SPEND = "TOTAL_SPEND"; +const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; +const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; + +} // namespace OHOS::FileManagement::Backup +#endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_INNER_H diff --git a/utils/src/b_radar/radar_app_statistic.cpp b/utils/src/b_radar/radar_app_statistic.cpp index 9d37a82db..804b0682f 100644 --- a/utils/src/b_radar/radar_app_statistic.cpp +++ b/utils/src/b_radar/radar_app_statistic.cpp @@ -14,11 +14,22 @@ */ #include "b_radar/radar_app_statistic.h" +#include "b_radar/radar_const_inner.h" #include "filemgmt_libhilog.h" #include "hisysevent.h" namespace OHOS::FileManagement::Backup { +const std::unordered_map FileTypeDef = { + {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, {"db", TXT}, {"db-compare", TXT}, + {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, + {"raw", PIC}, + {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, + {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, + {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, + {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} +}; + std::string FileStatList::ToJsonString() { std::string result = "["; diff --git a/utils/src/b_radar/radar_total_statistic.cpp b/utils/src/b_radar/radar_total_statistic.cpp index ca143af9a..87035f4a5 100644 --- a/utils/src/b_radar/radar_total_statistic.cpp +++ b/utils/src/b_radar/radar_total_statistic.cpp @@ -14,6 +14,7 @@ */ #include "b_radar/radar_total_statistic.h" +#include "b_radar/radar_const_inner.h" #include "b_utils/b_time.h" #include "filemgmt_libhilog.h" #include "hisysevent.h" -- Gitee From 7c7f6527bbf488400ec2f49aafb1005c71cfb626 Mon Sep 17 00:00:00 2001 From: ZhangYuanhuai Date: Tue, 29 Jul 2025 15:24:51 +0800 Subject: [PATCH 36/62] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8Furi=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ZhangYuanhuai --- .../native/remote_file_share/src/remote_file_share.cpp | 7 ++++--- test/unittest/remote_file_share/remote_file_share_test.cpp | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp b/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp index 65483cc16..799b553b3 100644 --- a/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp +++ b/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp @@ -743,9 +743,10 @@ static int32_t SetHmdfsUriDirInfo(struct HmdfsUriInfo &hui, Uri &uri, const std: return SetFileSize(physicalPath, hui); } -static int32_t SetDistributedfilesHmdfsUriDirInfo(struct HmdfsUriInfo &hui, Uri &uri, const std::string &physicalPath) +static int32_t SetDistributedfilesHmdfsUriDirInfo(const std::string &physicalPath, const std::string &uriStr, + struct HmdfsUriInfo &hui, const std::string &networkId) { - hui.uriStr = uri.ToString(); + hui.uriStr = uriStr + NETWORK_PARA + networkId; return SetFileSize(physicalPath, hui); } @@ -848,7 +849,7 @@ static int32_t CheckIfNeedMount(const std::string &bundleName, const std::string return E_OK; } if (IsDistributedFileDir(uri) || IsCloudFileDir(uri)) { - (void)SetDistributedfilesHmdfsUriDirInfo(dfsUriInfo, uri, physicalPath); + (void)SetDistributedfilesHmdfsUriDirInfo(physicalPath, uriStr, dfsUriInfo, networkId); uriToDfsUriMaps.insert({uriStr, dfsUriInfo}); LOGI("bundleName: %{public}s, dfsUri: %{private}s", uriStr.c_str(), dfsUriInfo.uriStr.c_str()); return E_OK; 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 9cbe14a73..e3e86aff2 100644 --- a/test/unittest/remote_file_share/remote_file_share_test.cpp +++ b/test/unittest/remote_file_share/remote_file_share_test.cpp @@ -1294,8 +1294,9 @@ namespace { HmdfsUriInfo hui; OHOS::Uri uri("file://com.demo.a/data/storage/el2/base/remote_share.txt"); string physicalPath = "/data/app/el2/100/base/com.demo.a/remote_share.txt"; + string networkId="networdid123456" - int32_t ret = SetDistributedfilesHmdfsUriDirInfo(hui, uri, physicalPath); + int32_t ret = SetDistributedfilesHmdfsUriDirInfo(physicalPath, uri.ToString(), hui, networkId); EXPECT_EQ(hui.uriStr, uri.ToString()); EXPECT_EQ(ret, NO_SUCH_FILE_ERROR); -- Gitee From 3fe69a393176db07f25d082e08a5a08fd151e33a Mon Sep 17 00:00:00 2001 From: ZhangYuanhuai Date: Tue, 29 Jul 2025 18:37:11 +0800 Subject: [PATCH 37/62] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8Furi=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ZhangYuanhuai --- .../native/remote_file_share/src/remote_file_share.cpp | 2 +- test/unittest/remote_file_share/remote_file_share_test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp b/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp index 799b553b3..f888fa9ae 100644 --- a/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp +++ b/interfaces/innerkits/native/remote_file_share/src/remote_file_share.cpp @@ -744,7 +744,7 @@ static int32_t SetHmdfsUriDirInfo(struct HmdfsUriInfo &hui, Uri &uri, const std: } static int32_t SetDistributedfilesHmdfsUriDirInfo(const std::string &physicalPath, const std::string &uriStr, - struct HmdfsUriInfo &hui, const std::string &networkId) + struct HmdfsUriInfo &hui, const std::string &networkId) { hui.uriStr = uriStr + NETWORK_PARA + networkId; return SetFileSize(physicalPath, hui); 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 e3e86aff2..59dcfa2ef 100644 --- a/test/unittest/remote_file_share/remote_file_share_test.cpp +++ b/test/unittest/remote_file_share/remote_file_share_test.cpp @@ -1294,7 +1294,7 @@ namespace { HmdfsUriInfo hui; OHOS::Uri uri("file://com.demo.a/data/storage/el2/base/remote_share.txt"); string physicalPath = "/data/app/el2/100/base/com.demo.a/remote_share.txt"; - string networkId="networdid123456" + string networkId = "networdid123456"; int32_t ret = SetDistributedfilesHmdfsUriDirInfo(physicalPath, uri.ToString(), hui, networkId); EXPECT_EQ(hui.uriStr, uri.ToString()); -- Gitee From c3a986ffb4ab1571bd812a8a245d385c3706efd5 Mon Sep 17 00:00:00 2001 From: ZhangYuanhuai Date: Wed, 30 Jul 2025 14:08:45 +0800 Subject: [PATCH 38/62] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8Furi=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ZhangYuanhuai --- test/unittest/remote_file_share/remote_file_share_test.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 59dcfa2ef..328209ba8 100644 --- a/test/unittest/remote_file_share/remote_file_share_test.cpp +++ b/test/unittest/remote_file_share/remote_file_share_test.cpp @@ -1293,11 +1293,12 @@ namespace { HmdfsUriInfo hui; OHOS::Uri uri("file://com.demo.a/data/storage/el2/base/remote_share.txt"); + OHOS::Uri uri_res("file://com.demo.a/data/storage/el2/base/remote_share.txt?networkid=networdid123456"); string physicalPath = "/data/app/el2/100/base/com.demo.a/remote_share.txt"; string networkId = "networdid123456"; int32_t ret = SetDistributedfilesHmdfsUriDirInfo(physicalPath, uri.ToString(), hui, networkId); - EXPECT_EQ(hui.uriStr, uri.ToString()); + EXPECT_EQ(hui.uriStr, uri_res.ToString()); EXPECT_EQ(ret, NO_SUCH_FILE_ERROR); GTEST_LOG_(INFO) << "RemoteFileShareTest-end Remote_file_share_SetDistributedfilesHmdfsUriDirInfo_0001"; -- Gitee From f857c741505e35ae685a39b6235b9f1c5a8ae615 Mon Sep 17 00:00:00 2001 From: lizhengxing Date: Wed, 16 Jul 2025 11:58:40 +0800 Subject: [PATCH 39/62] clear temp dir && errCode trans bug fix Signed-off-by: lizhengxing --- .../backup_sa/include/module_ipc/service.h | 4 + .../src/module_external/bms_adapter.cpp | 1 - .../src/module_ipc/service_incremental.cpp | 74 +++++++++--- .../backup_sa/src/module_ipc/sub_service.cpp | 1 - tests/mock/direct_ex_mock/direct_ex_mock.cpp | 21 ++++ tests/mock/direct_ex_mock/direct_ex_mock.h | 42 +++++++ tests/unittests/backup_sa/module_ipc/BUILD.gn | 2 + .../module_ipc/service_incremental_test.cpp | 112 +++++++++++++++++- 8 files changed, 237 insertions(+), 20 deletions(-) create mode 100644 tests/mock/direct_ex_mock/direct_ex_mock.cpp create mode 100644 tests/mock/direct_ex_mock/direct_ex_mock.h diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 8bb77e1ad..63c01fb31 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -720,6 +720,9 @@ private: const vector &bundleNames, std::string &oldBackupVersion); void AppStatReportErr(const string &bundleName, const string &func, RadarError err); void SaStatReport(const string &bundleName, const string &func, RadarError err); + void ClearIncrementalStatFile(int32_t userId, const string &bundleName); + BJsonCachedEntity CreateJsonEntity(UniqueFd &fd, + vector &bundleInfos, const std::vector &bundleNames); void TotalStart() { if (totalStatistic_ != nullptr) { @@ -760,6 +763,7 @@ private: static inline std::atomic seed {1}; std::atomic isConnectDied_ {false}; std::atomic isOccupyingSession_ {false}; + std::atomic isCreatingIncreaseFile_ {0}; sptr session_; sptr sched_; diff --git a/services/backup_sa/src/module_external/bms_adapter.cpp b/services/backup_sa/src/module_external/bms_adapter.cpp index 67eb26936..5173a25c5 100644 --- a/services/backup_sa/src/module_external/bms_adapter.cpp +++ b/services/backup_sa/src/module_external/bms_adapter.cpp @@ -205,7 +205,6 @@ static bool CreateIPCInteractionFiles(int32_t userId, const string &bundleName, backupSaBundleDir = BConstants::BACKUP_PATH_PREFIX + to_string(userId) + BConstants::BACKUP_PATH_SURFFIX + bundleDetail.bundleName + BConstants::FILE_SEPARATOR_CHAR; } - HILOGI("bundleInteraction dir is:%{public}s", backupSaBundleDir.c_str()); if (access(backupSaBundleDir.data(), F_OK) != 0) { int32_t err = mkdir(backupSaBundleDir.data(), S_IRWXU | S_IRWXG); if (err != 0 && errno != EEXIST) { diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index f223767e3..60a1838e3 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -62,6 +62,7 @@ const std::string FILE_BACKUP_EVENTS = "FILE_BACKUP_EVENTS"; namespace { constexpr int32_t INDEX = 3; constexpr int32_t MS_1000 = 1000; +constexpr int32_t INCREMENTAL_COUNT = 1; const static string UNICAST_TYPE = "unicast"; } // namespace @@ -130,24 +131,47 @@ ErrCode Service::GetLocalCapabilitiesIncremental(const std::vector Service::CreateJsonEntity(UniqueFd &fd, + vector& bundleInfos, const std::vector &bundleNames) +{ + BJsonCachedEntity cachedEntity(move(fd)); + auto cache = cachedEntity.Structuralize(); + std::string backupVersion = BJsonUtil::ParseBackupVersion(); + cache.SetBackupVersion(backupVersion); + cache.SetSystemFullName(GetOSFullName()); + cache.SetDeviceType(GetDeviceType()); + bundleInfos = BundleMgrAdapter::GetBundleInfosForIncremental(GetUserIdDefault(), bundleNames); + cache.SetBundleInfos(bundleInfos, true); + cachedEntity.Persist(); + HILOGI("Service GetLocalCapabilitiesIncremental persist, bundleInfos size:%{public}zu", bundleInfos.size()); + isCreatingIncreaseFile_.fetch_sub(INCREMENTAL_COUNT); + if (isCreatingIncreaseFile_.load() <= 0) { + isCreatingIncreaseFile_.store(0); + const int userId = GetUserIdDefault(); + for (const auto &bundleInfo : bundleInfos) { + ClearIncrementalStatFile(userId, bundleInfo.name); + } + HILOGI("do ClearIncrementalStatFile finished"); + } + return cachedEntity; +} + UniqueFd Service::GetLocalCapabilitiesIncremental(const std::vector &bundleNames) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { - /* - Only called by restore app before InitBackupSession, - so there must be set init userId. - */ HILOGI("Begin"); if (session_ == nullptr || isOccupyingSession_.load()) { HILOGE("Get LocalCapabilities Incremental Error, session is empty or cleaning up the service"); return UniqueFd(-ENOENT); } session_->IncreaseSessionCnt(__PRETTY_FUNCTION__); + isCreatingIncreaseFile_.fetch_add(INCREMENTAL_COUNT); ErrCode errCode = VerifyCaller(); if (errCode != ERR_OK) { HILOGE("Get local abilities info failed, Verify caller failed, errCode:%{public}d", errCode); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); + isCreatingIncreaseFile_.fetch_sub(INCREMENTAL_COUNT); return UniqueFd(-ENOENT); } string path = BConstants::GetSaBundleBackupRootDir(GetUserIdDefault()); @@ -157,26 +181,20 @@ UniqueFd Service::GetLocalCapabilitiesIncremental(const std::vectorDecreaseSessionCnt(__PRETTY_FUNCTION__); + isCreatingIncreaseFile_.fetch_sub(INCREMENTAL_COUNT); return UniqueFd(-ENOENT); } - BJsonCachedEntity cachedEntity(move(fd)); - auto cache = cachedEntity.Structuralize(); - std::string backupVersion = BJsonUtil::ParseBackupVersion(); - cache.SetBackupVersion(backupVersion); - cache.SetSystemFullName(GetOSFullName()); - cache.SetDeviceType(GetDeviceType()); - auto bundleInfos = BundleMgrAdapter::GetBundleInfosForIncremental(GetUserIdDefault(), bundleNames); - cache.SetBundleInfos(bundleInfos, true); - cachedEntity.Persist(); - HILOGI("Service GetLocalCapabilitiesIncremental persist"); + vector bundleInfos; + BJsonCachedEntity cachedEntity = CreateJsonEntity(fd, bundleInfos, bundleNames); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); - HILOGI("End, bundleInfos size:%{public}zu", bundleInfos.size()); return move(cachedEntity.GetFd()); } catch (const BError &e) { + isCreatingIncreaseFile_.fetch_sub(INCREMENTAL_COUNT); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); HILOGE("GetLocalCapabilitiesIncremental failed, errCode = %{public}d", e.GetCode()); return UniqueFd(-e.GetCode()); } catch (...) { + isCreatingIncreaseFile_.fetch_sub(INCREMENTAL_COUNT); HILOGE("Unexpected exception"); session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return UniqueFd(-EPERM); @@ -712,6 +730,7 @@ ErrCode Service::AppIncrementalDone(ErrCode errCode) } HILOGI("Service AppIncrementalDone start, callerName is %{public}s, errCode is: %{public}d", callerName.c_str(), errCode); + ClearIncrementalStatFile(GetUserIdDefault(), callerName); if (session_->OnBundleFileReady(callerName) || errCode != BError(BError::Codes::OK)) { std::shared_ptr mutexPtr = GetExtensionMutex(callerName); if (mutexPtr == nullptr) { @@ -1119,4 +1138,29 @@ ErrCode Service::Cancel(const std::string& bundleName, int32_t &result) } return BError(BError::Codes::OK); } + +void Service::ClearIncrementalStatFile(int32_t userId, const string &bundleName) +{ + BJsonUtil::BundleDetailInfo bundleDetail = BJsonUtil::ParseBundleNameIndexStr(bundleName); + string backupSaBundleDir; + if (bundleDetail.bundleIndex > 0) { + const std::string bundleNameIndex = "+clone-" + std::to_string(bundleDetail.bundleIndex) + "+" + + bundleDetail.bundleName; + backupSaBundleDir = BConstants::BACKUP_PATH_PREFIX + to_string(userId) + BConstants::BACKUP_PATH_SURFFIX + + bundleNameIndex + BConstants::FILE_SEPARATOR_CHAR; + } else { + backupSaBundleDir = BConstants::BACKUP_PATH_PREFIX + to_string(userId) + BConstants::BACKUP_PATH_SURFFIX + + bundleDetail.bundleName + BConstants::FILE_SEPARATOR_CHAR; + } + if (access(backupSaBundleDir.c_str(), F_OK) != ERR_OK) { + HILOGD("ClearIncrementalStatFile, access dir failed errno = %{public}d", errno); + return; + } + if (!ForceRemoveDirectoryBMS(backupSaBundleDir.c_str())) { + HILOGE("Failed to delete SaBundleBackupDir cache: %{public}s", + backupSaBundleDir.c_str()); + return; + } +} + } // namespace OHOS::FileManagement::Backup diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 7c83fd08f..94254c6fd 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -1100,7 +1100,6 @@ ErrCode Service::GetBackupDataSize(bool isPreciseScan, const std::vectorDecreaseSessionCnt(__PRETTY_FUNCTION__); return BError(BError::Codes::SA_INVAL_ARG, "verify caller failed"); } - BundleMgrAdapter::CreatBackupEnv(bundleNameList, GetUserIdDefault()); CyclicSendScannedInfo(isPreciseScan, bundleNameList); return BError(BError::Codes::OK); } catch (...) { diff --git a/tests/mock/direct_ex_mock/direct_ex_mock.cpp b/tests/mock/direct_ex_mock/direct_ex_mock.cpp new file mode 100644 index 000000000..0e2fe36e5 --- /dev/null +++ b/tests/mock/direct_ex_mock/direct_ex_mock.cpp @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2025 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 "direct_ex_mock.h" + +bool OHOS::ForceRemoveDirectoryBMS(const std::string& path) +{ + return AppFileService::DirectoryFuncMock::directoryFunc_->ForceRemoveDirectoryBMS(path); +} \ No newline at end of file diff --git a/tests/mock/direct_ex_mock/direct_ex_mock.h b/tests/mock/direct_ex_mock/direct_ex_mock.h new file mode 100644 index 000000000..5ab781775 --- /dev/null +++ b/tests/mock/direct_ex_mock/direct_ex_mock.h @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2025 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. +*/ + +#ifndef FILEMANAGEMENT_APP_FILE_SERVICE_DIRECT_EX_MOCK_H +#define FILEMANAGEMENT_APP_FILE_SERVICE_DIRECT_EX_MOCK_H + +#include + +#include + +#include "directory_ex.h" + +namespace OHOS { +namespace AppFileService { +class DirectoryFunc { +public: + virtual ~DirectoryFunc() = default; + virtual bool ForceRemoveDirectoryBMS(const std::string&) = 0; +public: + static inline std::shared_ptr directoryFunc_ = nullptr; +}; + +class DirectoryFuncMock : public DirectoryFunc { +public: + MOCK_METHOD(bool, ForceRemoveDirectoryBMS, (const std::string&)); +}; +} // namespace AppFileService +} // namespace OHOS + +#endif // FILEMANAGEMENT_APP_FILE_SERVICE_LIBRARY_FUNC_MOCK_H \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index 3c8a43658..74a142bed 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -448,6 +448,7 @@ ohos_unittest("backup_service_incremental_test") { "${path_backup_mock}/module_sched/sched_scheduler_mock.cpp", "${path_backup_mock}/utils_mock/src/b_jsonutil_mock.cpp", "${path_backup_mock}/utils_mock/src/backup_para_mock.cpp", + "${path_backup_mock}/direct_ex_mock/direct_ex_mock.cpp", "${path_backup}/frameworks/native/backup_kit_inner/src/service_client.cpp", "service_incremental_test.cpp", ] @@ -464,6 +465,7 @@ 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_backup_mock}/direct_ex_mock", ] deps = [ diff --git a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp index ce96dcb76..9111b9b55 100644 --- a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp @@ -19,6 +19,7 @@ #include "bms_adapter_mock.h" #include "b_json/b_json_entity_caps.h" #include "b_jsonutil_mock.h" +#include "direct_ex_mock.h" #include "ipc_skeleton_mock.h" #include "sa_backup_connection_mock.h" #include "service_reverse_proxy_mock.h" @@ -30,6 +31,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; +using namespace OHOS::AppFileService; class BService { public: @@ -513,6 +515,7 @@ public: static inline shared_ptr skeleton = nullptr; static inline sptr srProxy = nullptr; static inline shared_ptr srvMock = nullptr; + static inline shared_ptr directMock = nullptr; }; void ServiceIncrementalTest::SetUpTestCase(void) @@ -537,6 +540,8 @@ void ServiceIncrementalTest::SetUpTestCase(void) skeleton = make_shared(); IPCSkeletonMock::skeleton = skeleton; srProxy = sptr(new ServiceReverseProxyMock()); + directMock = make_shared(); + DirectoryFuncMock::directoryFunc_ = directMock; } void ServiceIncrementalTest::TearDownTestCase() @@ -561,6 +566,8 @@ void ServiceIncrementalTest::TearDownTestCase() srProxy = nullptr; ServiceMock::serviceMock = nullptr; srvMock = nullptr; + DirectoryFuncMock::directoryFunc_ = nullptr; + directMock = nullptr; } /** @@ -592,12 +599,28 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_GetLocalCapabilitiesIncr fd = service->GetLocalCapabilitiesIncremental({}); EXPECT_EQ(static_cast(fd), -ENOENT); - vector info; + vector infos; + infos.emplace_back(BJsonEntityCaps::BundleInfo{.name = "bundleName", .appIndex = 0}); + EXPECT_CALL(*directMock, ForceRemoveDirectoryBMS(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); - EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)).WillOnce(Return(0)); + EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); EXPECT_CALL(*bms, GetBundleInfosForIncremental(An(), An&>())) - .WillOnce(Return(info)); + .WillOnce(Return(infos)); + + BJsonUtil::BundleDetailInfo bundleInfo; + bundleInfo.bundleIndex = 1; + bundleInfo.bundleName = "bundleName"; + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); fd = service->GetLocalCapabilitiesIncremental({}); + + EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); + EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); + EXPECT_CALL(*bms, GetBundleInfosForIncremental(An(), An&>())) + .WillOnce(Return(infos)); + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); + service->isCreatingIncreaseFile_.store(2); + fd = service->GetLocalCapabilitiesIncremental({}); + service->isCreatingIncreaseFile_.store(0); EXPECT_TRUE(static_cast(fd) > 0); } catch (...) { EXPECT_TRUE(false); @@ -1342,28 +1365,37 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_AppIncrementalDone_0000, int32_t errCode = BError(BError::Codes::OK).GetCode(); auto session_ = service->session_; service->session_ = nullptr; + EXPECT_CALL(*srvMock, GetUserIdDefault()).WillRepeatedly(Return(100)); + BJsonUtil::BundleDetailInfo bundleInfo; + bundleInfo.bundleIndex = 0; + bundleInfo.bundleName = "bundleName"; + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); auto ret = service->AppIncrementalDone(errCode); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); service->session_ = session_; EXPECT_CALL(*srvMock, VerifyCallerAndGetCallerName(_)) .WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); ret = service->AppIncrementalDone(errCode); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG).GetCode()); EXPECT_CALL(*srvMock, VerifyCallerAndGetCallerName(_)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); ret = service->AppIncrementalDone(errCode); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); service->backupExtMutexMap_.clear(); EXPECT_CALL(*srvMock, VerifyCallerAndGetCallerName(_)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); ret = service->AppIncrementalDone(BError(BError::Codes::SA_INVAL_ARG).GetCode()); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); EXPECT_CALL(*srvMock, VerifyCallerAndGetCallerName(_)).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(true)); + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); ret = service->AppIncrementalDone(errCode); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); } catch (...) { @@ -2096,4 +2128,78 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_RemoveExtensionMutex_000 } GTEST_LOG_(INFO) << "ServiceIncrementalTest-end SUB_ServiceIncremental_RemoveExtensionMutex_0000"; } + +/** + * @tc.number: SUB_ServiceIncremental_ClearIncrementalStatFile_0000 + * @tc.name: SUB_ServiceIncremental_ClearIncrementalStatFile_0000 + * @tc.desc: 测试 ClearIncrementalStatFile 分身与一般应用分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_ClearIncrementalStatFile_0000, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceIncrementalTest-begin SUB_ServiceIncremental_ClearIncrementalStatFile_0000"; + try { + + int userId = BConstants::DEFAULT_USER_ID; + ASSERT_TRUE(service != nullptr); + BJsonUtil::BundleDetailInfo bundleInfo; + bundleInfo.bundleIndex = 1; + bundleInfo.bundleName = "com.example.app2backup"; + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); + service->ClearIncrementalStatFile(userId, bundleInfo.bundleName); + + bundleInfo.bundleIndex = 0; + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); + service->ClearIncrementalStatFile(userId, bundleInfo.bundleName); + EXPECT_EQ(bundleInfo.bundleIndex, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceIncrementalTest-an exception occurred by ClearIncrementalStatFile."; + } + GTEST_LOG_(INFO) << "ServiceIncrementalTest-end SUB_ServiceIncremental_ClearIncrementalStatFile_0000"; +} + +/** + * @tc.number: SUB_ServiceIncremental_ClearIncrementalStatFile_0100 + * @tc.name: SUB_ServiceIncremental_ClearIncrementalStatFile_0100 + * @tc.desc: 测试 ClearIncrementalStatFile 的文件删除异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: issueIAKC3I + */ +HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_ClearIncrementalStatFile_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceIncrementalTest-begin SUB_ServiceIncremental_ClearIncrementalStatFile_0100"; + try { + + int userId = BConstants::DEFAULT_USER_ID; + ASSERT_TRUE(service != nullptr); + BJsonUtil::BundleDetailInfo bundleInfo; + bundleInfo.bundleIndex = 0; + bundleInfo.bundleName = "com.example.app2backup"; + string path = BConstants::GetSaBundleBackupRootDir(userId).data() + bundleInfo.bundleName; + string cmdMkdir = string("mkdir -p ") + path; + int ret = system(cmdMkdir.c_str()); + EXPECT_EQ(ret, 0); + + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); + service->ClearIncrementalStatFile(userId, bundleInfo.bundleName); + + EXPECT_CALL(*directMock, ForceRemoveDirectoryBMS(_)).WillOnce(Return(false)); + EXPECT_CALL(*jsonUtil, ParseBundleNameIndexStr(_)).WillOnce(Return(bundleInfo)); + service->ClearIncrementalStatFile(userId, bundleInfo.bundleName); + EXPECT_EQ(bundleInfo.bundleIndex, 0); + string cmdRmdir = string("rm -r ") + path; + ret = system(cmdRmdir.c_str()); + EXPECT_EQ(ret, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceIncrementalTest-an exception occurred by ClearIncrementalStatFile."; + } + GTEST_LOG_(INFO) << "ServiceIncrementalTest-end SUB_ServiceIncremental_ClearIncrementalStatFile_0100"; +} } \ No newline at end of file -- Gitee From 315afb5ca6dccbdbc42cbc5b9e5bea6c3fad477f Mon Sep 17 00:00:00 2001 From: yaoruozi Date: Sun, 27 Jul 2025 00:00:54 +0800 Subject: [PATCH 40/62] add backupSa fuzz Signed-off-by: yaoruozi --- test/fuzztest/BUILD.gn | 9 ++ .../backupext_fuzzer/backupext_fuzzer.cpp | 6 +- .../backupsa_fuzzer/backupsa_fuzzer.cpp | 2 +- test/fuzztest/backupsaappdone_fuzzer/BUILD.gn | 64 +++++++++++++ .../backupsaappdone_fuzzer.cpp | 70 ++++++++++++++ .../backupsaappdone_fuzzer.h | 21 +++++ .../backupsaappdone_fuzzer/corpus/init | 16 ++++ .../backupsaappdone_fuzzer/project.xml | 25 +++++ ...kupsaappendbundlesbackupsession_fuzzer.cpp | 9 +- .../BUILD.gn | 64 +++++++++++++ ...upsaappendbundlesrestoresession_fuzzer.cpp | 92 +++++++++++++++++++ ...ckupsaappendbundlesrestoresession_fuzzer.h | 21 +++++ .../corpus/init | 16 ++++ .../project.xml | 25 +++++ .../backupsaappfileready_fuzzer/BUILD.gn | 64 +++++++++++++ .../backupsaappfileready_fuzzer.cpp | 74 +++++++++++++++ .../backupsaappfileready_fuzzer.h | 21 +++++ .../backupsaappfileready_fuzzer/corpus/init | 16 ++++ .../backupsaappfileready_fuzzer/project.xml | 25 +++++ test/fuzztest/backupsafinish_fuzzer/BUILD.gn | 64 +++++++++++++ .../backupsafinish_fuzzer.cpp | 65 +++++++++++++ .../backupsafinish_fuzzer.h | 21 +++++ .../backupsafinish_fuzzer/corpus/init | 16 ++++ .../backupsafinish_fuzzer/project.xml | 25 +++++ .../BUILD.gn | 64 +++++++++++++ .../backupsagetlocalcapabilities_fuzzer.cpp | 66 +++++++++++++ .../backupsagetlocalcapabilities_fuzzer.h | 21 +++++ .../corpus/init | 16 ++++ .../project.xml | 25 +++++ .../backupsainitbackupsession_fuzzer/BUILD.gn | 64 +++++++++++++ .../backupsainitbackupsession_fuzzer.cpp | 67 ++++++++++++++ .../backupsainitbackupsession_fuzzer.h | 21 +++++ .../corpus/init | 16 ++++ .../project.xml | 25 +++++ .../BUILD.gn | 64 +++++++++++++ .../backupsainitrestoresession_fuzzer.cpp | 66 +++++++++++++ .../backupsainitrestoresession_fuzzer.h | 21 +++++ .../corpus/init | 16 ++++ .../project.xml | 25 +++++ .../backupsapublishfile_fuzzer/BUILD.gn | 64 +++++++++++++ .../backupsapublishfile_fuzzer.cpp | 74 +++++++++++++++ .../backupsapublishfile_fuzzer.h | 21 +++++ .../backupsapublishfile_fuzzer/corpus/init | 16 ++++ .../backupsapublishfile_fuzzer/project.xml | 25 +++++ test/fuzztest/backupsastart_fuzzer/BUILD.gn | 64 +++++++++++++ .../backupsastart_fuzzer.cpp | 66 +++++++++++++ .../backupsastart_fuzzer.h | 21 +++++ .../fuzztest/backupsastart_fuzzer/corpus/init | 16 ++++ .../fuzztest/backupsastart_fuzzer/project.xml | 25 +++++ .../servicereverse_fuzzer.cpp | 13 +-- 50 files changed, 1798 insertions(+), 15 deletions(-) create mode 100644 test/fuzztest/backupsaappdone_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.h create mode 100644 test/fuzztest/backupsaappdone_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsaappdone_fuzzer/project.xml create mode 100644 test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.h create mode 100644 test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/project.xml create mode 100644 test/fuzztest/backupsaappfileready_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.cpp create mode 100644 test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.h create mode 100644 test/fuzztest/backupsaappfileready_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsaappfileready_fuzzer/project.xml create mode 100644 test/fuzztest/backupsafinish_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.cpp create mode 100644 test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.h create mode 100644 test/fuzztest/backupsafinish_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsafinish_fuzzer/project.xml create mode 100644 test/fuzztest/backupsagetlocalcapabilities_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.cpp create mode 100644 test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.h create mode 100644 test/fuzztest/backupsagetlocalcapabilities_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsagetlocalcapabilities_fuzzer/project.xml create mode 100644 test/fuzztest/backupsainitbackupsession_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.cpp create mode 100644 test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.h create mode 100644 test/fuzztest/backupsainitbackupsession_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsainitbackupsession_fuzzer/project.xml create mode 100644 test/fuzztest/backupsainitrestoresession_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.cpp create mode 100644 test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.h create mode 100644 test/fuzztest/backupsainitrestoresession_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsainitrestoresession_fuzzer/project.xml create mode 100644 test/fuzztest/backupsapublishfile_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.cpp create mode 100644 test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.h create mode 100644 test/fuzztest/backupsapublishfile_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsapublishfile_fuzzer/project.xml create mode 100644 test/fuzztest/backupsastart_fuzzer/BUILD.gn create mode 100644 test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.cpp create mode 100644 test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.h create mode 100644 test/fuzztest/backupsastart_fuzzer/corpus/init create mode 100644 test/fuzztest/backupsastart_fuzzer/project.xml diff --git a/test/fuzztest/BUILD.gn b/test/fuzztest/BUILD.gn index 94ef49b85..d3efd11a9 100644 --- a/test/fuzztest/BUILD.gn +++ b/test/fuzztest/BUILD.gn @@ -18,16 +18,25 @@ group("fuzztest") { # deps file "backupext_fuzzer:BackupExtFuzzTest", "backupsa_fuzzer:BackupSaFuzzTest", + "backupsaappdone_fuzzer:BackupSaAppDoneFuzzTest", "backupsaappendbundlesbackupsession_fuzzer:BackupSaAppendBundlesBackupSessionFuzzTest", "backupsaappendbundlesincrementalbackupsession_fuzzer:BackupSaAppendBundlesIncrementalBackupSessionFuzzTest", + "backupsaappendbundlesrestoresession_fuzzer:BackupSaAppendBundlesRestoreSessionFuzzTest", + "backupsaappfileready_fuzzer:BackupSaAppFileReadyFuzzTest", "backupsaappincrementaldone_fuzzer:BackupSaAppIncrementalDoneFuzzTest", "backupsaappincrementalfileready_fuzzer:BackupSaAppIncrementalFileReadyFuzzTest", + "backupsafinish_fuzzer:BackupSaFinishFuzzTest", "backupsagetfilehandle_fuzzer:BackupSaGetFileHandleFuzzTest", "backupsagetincrementalfilehandle_fuzzer:BackupSaGetIncrementalFileHandleFuzzTest", "backupsagetincrementallocalcapabilities_fuzzer:BackupSaGetIncrementalLocalCapabilitiesFuzzTest", + "backupsagetlocalcapabilities_fuzzer:BackupSaGetLocalCapabilitiesFuzzTest", + "backupsainitbackupsession_fuzzer:BackupSaInitBackupSessionFuzzTest", "backupsainitincrementalbackupsession_fuzzer:BackupSaInitIncrementalBackupSessionFuzzTest", + "backupsainitrestoresession_fuzzer:BackupSaInitRestoreSessionFuzzTest", + "backupsapublishfile_fuzzer:BackupSaPublishFileFuzzTest", "backupsapublishincrementalfile_fuzzer:BackupSaPublishIncrementalFileFuzzTest", "backupsarelease_fuzzer:BackupSaReleaseFuzzTest", + "backupsastart_fuzzer:BackupSaStartFuzzTest", "backupservicestub_fuzzer:BackupServiceStubFuzzTest", "fileshare_fuzzer:FileShareFuzzTest", "remotefileshare_fuzzer:RemoteFileShareFuzzTest", diff --git a/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp b/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp index a100e64fa..a4c6b1138 100644 --- a/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp +++ b/test/fuzztest/backupext_fuzzer/backupext_fuzzer.cpp @@ -331,9 +331,9 @@ bool OnRemoteRequestFuzzTest(OHOS::sptr extension, const ui try { extension->OnRemoteRequest(code, datas, reply, option); } catch (OHOS::FileManagement::Backup::BError &err) { - // filter Backup error + HILOGE("BackupSaFuzzTest error"); } catch (...) { - // filter other error + HILOGE("BackupSaFuzzTest exception"); } } return true; @@ -348,6 +348,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) auto extension = OHOS::sptr( new OHOS::FileManagement::Backup::BackupExtExtension(extBackup, "")); + OHOS::OnRemoteRequestFuzzTest(extension, data, size); OHOS::InitFuzzTest(extBackup, data, size); OHOS::OnCommandFuzzTest(extBackup, data, size); OHOS::OnConnectFuzzTest(extBackup, data, size); @@ -373,7 +374,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::CmdHandleIncrementalBackupFuzzTest(extension, data, size); OHOS::CmdIncrementalOnBackupFuzzTest(extension, data, size); OHOS::CmdGetIncrementalBackupFileHandleFuzzTest(extension, data, size); - OHOS::OnRemoteRequestFuzzTest(extension, data, size); } catch (OHOS::FileManagement::Backup::BError &err) { // Only filter BError errors, Other results are not expected. } diff --git a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp index 7f4e7a156..8bd10a0d6 100644 --- a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp +++ b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp @@ -61,7 +61,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) } catch (OHOS::FileManagement::Backup::BError &err) { HILOGE("BackupSaFuzzTest error"); } catch (...) { - // filter other error + HILOGE("BackupSaFuzzTest exception"); } return 0; } \ No newline at end of file diff --git a/test/fuzztest/backupsaappdone_fuzzer/BUILD.gn b/test/fuzztest/backupsaappdone_fuzzer/BUILD.gn new file mode 100644 index 000000000..c2d260e1a --- /dev/null +++ b/test/fuzztest/backupsaappdone_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2022-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaAppDoneFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsaappdone_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsaappdone_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.cpp b/test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.cpp new file mode 100644 index 000000000..c62c0624f --- /dev/null +++ b/test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 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 "backupsaappdone_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdAppDoneFuzzTest(const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t)) { + return false; + } + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + int32_t errCode = *(reinterpret_cast(data)); + datas.WriteInt32(errCode); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_APP_DONE), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdAppDoneFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.h b/test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.h new file mode 100644 index 000000000..033d71c0d --- /dev/null +++ b/test/fuzztest/backupsaappdone_fuzzer/backupsaappdone_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2022-2025 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. + */ + +#ifndef BACKUPSAAPPDONE_FUZZER_H +#define BACKUPSAAPPDONE_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsaappdone_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsaappdone_fuzzer/corpus/init b/test/fuzztest/backupsaappdone_fuzzer/corpus/init new file mode 100644 index 000000000..8eb5a7d6e --- /dev/null +++ b/test/fuzztest/backupsaappdone_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2022 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsaappdone_fuzzer/project.xml b/test/fuzztest/backupsaappdone_fuzzer/project.xml new file mode 100644 index 000000000..85e7ef2c1 --- /dev/null +++ b/test/fuzztest/backupsaappdone_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp index 9eea23fc6..9dd7cd8a9 100644 --- a/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp +++ b/test/fuzztest/backupsaappendbundlesbackupsession_fuzzer/backupsaappendbundlesbackupsession_fuzzer.cpp @@ -43,26 +43,25 @@ bool CmdAppendBundlesBackupSessionFuzzTest(const uint8_t *data, size_t size) datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); if (size > 0) { vector bundleNames; + string param(reinterpret_cast(data), size); for (size_t i = 0; i < size; i++) { - string param(reinterpret_cast(data), size); string name = param + to_string(i); bundleNames.push_back(name); } datas.WriteStringVector(bundleNames); } - - datas.RewindRead(0); MessageParcel reply; MessageOption option; - sptr service(new Service(SERVICE_ID)); uint32_t code = static_cast(IServiceIpcCode::COMMAND_APPEND_BUNDLES_BACKUP_SESSION); try { service->OnRemoteRequest(code, datas, reply, option); } catch (OHOS::FileManagement::Backup::BError &err) { HILOGE("BackupSaFuzzTest error"); - } catch (...) { + } catch (const std::exception& ex) { HILOGE("BackupSaFuzzTest exception"); + } catch (...) { + HILOGE("BackupSaFuzzTest unknown exception"); } return true; } diff --git a/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/BUILD.gn b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/BUILD.gn new file mode 100644 index 000000000..61d72bd32 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaAppendBundlesRestoreSessionFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsaappendbundlesrestoresession_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.cpp b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.cpp new file mode 100644 index 000000000..0a71662ca --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021-2025 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 "backupsaappendbundlesrestoresession_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdAppendBundlesRestoreSessionFuzzTest(const uint8_t *data, size_t size) +{ + if (data == nullptr || size == 0) { + return false; + } + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + size_t len = 0; + if (size >= len + sizeof(int)) { + int fd = *(reinterpret_cast(data + len)); + datas.WriteFileDescriptor(UniqueFd(fd)); + len += sizeof(int); + } + int32_t type = 0; + if (size >= len + sizeof(int32_t)) { + type = *(reinterpret_cast(data + len)); + datas.WriteInt32(type); + len += sizeof(int32_t); + } + int32_t userId = 0; + if (size >= len + sizeof(int32_t)) { + userId = *(reinterpret_cast(data + len)); + datas.WriteInt32(userId); + len += sizeof(int32_t); + } + if (size > len) { + vector bundleNames; + string baseStr(reinterpret_cast(data + len), size - len); + bundleNames.push_back(baseStr); + datas.WriteStringVector(bundleNames); + } + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest( + static_cast(IServiceIpcCode::COMMAND_APPEND_BUNDLES_RESTORE_SESSION_DATA), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdAppendBundlesRestoreSessionFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.h b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.h new file mode 100644 index 000000000..4c1b680a1 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/backupsaappendbundlesrestoresession_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAAPPENDBUNDLESRESTORESESSION_FUZZER_H +#define BACKUPSAAPPENDBUNDLESRESTORESESSION_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsaappendbundlesrestoresession_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/corpus/init b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/project.xml b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsaappendbundlesrestoresession_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsaappfileready_fuzzer/BUILD.gn b/test/fuzztest/backupsaappfileready_fuzzer/BUILD.gn new file mode 100644 index 000000000..9b027583f --- /dev/null +++ b/test/fuzztest/backupsaappfileready_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaAppFileReadyFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsaappfileready_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsaappfileready_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.cpp b/test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.cpp new file mode 100644 index 000000000..ad76fb640 --- /dev/null +++ b/test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2025 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 "backupsaappfileready_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdAppFileReadyFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + std::string fileName(reinterpret_cast(data), size); + datas.WriteString(fileName); + + int fd = -1; + if (size >= sizeof(int)) { + fd = *(reinterpret_cast(data)); + } + datas.WriteFileDescriptor(UniqueFd(fd)); + + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_APP_FILE_READY); + service->OnRemoteRequest(code, datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdAppFileReadyFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.h b/test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.h new file mode 100644 index 000000000..6fbc9e6b7 --- /dev/null +++ b/test/fuzztest/backupsaappfileready_fuzzer/backupsaappfileready_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAAPPFILEREADY_FUZZER_H +#define BACKUPSAAPPFILEREADY_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsaappfileready_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsaappfileready_fuzzer/corpus/init b/test/fuzztest/backupsaappfileready_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsaappfileready_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsaappfileready_fuzzer/project.xml b/test/fuzztest/backupsaappfileready_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsaappfileready_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsafinish_fuzzer/BUILD.gn b/test/fuzztest/backupsafinish_fuzzer/BUILD.gn new file mode 100644 index 000000000..aa1328aa7 --- /dev/null +++ b/test/fuzztest/backupsafinish_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaFinishFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsafinish_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsafinish_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.cpp b/test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.cpp new file mode 100644 index 000000000..0785ebd6a --- /dev/null +++ b/test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2025 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 "backupsafinish_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; +bool CmdFinishFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_FINISH), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdFinishFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.h b/test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.h new file mode 100644 index 000000000..8191a4642 --- /dev/null +++ b/test/fuzztest/backupsafinish_fuzzer/backupsafinish_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAFINISHFUZZ_FUZZER_H +#define BACKUPSAFINISHFUZZ_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsafinish_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsafinish_fuzzer/corpus/init b/test/fuzztest/backupsafinish_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsafinish_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsafinish_fuzzer/project.xml b/test/fuzztest/backupsafinish_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsafinish_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsagetlocalcapabilities_fuzzer/BUILD.gn b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/BUILD.gn new file mode 100644 index 000000000..7bc3a73ca --- /dev/null +++ b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaGetLocalCapabilitiesFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsagetlocalcapabilities_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsagetlocalcapabilities_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.cpp b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.cpp new file mode 100644 index 000000000..4db077276 --- /dev/null +++ b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 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 "backupsagetlocalcapabilities_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdGetLocalCapabilitiesFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + uint32_t code = static_cast(IServiceIpcCode::COMMAND_GET_LOCAL_CAPABILITIES); + service->OnRemoteRequest(code, datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdGetLocalCapabilitiesFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.h b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.h new file mode 100644 index 000000000..61e1af185 --- /dev/null +++ b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/backupsagetlocalcapabilities_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAGETLOCALCAPABILITIES_FUZZER_H +#define BACKUPSAGETLOCALCAPABILITIES_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsagetlocalcapabilities_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsagetlocalcapabilities_fuzzer/corpus/init b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsagetlocalcapabilities_fuzzer/project.xml b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsagetlocalcapabilities_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsainitbackupsession_fuzzer/BUILD.gn b/test/fuzztest/backupsainitbackupsession_fuzzer/BUILD.gn new file mode 100644 index 000000000..64168d4e5 --- /dev/null +++ b/test/fuzztest/backupsainitbackupsession_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaInitBackupSessionFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsainitbackupsession_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsainitbackupsession_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.cpp b/test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.cpp new file mode 100644 index 000000000..5ac3b7af7 --- /dev/null +++ b/test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2025 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 "backupsainitbackupsession_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdInitBackupSessionFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_INIT_BACKUP_SESSION), + datas, reply, option); + service = nullptr; + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdInitBackupSessionFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.h b/test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.h new file mode 100644 index 000000000..117776b31 --- /dev/null +++ b/test/fuzztest/backupsainitbackupsession_fuzzer/backupsainitbackupsession_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAINITBACKUPSESSION_FUZZER_H +#define BACKUPSAINITBACKUPSESSION_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsainitbackupsession_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsainitbackupsession_fuzzer/corpus/init b/test/fuzztest/backupsainitbackupsession_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsainitbackupsession_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsainitbackupsession_fuzzer/project.xml b/test/fuzztest/backupsainitbackupsession_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsainitbackupsession_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsainitrestoresession_fuzzer/BUILD.gn b/test/fuzztest/backupsainitrestoresession_fuzzer/BUILD.gn new file mode 100644 index 000000000..2961ddd9e --- /dev/null +++ b/test/fuzztest/backupsainitrestoresession_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaInitRestoreSessionFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsainitrestoresession_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsainitrestoresession_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.cpp b/test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.cpp new file mode 100644 index 000000000..f5adc5aa2 --- /dev/null +++ b/test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 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 "backupsainitrestoresession_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdInitRestoreSessionFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_INIT_RESTORE_SESSION), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdInitRestoreSessionFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.h b/test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.h new file mode 100644 index 000000000..0b21b9243 --- /dev/null +++ b/test/fuzztest/backupsainitrestoresession_fuzzer/backupsainitrestoresession_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAINITRESTORESESSION_FUZZER_H +#define BACKUPSAINITRESTORESESSION_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsainitrestoresession_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsainitrestoresession_fuzzer/corpus/init b/test/fuzztest/backupsainitrestoresession_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsainitrestoresession_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsainitrestoresession_fuzzer/project.xml b/test/fuzztest/backupsainitrestoresession_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsainitrestoresession_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsapublishfile_fuzzer/BUILD.gn b/test/fuzztest/backupsapublishfile_fuzzer/BUILD.gn new file mode 100644 index 000000000..0dfafe417 --- /dev/null +++ b/test/fuzztest/backupsapublishfile_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaPublishFileFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsapublishfile_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsapublishfile_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.cpp b/test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.cpp new file mode 100644 index 000000000..27b6562a2 --- /dev/null +++ b/test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2025 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 "backupsapublishfile_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdPublishFileFuzzTest(const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(uint32_t)) { + return false; + } + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + uint32_t sn = *(reinterpret_cast(data)); + int len = (size - sizeof(uint32_t)) >> 1; + std::string fileName(reinterpret_cast(data + sizeof(uint32_t)), len); + std::string bundleName(reinterpret_cast(data + sizeof(uint32_t) + len), len); + BFileInfo fileInfo(fileName, bundleName, sn); + datas.WriteParcelable(&fileInfo); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_PUBLISH_FILE), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdPublishFileFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.h b/test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.h new file mode 100644 index 000000000..38fa27870 --- /dev/null +++ b/test/fuzztest/backupsapublishfile_fuzzer/backupsapublishfile_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSAPUBLISHFILE_FUZZER_H +#define BACKUPSAPUBLISHFILE_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsapublishfile_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsapublishfile_fuzzer/corpus/init b/test/fuzztest/backupsapublishfile_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsapublishfile_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsapublishfile_fuzzer/project.xml b/test/fuzztest/backupsapublishfile_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsapublishfile_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/backupsastart_fuzzer/BUILD.gn b/test/fuzztest/backupsastart_fuzzer/BUILD.gn new file mode 100644 index 000000000..3299389bb --- /dev/null +++ b/test/fuzztest/backupsastart_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2025 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. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupSaStartFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupsastart_fuzzer" + include_dirs = [ + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupsastart_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/services/backup_sa:backup_sa", + "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${path_backup}/utils:backup_utils", + ] + public_configs = [ "${path_backup}/services/backup_sa:public_idl_config" ] + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "file_api:filemgmt_libn", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.cpp b/test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.cpp new file mode 100644 index 000000000..ade2f0a21 --- /dev/null +++ b/test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 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 "backupsastart_fuzzer.h" + +#include +#include +#include +#include +#include + +#include "message_parcel.h" +#include "service.h" +#include "service_proxy.h" +#include "service_reverse.h" +#include "service_stub.h" +#include "securec.h" +#include "system_ability.h" + +using namespace std; +using namespace OHOS::FileManagement::Backup; + +namespace OHOS { +constexpr int32_t SERVICE_ID = 5203; + +bool CmdStartFuzzTest(const uint8_t *data, size_t size) +{ + MessageParcel datas; + datas.WriteInterfaceToken(ServiceStub::GetDescriptor()); + datas.WriteBuffer(data, size); + datas.RewindRead(0); + MessageParcel reply; + MessageOption option; + + sptr service(new Service(SERVICE_ID)); + service->OnRemoteRequest(static_cast(IServiceIpcCode::COMMAND_START), + datas, reply, option); + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + /* Run your code on data */ + try { + OHOS::CmdStartFuzzTest(data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + HILOGE("BackupSaFuzzTest exception"); + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.h b/test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.h new file mode 100644 index 000000000..31b627bb5 --- /dev/null +++ b/test/fuzztest/backupsastart_fuzzer/backupsastart_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 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. + */ + +#ifndef BACKUPSASTARTFUZZ_FUZZER_H +#define BACKUPSASTARTFUZZ_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupsastart_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupsastart_fuzzer/corpus/init b/test/fuzztest/backupsastart_fuzzer/corpus/init new file mode 100644 index 000000000..7ade8a0fa --- /dev/null +++ b/test/fuzztest/backupsastart_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 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. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupsastart_fuzzer/project.xml b/test/fuzztest/backupsastart_fuzzer/project.xml new file mode 100644 index 000000000..66e1dcac4 --- /dev/null +++ b/test/fuzztest/backupsastart_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + + diff --git a/test/fuzztest/servicereverse_fuzzer/servicereverse_fuzzer.cpp b/test/fuzztest/servicereverse_fuzzer/servicereverse_fuzzer.cpp index 09767b6ee..8f9b3cb14 100644 --- a/test/fuzztest/servicereverse_fuzzer/servicereverse_fuzzer.cpp +++ b/test/fuzztest/servicereverse_fuzzer/servicereverse_fuzzer.cpp @@ -657,16 +657,19 @@ bool IncrementalRestoreOnProcessInfoFuzzTest(sptr service, const bool OnRemoteRequestFuzzTest(sptr service, const uint8_t *data, size_t size) { - uint32_t codeMax = 26; + uint32_t codeMax = 31; for (uint32_t code = 1; code < codeMax; code++) { MessageParcel datas; MessageParcel reply; MessageOption option; - datas.WriteInterfaceToken(ServiceReverseStub::GetDescriptor()); datas.WriteBuffer(reinterpret_cast(data), size); datas.RewindRead(0); - service->OnRemoteRequest(code, datas, reply, option); + try { + service->OnRemoteRequest(code, datas, reply, option); + } catch (BError &err) { + // Only filter BError errors, Other results are not expected. + } } { MessageParcel datas; @@ -697,7 +700,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) printf("service handler is nullptr"); return 0; } - + OHOS::OnRemoteRequestFuzzTest(incrementalRestoreService, data, size); OHOS::BackupOnFileReadyFuzzTest(backupService, data, size); OHOS::BackupOnBundleStartedFuzzTest(backupService, data, size); OHOS::BackupOnResultReportFuzzTest(backupService, data, size); @@ -730,7 +733,5 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::IncrementalRestoreOnFileReadyFuzzTest(incrementalRestoreService, data, size); OHOS::IncrementalRestoreOnResultReportFuzzTest(incrementalRestoreService, data, size); OHOS::IncrementalRestoreOnProcessInfoFuzzTest(incrementalRestoreService, data, size); - OHOS::OnRemoteRequestFuzzTest(incrementalRestoreService, data, size); - return 0; } \ No newline at end of file -- Gitee From 1890d120f3fd38ac9c4a5638ab98ff99ef5d22b2 Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Mon, 4 Aug 2025 19:49:08 +0800 Subject: [PATCH 41/62] clean code Signed-off-by: chenxi0605 --- CODEOWNERS | 4 ++-- .../backup_sa/src/module_external/bms_adapter.cpp | 12 ++++++------ .../backup_sa/module_external/bms_adapter_test.cpp | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index d36c1e1e2..906be70eb 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,5 +11,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -# any change to xxx_ipc_interface_code.h needs to be reviewed by @leonchan5 liubao6@huawei.com -interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h @leonchan5 liubao6@huawei.com \ No newline at end of file +# any change to xxx_ipc_interface_code.h needs to be reviewed by @leonchan5 +interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h @leonchan5 \ No newline at end of file diff --git a/services/backup_sa/src/module_external/bms_adapter.cpp b/services/backup_sa/src/module_external/bms_adapter.cpp index 67eb26936..92d67054b 100644 --- a/services/backup_sa/src/module_external/bms_adapter.cpp +++ b/services/backup_sa/src/module_external/bms_adapter.cpp @@ -44,7 +44,7 @@ using namespace std; namespace { enum { APP = 0, LOCAL, DISTRIBUTED, DATABASE, CACHE }; -const string HMOS_HAP_CODE_PATH = "1"; +const string HAP_CODE_PATH = "1"; 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"; @@ -346,7 +346,7 @@ vector BundleMgrAdapter::GetBundleInfosForIncrement vector bundleInfos; HILOGI("End get installedBundles count is:%{public}zu", installedBundles.size()); for (const auto &installedBundle : installedBundles) { - if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || + if (installedBundle.applicationInfo.codePath == HAP_CODE_PATH || installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { HILOGI("Unsupported applications, name : %{public}s", installedBundle.name.data()); continue; @@ -394,7 +394,7 @@ vector BundleMgrAdapter::GetFullBundleInfos(int32_t HILOGE("Current bundle name is invalid"); continue; } - if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || + if (installedBundle.applicationInfo.codePath == HAP_CODE_PATH || installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { HILOGI("Unsupported applications, name : %{public}s", installedBundle.name.data()); continue; @@ -433,7 +433,7 @@ string BundleMgrAdapter::GetExtName(string bundleName, int32_t userId) throw BError(BError::Codes::SA_BROKEN_IPC, "Failed to get bundle infos"); } for (const auto &installedBundle : installedBundles) { - if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || + if (installedBundle.applicationInfo.codePath == HAP_CODE_PATH || installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { HILOGI("Unsupported applications, name : %{public}s", installedBundle.name.data()); continue; @@ -517,7 +517,7 @@ bool BundleMgrAdapter::GetCurBundleExtenionInfo(BundleExtInfo &bundleExtInfo, sp bundleExtInfo.error_ = RadarError(MODULE_HAP, BError(BError::Codes::SA_BUNDLE_INFO_EMPTY)); return false; } - if (bundleExtInfo.bundleInfo_.applicationInfo.codePath == HMOS_HAP_CODE_PATH || + if (bundleExtInfo.bundleInfo_.applicationInfo.codePath == HAP_CODE_PATH || bundleExtInfo.bundleInfo_.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { HILOGE("Unsupported applications, name : %{public}s", bundleExtInfo.bundleInfo_.name.data()); bundleExtInfo.error_ = RadarError(MODULE_HAP, BError(BError::Codes::SA_FORBID_BACKUP_RESTORE)); @@ -581,7 +581,7 @@ std::vector BundleMgrAdapter::GetBundleInfosForLoca vector bundleInfos; HILOGI("End get installedBundles count is:%{public}zu", installedBundles.size()); for (auto const &installedBundle : installedBundles) { - if (installedBundle.applicationInfo.codePath == HMOS_HAP_CODE_PATH || + if (installedBundle.applicationInfo.codePath == HAP_CODE_PATH || installedBundle.applicationInfo.codePath == LINUX_HAP_CODE_PATH) { HILOGI("Unsupported applications, name : %{public}s", installedBundle.name.data()); continue; diff --git a/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp b/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp index bcdec2d35..a8967a828 100644 --- a/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp +++ b/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp @@ -29,7 +29,7 @@ using namespace std; using namespace testing; using namespace FileManagement::Backup; -const string HMOS_HAP_CODE_PATH = "1"; +const string HAP_CODE_PATH = "1"; const string LINUX_HAP_CODE_PATH = "2"; const string BUNDLE_NAME = "com.example.app2backup"; const int32_t USER_ID = 100; @@ -137,7 +137,7 @@ HWTEST_F(BmsAdapterTest, SUB_bms_adapter_GetBundleInfosForLocalCapabilities_test AppExecFwk::BundleInfo info; std::vector infos; - info.applicationInfo.codePath = HMOS_HAP_CODE_PATH; + info.applicationInfo.codePath = HAP_CODE_PATH; infos.emplace_back(info); info.applicationInfo.codePath = LINUX_HAP_CODE_PATH; infos.emplace_back(info); -- Gitee From 3b43c023560e1c7ff767e16cff2fc78c1ad5bf28 Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Tue, 5 Aug 2025 10:20:25 +0800 Subject: [PATCH 42/62] clean code Signed-off-by: chenxi0605 --- CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 906be70eb..d36c1e1e2 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,5 +11,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -# any change to xxx_ipc_interface_code.h needs to be reviewed by @leonchan5 -interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h @leonchan5 \ No newline at end of file +# any change to xxx_ipc_interface_code.h needs to be reviewed by @leonchan5 liubao6@huawei.com +interfaces/inner_api/native/backup_kit_inner/impl/i_service_ipc_interface_code.h @leonchan5 liubao6@huawei.com \ No newline at end of file -- Gitee From 933674ad604a743ea9196dc047ca73a0d3ff8844 Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Tue, 5 Aug 2025 15:04:51 +0800 Subject: [PATCH 43/62] modify logdomain id Signed-off-by: chenxi0605 --- frameworks/native/backup_ext/BUILD.gn | 2 +- frameworks/native/backup_ext/src/untar_file.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/native/backup_ext/BUILD.gn b/frameworks/native/backup_ext/BUILD.gn index 14208017d..bab933615 100644 --- a/frameworks/native/backup_ext/BUILD.gn +++ b/frameworks/native/backup_ext/BUILD.gn @@ -41,7 +41,7 @@ ohos_shared_library("backup_extension_ability_native") { ] defines = [ - "LOG_DOMAIN=0xD004301", + "LOG_DOMAIN=0xD004303", "LOG_TAG=\"BackupExt\"", ] diff --git a/frameworks/native/backup_ext/src/untar_file.cpp b/frameworks/native/backup_ext/src/untar_file.cpp index c5eaa1331..d84c328a7 100644 --- a/frameworks/native/backup_ext/src/untar_file.cpp +++ b/frameworks/native/backup_ext/src/untar_file.cpp @@ -630,7 +630,7 @@ FILE *UntarFile::CreateFile(string &filePath) } uint32_t len = filePath.length(); - HILOGW("Failed to open file %{public}d, %{public}s, err = %{public}d, Will create", len, + HILOGD("Failed to open file %{public}d, %{public}s, err = %{public}d, Will create", len, GetAnonyPath(filePath).c_str(), errno); size_t pos = filePath.rfind('/'); if (pos == string::npos) { -- Gitee From ae253ed3bdffb8ac0b21d04daa8a9cf7bfa527ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Sat, 2 Aug 2025 09:25:00 +0800 Subject: [PATCH 44/62] add jsoncpp dep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- services/backup_sa/include/module_ipc/svc_backup_connection.h | 2 +- test/fuzztest/backupsa_fuzzer/BUILD.gn | 1 + test/fuzztest/backupservicestub_fuzzer/BUILD.gn | 1 + utils/include/b_filesystem/b_file.h | 1 - 4 files changed, 3 insertions(+), 2 deletions(-) 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 786c01f4d..305a40b99 100644 --- a/services/backup_sa/include/module_ipc/svc_backup_connection.h +++ b/services/backup_sa/include/module_ipc/svc_backup_connection.h @@ -92,7 +92,7 @@ public: uint32_t GetConnectSpan() { return connectSpend_.GetSpan(); } - BError GetError() { return error_; } + BError& GetError() { return error_; } public: SvcBackupConnection(std::function callDied, std::function callConnected, diff --git a/test/fuzztest/backupsa_fuzzer/BUILD.gn b/test/fuzztest/backupsa_fuzzer/BUILD.gn index bce672d81..282f30037 100644 --- a/test/fuzztest/backupsa_fuzzer/BUILD.gn +++ b/test/fuzztest/backupsa_fuzzer/BUILD.gn @@ -50,6 +50,7 @@ ohos_fuzztest("BackupSaFuzzTest") { "file_api:filemgmt_libn", "hilog:libhilog", "ipc:ipc_core", + "jsoncpp:jsoncpp", "safwk:system_ability_fwk", ] diff --git a/test/fuzztest/backupservicestub_fuzzer/BUILD.gn b/test/fuzztest/backupservicestub_fuzzer/BUILD.gn index c4d813425..4c99886f0 100644 --- a/test/fuzztest/backupservicestub_fuzzer/BUILD.gn +++ b/test/fuzztest/backupservicestub_fuzzer/BUILD.gn @@ -52,6 +52,7 @@ ohos_fuzztest("BackupServiceStubFuzzTest") { "c_utils:utils", "hilog:libhilog", "ipc:ipc_core", + "jsoncpp:jsoncpp", "safwk:system_ability_fwk", ] diff --git a/utils/include/b_filesystem/b_file.h b/utils/include/b_filesystem/b_file.h index 2206bd422..27fe5ce36 100644 --- a/utils/include/b_filesystem/b_file.h +++ b/utils/include/b_filesystem/b_file.h @@ -20,7 +20,6 @@ #include #include "unique_fd.h" -#include "json/json.h" #include "b_anony/b_anony.h" -- Gitee From da8a55aa1a194ce09c05a95b6a598e4a9713f963 Mon Sep 17 00:00:00 2001 From: linan24 Date: Wed, 6 Aug 2025 10:15:00 +0800 Subject: [PATCH 45/62] fix sandbox double free coredump Signed-off-by: linan24 --- interfaces/common/include/sandbox_helper.h | 3 -- interfaces/common/src/sandbox_helper.cpp | 31 +++++++++---------- ...getincrementallocalcapabilities_fuzzer.cpp | 1 - 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/interfaces/common/include/sandbox_helper.h b/interfaces/common/include/sandbox_helper.h index ce5fcefd6..e650cf4d6 100644 --- a/interfaces/common/include/sandbox_helper.h +++ b/interfaces/common/include/sandbox_helper.h @@ -25,8 +25,6 @@ namespace AppFileService { class SandboxHelper { private: static std::mutex mapMutex_; - static std::unordered_map sandboxPathMap_; - static std::unordered_map backupSandboxPathMap_; static bool GetSandboxPathMap(); static bool GetBackupSandboxPathMap(); static void* libMediaHandle_; @@ -44,7 +42,6 @@ public: static void GetNetworkIdFromUri(const std::string &fileUri, std::string &networkId); static std::string GetLowerDir(std::string &lowerPathHead, const std::string &userId, const std::string &bundleName, const std::string &networkId); - static void ClearBackupSandboxPathMap(); }; } // namespace AppFileService } // namespace OHOS diff --git a/interfaces/common/src/sandbox_helper.cpp b/interfaces/common/src/sandbox_helper.cpp index 0536ab7fd..d0a2e6f55 100644 --- a/interfaces/common/src/sandbox_helper.cpp +++ b/interfaces/common/src/sandbox_helper.cpp @@ -58,6 +58,11 @@ namespace { const std::string AMPERSAND = "&"; } +namespace { + std::unordered_map g_sandboxPathMap; + std::unordered_map g_backupSandboxPathMap; +} + struct MediaUriInfo { string mediaType; string fileId; @@ -65,8 +70,6 @@ struct MediaUriInfo { string displayName; }; -std::unordered_map SandboxHelper::sandboxPathMap_; -std::unordered_map SandboxHelper::backupSandboxPathMap_; std::mutex SandboxHelper::mapMutex_; void* SandboxHelper::libMediaHandle_; @@ -158,7 +161,7 @@ string SandboxHelper::GetLowerDir(string &lowerPathHead, const string &userId, c bool SandboxHelper::GetSandboxPathMap() { lock_guard lock(mapMutex_); - if (sandboxPathMap_.size() > 0) { + if (g_sandboxPathMap.size() > 0) { return true; } @@ -178,10 +181,10 @@ bool SandboxHelper::GetSandboxPathMap() for (size_t i = 0; i < mountPathMap.size(); i++) { string srcPath = mountPathMap[i][PHYSICAL_PATH_KEY]; string sandboxPath = mountPathMap[i][SANDBOX_PATH_KEY]; - sandboxPathMap_[sandboxPath] = srcPath; + g_sandboxPathMap[sandboxPath] = srcPath; } - if (sandboxPathMap_.size() == 0) { + if (g_sandboxPathMap.size() == 0) { return false; } @@ -191,7 +194,7 @@ bool SandboxHelper::GetSandboxPathMap() bool SandboxHelper::GetBackupSandboxPathMap() { lock_guard lock(mapMutex_); - if (backupSandboxPathMap_.size() > 0) { + if (g_backupSandboxPathMap.size() > 0) { return true; } @@ -211,10 +214,10 @@ bool SandboxHelper::GetBackupSandboxPathMap() for (size_t i = 0; i < mountPathMap.size(); i++) { string srcPath = mountPathMap[i][PHYSICAL_PATH_KEY]; string sandboxPath = mountPathMap[i][SANDBOX_PATH_KEY]; - backupSandboxPathMap_[sandboxPath] = srcPath; + g_backupSandboxPathMap[sandboxPath] = srcPath; } - if (backupSandboxPathMap_.size() == 0) { + if (g_backupSandboxPathMap.size() == 0) { return false; } @@ -419,7 +422,7 @@ int32_t SandboxHelper::GetPhysicalDir(const std::string &fileUri, const std::str string lowerPathTail = ""; string lowerPathHead = ""; - DoGetPhysicalPath(lowerPathTail, lowerPathHead, sandboxPath, sandboxPathMap_); + DoGetPhysicalPath(lowerPathTail, lowerPathHead, sandboxPath, g_sandboxPathMap); if (lowerPathHead == "") { LOGE("lowerPathHead is invalid"); @@ -459,7 +462,7 @@ int32_t SandboxHelper::GetPhysicalPath(const std::string &fileUri, const std::st string lowerPathTail = ""; string lowerPathHead = ""; - DoGetPhysicalPath(lowerPathTail, lowerPathHead, sandboxPath, sandboxPathMap_); + DoGetPhysicalPath(lowerPathTail, lowerPathHead, sandboxPath, g_sandboxPathMap); if (lowerPathHead == "") { LOGE("lowerPathHead is invalid"); @@ -499,7 +502,7 @@ int32_t SandboxHelper::GetBackupPhysicalPath(const std::string &fileUri, const s string lowerPathTail = ""; string lowerPathHead = ""; - DoGetPhysicalPath(lowerPathTail, lowerPathHead, sandboxPath, backupSandboxPathMap_); + DoGetPhysicalPath(lowerPathTail, lowerPathHead, sandboxPath, g_backupSandboxPathMap); if (lowerPathHead == "") { LOGE("lowerPathHead is invalid"); @@ -552,12 +555,6 @@ bool SandboxHelper::CheckValidPath(const std::string &filePath) return true; } - -void SandboxHelper::ClearBackupSandboxPathMap() -{ - lock_guard lock(mapMutex_); - backupSandboxPathMap_.clear(); -} } // namespace AppFileService } // namespace OHOS diff --git a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp index 226d8255b..315619cee 100644 --- a/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp +++ b/test/fuzztest/backupsagetincrementallocalcapabilities_fuzzer/backupsagetincrementallocalcapabilities_fuzzer.cpp @@ -325,7 +325,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::CheckIfDirForIncludesFuzzTest(data, size); OHOS::GetPathWildCardFuzzTest(data, size); OHOS::CmdCheckOverLongPath(data, size); - OHOS::AppFileService::SandboxHelper::ClearBackupSandboxPathMap(); } catch (OHOS::FileManagement::Backup::BError &err) { HILOGE("BackupSaFuzzTest error"); } catch (...) { -- Gitee From 895a01b2c88201534e1c4adb8a86b53fc23fbbf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Wed, 6 Aug 2025 14:49:19 +0800 Subject: [PATCH 46/62] fix curScenario MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- frameworks/native/backup_ext/src/ext_extension.cpp | 6 +++--- frameworks/native/backup_ext/src/sub_ext_extension.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index ec7f43d14..5adbcae64 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -560,6 +560,7 @@ ErrCode BackupExtExtension::PublishFile(const std::string &fileName) VerifyCaller(); // 异步执行解压操作 if (extension_->AllowToBackupRestore()) { + curScenario_ = BackupRestoreScenario::FULL_RESTORE; AsyncTaskRestore(GetIdxFileData(bundleName_), GetExtManageInfo()); } HILOGI("End publish file"); @@ -597,6 +598,7 @@ ErrCode BackupExtExtension::PublishIncrementalFile(const string &fileName) isDebug_ = true; } if (extension_->AllowToBackupRestore()) { + curScenario_ = BackupRestoreScenario::INCREMENTAL_RESTORE; if (extension_->SpecialVersionForCloneAndCloud()) { HILOGI("Create task for Incremental SpecialVersion"); AsyncTaskIncreRestoreSpecialVersion(); @@ -629,6 +631,7 @@ ErrCode BackupExtExtension::HandleBackup(bool isClearData) return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") .GetCode(); } + curScenario_ = BackupRestoreScenario::FULL_BACKUP; AsyncTaskOnBackup(); return ERR_OK; } @@ -1684,7 +1687,6 @@ void BackupExtExtension::AsyncTaskRestoreForUpgrade() return; } HILOGI("On restore, start ext timer end."); - ptr->curScenario_ = BackupRestoreScenario::FULL_RESTORE; if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::FULL_RESTORE)) != ERR_OK) { HILOGE("Call onProcess result is timeout"); return; @@ -1740,7 +1742,6 @@ void BackupExtExtension::AsyncTaskIncrementalRestoreForUpgrade() return; } HILOGI("On incrementalRestore, start ext timer end."); - ptr->curScenario_ = BackupRestoreScenario::INCREMENTAL_RESTORE; if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::INCREMENTAL_RESTORE)) != ERR_OK) { HILOGE("Call onProcess result is timeout"); return; @@ -1947,7 +1948,6 @@ void BackupExtExtension::AsyncTaskOnBackup() 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 { - ptr->curScenario_ = BackupRestoreScenario::FULL_BACKUP; if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::FULL_BACKUP)) != ERR_OK) { HILOGE("Call onProcess result is timeout"); return; diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index fb11fea1b..b05dc211d 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -98,6 +98,7 @@ ErrCode BackupExtExtension::IncrementalOnBackup(bool isClearData) return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") .GetCode(); } + curScenario_ = BackupRestoreScenario::INCREMENTAL_BACKUP; AsyncTaskOnIncrementalBackup(); return ERR_OK; } @@ -1191,7 +1192,6 @@ void BackupExtExtension::AsyncTaskOnIncrementalBackup() 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 { - ptr->curScenario_ = BackupRestoreScenario::INCREMENTAL_BACKUP; if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::INCREMENTAL_BACKUP)) != ERR_OK) { HILOGE("Call onProcess result is timeout"); return; -- Gitee From 6e172666f3162e28b9ed566dfa9ab89cb6fc5016 Mon Sep 17 00:00:00 2001 From: lizhengxing Date: Thu, 7 Aug 2025 19:30:13 +0800 Subject: [PATCH 47/62] mkdir before dopacket Signed-off-by: lizhengxing --- frameworks/native/backup_ext/src/ext_extension.cpp | 2 ++ frameworks/native/backup_ext/src/sub_ext_extension.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index ec7f43d14..e7c3d19e8 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -1067,9 +1067,11 @@ void BackupExtExtension::AsyncTaskBackup(const string config) ptr->DoBackUpTask(config); } catch (const BError &e) { HILOGE("extension: AsyncTaskBackup error, err code:%{public}d", e.GetCode()); + ScanFileSingleton::GetInstance().SetCompeletedFlag(false); ptr->AppDone(e.GetCode()); } catch (...) { HILOGE("Failed to restore the ext bundle"); + ScanFileSingleton::GetInstance().SetCompeletedFlag(false); ptr->AppDone(BError(BError::Codes::EXT_INVAL_ARG).GetCode()); } ptr->DoClear(); diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index fb11fea1b..249800ac1 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -1615,6 +1615,7 @@ void BackupExtExtension::DoBackUpTask(const string &config) ret = DoBackup(bigFileInfo, fileBackupedInfo, smallFiles, includeSize, excludeSize); DoBackupEnd(); + ScanFileSingleton::GetInstance().SetCompeletedFlag(false); AppDone(ret); HILOGI("backup app done %{public}d", ret); } -- Gitee From c75b7a00d9f184f8a4a6153aa287c5d588a29307 Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Thu, 7 Aug 2025 20:32:33 +0800 Subject: [PATCH 48/62] while clear flag is true also need remove tar Signed-off-by: chenxi0605 --- frameworks/native/backup_ext/src/ext_extension.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index ec7f43d14..c12bd3990 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -930,10 +930,6 @@ int BackupExtExtension::DoRestore(const string &fileName, const off_t fileSize) return ret; } HILOGI("Application recovered successfully, package path is %{public}s", tarName.c_str()); - if (!isClearData_) { - HILOGI("configured not clear data"); - return ERR_OK; - } if (!RemoveFile(tarName)) { HILOGE("Failed to delete the backup tar %{public}s", tarName.c_str()); } @@ -1478,10 +1474,6 @@ void BackupExtExtension::DeleteBackupIncrementalIdxFile() void BackupExtExtension::DeleteBackupIncrementalTars(const string &tarName) { - if (!isClearData_) { - HILOGI("configured not need clear data"); - return; - } if (!RemoveFile(tarName)) { HILOGE("Failed to delete the backup tar %{private}s, err = %{public}d", tarName.c_str(), errno); } -- Gitee From b0ab9f1edb5059888d16009c1f2ae094077d951d Mon Sep 17 00:00:00 2001 From: wangpggg Date: Fri, 8 Aug 2025 11:18:24 +0800 Subject: [PATCH 49/62] modify fuzz Signed-off-by: wangpeng --- .../backupsa_fuzzer/backupsa_fuzzer.cpp | 19 +++++++++++++---- .../backupservicestub_fuzzer.cpp | 21 ------------------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp index 8bd10a0d6..adbeaf176 100644 --- a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp +++ b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp @@ -15,14 +15,25 @@ #include "backupsa_fuzzer.h" +#include +#include +#include + +#include #include "message_parcel.h" +#include "service_stub.h" #include "service.h" -#include "service_client.h" +#include "securec.h" +#include "system_ability.h" + +#include "filemgmt_libhilog.h" -namespace OHOS { using namespace OHOS::FileManagement::Backup; + +namespace OHOS { constexpr size_t U32_AT_SIZE = 4; -constexpr uint8_t MAX_CALL_TRANSACTION = 40; +constexpr uint8_t MAX_CALL_TRANSACTION = 24; +constexpr int32_t SERVICE_ID = 5203; uint32_t GetU32Data(const char* ptr) { @@ -36,7 +47,7 @@ bool BackupSaFuzzTest(const uint8_t *data, size_t size) return true; } - Service* service = static_cast(ServiceClient::GetInstance()->AsObject().GetRefPtr()); + sptr service = sptr(new Service(SERVICE_ID)); uint32_t code = GetU32Data(reinterpret_cast(data)); if (code == 0) { return true; diff --git a/test/fuzztest/backupservicestub_fuzzer/backupservicestub_fuzzer.cpp b/test/fuzztest/backupservicestub_fuzzer/backupservicestub_fuzzer.cpp index 94f3c897a..6b2c9cd2b 100644 --- a/test/fuzztest/backupservicestub_fuzzer/backupservicestub_fuzzer.cpp +++ b/test/fuzztest/backupservicestub_fuzzer/backupservicestub_fuzzer.cpp @@ -670,26 +670,6 @@ bool CmdUpdateSendRateFuzzTest(sptr service, const uint8_t *data, size_ } return true; } - -bool CmdGetBackupDataSizeFuzzTest(sptr service, const uint8_t *data, size_t size) -{ - if (data == nullptr || size < sizeof(int32_t) + sizeof(int32_t)) { - return true; - } - - MessageParcel msg; - MessageParcel reply; - MessageOption option; - uint32_t code = static_cast(IServiceIpcCode::COMMAND_GET_BACKUP_DATA_SIZE); - - try { - msg.WriteBuffer(data, size); - service->OnRemoteRequest(code, msg, reply, option); - } catch (OHOS::FileManagement::Backup::BError &err) { - // Only filter BError errors, Other results are not expected. - } - return true; -} } // namespace OHOS /* Fuzzer entry point */ @@ -728,7 +708,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) CmdGetBackupInfoFuzzTest(service, data, size); CmdUpdateTimerFuzzTest(service, data, size); CmdUpdateSendRateFuzzTest(service, data, size); - CmdGetBackupDataSizeFuzzTest(service, data, size); } catch (OHOS::FileManagement::Backup::BError &err) { // Only filter BError errors, Other results are not expected. } -- Gitee From d2b7133ff2b021d6799439dab4a7f1c78c0199d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Mon, 11 Aug 2025 11:31:00 +0800 Subject: [PATCH 50/62] fix curScenario_ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- frameworks/native/backup_ext/src/ext_extension.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 5adbcae64..8a2801f32 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -2000,7 +2000,7 @@ ErrCode BackupExtExtension::HandleRestore(bool isClearData) return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE, "Application does not allow backup or restore") .GetCode(); } - + curScenario_ = BackupRestoreScenario::FULL_RESTORE; // async do restore. if (extension_->WasFromSpecialVersion() && extension_->RestoreDataReady()) { HILOGI("Restore directly when upgrading."); -- Gitee From e4d5d2d4115af66ae80ebe81eb94ed0adfbdbb6b Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Tue, 12 Aug 2025 15:23:08 +0800 Subject: [PATCH 51/62] clean code Signed-off-by: chenxi0605 --- frameworks/native/backup_ext/src/sub_ext_extension.cpp | 2 +- .../innerkits/native/file_share/src/file_share.cpp | 9 ++++++--- utils/include/b_resources/b_constants.h | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 4f99ce91e..ff18af6c1 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -152,7 +152,7 @@ void BackupExtExtension::SetClearDataFlag(bool isClearData) string BackupExtExtension::GetBundlePath() { - if (bundleName_ == BConstants::BUNDLE_FILE_MANAGER) { + if (BFile::EndsWith(bundleName_, BConstants::BUNDLE_FILE_MANAGER) && bundleName_.size() == BConstants::FM_LEN) { return string(BConstants::PATH_FILEMANAGE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); } else if (bundleName_ == BConstants::BUNDLE_MEDIAL_DATA) { return string(BConstants::PATH_MEDIALDATA_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); diff --git a/interfaces/innerkits/native/file_share/src/file_share.cpp b/interfaces/innerkits/native/file_share/src/file_share.cpp index 6f6d62b86..79f603158 100644 --- a/interfaces/innerkits/native/file_share/src/file_share.cpp +++ b/interfaces/innerkits/native/file_share/src/file_share.cpp @@ -58,7 +58,8 @@ const string FILE_DEFAULT_PATH = "/storage/Users/currentUser/"; const string FILE_PATH_TAIL = "/files/Docs"; const string FILE_PATH_HEAD = "/mnt/hmdfs/"; const string FILE_PATH_MID = "/account/device_view/"; -const string FILE_MANAGER_BUNDLE_NAME = "hmos.filemanager"; +const string FILE_MANAGER_BUNDLE_NAME = ".filemanager"; +const int32_t FM_LEN = 27; } struct FileShareInfo { @@ -101,7 +102,8 @@ static void GetProviderInfo(string uriStr, FileShareInfo &info) Uri uri(uriStr); info.providerBundleName_ = uri.GetAuthority(); info.providerSandboxPath_ = SandboxHelper::Decode(uri.GetPath()); - if (info.providerBundleName_ == DOCS_TYPE && info.targetBundleName_.find(FILE_MANAGER_BUNDLE_NAME) == 0) { + if (info.providerBundleName_ == DOCS_TYPE && bundleName.size() == BConstants::FM_LEN + && BFile::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { info.providerSandboxPath_ = FILE_DEFAULT_PATH; } } @@ -254,7 +256,8 @@ static int32_t GetFileShareInfo(const string &uri, uint32_t tokenId, uint32_t fl return ret; } - if (info.providerBundleName_ == DOCS_TYPE && info.targetBundleName_.find(FILE_MANAGER_BUNDLE_NAME) == 0) { + if (info.providerBundleName_ == DOCS_TYPE && bundleName.size() == BConstants::FM_LEN + && BFile::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { ret = GetDocsDir(uri, info); if (ret != 0) { LOGE("Failed to get docs dir, errno: %{public}d", ret); diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index a3db60af9..bf66f58f9 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -151,7 +151,7 @@ static inline std::string PATH_PUBLIC_HOME = "/storage/Users/currentUser/"; static inline std::string PATH_APP_DATA = "appdata"; // 文管bundleName -static inline std::string BUNDLE_FILE_MANAGER = "hmos.filemanager"; +static inline std::string BUNDLE_FILE_MANAGER = ".filemanager"; // 文管bundleNameSize constexpr size_t FM_LEN = 27; // 媒体库数据bundleName -- Gitee From a245e88b1350a6f29bf6f81e61be6255f9258b5b Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Tue, 12 Aug 2025 16:31:13 +0800 Subject: [PATCH 52/62] clean code Signed-off-by: chenxi0605 --- interfaces/common/include/common_func.h | 1 + interfaces/common/src/common_func.cpp | 8 ++++++++ interfaces/innerkits/native/file_share/src/file_share.cpp | 8 ++++---- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/interfaces/common/include/common_func.h b/interfaces/common/include/common_func.h index dffcc8668..1a7e03c53 100644 --- a/interfaces/common/include/common_func.h +++ b/interfaces/common/include/common_func.h @@ -26,6 +26,7 @@ public: static std::string GetSelfBundleName(); static std::string GetUriFromPath(const std::string &path); static bool GetDirByBundleNameAndAppIndex(const std::string &bundleName, int32_t appIndex, std::string &dirName); + static bool EndsWith(const std::string &str, const std::string &suffix); }; } // namespace AppFileService } // namespace OHOS diff --git a/interfaces/common/src/common_func.cpp b/interfaces/common/src/common_func.cpp index 75c9a466f..94ebf61a8 100644 --- a/interfaces/common/src/common_func.cpp +++ b/interfaces/common/src/common_func.cpp @@ -133,5 +133,13 @@ string CommonFunc::GetUriFromPath(const string &path) realPath = FILE_SCHEME_PREFIX + packageName + SandboxHelper::Encode(realPath); return realPath; } + +bool CommonFunc::EndsWith(const std::string &str, const std::string &suffix) +{ + if (suffix.length() > str.length()) { + return false; + } + return (str.rfind(suffix) == (str.length() - suffix.length())); +} } // namespace AppFileService } // namespace OHOS diff --git a/interfaces/innerkits/native/file_share/src/file_share.cpp b/interfaces/innerkits/native/file_share/src/file_share.cpp index 79f603158..09304a8f0 100644 --- a/interfaces/innerkits/native/file_share/src/file_share.cpp +++ b/interfaces/innerkits/native/file_share/src/file_share.cpp @@ -102,8 +102,8 @@ static void GetProviderInfo(string uriStr, FileShareInfo &info) Uri uri(uriStr); info.providerBundleName_ = uri.GetAuthority(); info.providerSandboxPath_ = SandboxHelper::Decode(uri.GetPath()); - if (info.providerBundleName_ == DOCS_TYPE && bundleName.size() == BConstants::FM_LEN - && BFile::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { + if (info.providerBundleName_ == DOCS_TYPE && info.targetBundleName_.size() == FM_LEN + && CommonFunc::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { info.providerSandboxPath_ = FILE_DEFAULT_PATH; } } @@ -256,8 +256,8 @@ static int32_t GetFileShareInfo(const string &uri, uint32_t tokenId, uint32_t fl return ret; } - if (info.providerBundleName_ == DOCS_TYPE && bundleName.size() == BConstants::FM_LEN - && BFile::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { + if (info.providerBundleName_ == DOCS_TYPE && info.targetBundleName_.size() == FM_LEN + && CommonFunc::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { ret = GetDocsDir(uri, info); if (ret != 0) { LOGE("Failed to get docs dir, errno: %{public}d", ret); -- Gitee From 2b6a10e66dd51eabaad45225ada27d6ed4a4d206 Mon Sep 17 00:00:00 2001 From: chenxi0605 Date: Tue, 12 Aug 2025 17:18:04 +0800 Subject: [PATCH 53/62] clean code Signed-off-by: chenxi0605 --- interfaces/innerkits/native/file_share/src/file_share.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/innerkits/native/file_share/src/file_share.cpp b/interfaces/innerkits/native/file_share/src/file_share.cpp index 09304a8f0..96180a020 100644 --- a/interfaces/innerkits/native/file_share/src/file_share.cpp +++ b/interfaces/innerkits/native/file_share/src/file_share.cpp @@ -103,7 +103,7 @@ static void GetProviderInfo(string uriStr, FileShareInfo &info) info.providerBundleName_ = uri.GetAuthority(); info.providerSandboxPath_ = SandboxHelper::Decode(uri.GetPath()); if (info.providerBundleName_ == DOCS_TYPE && info.targetBundleName_.size() == FM_LEN - && CommonFunc::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { + && CommonFunc::EndsWith(info.targetBundleName_, FILE_MANAGER_BUNDLE_NAME)) { info.providerSandboxPath_ = FILE_DEFAULT_PATH; } } @@ -257,7 +257,7 @@ static int32_t GetFileShareInfo(const string &uri, uint32_t tokenId, uint32_t fl } if (info.providerBundleName_ == DOCS_TYPE && info.targetBundleName_.size() == FM_LEN - && CommonFunc::EndsWith(info.targetBundleName_, BConstants::BUNDLE_FILE_MANAGER)) { + && CommonFunc::EndsWith(info.targetBundleName_, FILE_MANAGER_BUNDLE_NAME)) { ret = GetDocsDir(uri, info); if (ret != 0) { LOGE("Failed to get docs dir, errno: %{public}d", ret); -- Gitee From ada86aebf226962728be4af91be30d0f2d7ac457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Thu, 14 Aug 2025 09:57:54 +0800 Subject: [PATCH 54/62] add hilog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- tests/unittests/backup_ext/BUILD.gn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unittests/backup_ext/BUILD.gn b/tests/unittests/backup_ext/BUILD.gn index ed59b5e9a..4316778ce 100644 --- a/tests/unittests/backup_ext/BUILD.gn +++ b/tests/unittests/backup_ext/BUILD.gn @@ -178,6 +178,7 @@ ohos_unittest("tar_file_test") { "c_utils:utils", "googletest:gmock_main", "googletest:gtest_main", + "hilog:libhilog", "hitrace:hitrace_meter", "ipc:ipc_core", "ipc:ipc_napi", @@ -259,6 +260,7 @@ ohos_unittest("untar_file_sup_test") { "c_utils:utils", "googletest:gmock_main", "googletest:gtest_main", + "hilog:libhilog", "hitrace:hitrace_meter", "ipc:ipc_core", "ipc:ipc_napi", @@ -334,6 +336,7 @@ ohos_unittest("untar_file_test") { "c_utils:utils", "googletest:gmock_main", "googletest:gtest_main", + "hilog:libhilog", "hitrace:hitrace_meter", "ipc:ipc_core", "ipc:ipc_napi", -- Gitee From af2a614927634c2adbc7c9a2d6bcfe559807bfd2 Mon Sep 17 00:00:00 2001 From: linan24 Date: Fri, 15 Aug 2025 10:56:20 +0800 Subject: [PATCH 55/62] blue yellow code sync Signed-off-by: linan24 --- frameworks/native/backup_ext/include/ext_extension.h | 2 +- interfaces/common/src/sandbox_helper.cpp | 1 - interfaces/innerkits/native/file_uri/include/file_uri.h | 2 +- .../backup_sa/include/module_ipc/svc_backup_connection.h | 2 +- .../backup_sa/src/module_ipc/svc_backup_connection.cpp | 2 +- services/backup_sa/src/module_ipc/svc_session_manager.cpp | 8 +++----- tests/mock/b_radar/include/hisysevent_mock.h | 2 +- tests/mock/module_ipc/include/svc_extension_proxy_mock.h | 2 +- tests/mock/module_ipc/include/svc_session_manager_mock.h | 2 +- tests/mock/module_ipc/svc_extension_proxy_mock.cpp | 2 +- tests/mock/module_ipc/svc_session_manager_mock.cpp | 2 +- tests/mock/module_ipc/svc_session_manager_throw_mock.cpp | 2 +- tests/mock/module_ipc/svc_session_manager_throw_mock.h | 2 +- .../backup_api/backup_impl/include/ext_extension_mock.h | 2 +- tests/unittests/backup_ext/ext_extension_test.cpp | 2 +- tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp | 2 +- utils/include/b_error/b_error.h | 2 +- utils/include/b_filesystem/b_dir.h | 2 +- utils/include/b_filesystem/b_file.h | 2 +- utils/include/b_utils/b_time.h | 2 +- utils/src/b_filesystem/b_dir.cpp | 2 +- utils/src/b_filesystem/b_file.cpp | 2 +- utils/src/b_utils/b_time.cpp | 2 +- 23 files changed, 24 insertions(+), 27 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index ac4246976..51a12dd34 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -384,13 +384,13 @@ private: void OnRestoreExFinish(); void DoBackupStart(); void DoBackupEnd(); + void UpdateTarStat(uint64_t tarFileSize); void CalculateDataSizeTask(const string &config); void DoBackUpTask(const string &config); TarMap convertFileToBigFiles(std::map files); void PreDealExcludes(std::vector &excludes); template map MatchFiles(map files, vector endExcludes); - void UpdateTarStat(uint64_t tarFileSize); void HandleExtDisconnect(bool isAppResultReport, ErrCode errCode); bool HandleGetExtOnRelease(); diff --git a/interfaces/common/src/sandbox_helper.cpp b/interfaces/common/src/sandbox_helper.cpp index d0a2e6f55..f54ee806c 100644 --- a/interfaces/common/src/sandbox_helper.cpp +++ b/interfaces/common/src/sandbox_helper.cpp @@ -537,7 +537,6 @@ bool SandboxHelper::IsValidPath(const std::string &filePath) bool SandboxHelper::CheckValidPath(const std::string &filePath) { if (filePath.empty() || filePath.size() >= PATH_MAX) { - LOGE("filePath is invalid, size = %{public}zu", filePath.size()); return false; } diff --git a/interfaces/innerkits/native/file_uri/include/file_uri.h b/interfaces/innerkits/native/file_uri/include/file_uri.h index 1f8f50410..8ae2f8a11 100644 --- a/interfaces/innerkits/native/file_uri/include/file_uri.h +++ b/interfaces/innerkits/native/file_uri/include/file_uri.h @@ -26,8 +26,8 @@ class FileUri { public: std::string GetName(); std::string GetPath(); - std::string GetRealPathBySA(const std::string &targetBundleName = ""); std::string GetRealPath(); + std::string GetRealPathBySA(const std::string &targetBundleName = ""); std::string ToString(); std::string GetFullDirectoryUri(); bool IsRemoteUri(); 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 305a40b99..3d604992c 100644 --- a/services/backup_sa/include/module_ipc/svc_backup_connection.h +++ b/services/backup_sa/include/module_ipc/svc_backup_connection.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 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 6ca871b1d..1d7804cca 100644 --- a/services/backup_sa/src/module_ipc/svc_backup_connection.cpp +++ b/services/backup_sa/src/module_ipc/svc_backup_connection.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index 07545697b..18af5a9fd 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 @@ -236,7 +236,7 @@ bool SvcSessionManager::OnBundleFileReady(const string &bundleName, const string return true; } } - HILOGD("End, bundleName name is:%{public}s", bundleName.c_str()); + HILOGD("End, bundleName name is:%{private}s", bundleName.c_str()); return false; } @@ -512,7 +512,6 @@ bool SvcSessionManager::GetSchedBundleName(string &bundleName) { unique_lock lock(lock_); if (extConnectNum_ >= BConstants::EXT_CONNECT_MAX_COUNT) { - HILOGE("Sched bundle count is too many"); return false; } @@ -741,7 +740,6 @@ bool SvcSessionManager::IsOnAllBundlesFinished() bool SvcSessionManager::IsOnOnStartSched() { - HILOGI("Begin"); shared_lock lock(lock_); if (!impl_.clientToken) { HILOGE("IsOnOnStartSched error, No caller token was specified"); @@ -750,7 +748,7 @@ bool SvcSessionManager::IsOnOnStartSched() if (impl_.isBackupStart && impl_.backupExtNameMap.size()) { return true; } - HILOGI("End"); + return false; } diff --git a/tests/mock/b_radar/include/hisysevent_mock.h b/tests/mock/b_radar/include/hisysevent_mock.h index c7946085b..37075841d 100644 --- a/tests/mock/b_radar/include/hisysevent_mock.h +++ b/tests/mock/b_radar/include/hisysevent_mock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 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 diff --git a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h index 22a484e0e..e2ee42d9a 100644 --- a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h +++ b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License") = 0; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/tests/mock/module_ipc/include/svc_session_manager_mock.h b/tests/mock/module_ipc/include/svc_session_manager_mock.h index 4c4a3a19b..9588ac367 100644 --- a/tests/mock/module_ipc/include/svc_session_manager_mock.h +++ b/tests/mock/module_ipc/include/svc_session_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License") = 0; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp index 75891ebe2..63d6792fb 100644 --- a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp +++ b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index c1862dc6c..2cc861333 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 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 e144e43d4..1fa56ea3b 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 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 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 f183a662a..8cd651ca7 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 Huawei Device Co., Ltd. + * Copyright (C) 2024-2025 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 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 38411a68e..cf98ed625 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/tests/unittests/backup_ext/ext_extension_test.cpp b/tests/unittests/backup_ext/ext_extension_test.cpp index 4580a54b2..ee3eb4a61 100644 --- a/tests/unittests/backup_ext/ext_extension_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 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 c1bd86ca0..8337ae6a8 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/utils/include/b_error/b_error.h b/utils/include/b_error/b_error.h index bf4fba516..095ee1419 100644 --- a/utils/include/b_error/b_error.h +++ b/utils/include/b_error/b_error.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/utils/include/b_filesystem/b_dir.h b/utils/include/b_filesystem/b_dir.h index c4d89d1c8..9c5f236a0 100644 --- a/utils/include/b_filesystem/b_dir.h +++ b/utils/include/b_filesystem/b_dir.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/utils/include/b_filesystem/b_file.h b/utils/include/b_filesystem/b_file.h index 27fe5ce36..6245c7323 100644 --- a/utils/include/b_filesystem/b_file.h +++ b/utils/include/b_filesystem/b_file.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/utils/include/b_utils/b_time.h b/utils/include/b_utils/b_time.h index 8a995bdf4..a4989a80f 100644 --- a/utils/include/b_utils/b_time.h +++ b/utils/include/b_utils/b_time.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 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 diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index a725c3f09..ca6638f09 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/utils/src/b_filesystem/b_file.cpp b/utils/src/b_filesystem/b_file.cpp index f89e7e4f6..7e8d57e72 100644 --- a/utils/src/b_filesystem/b_file.cpp +++ b/utils/src/b_filesystem/b_file.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 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 diff --git a/utils/src/b_utils/b_time.cpp b/utils/src/b_utils/b_time.cpp index adaa98796..23cd673c2 100644 --- a/utils/src/b_utils/b_time.cpp +++ b/utils/src/b_utils/b_time.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 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 -- Gitee From b4b190fabb1fcc7f96919d58ce50330775a714b9 Mon Sep 17 00:00:00 2001 From: linan24 Date: Fri, 15 Aug 2025 12:26:43 +0800 Subject: [PATCH 56/62] =?UTF-8?q?=E8=93=9D=E9=BB=84=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=9B=9E=E9=80=80=E8=93=9D=E5=8C=BA=E8=BD=AF=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: linan24 --- .../native/backup_ext/include/ext_extension.h | 2 +- .../native/backup_ext/include/untar_file.h | 2 +- .../native/backup_ext/src/ext_extension.cpp | 54 +++++-------------- .../backup_ext/src/sub_ext_extension.cpp | 4 +- utils/include/b_filesystem/b_dir.h | 17 ------ utils/src/b_filesystem/b_dir.cpp | 27 ---------- 6 files changed, 17 insertions(+), 89 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index ac4246976..d210b9c47 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -336,7 +336,7 @@ private: void RestoreBigFiles(bool appendTargetPath); void FillEndFileInfos(const std::string &path, const unordered_map &result); void RestoreBigFileAfter(const string &filePath, const struct stat &sta); - int DealIncreUnPacketResult(const off_t tarFileSize, const std::string &tarFileName, + void DealIncreUnPacketResult(const off_t tarFileSize, const std::string &tarFileName, const std::tuple &result); ErrCode StartOnProcessTaskThread(wptr obj, BackupRestoreScenario scenario); diff --git a/frameworks/native/backup_ext/include/untar_file.h b/frameworks/native/backup_ext/include/untar_file.h index 49eb36e26..ed05bae6c 100644 --- a/frameworks/native/backup_ext/include/untar_file.h +++ b/frameworks/native/backup_ext/include/untar_file.h @@ -18,7 +18,6 @@ #include "tar_file.h" #include "b_json/b_report_entity.h" -#include "b_filesystem/b_dir.h" namespace OHOS::FileManagement::Backup { struct FileStatInfo { @@ -31,6 +30,7 @@ struct FileStatInfo { }; using ErrFileInfo = std::map>; +using EndFileInfo = std::map; const int FIRST_PARAM = 0; const int SECOND_PARAM = 1; diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 7845876e7..65c10b663 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -924,10 +924,6 @@ int BackupExtExtension::DoRestore(const string &fileName, const off_t fileSize) endFileInfos_.merge(fileInfos); errFileInfos_.merge(errInfos); } - if (BDir::CheckAndRmSoftLink(tarName) || BDir::CheckAndRmSoftLink(fileInfos)) { - HILOGE("File soft links are forbidden"); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); - } if (ret != 0) { HILOGE("Failed to untar file = %{public}s, err = %{public}d", tarName.c_str(), ret); return ret; @@ -955,25 +951,23 @@ void BackupExtExtension::GetTarIncludes(const string &tarName, unordered_map &result) { + if (!isDebug_) { + return; + } int err = std::get(result); - EndFileInfo tmpEndInfo = std::get(result); if (!isRpValid_) { if (err != ERR_OK) { endFileInfos_[tarFileName] = tarFileSize; errFileInfos_[tarFileName] = {err}; } + EndFileInfo tmpEndInfo = std::get(result); endFileInfos_.merge(tmpEndInfo); } - if (BDir::CheckAndRmSoftLink(tmpEndInfo)) { - HILOGE("File soft links are forbidden"); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); - } ErrFileInfo tmpErrInfo = std::get(result); errFileInfos_.merge(tmpErrInfo); - return ERR_OK; } int BackupExtExtension::DoIncrementalRestore() @@ -1001,9 +995,9 @@ int BackupExtExtension::DoIncrementalRestore() string tarName = path + item; // 当用户指定fullBackupOnly字段或指定版本的恢复,解压目录当前在/backup/restore - if (!BDir::IsFilePathValid(tarName) || BDir::CheckAndRmSoftLink(tarName)) { + if (!BDir::IsFilePathValid(tarName)) { HILOGE("Check incre tarfile path : %{public}s err, path is forbidden", GetAnonyPath(tarName).c_str()); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); + return ERR_INVALID_VALUE; } unordered_map result; GetTarIncludes(tarName, result); @@ -1016,9 +1010,7 @@ int BackupExtExtension::DoIncrementalRestore() std::tuple unPacketRes = UntarFile::GetInstance().IncrementalUnPacket(tarName, path, result); err = std::get(unPacketRes); - if (int tmpErr = DealIncreUnPacketResult(tarFileSize, item, unPacketRes); tmpErr != ERR_OK) { - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); - } + DealIncreUnPacketResult(tarFileSize, item, unPacketRes); HILOGI("Application recovered successfully, package path is %{public}s", tarName.c_str()); DeleteBackupIncrementalTars(tarName); } @@ -1096,13 +1088,6 @@ void BackupExtExtension::RestoreBigFilesForSpecialCloneCloud(const ExtManageInfo if (!BDir::IsFilePathValid(fileName)) { HILOGE("Check big special file path : %{public}s err, path is forbidden", GetAnonyPath(fileName).c_str()); errFileInfos_[fileName].emplace_back(DEFAULT_INVAL_VALUE); - if (!RemoveFile(fileName)) { - HILOGE("Failed to delete the backup bigFile %{public}s", GetAnonyPath(fileName).c_str()); - } - return; - } - if (BDir::CheckAndRmSoftLink(fileName)) { - HILOGE("File soft links are forbidden"); return; } if (chmod(fileName.c_str(), sta.st_mode) != 0) { @@ -1141,10 +1126,6 @@ ErrCode BackupExtExtension::RestoreTarForSpecialCloneCloud(const ExtManageInfo & HILOGE("Check spec tarfile hash path : %{public}s err, path is forbidden", GetAnonyPath(tarName).c_str()); return ERR_INVALID_VALUE; } - if (BDir::CheckAndRmSoftLink(tarName)) { - HILOGE("File soft links are forbidden"); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); - } if (!BDir::IsFilePathValid(untarPath)) { HILOGE("Check spec tarfile path : %{public}s err, path is forbidden", GetAnonyPath(untarPath).c_str()); return ERR_INVALID_VALUE; @@ -1155,18 +1136,18 @@ ErrCode BackupExtExtension::RestoreTarForSpecialCloneCloud(const ExtManageInfo & } auto [err, fileInfos, errInfos] = UntarFile::GetInstance().UnPacket(tarName, untarPath); if (isDebug_) { + if (err != 0) { + endFileInfos_[tarName] = item.sta.st_size; + errFileInfos_[tarName] = { err }; + } endFileInfos_.merge(fileInfos); errFileInfos_.merge(errInfos); } - if (BDir::CheckAndRmSoftLink(fileInfos)) { - HILOGE("File soft links are forbidden"); - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); - } - DeleteBackupIncrementalTars(tarName); if (err != ERR_OK) { HILOGE("Failed to untar file = %{public}s, err = %{public}d", tarName.c_str(), err); return err; } + DeleteBackupIncrementalTars(tarName); return ERR_OK; } @@ -1380,10 +1361,6 @@ void BackupExtExtension::RestoreOneBigFile(const std::string &path, HILOGE("Check big file path : %{public}s err, path is forbidden", GetAnonyPath(filePath).c_str()); return; } - if (BDir::CheckAndRmSoftLink(fileName)) { - HILOGE("File soft links are forbidden"); - return; - } if (isDebug_) { endFileInfos_[filePath] = item.sta.st_size; } @@ -1396,10 +1373,7 @@ void BackupExtExtension::RestoreOneBigFile(const std::string &path, HILOGE("failed to move the file. err = %{public}d", errno); return; } - if (BDir::CheckAndRmSoftLink(filePath)) { - HILOGE("File soft links are forbidden"); - return; - } + RestoreBigFileAfter(filePath, item.sta); } diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index ff18af6c1..cb1bd5b5c 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -1516,9 +1516,7 @@ ErrCode BackupExtExtension::CloudSpecialRestore(string tarName, string untarPath auto unPacketRes = UntarFile::GetInstance().IncrementalUnPacket(tarName, untarPath, result); ErrCode err = ERR_OK; err = std::get(unPacketRes); - if (int tmpErr = DealIncreUnPacketResult(tarFileSize, tarName, unPacketRes); tmpErr != ERR_OK) { - return BError(BError::Codes::EXT_FORBID_BACKUP_RESTORE).GetCode(); - } + DealIncreUnPacketResult(tarFileSize, tarName, unPacketRes); HILOGI("Application recovered successfully, package path is %{public}s", tarName.c_str()); DeleteBackupIncrementalTars(tarName); return err; diff --git a/utils/include/b_filesystem/b_dir.h b/utils/include/b_filesystem/b_dir.h index c4d89d1c8..bb5b12e04 100644 --- a/utils/include/b_filesystem/b_dir.h +++ b/utils/include/b_filesystem/b_dir.h @@ -32,7 +32,6 @@ #include "errors.h" namespace OHOS::FileManagement::Backup { -using EndFileInfo = std::map; class BDir { public: /** @@ -103,22 +102,6 @@ public: */ static bool IsFilePathValid(const std::string &filePath); - /** - * @brief 核实文件是否存在软链接并删除 - * - * @param filePath 待核实的路径 - * @return 是否存在软连接 - */ - static bool CheckAndRmSoftLink(const std::string &filePath); - - /** - * @brief 核实文件是否存在软链接并删除 - * - * @param filePaths 待核实的路径集合 - * @return 是否存在软连接 - */ - static bool CheckAndRmSoftLink(const EndFileInfo &filePaths); - /** * @brief 判断目录列表是否包含路径 */ diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index a725c3f09..7e89517c7 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -532,33 +532,6 @@ bool BDir::IsFilePathValid(const std::string &filePath) return AppFileService::SandboxHelper::IsValidPath(filePath); } -bool BDir::CheckAndRmSoftLink(const std::string &filePath) -{ - if (std::filesystem::is_symlink(filePath)) { - HILOGE("Soft link is not allowed, path = %{public}s", GetAnonyPath(filePath).c_str()); - if (unlink(filePath.c_str()) < 0) { - HILOGE("Failed to unlink the backup file : %{public}s", GetAnonyPath(filePath).c_str()); - } - return true; - } - return false; -} - -bool BDir::CheckAndRmSoftLink(const EndFileInfo &filePaths) -{ - bool isSoftLink = false; - for (const auto &it : filePaths) { - if (std::filesystem::is_symlink(it.first)) { - HILOGE("Soft link is not allowed, path = %{public}s", GetAnonyPath(it.first).c_str()); - isSoftLink = true; - if (unlink(it.first.c_str()) < 0) { - HILOGE("Failed to unlink the backup file : %{public}s", GetAnonyPath(it.first).c_str()); - } - } - } - return isSoftLink; -} - bool BDir::IsDirsMatch(const vector &excludePaths, const string &path) { if (path.empty()) { -- Gitee From 408086b5370f54258d26afe8fb5aa2b044d3dbf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Fri, 15 Aug 2025 15:28:09 +0800 Subject: [PATCH 57/62] blue only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../native/backup_ext/src/ext_extension.cpp | 10 +- .../backup_ext/src/sub_ext_extension.cpp | 4 +- .../kits/ndk/fileshare/src/oh_file_share.cpp | 2 +- services/backup_sa/src/module_ipc/service.cpp | 3 +- .../src/module_ipc/service_incremental.cpp | 5 +- .../backup_sa/src/module_ipc/sub_service.cpp | 23 - .../module_ipc/svc_restore_deps_manager.cpp | 2 +- .../backup_ext/include/ext_backup_js_mock.h | 3 - tests/mock/module_ipc/service_mock.cpp | 4 +- tests/unittests/backup_sa/BUILD.gn | 1 - .../backup_sa/module_client/BUILD.gn | 86 ---- .../module_client/service_client_test.cpp | 405 ------------------ .../module_external/bms_adapter_test.cpp | 1 - tests/unittests/backup_sa/module_ipc/BUILD.gn | 3 + .../module_ipc/service_other_test.cpp | 5 +- .../module_ipc/service_stub_test.cpp | 6 +- .../backup_sa/module_ipc/service_test.cpp | 6 +- .../backup_sa/module_ipc/sub_service_test.cpp | 3 +- .../b_utils/scan_file_singleton_test.cpp | 24 +- utils/include/b_radar/radar_const.h | 2 +- utils/include/b_utils/scan_file_singleton.h | 4 +- 21 files changed, 43 insertions(+), 559 deletions(-) delete mode 100644 tests/unittests/backup_sa/module_client/BUILD.gn delete mode 100644 tests/unittests/backup_sa/module_client/service_client_test.cpp diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 7845876e7..13608ef7c 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -854,7 +854,7 @@ tuple BackupExtExtension::CalculateDataSize(const B // 扫描文件计算数据量 tie(bigFileInfo, smallFiles) = GetFileInfos(includes, excludes); - ScanFileSingleton::GetInstance().SetCompeletedFlag(true); + ScanFileSingleton::GetInstance().SetCompletedFlag(true); appStatistic_->smallFileCount_ = smallFiles.size(); appStatistic_->bigFileCount_ = bigFileInfo.size(); for (const auto &item : bigFileInfo) { @@ -1039,11 +1039,11 @@ void BackupExtExtension::AsyncTaskBackup(const string config) ptr->CalculateDataSizeTask(config); } catch (const BError &e) { HILOGE("extension: AsyncTaskBackup error, err code:%{public}d", e.GetCode()); - ScanFileSingleton::GetInstance().SetCompeletedFlag(true); + ScanFileSingleton::GetInstance().SetCompletedFlag(true); ptr->AppDone(e.GetCode()); } catch (...) { HILOGE("Failed to restore the ext bundle"); - ScanFileSingleton::GetInstance().SetCompeletedFlag(true); + ScanFileSingleton::GetInstance().SetCompletedFlag(true); ptr->AppDone(BError(BError::Codes::EXT_INVAL_ARG).GetCode()); } }; @@ -1066,11 +1066,11 @@ void BackupExtExtension::AsyncTaskBackup(const string config) ptr->DoBackUpTask(config); } catch (const BError &e) { HILOGE("extension: AsyncTaskBackup error, err code:%{public}d", e.GetCode()); - ScanFileSingleton::GetInstance().SetCompeletedFlag(false); + ScanFileSingleton::GetInstance().SetCompletedFlag(false); ptr->AppDone(e.GetCode()); } catch (...) { HILOGE("Failed to restore the ext bundle"); - ScanFileSingleton::GetInstance().SetCompeletedFlag(false); + ScanFileSingleton::GetInstance().SetCompletedFlag(false); ptr->AppDone(BError(BError::Codes::EXT_INVAL_ARG).GetCode()); } ptr->DoClear(); diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index ff18af6c1..27ccb5dfb 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -1592,7 +1592,7 @@ void BackupExtExtension::DoBackUpTask(const string &config) int ret = 0; TarMap fileBackupedInfo; - while (!ScanFileSingleton::GetInstance().GetCompeletedFlag()) { + while (!ScanFileSingleton::GetInstance().GetCompletedFlag()) { ScanFileSingleton::GetInstance().WaitForFiles(); std::map incFiles = ScanFileSingleton::GetInstance().GetAllBigFiles(); if (incFiles.empty()) { @@ -1615,7 +1615,7 @@ void BackupExtExtension::DoBackUpTask(const string &config) ret = DoBackup(bigFileInfo, fileBackupedInfo, smallFiles, includeSize, excludeSize); DoBackupEnd(); - ScanFileSingleton::GetInstance().SetCompeletedFlag(false); + ScanFileSingleton::GetInstance().SetCompletedFlag(false); AppDone(ret); HILOGI("backup app done %{public}d", ret); } diff --git a/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp b/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp index 019f6a598..21449436c 100644 --- a/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp +++ b/interfaces/kits/ndk/fileshare/src/oh_file_share.cpp @@ -94,7 +94,7 @@ static bool ConvertPolicyErrorResult(const std::deque &remote) .activeTime = TimeUtils::GetCurrentTime(), }); if (ret == ERR_OK) { + HILOGE("Success to init a new restore session"); ClearFailedBundles(); successBundlesNum_ = 0; ClearBundleRadarReport(); @@ -523,6 +524,7 @@ ErrCode Service::InitBackupSession(const sptr &remote) .activeTime = TimeUtils::GetCurrentTime(), }); if (ret == ERR_OK) { + HILOGE("Success to init a new backup session"); ClearFailedBundles(); successBundlesNum_ = 0; ClearBundleRadarReport(); @@ -977,7 +979,6 @@ ErrCode Service::ServiceResultReport(const std::string& restoreRetInfo, BackupRe { string callerName; HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - UpdateHandleCnt(errCode); try { ErrCode ret = VerifyCallerAndGetCallerName(callerName); if (ret != ERR_OK) { diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 60a1838e3..60530df5f 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -348,10 +348,10 @@ ErrCode Service::InitIncrementalBackupSession(const sptr& remot } totalStatistic_->Report("InitIncrementalBackupSession", MODULE_INIT, errCode); if (errCode == BError(BError::Codes::SA_SESSION_CONFLICT)) { - HILOGE("Active restore session error, Already have a session"); + HILOGE("Active incremental backup error, Already have a session"); return errCode; } - HILOGE("Active restore session error"); + HILOGE("Active backup session error"); StopAll(nullptr, true); return errCode; } @@ -759,6 +759,7 @@ ErrCode Service::GetIncrementalFileHandle(const std::string &bundleName, const s { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { + HILOGE("GetIncrementalFileHandle error, session is empty"); if (session_ == nullptr) { HILOGE("GetIncrementalFileHandle error, session is empty"); return BError(BError::Codes::SA_INVAL_ARG); diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 57f6e9eb5..0875d71e7 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -1064,29 +1064,6 @@ UniqueFd Service::GetLocalCapabilitiesForBundleInfos() } } -void Service::CallOnBundleEndByScenario(const std::string &bundleName, BackupRestoreScenario scenario, ErrCode errCode) -{ - if (session_ == nullptr) { - HILOGE("Session is empty, bundleName:%{public}s", bundleName.c_str()); - return; - } - HILOGI("Begin"); - try { - if (scenario == BackupRestoreScenario::FULL_RESTORE) { - session_->GetServiceReverseProxy()->RestoreOnBundleFinished(errCode, bundleName); - } else if (scenario == BackupRestoreScenario::INCREMENTAL_RESTORE) { - session_->GetServiceReverseProxy()->IncrementalRestoreOnBundleFinished(errCode, bundleName); - } else if (scenario == BackupRestoreScenario::FULL_BACKUP) { - session_->GetServiceReverseProxy()->BackupOnBundleFinished(errCode, bundleName); - } else if (scenario == BackupRestoreScenario::INCREMENTAL_BACKUP) { - session_->GetServiceReverseProxy()->IncrementalBackupOnBundleFinished(errCode, bundleName); - } - } catch (const BError &e) { - HILOGE("Call onBundleFinished error, client is died"); - return; - } -} - ErrCode Service::GetBackupDataSize(bool isPreciseScan, const std::vector& bundleNameList) { try { 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 681821422..10932eb32 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 @@ -33,7 +33,7 @@ vector SvcRestoreDepsManager::GetRestoreBundleNames(const vector, int32_t)); MOCK_METHOD((std::function &argv)>), ParseReleaseInfo, ()); - MOCK_METHOD(ErrCode, GetBackupCompatibilityInfo, (std::function, std::string)); - MOCK_METHOD(ErrCode, GetRestoreCompatibilityInfo, (std::function, std::string)); - MOCK_METHOD((std::function &argv)>), ParseCompatibilityInfo, ()); public: MOCK_METHOD(bool, GetProfileFromAbility, (const OHOS::AppExecFwk::AbilityInfo&, const std::string&, std::vector&), (const)); diff --git a/tests/mock/module_ipc/service_mock.cpp b/tests/mock/module_ipc/service_mock.cpp index c07e58304..735762b18 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -387,14 +387,14 @@ void Service::CreateDirIfNotExist(const std::string &path) { } -void Service::StartRunningTimer(const std::string &bundleName) {} - std::vector Service::GetSupportBackupBundleNames(vector&, bool, const vector&) { return {}; } +void Service::StartRunningTimer(const std::string &bundleName) {} + void Service::HandleNotSupportBundleNames(const vector&, vector&, bool) {} void Service::SetBundleIncDataInfo(const std::vector&, std::vector&) {} diff --git a/tests/unittests/backup_sa/BUILD.gn b/tests/unittests/backup_sa/BUILD.gn index b552944b3..5351c84bd 100644 --- a/tests/unittests/backup_sa/BUILD.gn +++ b/tests/unittests/backup_sa/BUILD.gn @@ -19,7 +19,6 @@ group("backup_sa_test") { deps = [ "module_app_gallery:app_gallery_test", - "module_client:service_client_test", "module_external:adapter_test", "module_ipc:backup_sa_ipc_test", "session:session_test", diff --git a/tests/unittests/backup_sa/module_client/BUILD.gn b/tests/unittests/backup_sa/module_client/BUILD.gn deleted file mode 100644 index 47a26fff8..000000000 --- a/tests/unittests/backup_sa/module_client/BUILD.gn +++ /dev/null @@ -1,86 +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. - -import("//build/test.gni") -import("//foundation/filemanagement/app_file_service/app_file_service.gni") -import("//foundation/filemanagement/app_file_service/backup.gni") - -ohos_unittest("service_client_test") { - module_out_path = path_module_out_tests - - include_dirs = [ - "${path_backup}/frameworks/native/backup_kit_inner/include", - "${path_backup}/interfaces/inner_api/native/backup_kit_inner/impl", - "${path_backup}/services/backup_sa/include", - "${path_backup}/services/backup_sa/include/module_notify", - "${path_backup}/utils/include", - "${path_backup}/utils/src", - "${path_backup}/tests/mock/utils_mock/include", - ".", - ] - - sources = [ - "${path_backup}/tests/mock/utils_mock/src/utils_mock_global_variable.cpp", - "service_client_test.cpp", - ] - - deps = [ - "${path_backup}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", - "${path_backup}/services/backup_sa:backup_sa_ipc_stub", - "${path_backup}/utils:backup_utils", - ] - - sanitize = { - integer_overflow = true - ubsan = true - boundary_sanitize = true - cfi = true - cfi_cross_dso = true - debug = false - } - - defines = [ - "LOG_TAG=\"app_file_service\"", - "LOG_DOMAIN=0xD200000", - "private = public", - "protected = public", - ] - - external_deps = [ - "ability_base:want", - "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", - "common_event_service:cesfwk_innerkits", - "googletest:gmock_main", - "googletest:gtest_main", - "hilog:libhilog", - "hitrace:hitrace_meter", - "ipc:ipc_core", - "jsoncpp:jsoncpp", - "safwk:system_ability_fwk", - "samgr:samgr_proxy", - "storage_service:storage_manager_sa_proxy", - ] - - use_exceptions = true -} - -group("backup_sa_service_client_test") { - testonly = true - deps = [ ":service_client_test" ] -} diff --git a/tests/unittests/backup_sa/module_client/service_client_test.cpp b/tests/unittests/backup_sa/module_client/service_client_test.cpp deleted file mode 100644 index ce840db00..000000000 --- a/tests/unittests/backup_sa/module_client/service_client_test.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/* - * 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 - * - * 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 "b_error/b_error.h" -#include "service_client.h" -#include "service_reverse.h" -#include "b_session_restore.h" - -namespace OHOS::FileManagement::Backup { -using namespace std; -using namespace testing; - -class ServiceClientTest : public testing::Test { -public: - static void SetUpTestCase(void); - static void TearDownTestCase(); - void SetUp() override {}; - void TearDown() override {}; - -public: - static inline sptr proxy = nullptr; -}; - -void ServiceClientTest::SetUpTestCase() -{ - GTEST_LOG_(INFO) << "begin SetUpTestCase"; - proxy = ServiceClient::GetInstance(); - if (proxy == nullptr) { - GTEST_LOG_(INFO) << "Failed to get ServiceClient instance"; - } -} - -void ServiceClientTest::TearDownTestCase() -{ - if (proxy != nullptr) { - ServiceClient::InvaildInstance(); - proxy = nullptr; - } - ServiceClient::InvaildInstance(); -} - -/** - * @tc.number: SUB_service_client_test_0100 - * @tc.name: SUB_service_client_test_0100 - * @tc.desc: 测试 InitIncrementalBackupSession 接口 - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: issuesI9KPRL - */ -HWTEST_F(ServiceClientTest, SUB_service_client_test_0100, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0100"; - EXPECT_NE(proxy, nullptr); - ServiceClient::InvaildInstance(); - proxy=ServiceClient::serviceProxy_; - EXPECT_EQ(proxy, nullptr); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0100"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0200, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0200"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - ErrCode ret = proxy->Start(); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_PERM)); - ret = proxy->Finish(); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_PERM)); - ret = proxy->Release(); - EXPECT_NE(ret, BError(BError::BackupErrorCode::E_PERM)); - ret = proxy->GetAppLocalListAndDoIncrementalBackup(); - EXPECT_NE(ret, BError(BError::Codes::OK)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0200"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0300, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0300"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - std::string bundleName; - int32_t result = -1; - bundleName = "test"; - proxy->CancelForResult(bundleName, result); - EXPECT_EQ(result, 0); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0300"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0400, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0400"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - ErrCode err = -1; - ErrCode ret = proxy->AppIncrementalDone(err); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - err = 0; - ret = proxy->AppIncrementalDone(err); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - err = 1; - ret = proxy->AppIncrementalDone(err); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0400"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0500, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0500"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - ErrCode err = -1; - ErrCode ret = proxy->AppDone(err); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - err = 0; - ret = proxy->AppDone(err); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - err = 1; - ret = proxy->AppDone(err); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0500"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0600, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0600"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - int fd = -1; - ErrCode ret = proxy->GetLocalCapabilities(fd); - EXPECT_EQ(ret, BError(BError::Codes::OK)); - fd = -2; - ret = proxy->GetLocalCapabilitiesForBundleInfos(fd); - EXPECT_EQ(ret, BError(BError::Codes::OK)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0600"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0700, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0700"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - std::string bundleName; - std::string fileName; - ErrCode ret = proxy->GetIncrementalFileHandle(bundleName, fileName); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - bundleName = ""; - fileName = ""; - ret = proxy->GetIncrementalFileHandle(bundleName, fileName); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - bundleName = "test"; - fileName = "test"; - ret = proxy->GetIncrementalFileHandle(bundleName, fileName); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0700"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0800, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0800"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - std::string bundleName; - std::string fileName; - bool booleanValue = false; - ErrCode ret = proxy->GetBackupInfo(bundleName, fileName); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_BEF)); - EXPECT_EQ(bundleName, ""); - EXPECT_EQ(fileName, ""); - booleanValue = true; - ret = proxy->StartExtTimer(booleanValue); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - booleanValue = false; - ret = proxy->StartExtTimer(booleanValue); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - booleanValue = true; - ret = proxy->StartFwkTimer(booleanValue); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - booleanValue = false; - ret = proxy->StartFwkTimer(booleanValue); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - booleanValue = true; - ret = proxy->StopExtTimer(booleanValue); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - booleanValue = false; - ret = proxy->StopExtTimer(booleanValue); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - bool isExt = true; - bundleName = ""; - ret = proxy->UpdateTimer(bundleName, 0, isExt); - EXPECT_NE(ret, BError(BError::BackupErrorCode::E_INVAL)); - EXPECT_EQ(isExt, false); - bundleName = "test"; - ret = proxy->UpdateTimer(bundleName, 10, isExt); - EXPECT_EQ(ret, BError(BError::Codes::OK)); - EXPECT_EQ(isExt, false); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0800"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_0900, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_0900"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - std::string stringVal = ""; - ErrCode ret = proxy->ReportAppProcessInfo(stringVal, BackupRestoreScenario::FULL_BACKUP); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - stringVal = ""; - ret = proxy->ReportAppProcessInfo(stringVal, BackupRestoreScenario::FULL_BACKUP); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - stringVal = "test"; - ret = proxy->ReportAppProcessInfo(stringVal, BackupRestoreScenario::FULL_BACKUP); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - int64_t val = -1; - ret = proxy->RefreshDataSize(val); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - val = 1; - ret = proxy->RefreshDataSize(val); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - stringVal = ""; - ret = proxy->ServiceResultReport(stringVal, BackupRestoreScenario::FULL_BACKUP, 0); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - stringVal = ""; - ret = proxy->ServiceResultReport(stringVal, BackupRestoreScenario::FULL_BACKUP, 0); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_0900"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_1000, testing::ext::TestSize.Level1) -{ - std::string bundleName = ""; - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_1000"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - BFileInfo *fileInfo = nullptr; - BFileInfo bf {bundleName, "", 0}; - fileInfo = &bf; - ErrCode ret = proxy->PublishFile(*fileInfo); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->PublishIncrementalFile(*fileInfo); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->PublishSAIncrementalFile(*fileInfo, 0); - EXPECT_NE(ret, BError(BError::Codes::OK)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_1000"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_1100, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_1100"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - int fd = 0; - int32_t restoreType = -1; - int32_t userid = -1; - std::vector bundleNames; - std::vector detailInfos; - std::vector bundlesToBackup; - ErrCode ret = proxy->AppendBundlesRestoreSessionDataByDetail(fd, bundleNames, detailInfos, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesRestoreSessionData(fd, bundleNames, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesIncrementalBackupSessionWithBundleInfos(bundlesToBackup, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - ret = proxy->AppendBundlesBackupSession(bundleNames); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - ret = proxy->AppendBundlesDetailsBackupSession(bundleNames, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - bundleNames.push_back("test"); - ret = proxy->AppendBundlesRestoreSessionDataByDetail(fd, bundleNames, detailInfos, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesRestoreSessionData(fd, bundleNames, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesIncrementalBackupSessionWithBundleInfos(bundlesToBackup, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - ret = proxy->AppendBundlesBackupSession(bundleNames); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - ret = proxy->AppendBundlesDetailsBackupSession(bundleNames, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - detailInfos.push_back("test"); - ret = proxy->AppendBundlesRestoreSessionDataByDetail(fd, bundleNames, detailInfos, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesRestoreSessionData(fd, bundleNames, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesIncrementalBackupSessionWithBundleInfos(bundlesToBackup, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - ret = proxy->AppendBundlesDetailsBackupSession(bundleNames, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - restoreType = 1; - userid = 1; - ret = proxy->AppendBundlesRestoreSessionDataByDetail(fd, bundleNames, detailInfos, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesRestoreSessionData(fd, bundleNames, restoreType, userid); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppendBundlesIncrementalBackupSessionWithBundleInfos(bundlesToBackup, detailInfos); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_1100"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_1200, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_1200"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - sptr srptr = nullptr; - ErrCode ret = proxy->InitRestoreSession(srptr); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->InitBackupSession(srptr); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->InitIncrementalBackupSession(srptr); - EXPECT_NE(ret, BError(BError::Codes::OK)); - std::string errMsg = ""; - std::string result = "err"; - proxy->InitRestoreSessionWithErrMsg(srptr, ret, errMsg); - EXPECT_NE(ret, BError(BError::Codes::OK)); - proxy->InitBackupSessionWithErrMsg(srptr, ret, errMsg); - EXPECT_NE(ret, BError(BError::Codes::OK)); - proxy->InitIncrementalBackupSessionWithErrMsg(srptr, ret, errMsg); - EXPECT_NE(ret, BError(BError::Codes::OK)); - BSessionRestore::Callbacks callback; - srptr = sptr(new ServiceReverse(callback)); - ret = proxy->InitRestoreSession(srptr); - EXPECT_EQ(ret, BError(BError::Codes::OK)); - ret = proxy->InitBackupSession(srptr); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_CONFLICT)); - ret = proxy->InitIncrementalBackupSession(srptr); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_CONFLICT)); - - proxy->InitRestoreSessionWithErrMsg(srptr, ret, errMsg); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_CONFLICT)); - EXPECT_NE(errMsg, ""); - proxy->InitBackupSessionWithErrMsg(srptr, ret, errMsg); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_CONFLICT)); - EXPECT_NE(errMsg, ""); - proxy->InitIncrementalBackupSessionWithErrMsg(srptr, ret, errMsg); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_CONFLICT)); - EXPECT_NE(errMsg, ""); - - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_1200"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_1300, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_1300"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_1300"; -} - -HWTEST_F(ServiceClientTest, SUB_service_client_test_1400, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ServiceClientTest-begin SUB_service_client_test_1400"; - proxy = ServiceClient::GetInstance(); - EXPECT_NE(proxy, nullptr); - std::string bundleName; - std::string fileName; - bool isExt = true; - bundleName = ""; - ErrCode ret = proxy->UpdateSendRate(bundleName, 0, isExt); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - EXPECT_TRUE(isExt); - bundleName = "test"; - ret = proxy->UpdateSendRate(bundleName, 10, isExt); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - EXPECT_TRUE(isExt); - bundleName = ""; - ret = proxy->AppIncrementalFileReady(bundleName, 0, 0, 0); - EXPECT_NE(ret, BError(BError::Codes::OK)); - bundleName = "test"; - ret = proxy->AppIncrementalFileReady(bundleName, 1, 1, 0); - EXPECT_EQ(ret, BError(BError::BackupErrorCode::E_INVAL)); - fileName = ""; - ret = proxy->AppFileReady(fileName, 0, 0); - EXPECT_NE(ret, BError(BError::Codes::OK)); - fileName = "name"; - ret = proxy->AppFileReady(fileName, -1, 0); - EXPECT_NE(ret, BError(BError::Codes::OK)); - ret = proxy->AppFileReady(fileName, 0, 0); - EXPECT_NE(ret, BError(BError::BackupErrorCode::E_INVAL)); - bundleName = ""; - fileName = ""; - ret = proxy->GetFileHandle(bundleName, fileName); - EXPECT_EQ(ret, BError(BError::Codes::OK)); - EXPECT_EQ(fileName, ""); - bundleName = "test"; - ret = proxy->GetFileHandle(bundleName, fileName); - EXPECT_EQ(ret, BError(BError::Codes::OK)); - EXPECT_EQ(fileName, ""); - GTEST_LOG_(INFO) << "ServiceClientTest-end SUB_service_client_test_1400"; -} -} // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp b/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp index a8967a828..58d25582d 100644 --- a/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp +++ b/tests/unittests/backup_sa/module_external/bms_adapter_test.cpp @@ -69,7 +69,6 @@ public: MOCK_METHOD(int32_t, GetExtensionRunningSaList, (const std::string&, (std::vector>&))); MOCK_METHOD(int32_t, GetRunningSaExtensionInfoList, (const std::string&, (std::vector&))); MOCK_METHOD(int32_t, GetCommonEventExtraDataIdlist, (int32_t, (std::vector&), const std::string&)); - MOCK_METHOD((sptr), GetLocalAbilityManagerProxy, (int32_t)); }; class BundleMgrMock : public IRemoteStub { diff --git a/tests/unittests/backup_sa/module_ipc/BUILD.gn b/tests/unittests/backup_sa/module_ipc/BUILD.gn index bc4f9bd3b..afeed10d2 100644 --- a/tests/unittests/backup_sa/module_ipc/BUILD.gn +++ b/tests/unittests/backup_sa/module_ipc/BUILD.gn @@ -61,6 +61,7 @@ ohos_unittest("module_ipc_test") { ] sanitize = { + integer_overflow = true cfi = true cfi_cross_dso = true debug = false @@ -139,6 +140,7 @@ ohos_unittest("backup_service_test") { ] sanitize = { + integer_overflow = true cfi = true cfi_cross_dso = true debug = false @@ -348,6 +350,7 @@ ohos_unittest("backup_service_scheduler_test") { ] sanitize = { + integer_overflow = true cfi = true cfi_cross_dso = true debug = false 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 c99367281..a1253d5ea 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -1244,7 +1244,7 @@ HWTEST_F(ServiceTest, SUB_Service_PublishFile_0100, TestSize.Level1) EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); - EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); + EXPECT_CALL(*skeleton, GetCallingUid()).WillRepeatedly(Return(BConstants::SYSTEM_UID)); EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, PublishFile(_)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); @@ -1317,6 +1317,7 @@ HWTEST_F(ServiceTest, SUB_Service_AppDone_0200, TestSize.Level1) auto ret = service->AppDone(errCode); EXPECT_EQ(ret, BError(BError::Codes::OK)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); @@ -1547,7 +1548,7 @@ HWTEST_F(ServiceTest, SUB_Service_AppendBundlesClearSession_0000, TestSize.Level info.name = "bundleNames"; info.appIndex = 0; bundleInfos.push_back(info); - EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); + EXPECT_CALL(*session, GetSessionUserId()).WillRepeatedly(Return(0)); EXPECT_CALL(*bms, GetBundleInfos(_, _)).WillOnce(Return(bundleInfos)); EXPECT_CALL(*session, IsOnOnStartSched()).WillOnce(Return(false)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")) 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 db4f1931e..160351ddf 100644 --- a/tests/unittests/backup_sa/module_ipc/service_stub_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_stub_test.cpp @@ -56,10 +56,8 @@ public: MOCK_METHOD3(ServiceResultReport, ErrCode(const string restoreRetInfo, BackupRestoreScenario scenario, ErrCode errCode)); MOCK_METHOD2(GetFileHandle, ErrCode(const string &bundleName, const string &fileName)); - MOCK_METHOD5( - AppendBundlesRestoreSession, - ErrCode(UniqueFd fd, const std::vector &bundleNames, const std::vector &detailInfos, - RestoreTypeEnum restoreType, int32_t userId)); + MOCK_METHOD5(AppendBundlesRestoreSession, ErrCode(UniqueFd fd, const std::vector &bundleNames, + const std::vector &detailInfos, RestoreTypeEnum restoreType, int32_t userId)); MOCK_METHOD4( AppendBundlesRestoreSession, ErrCode(UniqueFd fd, const std::vector &bundleNames, RestoreTypeEnum restoreType, int32_t userId)); diff --git a/tests/unittests/backup_sa/module_ipc/service_test.cpp b/tests/unittests/backup_sa/module_ipc/service_test.cpp index d47502656..f51d1fc6f 100644 --- a/tests/unittests/backup_sa/module_ipc/service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_test.cpp @@ -888,8 +888,7 @@ HWTEST_F(ServiceTest, SUB_Service_ExtStart_0101, testing::ext::TestSize.Level1) BackupExtInfo extInfo {}; auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; auto callConnected = [](const string &&bundleName) {}; - string bundleNameIndexInfo = "123456789"; - extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, bundleNameIndexInfo)); + extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, BUNDLE_NAME)); extInfo.backUpConnection->backupProxy_ = nullptr; impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; impl_.scenario = IServiceReverseType::Scenario::UNDEFINED; @@ -2051,8 +2050,7 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0100, testing::ext::TestSize.Le BackupExtInfo extInfo {}; auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; auto callConnected = [](const string &&bundleName) {}; - string bundleNameIndexInfo = "123456789"; - extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, bundleNameIndexInfo)); + extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, BUNDLE_NAME)); impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; impl_.scenario = IServiceReverseType::Scenario::RESTORE; EXPECT_TRUE(servicePtr_ != nullptr); diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index cb6051d3f..4d11a9489 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -2306,12 +2306,13 @@ HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0200, testing::ext::TestS res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); - EXPECT_CALL(*session, GetScenario()).WillRepeatedly(Return(IServiceReverseType::Scenario::RESTORE)); + EXPECT_CALL(*svcProxy, HandleGetCompatibilityInfo(_, _, _)) .WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); + EXPECT_CALL(*session, GetScenario()).WillRepeatedly(Return(IServiceReverseType::Scenario::RESTORE)); EXPECT_CALL(*svcProxy, HandleGetCompatibilityInfo(_, _, _)) .WillOnce(Return(BError(BError::Codes::OK).GetCode())); res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); diff --git a/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp b/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp index c759c1f44..c8f3f4fe0 100644 --- a/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp +++ b/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp @@ -76,28 +76,28 @@ HWTEST_F(ScanFileSingletonTest, scan_file_singleton_GetAllBigfiles_0100, testing /** * @brief 测试设置和获取完成标志 - * @tc.number: SUB_scan_file_singleton_SetGetCompeletedFlag_0100 - * @tc.name: scan_file_singleton_SetGetCompeletedFlag_0100 - * @tc.desc: 测试ScanFileSingleton的SetCompeletedFlag和GetCompeletedFlag方法是否能正确设置和获取完成标志 + * @tc.number: SUB_scan_file_singleton_SetGetCompletedFlag_0100 + * @tc.name: scan_file_singleton_SetGetCompletedFlag_0100 + * @tc.desc: 测试ScanFileSingleton的SetCompletedFlag和GetCompletedFlag方法是否能正确设置和获取完成标志 * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 1 */ -HWTEST_F(ScanFileSingletonTest, scan_file_singleton_SetGetCompeletedFlag_0100, testing::ext::TestSize.Level1) +HWTEST_F(ScanFileSingletonTest, scan_file_singleton_SetGetCompletedFlag_0100, testing::ext::TestSize.Level1) { auto& instance = ScanFileSingleton::GetInstance(); - instance.SetCompeletedFlag(true); - EXPECT_TRUE(instance.GetCompeletedFlag()) << "The completed flag should be true."; + instance.SetCompletedFlag(true); + EXPECT_TRUE(instance.GetCompletedFlag()) << "The completed flag should be true."; - instance.SetCompeletedFlag(false); - EXPECT_FALSE(instance.GetCompeletedFlag()) << "The completed flag should be false."; + instance.SetCompletedFlag(false); + EXPECT_FALSE(instance.GetCompletedFlag()) << "The completed flag should be false."; } /** * @brief 测试添加和获取小文件信息 * @tc.number: SUB_scan_file_singleton_GetAllSmallFiles_0100 * @tc.name: scan_file_singleton_GetAllSmallFiles_0100 - * @tc.desc: 测试ScanFileSingleton的GetAllBigfiles方法是否能正确添加和获取小文件信息 + * @tc.desc: 测试ScanFileSingleton的GetAllSmallfiles方法是否能正确添加和获取小文件信息 * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 1 @@ -107,10 +107,10 @@ HWTEST_F(ScanFileSingletonTest, scan_file_singleton_GetAllSmallFiles_0100, testi auto& instance = ScanFileSingleton::GetInstance(); instance.AddSmallFile("/path/to/small_file.txt", 512); - auto allSmallFiels = instance.GetAllSmallFiles(); + auto allSmallFiles = instance.GetAllSmallFiles(); - EXPECT_EQ(allSmallFiels.size(), 1) << "There should be one small file in queue."; - EXPECT_EQ(allSmallFiels["/path/to/small_file.txt"], 512) << "The file size should be 512 bytes."; + EXPECT_EQ(allSmallFiles.size(), 1) << "There should be one small file in queue."; + EXPECT_EQ(allSmallFiles["/path/to/small_file.txt"], 512) << "The file size should be 512 bytes."; } /** diff --git a/utils/include/b_radar/radar_const.h b/utils/include/b_radar/radar_const.h index 6ebf347da..cd9ae364b 100644 --- a/utils/include/b_radar/radar_const.h +++ b/utils/include/b_radar/radar_const.h @@ -107,7 +107,7 @@ struct RadarError { error_ = TransferErrCode(code); } - int16_t TransferErrCode(int32_t code) + uint16_t TransferErrCode(int32_t code) { if (code == 0) { return 0; diff --git a/utils/include/b_utils/scan_file_singleton.h b/utils/include/b_utils/scan_file_singleton.h index a3174279b..2316c7056 100644 --- a/utils/include/b_utils/scan_file_singleton.h +++ b/utils/include/b_utils/scan_file_singleton.h @@ -33,9 +33,9 @@ public: std::map GetAllBigFiles(); - bool GetCompeletedFlag(); + bool GetCompletedFlag(); - void SetCompeletedFlag(bool value); + void SetCompletedFlag(bool value); std::map GetAllSmallFiles(); -- Gitee From c3a33d60bfecb678d08e5842a6cbfb12d17b8384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Fri, 15 Aug 2025 15:34:09 +0800 Subject: [PATCH 58/62] blue only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- .../backup_sa/src/module_ipc/sub_service.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 0875d71e7..f676a797c 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -878,6 +878,30 @@ ErrCode Service::HandleCurAppDone(ErrCode errCode, const std::string &bundleName return BError(BError::Codes::OK); } +void Service::CallOnBundleEndByScenario(const std::string &bundleName, BackupRestoreScenario scenario, ErrCode errCode) +{ + if (session_ == nullptr) { + HILOGE("Session is empty, bundleName:%{public}s", bundleName.c_str()); + return; + } + HILOGI("Begin"); + try { + if (scenario == BackupRestoreScenario::FULL_RESTORE) { + session_->GetServiceReverseProxy()->RestoreOnBundleFinished(errCode, bundleName); + } else if (scenario == BackupRestoreScenario::INCREMENTAL_RESTORE) { + session_->GetServiceReverseProxy()->IncrementalRestoreOnBundleFinished(errCode, bundleName); + } else if (scenario == BackupRestoreScenario::FULL_BACKUP) { + session_->GetServiceReverseProxy()->BackupOnBundleFinished(errCode, bundleName); + } else if (scenario == BackupRestoreScenario::INCREMENTAL_BACKUP) { + session_->GetServiceReverseProxy()->IncrementalBackupOnBundleFinished(errCode, bundleName); + } + } catch (const BError &e) { + HILOGE("Call onBundleFinished error, client is died"); + return; + } +} + + std::string Service::GetCallerName() { std::string callerName; -- Gitee From 128fee55f6f2010da1275adf179389e81358ff14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Fri, 15 Aug 2025 15:59:53 +0800 Subject: [PATCH 59/62] clean code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- utils/src/b_utils/scan_file_singleton.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/src/b_utils/scan_file_singleton.cpp b/utils/src/b_utils/scan_file_singleton.cpp index 8761a4cc3..37455d4fb 100644 --- a/utils/src/b_utils/scan_file_singleton.cpp +++ b/utils/src/b_utils/scan_file_singleton.cpp @@ -52,13 +52,13 @@ std::map ScanFileSingleton::GetAllBigFiles() return fileMap; } -bool ScanFileSingleton::GetCompeletedFlag() +bool ScanFileSingleton::GetCompletedFlag() { std::lock_guard lock(mutexLock_); return isCalculateCompleted_; } -void ScanFileSingleton::SetCompeletedFlag(bool value) +void ScanFileSingleton::SetCompletedFlag(bool value) { std::lock_guard lock(mutexLock_); isCalculateCompleted_ = value; -- Gitee From 208127401938ad8bb862f4606a47de6c2b7407e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Fri, 15 Aug 2025 16:20:22 +0800 Subject: [PATCH 60/62] close launch timer when connect callback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- services/backup_sa/src/module_ipc/service.cpp | 1 + services/backup_sa/src/module_ipc/sub_service.cpp | 1 + .../backup_sa/src/module_sched/sched_scheduler.cpp | 12 ------------ 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index f578df62f..638888773 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1265,6 +1265,7 @@ void Service::ExtConnectDone(string bundleName) clearRecorder_->FindClearBundleRecord(bundleName)) { session_->SetServiceSchedAction(bundleName, BConstants::ServiceSchedAction::CLEAN); } else { + sched_->RemoveExtConn(bundleName); session_->SetServiceSchedAction(bundleName, BConstants::ServiceSchedAction::RUNNING); if (totalStatistic_ != nullptr) { session_->UpdateDfxInfo(bundleName, totalStatistic_->GetUniqId()); diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index d308767ee..37300712a 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -662,6 +662,7 @@ void Service::ExtConnectDied(const string &callName) } std::lock_guard lock(mutexPtr->callbackMutex); /* Clear Timer */ + sched_->RemoveExtConn(callName); session_->StopFwkTimer(callName); session_->StopExtTimer(callName); auto backUpConnection = session_->GetExtConnection(callName); diff --git a/services/backup_sa/src/module_sched/sched_scheduler.cpp b/services/backup_sa/src/module_sched/sched_scheduler.cpp index 70971f291..f9c9e2544 100644 --- a/services/backup_sa/src/module_sched/sched_scheduler.cpp +++ b/services/backup_sa/src/module_sched/sched_scheduler.cpp @@ -219,18 +219,6 @@ void SchedScheduler::StartExecuteBundleTask(const std::string &bundleName, BCons } } else if (action == BConstants::ServiceSchedAction::RUNNING) { HILOGI("Current bundle %{public}s process is running", bundleName.data()); - unique_lock lock(lock_); - auto iter = find_if(bundleTimeVec_.begin(), bundleTimeVec_.end(), [&bundleName](auto &obj) { - auto &[bName, iTime] = obj; - return bName == bundleName; - }); - if (iter == bundleTimeVec_.end()) { - throw BError(BError::Codes::SA_INVAL_ARG, "Failed to find timer"); - } - auto &[bName, iTime] = *iter; - // unregister timer - extTime_.Unregister(iTime); - lock.unlock(); //notify AppGallery to start restore if (reversePtr_ != nullptr) { reversePtr_->StartRunningTimer(bundleName); -- Gitee From 205ab338734630a85bfac3189c056c403b770b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Mon, 18 Aug 2025 14:11:34 +0800 Subject: [PATCH 61/62] clean code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- frameworks/native/backup_ext/src/sub_ext_extension.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 27ccb5dfb..95a271f18 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -152,7 +152,7 @@ void BackupExtExtension::SetClearDataFlag(bool isClearData) string BackupExtExtension::GetBundlePath() { - if (BFile::EndsWith(bundleName_, BConstants::BUNDLE_FILE_MANAGER) && bundleName_.size() == BConstants::FM_LEN) { + if (bundleName_ == BConstants::BUNDLE_FILE_MANAGER) { return string(BConstants::PATH_FILEMANAGE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); } else if (bundleName_ == BConstants::BUNDLE_MEDIAL_DATA) { return string(BConstants::PATH_MEDIALDATA_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); -- Gitee From 06badeb540b3b1bd73923ac42fdaf221210074a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E4=BD=B3=E7=82=9C?= Date: Tue, 19 Aug 2025 12:04:02 +0800 Subject: [PATCH 62/62] clean code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 石佳炜 --- services/backup_sa/src/module_ipc/service_incremental.cpp | 3 ++- services/backup_sa/src/module_ipc/sub_service.cpp | 1 - tests/unittests/backup_sa/module_ipc/sub_service_test.cpp | 1 - .../backup_utils/b_utils/scan_file_singleton_test.cpp | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 60530df5f..1b478b103 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -340,6 +340,7 @@ ErrCode Service::InitIncrementalBackupSession(const sptr& remot .callerName = GetCallerName(), .activeTime = TimeUtils::GetCurrentTime()}); if (errCode == ERR_OK) { + HILOGE("Success to init a new incremental backup session"); ClearFailedBundles(); successBundlesNum_ = 0; ClearBundleRadarReport(); @@ -759,7 +760,7 @@ ErrCode Service::GetIncrementalFileHandle(const std::string &bundleName, const s { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { - HILOGE("GetIncrementalFileHandle error, session is empty"); + HILOGI("Begin get incrementalFileHandle"); if (session_ == nullptr) { HILOGE("GetIncrementalFileHandle error, session is empty"); return BError(BError::Codes::SA_INVAL_ARG); diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 9431a8d81..a71006c6e 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -902,7 +902,6 @@ void Service::CallOnBundleEndByScenario(const std::string &bundleName, BackupRes } } - std::string Service::GetCallerName() { std::string callerName; diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index 4d11a9489..3a3888e59 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -2306,7 +2306,6 @@ HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0200, testing::ext::TestS res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); EXPECT_EQ(res, BError(BError::Codes::SA_INVAL_ARG).GetCode()); - EXPECT_CALL(*svcProxy, HandleGetCompatibilityInfo(_, _, _)) .WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); res = service->GetCompatibilityInfo(bundleName, extInfo, compatInfo); diff --git a/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp b/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp index c8f3f4fe0..bbd05eb03 100644 --- a/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp +++ b/tests/unittests/backup_utils/b_utils/scan_file_singleton_test.cpp @@ -97,7 +97,7 @@ HWTEST_F(ScanFileSingletonTest, scan_file_singleton_SetGetCompletedFlag_0100, te * @brief 测试添加和获取小文件信息 * @tc.number: SUB_scan_file_singleton_GetAllSmallFiles_0100 * @tc.name: scan_file_singleton_GetAllSmallFiles_0100 - * @tc.desc: 测试ScanFileSingleton的GetAllSmallfiles方法是否能正确添加和获取小文件信息 + * @tc.desc: 测试ScanFileSingleton的GetAllSmallFiles方法是否能正确添加和获取小文件信息 * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 1 -- Gitee