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 5b3bbbbed4371a5b6f7abd08a595558a53c27443..d9a40dd69bbd9c54930c8086363b8e1e2b5920ab 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 a1bbe1bceff1cfafdb509375b4546addda839d21..bb16e729b80bab244cee119b75c6bde5357f5f17 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 ad86f20e81d93505158170ae63ef65beb9edac4c..7c83fd08f98e657d274e451d35012217fcf85103 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 4dccce6be477d503996a38eb55cc23d65dc13e26..07545697b274cd0a772121977eceab131efe4b01 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/test/fuzztest/backupsa_fuzzer/BUILD.gn b/test/fuzztest/backupsa_fuzzer/BUILD.gn index be88b3013f4f1385709f65caff196f589d4547b7..bce672d8128bf8d522d6adce535c6e68b86106fc 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 2f4141076fd20963be281b231b952065d6fac243..7f4e7a15622f8144d5f122e13e75a3abee19fcd2 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 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 d5e982a602961df3008040dcf09c8a67a29325f6..4c4a3a19b8c5ac7b98f2ddfa5e59cbbc0462e4d1 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 05413708f069b91ae6295617a2fc80e9ea54f616..ab02cc68d06b40fcfce0f269621d7961ac159e77 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 26060dfccef3281dc1b6dc0b9188dbd24685410b..c1862dc6c49cb9511edebfae61ac7250a6dd2d18 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 2fb2f741ecb1e7449bdbfbd5ecb1516379804d3f..e144e43d495ea6aa6e480876bf9519a022dcc8b7 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 65fd948bdfcc0d5d09ce7da3334ff82211a97615..f183a662a12f89b057e653ad681491c01c73fb3f 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 710c128c6e6dcaff5d02dce89b7aa5ef69346445..d47502656b17d255318dd7e9011fa2de2a9ebb81 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 5392951f59177021998f2de8e735d607fa0d18ef..1206bf28de495a40a6afe52b4fc3ae477d03f7b8 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